Python 无Web访问的反向地理编码

Python 无Web访问的反向地理编码,python,gps,geocoding,reverse-geocoding,Python,Gps,Geocoding,Reverse Geocoding,我正在开发一个应用程序,其中一个要求是我能够基于GPS数据执行实时反向地理编码操作。特别是,我必须能够确定纬度、经度对映射到的州/省,并检测我们何时从一个州/省移动到另一个州/省 到目前为止,我有一些想法,但不知道是否有人对以下任何一项有任何想法: 有效解决这一问题的最佳方法是什么 哪里是好去处?北美州/省边界的适当格式是什么 首先,我有两个主要想法: 将北美划分为网格,网格中的每个矩形映射到特定的州和省。根据纬度和经度(反之亦然)在此表上进行查找(该表的增长速度越快,您希望的精度越高) 为

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

到目前为止,我有一些想法,但不知道是否有人对以下任何一项有任何想法:

  • 有效解决这一问题的最佳方法是什么
  • 哪里是好去处?北美州/省边界的适当格式是什么
首先,我有两个主要想法:

  • 将北美划分为网格,网格中的每个矩形映射到特定的州和省。根据纬度和经度(反之亦然)在此表上进行查找(该表的增长速度越快,您希望的精度越高)
  • 为每个状态定义多边形,并进行某种计算以确定lat/lon对位于哪个多边形中。我不知道该怎么做。HTML图像映射是定义州/省边界的一种方法
  • 我正在为感兴趣的人或那些可能有一个很好的库的人工作,他们想建议我使用python


    说清楚。。。我没有可用的web访问权限,因此在运行时不能使用现有的反向地理编码服务

    我有一个包含所有这些数据和一些访问工具的数据库。我是根据老虎普查数据做的。我想这基本上是将我的数据库导出到sqlite,并进行一些代码翻译。

    我不会从头开始实现您自己的解决方案。这是一项相当大的任务,而且已经有了实现这一目标的工具。如果您正在寻找一种开源方法(阅读:free),请查看以下博文:。

    我建议您使用您的第一个想法的变体:使用。空间索引是从矩形构建的数据结构,将lat/long映射到有效负载。在这种情况下,您可能会将矩形映射到州-省对。一个好的选择可能是。这是一个例子。您可以通过比较连续搜索的结果来检测漫游。

    如果您可以将状态边界作为多边形(例如,通过OpenStreetMap),则确定当前状态只是多边形测试中的一个点


    如果需要地址数据,脱机解决方案是使用Microsoft Mappoint

    您可以从中获取整个美国的数据,然后将所需的数据(如城市或州位置)提取为最适合您的应用程序的格式。注意:尽管数据质量良好,但不能保证完全准确,因此如果您需要完全准确,您可能需要到其他地方查看。

    我为以下国家创建了一个脱机反向地理编码模块:


    我会看看是否可以为各州添加数据。

    好主意!如果您需要在桌面上解决这类问题,那么这可能是一种很好的方法。不幸的是,我应该提到这一点,我运行在一个不支持Postgres的嵌入式平台上(而且它不能很容易移植,因为它不是嵌入式linux,尽管它基于posix)。Digi connectport的一个衍生产品是平台:虽然我不能在我的实现中使用r-tree python项目,但我确实使用了r-tree背后的一些思想,因为我使用每个状态的边界矩形构建了一个简单的空间索引。确定点所在的边界框后,我使用多边形中的点测试来计算其余的边界框。。。很好!很高兴听到这个消息。我误解了您也需要对县进行搜索-对于县,类似的算法也应该有效,只是需要更多的数据。无论如何,祝您漫游愉快。@Mosche我这里有一个sqlite格式的县。给我发一封电子邮件,我会看看我能做些什么。我很想知道你是如何解决这个问题的。你从哪里得到边界数据的?谢谢hoju,这个工具真是太棒了。我已经猎杀它很多年了!很高兴它对其他人有用-我自己的项目需要它,这看起来很神奇。我自己不是Python开发人员,但有时我会在Node.js中包含Python脚本。你能告诉我你的脚本需要哪个版本的python吗?
    >>> 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'}]