鉴于纬度/经度坐标,我们如何找出城市/国家/地区?

问题描述 投票:141回答:14

例如,如果我们有这些坐标集

"latitude": 48.858844300000001,
"longitude": 2.2943506,

我们如何找出城市/国家?

geolocation geocoding geospatial geo
14个回答
96
投票

免费的Google Geocoding API通过HTTP REST API提供此服务。注意,API为usage and rate limited,但您可以为无限制访问付费。

尝试使用此链接以查看输出示例(这在json中,输出在XML中也可用)

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true


172
投票

另一个选项:

  • http://download.geonames.org/export/dump/下载城市数据库
  • 将每个城市作为纬度/经度添加->将城市映射到R-Tree等空间索引(某些DB也具有此功能)
  • 使用最近邻搜索来查找任何给定点的最近城市

优点:

  • 不取决于外部服务器是否可用
  • 非常快(每秒轻松进行数千次查询)

缺点:

  • 不是自动最新的
  • 如果要区分最近的城市在几十英里之外的情况,则需要额外的代码
  • 可能会在两极和国际日期变更线附近产生奇怪的结果(尽管这些地方没有任何城市

45
投票

您需要geopy

pip install geopy

然后:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

以获取更多信息:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}

22
投票

一种开放源代码替代方法是来自Open Street Map的Nominatim。您所要做的就是在URL中设置变量,它返回该位置的城市/国家。请检查以下链接以获取官方文档:Nominatim


22
投票

我正在寻找类似的功能,并且在较早的答复中看到了共享的数据“ http://download.geonames.org/export/dump/”(感谢您的共享,它是一个很好的来源,并基于citys1000.txt数据实现了一项服务。

您可以看到它在http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 ((链接断开)] >>只需更改您所在位置的纬度和经度即可。

它已部署在OpenShift(RedHat平台)上。长时间的闲置时间过后,首次通话可能会花费一些时间,但通常性能令人满意。随意使用此服务...

此外,您可以在以下位置找到项目源https://github.com/turgos/Location


8
投票

我已经使用Geocoder来支持mention just a few,这是一个不错的Python库,它支持多个提供程序,包括Google,Geonames和OpenStreetMaps。我尝试使用GeoPy库,但它经常会超时。为GeoNames开发自己的代码并不是最好的时间选择,并且最终可能会获得不稳定的代码。根据我的经验,Geocoder非常简单易用,并且具有足够的documentation。下面是一些示例代码,用于按纬度和经度查找城市,或按城市名称查找纬度/经度。


5
投票

我花了大约30分钟的时间来尝试找到一个如何在Javascript中执行此操作的代码示例。对于您发布的问题,我找不到快速明确的答案。所以...我做了我自己的。希望人们可以使用它,而不必深入研究API或盯着不知道如何阅读的代码。哈,如果没有别的,我可以参考这篇文章作为我自己的东西。.很好的问题,并感谢论坛的讨论!


5
投票

我知道这个问题确实很老,但是我一直在研究相同的问题,所以我发现了由Ajay Thampi构建的非常有效且方便的软件包reverse_geocoder。该代码可用here。它基于K-D树的并行实现,这对于大量点非常有效(我花了几秒钟才获得100,000点。


3
投票

这实际上取决于您拥有什么技术限制。


1
投票

您可以使用Google Geocoding API


1
投票

Loc2country是基于Golang的工具,它针对给定的位置坐标(纬度/经度)返回ISO alpha-3国家/地区代码。它以微秒为单位响应。它使用地理哈希到国家地图。


1
投票

最小化库的数量。


0
投票

请检查以下答案。它对我有用


0
投票

如果您使用的是Google的Places API,这就是使用Javascript从place对象获取国家和城市的方法:

© www.soinside.com 2019 - 2024. All rights reserved.