【问题标题】:Get zip code from latitude, longitude?从纬度,经度获取邮政编码?
【发布时间】:2010-08-25 10:23:43
【问题描述】:

我想从用户当前位置(纬度,经度)获取邮政编码,我使用了 MKReverse Geocoder 委托方法,但有时我无法根据纬度和经度(有效值)获取邮政编码信息。 MKReverseGeocoder 还有其他选择吗?邮政编码数据库特定于国家,这就是我不想使用它们的原因。还有其他想法或线索吗?

谢谢

【问题讨论】:

  • 邮政编码数据库是特定国家的,是的;但邮政编码也是特定于国家/地区的(例如,美国的邮政编码格式与荷兰或英国不同)。如果您想使用邮政编码,则需要以一种或另一种方式处理。
  • 或者,您可以使用thezipcodes.com

标签: iphone


【解决方案1】:

考虑GeoNames web service。它是一个完整的地理编码/反向地理编码套件,采用知识共享署名许可。你可以下载他们的数据,或者点击他们的网络服务。最好的事情是,他们不需要任何 API 密钥或愚蠢的许可 - 你只需点击他们的网络应用程序并获得数据。

这是一个示例:http://ws.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=36&lng=-79.08 这将为您返回一个 JSON 对象,用于显示北卡罗来纳州教堂山地区周围的邮政编码。

这也是国际化的。这里是英格兰的西福德,唯一的区别是我发送的纬度/经度对:http://ws.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=50.5&lng=0.08

然后,您需要学习发出 Web 请求和解析 JSON(如果您还没有掌握这些东西),一切就绪。

【讨论】:

  • 对于商业用途,它有点贵(随着时间的推移)。这不是免费的,这是他们的指南:geonames.org/commercial-webservices.html。很抱歉把这个消息告诉你......
  • 为此使用 GeoNames 可能会导致重大错误。他们返回数据库中离您的查询点最近的记录的邮政编码。如果他们数据库中最近的记录位于不同的邮政编码中,这是错误的,只要您靠近两个邮政编码之间的边界,就会发生这种情况。有关获取此信息的正确方法,请参阅我在此页面上的答案。
  • 加载大约需要 25 秒
【解决方案2】:

这实际上是一个棘手的问题。使用 GeoNames 之类的地理编码解决方案可能会导致大量查询出现重大错误。原因是 GeoNames 通过在他们的数据库中查找最接近您的查询点的记录,然后返回他们在该点记录的邮政编码。当您的查询点位于其数据库中的记录之上时,这非常有用,但否则可能导致错误。例如,如果他们最近的记录在几个街区之外的不同邮政编码中,您将得到错误的答案。

美国人口普查局制作了邮政编码地图:

https://www.census.gov/geo/reference/zctas.html

请在该页面上查看他们的注释。

我还参与了一个项目,该项目使用人口普查地图提供一个 API,该 API 可以返回给定纬度和经度的邮政编码。它位于:

http://askgeo.com

我们提供 Web API 和 Java 库,您可以在自己的服务器上运行它们。该库具有出色的性能。由于我们的网站提供的信息不仅仅是邮政编码,因此您可以在此处阅读我们的邮政编码服务:

http://askgeo.com/database/UsZcta2010

您在此处阅读了有关 Web API 的文档:

http://askgeo.com/#web-api

对于此类查询,GeoNames 方法存在根本缺陷。如果您要查找包含给定查询点的多边形,则需要包含多边形的地图,并且需要空间索引来提供快速查找。 GeoNames 两者都没有。 AskGeo 两者都有。

【讨论】:

  • Geonames 似乎很棒,不过,如果我想从 ZipCode -> Lat/Long 去的话。
  • 人口普查网址已更改。这似乎是正确的:census.gov/geo/reference/zctas.html
  • 我担心这仅限于美国。我猜这个世界上还有很多其他国家。
  • 这个答案实际上是不正确的。 USCB 没有创建邮政编码地图,AskGeo 数据库没有针对给定纬度和经度的邮政编码的多边形——它有 ZCTA 代码的多边形,它们不一样! (有关 ZCTA 与 ZIP 不同之处的示例,请参阅 gis.washington.edu/phurvitz/zip_or_zcta。)因此,从技术上讲,此答案根本不适用于原始问题,因为 AskGeo 不能用于检索给定点的正确邮政编码。它能给你的只是 ZCTA,它可能相同也可能不同。
【解决方案3】:

如果您有免费的数据库(可从该站点获得?只需搜索邮政编码数据库即可)

然后您可以对附近的纬度/经度运行内部 SQL 查询测试。这样您就无需担心网络服务的许可问题。

那么你有三个选择。 SQL BETWEEN 语句、斜边方程或Haversine。 Haversine 是最好的,幸运的是它在其他地方有教程

【讨论】:

  • 为什么要投反对票?说真的,你想让我做数学吗?我在工作中使用该技术,它可以在不使用在线编码器的情况下做到这一点。这为我们解决了问题,它有效,但你投票给我是因为你懒得在没有人为你编写代码的情况下测试四个不等式?这里:如果 x lat - range,long 相同。回答你的问题
  • 如何处理数据库通常是邮政编码的中心纬度?您需要一个包含所有邮政编码的所有区域的数据库(例如 GeoJSON ),并且您需要一个能够理解 GeoJSON 区域内点查询(其中很少)的数据库。 Haversine 和 SQL BETWEEN 似乎会给你一个非常近似的答案,除非我遗漏了什么。
  • 我认为您没有遗漏任何东西。我们确实进行了数学计算,并通过使用三角函数来确定附近的纬度和经度来缩小邮政编码的范围。它需要处理能力,但对我们有好处。
  • 这似乎可以让您获得您附近的邮政编码,而不是您所在的邮政编码。对于附近,当然,很好的方法。一旦你得到“关闭”的邮政编码,你建议如何确定用户所在的邮政编码? (这是 Matrix 的问题)。
  • 我加了一个赞。 ,人们只是出于随意的怨恨而“投反对票”。
【解决方案4】:

【讨论】:

  • Google 的反向地理编码服务只能与嵌入式 Google 地图结合使用。
【解决方案5】:

此处的示例代码:

从结果[1].formatted_address 中获取邮政编码

https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse

【讨论】:

  • 这是一个很好的解决方案,但请注意,它是一项需要花钱使用的网络服务。
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多