我在他们的 API 中看不到任何执行此操作的内容: https ://docs.djangoproject.com/en/dev/ref/contrib/gis/geoip/#geoip-api
还是我应该只使用 Google API 进行反向地理编码?
我在他们的 API 中看不到任何执行此操作的内容: https ://docs.djangoproject.com/en/dev/ref/contrib/gis/geoip/#geoip-api
还是我应该只使用 Google API 进行反向地理编码?
解决方案 - 调用此 URL 并解析它的 JSON。
http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false
使用 geopy,它可以处理多个地理编码器,包括 googlev3。
from geopy.geocoders import GoogleV3
geolocator = GoogleV3()
location = geolocator.reverse("52.509669, 13.376294")
print(location.address)
>>> Potsdamer Platz, Mitte, Berlin, 10117, Deutschland, European Union
使用 pip 安装:
pip install geopy
在以下位置找到信息:https ://github.com/geopy/geopy
您可以使用地图 API。我已经包含了一个片段,我用它来计算使用 Postgis 和 Django 转换为 PointField 的马拉松起点。这应该会让你上路。
import requests
def geocode(data):
url_list = []
for item in data:
address = ('%s+%s' % (item.city, item.country)).replace(' ', '+')
url = 'http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=false' % address
url_list.append([item.pk, url])
json_results = []
for url in url_list:
r = requests.get(url[1])
json_results.append([url[0], r.json])
result_list = []
for result in json_results:
if result[1]['status'] == 'OK':
lat = float(result[1]['results'][0]['geometry']['location']['lat'])
lng = float(result[1]['results'][0]['geometry']['location']['lng'])
marathon = Marathon.objects.get(pk=result[0])
marathon.point = GEOSGeometry('POINT(%s %s)' % (lng, lat))
marathon.save()
return result_list
@rawsix 的答案对于 django 用户来说似乎很聪明。但是请注意,返回的位置geolocator.reverse(query)
是一个列表,而不是一个Location
对象;因此尝试从中检索属性address
会导致错误。
通常,该列表中的第一项具有最接近的地址信息。所以你可以简单地做:
location = location[0]
address = location.address
此外,您可以使用元组,而不是将字符串纬度和经度传递给 reverse 方法,并且它必须latitude
是longitude
. 你可以做:
from geopy.geocoders import GoogleV3()
geocoder = GoogleV3()
location_list = geocoder.reverse((latitude, longitude))
location = location_list[0]
address = location.address