`
sungang_1120
  • 浏览: 322597 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

geocoding基于地理编码和逆地理编码的算法问题(转载)

 
阅读更多

今天看了下geocoding内容,找了几篇问题:

http://hi.baidu.com/moonstream/blog/item/168bab8b71d6a9759e2fb4f2.html

 

如果你在一家从事GIS开发的软件公司呆上一阵子,一定经常听到人们提起"地理编码"这个词。那么,什么是地理编码呢?

我们先来看一看维基百科中是怎么解释的:

Geocoding is the process of assigning geographic coordinates (e.g.

latitude-longitude) to street addresses, as well as other points and

features. With geographic coordinates, the features can then be mapped and

entered into Geographic Information Systems.

——From Wikipedia, the free encyclopedia.

地理编码是将地理坐标(例如经纬度)赋予街道地址还有其他点位和地理特征的过程。有了地理坐标,地理特征就可以被显示到地图上或运用到地理信息系统中。

相反的,由一个地理坐标得到相应的地址表述的过程,就称作"逆地理编码(Reverse Geocoding)"。

地理编码和逆地理编码都是很常用的功能。例如,你想去海龙大厦,于是进入某个本地搜索网站,输入关键字"海龙大厦",然后你就得到了一张标有"海龙大厦"

的地图。在这个过程中,地理编码的步骤被隐含着,因为对于一般用户来说,得到经纬度的数值是没有用处的,只要得到包含目标的地图就可以了。对于后台服务,

则经历了两个步骤:第一步,通过地理编码查询得到海龙大厦的地理坐标;第二步,取得一幅这个坐标附近的地图,把"海龙大厦"标在这个地图上显示给用户。又

例如,你从GPS设备得到了你当前的经纬度,可是你并不知道自己身在何处,这个时候你可以通过逆地理编码服务得到你当前所在的地区名和街道名,并且了解到

你附近有什么标志性建筑(地标),你还可以把这个地址描述发给你的朋友从而让他方便地找到你。

那么,地理编码功能又是如何实现的呢?首先,当然要有一个地址库了。也就是一个包含着地理坐标信息的地址列表。有了这个地址库,我们就可以迅速的查询到某

个地址的地理坐标。但是,任何一个小城市也都会存在着数不胜数的地址,想要采集出全部的地址及其坐标几乎是不可能的。于是,在美国以及许多国家,人们通过

一种叫做"地址插值"的方法来计算某个地址的坐标。假设我们知道中关村大街1号的坐标和中关村大街50号的坐标,就可以近似的认为中关村大街2号至49号

这些地址平均分布在整个中关村大街上,于是我们就可以用数学公式近似计算出中关村大街2号至49号全部地址的坐标。这种方法当然会存在一定误差。美国大部

分城市地址的规则度较高,所以地址插值法在美国的实用性还比较好,但是对于中国现在地址分布较乱的国情,这种编码过程就不太适用了。因此,我们不得不尽可

能多地来收集地址信息。而这样浩大的工程,通常都会由政府部门来投资。另外,国内有测绘资质的商业公司也都在采集数据。

逆地理编码的过程通常这样:根据指定的地理坐标,从空间数据库中分别查询出该坐标所在的城市名称、区域名称、街道名称以及附近的地标,然后把这些信息组合成一个­完整的地址描述。例如:北京市海淀区中关村大街1号海龙大厦附近。

Google Maps

API是现在热门的免费地图接口,但是它并不包含地理编码服务,因此Google的官方文档中建议用户使用一些其它的开放地理编码服务。而互联网上能够找

到的地理编码服务几乎都是美国和加拿大的数据。在中国能够提供免费数据的只有灵图一家(http://freemosp.51ditu.com),

在灵图的开放接口中,包含了38个城市的地理编码及逆地理编码服务。美中不足的是,灵图的地理编码服务目前只能通过名称来查找位置,而不能通过地址来进行

查找。例如,你用"海龙大厦"作为关键字可以查找到"中关村大街1号"及其经纬度,但是用"中关村大街1号"作为关键字却不能匹配到"海龙大厦"。

位置服务其实是一把双刃剑,人们享受着位置服务带来的便利,同时又担心自己的隐私受到侵犯。而国家更不希望位置信息落入敌国或恐怖组织的手中。因此灵图公

布出来的地理坐标都是经过了偏移的,这是一个折衷的办法,使得我们能够在法律许可的范围内得到地址和经纬度数据。

地理编码和位置搜索经常被人们混淆,其实它们之间并没有很明显的界线。通常,位置搜索的方式更加灵活,为了更加准确地搜索出我们关心的位置,我们可以加入

区域和类别等限制条件,但是如果我们的目的依然是获取某个地方的"地理坐标",那么我们实际上就是在进行"地理编码"。

(摘自“http://www.cnblogs.com/kaixin110/archive/2007/09/25/905175.html”)

 

http://blog.csdn.net/historyasamirror/archive/2010/06/01/5638248.aspx

 

这年头和 location 相关的应用越来越火。从 foursquare 的热闹程度就可见一般(什么,没听过 foursquare…. 哥们,你 out 了)。和 location 有关的应用一般都包括一些共同的操作,最常见的一个,就是找附近的东东(餐馆,商店 …. )。

所以,这里就抛出了一个问题,怎样才能知道两个物体离得近呢?

我之前转过一篇 blog ,是关于 用 cellid进行定位的 ,当然,这种方法是在不得已的情况下才使用,比如得不到 gps 。这里,我们假设可以拿到两个物体的 gps 数据,所以一个最直观的办法,计算两个 gps 点的直线距离。当然,这个计算不精确,不要忘了,地球是圆的,所以两个 gps 点之间的距离应该是一个弧线。上网搜一下,应该能找到一个复杂的公式,专门用来计算这个弧长。

对于两个点来说,上述的方法就够用了。当如果有很多个点呢,难道要我计算两两之间的距离么?

这个问题属于 spatial data indexing&management 的范畴,有很多关于 database 或者 GIS 的书都会讲到一些解决的算法和特殊的数据结构。我在这只介绍一个简单的方法,叫做 geohash 。

geohash 其实是对 gps 数据进行了编码,使得上述问题更容易得到解决。(关于 geohash 的详细论述可以看 wiki ,介绍得很全面)

假设我们有一个 gps 数据,为 <42.6, -5.6> ,首先 (1) 我们会将经纬度分别编码成一个 binarycode ,比如纬度 42.6 被编码成“ 101111001001 ”,经度 -5.6 被翻译成“ 0111110000000 ”,然后 (2) 将两个 binarycode 连起来,经度的 binarycode 作为奇数位,纬度的 binarycode 作为偶数位,就变成了“ 01101 11111 11000 00100 00010 ”,最后,将这个 binarycode 转化为一个 32 进制的字符串,变成“ ezs42 ”。

需要说一下经纬度转化成 binarycode 的算法。举例来说,比如纬度的范围是 +90 ~ -90 ,我们将这个分为两个区间,分别是 (-90, 0) 和 (0,90) ,如果 gps 的 x( 纬度 ) 落在了第一个区间,那么它的第一位 binarycode 就是 0 ,如果落在第二个区间,那么它的第一位 binarycode 就是 1 ,显然 42.6 是在第二个区间,所以它的第一位 binarycode 是 1 ,然后再对 (0,90) 这个区间做二分,再计算下一步的 binarycode….

编码方式说完了,说说 geohash 的好处。当两个 gps 数据对应的 geohash 数据有一定长度的前缀是相同的,表示这两个数据在一定程度上距离接近,相同的前缀越长,那么两个点越离得近。( nearby places will often (but not always) present similar prefixes. )

注意,需要提及的是,两个 geohash 有相同前缀,表示这两个点离得近,但是!两个点离得近,不一定 geohash 有相同的前缀。 geohash 在这里存在一个缺陷,就是所谓的 edge case 。详情见 wiki 。

再往深入琢磨一下, geohash 的本质是什么。其实它就是对一个二维平面进行了一个索引,首先对这个平面竖着切一刀,刀的左边标记为 0 ,刀的右边标记为 1 ,然后再横着切一刀,并且继续标记,然后再竖着切 …. 有很多 spatial data indexing 的方法都是这样的思路,它的作用就是把平面的这种二维数据改造成一维的数据。而一维数据有个好处,就是可以做 sorting 。

到此,我们还没有回答之前提的问题,如果有很多点,该怎样从其中找出附近的点呢?答案貌似已经呼之欲出,俺就不多说了。

分享到:
评论

相关推荐

    地理编码技术本地化解决方案

    地理编码的核心原理是基于地址数据库和地理信息系统(GIS)。系统首先会解析输入的地址信息,并将其与地址数据库中的数据进行匹配。一旦找到匹配项,系统就会根据该地址对应的地理信息计算出相应的经纬度坐标。这一...

    基于中文分词的加权地理编码在COVID-19疫情防控空间定位中的应用.docx

    《基于中文分词的加权地理编码在COVID-19疫情防控空间定位中的应用》 ...未来,随着人工智能技术的不断进步,中文分词和地理编码的精准度将进一步提升,为疫情防控及其他领域提供更多精细化服务。

    GIS论文 MapInfo中的地理编码及应用.pdf

    其中,地理编码(Geocoding)是MapInfo的一个核心功能,它能够将地址或其他地理参考数据转换成地图上的具体位置,从而实现数据的空间化和可视化。 地理编码在MapInfo中的应用主要体现在将非空间数据(如地址、邮政...

    贝岭的matlab的代码-historical_geocoding:历史地理编码

    【标题】"贝岭的matlab的代码-historical_geocoding:历史地理编码"涉及到的是一个使用MATLAB编程语言实现的历史地理编码项目。历史地理编码是一种将过去的地名或地址转换为现代地理位置的过程,这对于历史研究、数据...

    地理编码和坐标转换工具 coordinate_transform_tools.zip

    "coordinate_transform_tools"这个工具很可能包含了对各种地理编码和坐标转换算法的实现,可能支持批处理、交互式输入等多种功能。用户可能需要输入原始坐标或地址,选择源和目标坐标系统,然后工具会进行相应的计算...

    无需地理编码器:使用免费数据库提供地理编码功能

    开发者可以通过这些模块快速搭建起一个基础的地理编码服务,而无需深入了解底层的算法和数据结构。 总结来说,这个主题涉及使用开源数据和工具实现自定义的地理编码服务,这为开发者提供了灵活且经济的选择,同时也...

    mapquest-geocoding-service:Reekoh IoT平台的MapQuest Geocoding API服务插件。 将Reekoh实例集成到MapQuest的地理编码API中,以进行反向和正向地理编码

    MapQuest Geocoding Service是Reekoh IoT平台的一个插件,它允许用户通过MapQuest的地理编码API将IoT(物联网)设备和数据与地理位置信息相结合。这个插件的目的是实现正向和反向地理编码功能,使得在Reekoh平台上...

    Android studio 百度地图开发:触摸选点、地理编码、定位和导航

    在Android应用开发中,集成百度地图API是一项常见的需求,它能提供丰富的地图功能,如...在实际开发过程中,还需要注意权限管理,如请求GPS定位权限,以及处理可能的网络和地理编码失败情况,以提供良好的用户体验。

    数据结构课设作业:基于QT实现的地图导航系统(Dijkstra算法).zip

    除了核心的Dijkstra算法,QT项目还可能涉及其他技术,如地理编码(Geocoding)将地址转换为坐标,反地理编码(Reverse Geocoding)将坐标转换为地址,以及路线规划中的路径平滑和转向指示等。 总的来说,这个项目...

    详细地址信息,地理位置

    在IT领域,地址信息和地理位置的数据处理是至关重要的部分,特别是在大数据分析、地图服务、物流配送、社交网络和位置服务应用中。这份压缩包文件,标题为“详细地址信息,地理位置”,显然包含了一些用于描述地理...

    高德POI编码获取工具

    2. **地理编码(Geocoding)**:是将地址文本转化为地理坐标(经度和纬度)的过程。高德POI编码获取工具可能就是通过调用高德地图的地理编码API,根据提供的地点信息获取对应的编码。 3. **POI(兴趣点)**:地图上...

    电信设备-基于地名数据库的海量中文网页在线地理信息化方法.zip

    此外,还需要使用地理编码(Geocoding)技术将这些地名转换为精确的经纬度坐标,以便在地图上展示。 海量数据处理涉及到数据挖掘和大数据技术,如Hadoop、Spark等分布式计算框架,用于存储和处理大规模的网页数据。...

    elastic-eleonor:地理编码中软约束具体化的实验

    1. **地理编码算法**:项目可能实现了一种或多种算法来解析地址并找到对应的经纬度,如反向地理编码(Reverse Geocoding)和正向地理编码(Forward Geocoding)。 2. **数据结构与算法**:为了高效地处理地址和地理...

    根据经纬度查地址.zip

    1. **地理编码服务**:像Google Maps API、Bing Maps API、高德地图API等提供反向地理编码的服务,它们通常基于庞大的地址数据库和复杂的算法来实现。用户通过调用API接口,传入经纬度坐标,返回对应的街道地址。 2...

    geoservices-geocoding

    总之,"geoservices-geocoding"作为一个基于Java的地理编码服务,为开发者提供了一个强大且灵活的工具,帮助他们在各种场景下处理地理位置信息。无论是构建地图应用、实现智能导航,还是进行大数据分析,它都能发挥...

    经纬度查询

    地理编码是将地址或地点名称转换为经纬度的过程,反之称为反地理编码(Reverse Geocoding)。这个"经纬度查询"软件的核心功能可能就是实现批量的地理编码。常见的地理编码服务有Google Maps API、Bing Maps API等,...

    matlab开发-GeoCode

    地理编码(Geocoding)是将人类可读的地址转换为地理位置坐标的过程,这对于定位、地图服务和位置分析至关重要。 MATLAB中的GeoCode功能可能通过API接口与第三方地理编码服务提供商(如Google Maps、Bing Maps、...

    java 电子 地图 模块

    这个“java 电子地图模块 商业项目源码”可能包含了一系列用于构建地图应用的核心功能和组件,如地图显示、定位、路线规划、地理编码和反地理编码等。 首先,地图显示是电子地图的基础,Java中通常会使用开源库如...

    MapX开发教程

    MapX是Microsoft Visual Basic编程环境下的一种地图控件,它允许开发者在应用程序中集成地图功能,进行地图显示、数据可视化和地理分析。MapX是Borland公司开发的Geocoding和Mapping SDK,广泛应用于GIS(地理信息...

    GeoUtils_min

    GeoUtils_min.js文件很可能包含了各种地理计算方法和工具,如坐标转换、距离计算、方位角确定、地理编码(Geocoding)、反向地理编码(Reverse Geocoding)等。这些功能在现代Web应用中非常实用,例如地图服务、定位...

Global site tag (gtag.js) - Google Analytics