如何在 Django GeoIP 中从纬度和经度获取地址?

问题描述 投票:0回答:5

我在他们的 API 中看不到任何可以执行此操作的内容: https://docs.djangoproject.com/en/dev/ref/contrib/gis/geoip/#geoip-api

或者我应该使用 Google API 进行反向地理编码?

python django geolocation
5个回答
7
投票

解决方案 - 调用此 URL 并解析它的 JSON。

http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false

7
投票

使用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


2
投票

您可以使用地图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

2
投票

@rawsix 的答案对于 django 用户来说似乎很聪明。 但请注意,

geolocator.reverse(query)
返回的位置是一个列表,而不是
Location
对象;因此尝试从中检索属性
address
会导致错误。

通常,该列表中的第一项具有最接近的地址信息。所以你可以简单地做:

 location = location[0]
 address = location.address

此外,您可以使用元组,而不是将字符串纬度和经度传递给反向方法,并且它必须是

latitude
之前的
longitude
。你可以这样做:

 from geopy.geocoders import GoogleV3()
 geocoder = GoogleV3()
 location_list = geocoder.reverse((latitude, longitude))
 location = location_list[0]
 address = location.address

0
投票

使用 Geopy:

# RUN 'pip install geopy' before using code.


from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="your_app_name")
location = geolocator.reverse("{lat}, {long}")
print(location.address)
© www.soinside.com 2019 - 2024. All rights reserved.