无需网络访问的反向地理编码

12

我正在开发一个应用程序,其中一个要求是能够基于GPS数据实时执行反向地理编码操作。特别地,我必须能够确定经度和纬度对应的州/省份,并检测我们何时从一个州/省份移动到另一个州/省份。

目前我有一些想法,但不知道是否有人能提供以下方面的建议:

  • 在效率高的前提下,如何最好地解决这个问题?
  • 在哪里可以找到北美州/省边界数据?适当的格式是什么?

作为一个入门者,以下是我目前的两个主要想法:

  1. 将北美分成一个网格,其中网格中的每个矩形映射到一个特定的州/省。根据纬度然后经度(或相反)在这张表中查找(精确度越高,表格越多)。
  2. 为每个州划定多边形,通过某种计算方式确定经纬度对所处的多边形区域。我不确定具体该如何进行。 HTML图像映射是定义州/省边界范围的一种方式。

我使用Python进行开发,如果您有兴趣或愿意推荐一些好的工具库,请告诉我。

需要明确的是……我无法在运行时使用现有的反向地理编码服务,因为我没有网络访问权限


我很想听听你是如何解决这个问题的。你最终从哪里获取了边界数据? - radven
7个回答

8
我为国家创建了一个离线反向地理编码模块:https://github.com/richardpenman/reverse_geocode
>>> import reverse_geocode 
>>> coordinates = (-37.81, 144.96), (31.76, 35.21)
>>> reverse_geocode.search(coordinates)
[{'city': 'Melbourne', 'code': 'AU', 'country': 'Australia'},
 {'city': 'Jerusalem', 'code': 'IL', 'country': 'Israel'}]

我会尝试添加州级数据。


1
谢谢hoju,这个工具真的很棒。我已经寻找它多年了! - zfz
很高兴它对其他人有用 - 我自己的项目也需要这个。 - hoju
你好,这看起来很棒。虽然我不是Python开发人员,但有时我会在我的Node.js中包含Python脚本。您能告诉我您的脚本需要哪个版本的Python吗? - Kunok

6
我建议使用您的第一个想法的变体:使用空间索引。 空间索引是从矩形构建的数据结构,将经纬度映射到有效载荷。 在这种情况下,您可能会将矩形映射到州/省对。 R-tree可能是一个不错的选择。 这里有一个R-tree python package。 您可以通过比较连续搜索的结果来检测漫游。

虽然我没有能够在我的实现中使用r-tree Python项目,但我确实使用了r-tree背后的一些思想,即为每个州构建一个简单的空间索引,使用边界矩形。在确定点位于哪些边界框之后,我使用点在多边形内的测试来解决其余问题...效果很好! - Paul Osborne
很高兴听到这个消息。我误解了你也需要这个搜索功能来查找县级地区 - 对于这个,类似的算法也可以工作,只需要更多的数据。无论如何,祝你漫游愉快。 - Yuval F

4

我建议不要从头开始实现自己的解决方案。这是一个非常大的任务,而且已经有一些工具可以完成这个任务。如果您在寻找开源方法(即免费),可以查看这篇博客文章:使用PostGIS进行反向地理编码


很棒的想法!如果您需要在桌面上解决这类问题,这可能是可行的方式。不幸的是,我应该提到这一点,我正在运行一个嵌入式平台,它不支持Postgres(并且不能轻易地进行移植,因为它不是嵌入式Linux,尽管它基于posix)。Digi connectport的衍生产品是该平台:http://www.digi.com/products/wirelessdropinnetworking/idigi-kits/x4-zb.jsp - Paul Osborne

1

如果您可以获取州边界的多边形(例如通过OpenStreetMap),确定当前状态只需要进行点在多边形测试。

如果您需要地址数据,离线解决方案是使用Microsoft Mappoint。


1

你可以从开放街图获取整个美国的数据。然后,你可以将需要的数据(如城市或州的位置)提取到最适合你的应用程序的任何格式中。请注意,尽管数据质量很好,但不能保证完全准确,因此如果你需要完全准确性,可能需要在其他地方寻找。


0

我有一个包含所有这些数据和一些访问工具的数据库。我是从人口普查虎数据中创建的。我想它基本上是将我的数据库导出到sqlite并进行一些代码翻译。


@Mosche 我这里有一个sqlite格式的文件,给我发个邮件,我看看能不能帮你。 - Dustin

0
我开发的免费反向地理编码服务(www.feroeg.com)基于Spatialite,这是一个实现SQL空间能力(r-tree)的sqlite库。 数据使用专有工具从OpenStreetMap(国家、城市、街道、街道编号)和OpenAddresses(街道编号)导入。 整个世界的数据量约为250GB。 有一篇论文描述了该服务的架构: https://feroeg.com/Feroeg_files/Feroeg Presentation.pdf

目前该项目(导入器和服务器)是闭源的。

反向地理编码库(C++)和转换工具可根据请求提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接