地图兴趣点搜索一(基本流程)

这篇具有很好参考价值的文章主要介绍了地图兴趣点搜索一(基本流程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 地图兴趣点搜索

1. 地图搜索无处不在

​ 随着本世纪初Google Map的诞生,地图以一个全新形式进入人们的视野,大家发现原来地图不只是躺在课本里的彩页,还可以与我们互动。今天地图在生活中已经无处不在。导航地图,搜索附近美食,看一下我的外卖距离我还有多远。。。这些我们已经习以为常的功能充满了地图的奇思妙用,也蕴藏了大量时空数据技术的运用。这篇开始我们将揭秘一些地图原理,让大家了解更多地图背后的故事。

​ 本文要介绍是地图地址搜索,专业名词为POI(Point Of Interest)检索。这个功能相信大多数人都使用过,比如,朋友约我到一个地点吃饭,我只记得这个饭馆的大致名称,于是会在地图搜索框里输入一些关键词,地图软件就很神奇的给为我推荐出了很多相近的地点,并且在地图上展示相应的位置。我们要做的就是结合地图上的位置和这些地点名字找出那个饭馆。

地图兴趣点搜索一(基本流程)

​ 这个我们几乎每天都会用到的功能如果要实现,大致有三个步骤,1、地址数据清洗:去除包括经纬度异常点,重复点,空值等等;2、地址信息索引与搜索;3、经纬度地图打点。简单来讲就是,处理数据、存储与查询数据、展示数据。这三个步骤里最枯燥繁琐的就是数据的清洗,最有意思也是最有挑战性的的是地址信息索引与搜索,最简单的就是结果的展示。下面我们通过简单的实践,看看如何搭建一个基础的地址搜索服务来实现存储与搜索。

2. 如何匹配地址

​ 地址信息索引与搜索大致流程可以用下面简单的示意图表示。将带有位置信息的地名地址数据导入数据存储,并建立索引,一般需要建立全文倒排索引+空间索引。当客户端输入关键词时,会利用索引进行搜索,最终返回匹配的结果集。

地图兴趣点搜索一(基本流程)

​ 这样看来和普通的业务系统也没有太大区别,关键是如何建立这个索引库以及怎样筛选结果。通常,在一个大型的地图引擎内部因为要服务的场景非常复杂,而且对准确率要求非常高,因此通常不会只建立一个索引库,不会只有一种匹配规则。本文,我们只关注主要的流程,建立一个最简单的框架,方便大家理解。

​ 我们不难发现,地址信息的搜索最关键的步骤是地址文本的匹配。简单讲,就是如何用输入的词语检索出我们真正想要的地址文本。这和普通的关系数据库有些不同,因为我们的地址数据通常不会有很明确的结构,同时,用户输入信息也不一定规范。这种场景更类似于全文检索,通过对比查询词和数据库内的地址,返回最相似的文本结果。因此建立一个含有空间坐标信息的地址全文索引库才是实现这个功能的重点。

3. 地址搜索简单实现

3.1 准备数据集

​ 此次实验我们使用开源OSM数据,它是由全球用户共同协作的wiki地图数据,里面的数据种类非常全面,虽然准确性不是特别高,但是作为实验数据集完全够用。下面这幅图是在QGIS截取的北京经开区某个住宅区的地图,黄色圆点是OSM的POI数据,红字是POI的地址名称。

地图兴趣点搜索一(基本流程)

​ 为了有更好的搜索效果,需要对数据进行一定的处理,这里我们需要把POI数据和行政区划数据进行叠加,使得POI的地址文本增加行政区域的信息。比如,地图上的“肯德基”,处理完之后就变成了“北京市经开区永华街道肯德基”,这样在我们搜索某个区域的肯德基时,就更有可能得到准确的结果。

3.2 ES搭建地址全文索引

​ 全文索引有很多实现方案,比较成熟的产品有solr、elasticsearch、sphinx等等,还可以基于搜索框架Lucene直接扩展。这里我们方便起见直接用ES来搭建,它内部也支持空间信息的存储,并且分布式架构更方便后面扩展。

3.2.1 安装搜索引擎

​ ES的安装非常简单,下载然后直接启动就能用,可以参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html。但是,这里要说明的是,光有原生的ES还不够,我们需要一个中文分词器,因为原生的分词器只适用于英文,对于中文信息完全不能用。关于中文分词器的安装可以参考:http://t.zoukankan.com/chenmc-p-9525163.html,我们使用比较流行的IK分词器。

​ IK分词器内部有两种分词方式,ik_max_word和ik_smart,以“中华人民共和国国歌”为例,

  • ik_max_word会拆分的非常细:中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌…
  • ik_smart则会比较克制:中华人民共和国、国歌

​ 很难说哪个更好,这要取决于你的场景和你的词典,如果你没有足够丰富的词典,并且对准确性要求没有特别高,只要能返回沾边的信息就行,那就可以用ik_max_word。如果你有很强大的词典,而且不想要太傻的结果,那你可以尝试ik_smart,这还不够,因为你需要了解更多原理知识来调整匹配策略,这些内容会在后面文章中探讨。为了能匹配的更准确,这里建立了一个政区词典,把所有政区的名词全部导了进去,下面图一是词典内的一些行政区名称,图二是在ik配置文件内放置好的词典文件。(IK分词器扩展词典:https://github.com/medcl/elasticsearch-analysis-ik)

地图兴趣点搜索一(基本流程)
地图兴趣点搜索一(基本流程)

3.2.2 创建索引

​ 创建索引类似于mysql中创建一个表,我们要定义表结构,以及分词的方式。这里分词有两个方面,一个是构建索引词库的分词,一个是对搜索词语的分词,我们都设置为ik_smart。另外,将经纬度进行整合,构造一个geo_point字段,方便后面空间搜索使用。

地图兴趣点搜索一(基本流程)

3.2.3 导入地址信息

​ 地址信息的导入建议写一个脚本,方便后面重复使用。ES提供了相应的rest api,我们只需要读取数据映射到对应的property字段即可。可参考java版本:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html

3.3 搜索地址

​ 搜索地址可以直接调用ES的rest接口,利用match函数进行全文匹配。如下例子,搜索“通州区万达广场”,ES会返回最可能的几个结果。我们还可以把解释器打开(在match命令后面加上?explain=true),看一下返回记录的分数和计算方式。关于解释器和分数计算,会在后面文章介绍。

地图兴趣点搜索一(基本流程)

​ 可以看到返回的结果基本符合我们的常识,只是排名第一的“建国路万达广场”有点突兀,查了一下它竟然位于朝阳区,而第二第三名里面有很明显的“通州区”字样,为啥反而排名很低呢?关于怎样让结果更符合我们的预期,后面文章再聊!

3.4 展示

​ 结果的展示非常简单,只需要将获取的location坐标通过前端组件展示到地图上即可,openlayers、mapbox、leaflet都是不错的开源框架,这里不再赘述。

4. JUST轻松实现

4.1 导入POI数据

​ 在时空数据接入模块,选择本地shpfile数据导入到服务器上,这里选择了通州区的地址数据。

地图兴趣点搜索一(基本流程)

4.2 查看已有数据表

​ 在时空数据查询模块,通过JUST-SQL检验数量是否一致

地图兴趣点搜索一(基本流程)

4.3 发布POI检索服务
4.3.1 建立一个正逆地理编码的场景

地图兴趣点搜索一(基本流程)

4.3.2 配置服务参数

地图兴趣点搜索一(基本流程)

4.3.3 查看服务文档

地图兴趣点搜索一(基本流程)文章来源地址https://www.toymoban.com/news/detail-404158.html

参考文章

  1. https://www.elastic.co/guide/en/elasticsearch/reference/7.9/query-dsl.html.
  2. Goldberg D W, Wilson J P, Knoblock C A. From text to geographic coordinates: the current state of geocoding[J]. URISA journal, 2007, 19(1): 33-46.
  3. https://lucene.apache.org/core/9_3_0/index.html
  4. 京东城市时空数据引擎JUST主页:https://just.urban-computing.cn/#/productCenter

到了这里,关于地图兴趣点搜索一(基本流程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高德地图系列(三):vue项目利用高德地图实现地址搜索功能

    目录 第一章 效果图 第二章 源代码 高德地图为我们提供了搜索联想,以及搜索结果标记,该案例已将基础功能打通,后续我们肯定还会对功能有所修改,想实现自己想要的效果,基本上看高德地图文档对着改就好了(跟我们用别的工具一样做即可)  代码描述如下:  注意事

    2024年02月03日
    浏览(51)
  • ES 地图经纬度搜索

    ES中提供了一个数据类型 geo_point,这个类型就是用来存储经纬度的。 创建一个带geo_point类型的索引,并添加测试数据  

    2024年02月12日
    浏览(41)
  • Vue3使用高德地图、搜索、地图选点、以及省市区三级联动

    1、准备工作 需要在 高德开发平台 申请自己的 key 和 密钥 这里的 Key 名称大家可以随意填写 申请完之后我们得到 key 和 密钥 vue中使用需要安装**@amap/amap-jsapi-loader --save** 官方文档 2、代码实现 首先我们需要三个文件,一个 index.vue 一个用来存放省市区的 index.js 文件 一个 ma

    2024年02月05日
    浏览(75)
  • Vue3+Vite连接高德地图JS API——地图显示、输入搜索

    1、进入高德地图API官网(https://lbs.amap.com/): 2、注册登录。 3、进入控制台。 4、点击“应用管理”,点击“我的应用”,创建新应用。 5、添加Key,服务平台选择“Web端(JS API)”,白名单不要填写,勾选阅读并同意。 点击提交后,就能看到Key已经生成,记住这里的Key和安

    2024年01月17日
    浏览(47)
  • 室外3D雷达地图构建流程

    ROS1/Melodic hdl_graph_slam (地图构建) interactive_slam (离线地图优化) 由于开发环境中需要从github中嵌套下载非常多的包,在没有翻墙的情况下直接下载几乎每次都会下载到一半后中断,因此在这里将环境依赖下载完整版本打包了。 链接:https://pan.baidu.com/s/1URtRfrcnXtmnGHNhjwwfgA?pwd=

    2024年02月06日
    浏览(38)
  • 申请高德地图API【流程记录】

    现在我们需要使用高德地图的api进行功能的实现,这就需要我们申请一个高德地图的key 1.进入官网 登录账号 点击高德开放平台 | 高德地图API (amap.com)。进行登录 选择控制台 注册为开发者 填写邮箱获取验证码后,进行支付宝扫码进行实名认证 注册完成 点击确认即可 2.申请

    2024年01月17日
    浏览(39)
  • 微信小程序使用腾讯地图完整流程

    前言:开发小程序需要得到定位和位置的省市区文字信息,看了所有的文章都没有一个完整和像样的,全是copy来,copy去的文章 - _ -!,一怒之下,开始了自己的踩坑之路 腾讯地图地址:腾讯位置服务 - 立足生态,连接未来 1.常规的申请账号登录 2.新建应用  3.点击添加key  

    2023年04月09日
    浏览(58)
  • 需求:微信小程序使用腾讯地图,做地点搜索!(完整版)

    先来看看我需要的效果吧! 话不多说,开始吧! 既然是腾讯地图,就要打开腾讯地图开放平台参考哦,放个链接:https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview 第一步:配置微信小程序需要用的key,WebServiceAPI,在微信开发者平台添加合法域名,下载SDKjs放在代码中 注意:

    2024年02月04日
    浏览(49)
  • uni-app 小程序使用腾讯地图完成搜索功能

    前言 使用uni-app开发小程序时候使用腾讯地图原生SDK是,要把原生写法转成vue写法在这记录一下。 我们需要注意的是使用高德地图时我们不仅要引入SDK,还要再uni-app中配置允许使用。 由于uni-app内置地图就是腾讯,所以获取位置的api,uni.getLocation坐标不用转换,直接使用。

    2024年02月08日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包