从纬度和经度获取邮政编码?

17
我想从用户的当前位置(纬度,经度)获取邮政编码,我曾经使用过MKReverse Geocoder委托方法,但有时根据纬度和经度(有效值)无法获取邮政编码信息。是否有其他替代方案可用于MKReverseGeocoder?邮政编码数据库是特定于某些国家的,这就是为什么我不想使用它们。还有其他想法或提示吗?
谢谢

2
邮政编码数据库是针对特定国家的,没错;但是邮政编码也是国家特定的(例如,美国的邮政编码格式与荷兰或英国不同)。如果您想使用邮政编码,就必须以某种方式处理这个问题。 - Piskvor left the building
另外,您也可以使用https://thezipcodes.com/。 - nkkumawat
5个回答

34
考虑使用GeoNames网络服务。这是一个完整的地理编码 / 反向地理编码套件,根据创意共享归属性许可证进行管理。您可以下载其数据或使用其Web服务。最好的是,他们不需要任何API密钥或许可证 - 您只需访问他们的Web应用程序并获取数据即可。
这里有一个示例:http://ws.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=36&lng=-79.08。这将为您返回教堂山,NC地区附近邮政编码的JSON对象。
它也是国际化的。这是英格兰的Seaford,唯一不同的是我发送的纬度/经度对:http://ws.geonames.org/findNearbyPostalCodesJSON?formatted=true&lat=50.5&lng=0.08 然后您需要学习如何制作网络请求和解析JSON(如果您还没有掌握这些技能),就可以开始了。

对于商业用途来说,它有点贵(随着时间的推移)。这并不是免费的,这是他们的指南:http://www.geonames.org/commercial-webservices.html。很抱歉要告诉你这个消息... - Stephen J
4
使用GeoNames进行这项操作可能会导致严重的错误。他们会返回其数据库中距离您查询点最近的记录的邮政编码。如果其数据库中最近的记录在不同的邮政编码区域内,这种做法就是错误的。这种情况在您靠近两个邮政编码区域的边界时很容易发生。请参见本页面上我的答案,了解获取此信息的正确方法。 - James D
加载大约花费了25秒钟。 - dansch

6
这实际上是一个棘手的问题。使用像GeoNames这样的地理编码解决方案可能会导致许多查询出现重大错误。原因在于,GeoNames在其数据库中查找最接近您查询点的记录,然后返回该点上记录的邮政编码。当查询点恰好位于其数据库中的记录上时,这种方法非常有效,但否则可能会导致错误。例如,如果它们最接近的记录在不同的邮政编码中几个街区之外,您将得到错误答案。
美国人口普查局制作了邮政编码地图:

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

请在那个页面查看他们的笔记。
我还参与了一个项目,该项目使用人口普查地图提供API,根据给定的纬度和经度返回邮政编码。它位于:

http://askgeo.com

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

http://askgeo.com/database/UsZcta2010

您可以在这里阅读有关Web API文档的信息:

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

GeoNames的方法在这种查询类型上根本有缺陷。如果您正在寻找包含给定查询点的多边形,您需要具有多边形的地图,并且需要空间索引以提供快速查找。GeoNames没有这两个条件。AskGeo都有。

1
GeoNames看起来很不错,如果我想要从ZipCode->经纬度。 - Walker
1
人口普查网址已更改。这似乎是正确的: https://www.census.gov/geo/reference/zctas.html - Brian Bulkowski
1
我担心这只限于美国。我猜世界上还有许多其他国家。 - Srujan Barai
这个答案事实上是错误的。美国人口普查局(USCB)并没有创建ZIP代码地图,而AskGeo数据库也没有提供给定纬度和经度的ZIP代码的多边形 - 它只提供了ZCTA代码的多边形,两者并不相同!(请参考http://gis.washington.edu/phurvitz/zip_or_zcta/以获取ZCTA与ZIP不同的示例。因此,从技术上讲,这个答案根本不适用于原始问题,因为无法使用AskGeo来检索给定点的正确ZIP代码。它只能提供ZCTA,这可能与ZIP代码相同,也可能不同。 - Jazz

2
如果您有一个免费的数据库(可以在该网站上找到?只需搜索邮政编码数据库即可),则可以运行内部SQL查询以测试附近的纬度/经度。这样,您就不需要担心许可Web服务的问题。
然后您有3个选择。 SQL BETWEEN语句、直角三角形公式或Haversine公式。 Haversine公式最好,幸运的是它已在其他地方进行了教程演示。

1
为什么要投反对票?说真的,你想让我算一下吗?我在工作中使用这种技术,它允许我们在不使用在线编码器的情况下完成这个过程。这个解决方案对我们很有效,而你却因为懒得测试四个不等式而投了我的反对票?这里有答案:如果 x < lat + range 并且 x > lat - range,long 也是同样的操作。回答了你的问题。 - Stephen J
这个程序如何处理数据库通常是邮政编码的中心经纬度?你需要一个包含所有邮政编码区域的数据库(比如GeoJSON格式),并且你需要一个能够理解GeoJSON点在区域查询的数据库(这种数据库很少见)。使用Haversine和SQL BETWEEN似乎只能给出非常粗略的答案,除非我漏掉了什么。 - Brian Bulkowski
是的,你说得对。你需要一个包含线条的地图,并且可能需要进行基本的碰撞检测或者使用你提到的方法。我们都掌握了数学知识,看起来解决方案在于开始时的详细数据。 - Stephen J
1
我点了个赞,但有些人只是出于随意的恶意而喜欢点“踩”。 - Jeryl Cook
@JerylCook 这不是恶意,只是答案不正确。这种方法不能可靠地返回包含给定地理坐标的邮政编码... - Dodgie
显示剩余3条评论

1

这是一个不错的解决方案,但请注意它是一个需要付费使用的 Web 服务。 - Dodgie

1

1
Google的反向地理编码服务只能与嵌入的Google地图一起使用。 - James D

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