2012-10-17 7 views

Odpowiedz

2

Możesz użyć API map. Dołączyłem fragment, którego używam do obliczania punktów startowych maratonu przekształconych w PointField za pomocą Postgis z Django. To powinno cię ustawić na swojej drodze.

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 
+0

Pozdrawiam, ale byłem po uzyskaniu "Adres" (jako wynik) z Lat & Long (jako wejście). Twój przykład jest odwrotnością tego, co chcę. Mam to działa przy użyciu podobnego podejścia https://maps.googleapis.com/maps/api/geocode/json?latlng= – Ernest

+1

zamiast adresu, użyj swoich długich wartości i sprawdź nadchodzące wyniki json. znajdziesz tam adres. – super9

5

Rozwiązanie - wywołanie tego adresu URL i przeanalizowanie go jako JSON.

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

Użyj geopy, może obsługiwać wielu geocoderów, w tym 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 

zainstalować z pip:

pip install geopy 

informacje znajdują się na: https://github.com/geopy/geopy

+1

użyłem tego samego kodu, ale kiedy jest stosowany print (location.address) masz błąd Traceback (najnowsza rozmowę ostatnia): Plik „”, wiersz 1, w AttributeError: „list” obiekt ma atrybut adresu” ' –

+0

Otrzymuję to samo podczas wywoływania wstecz, lista współrzędnych –

1

@rawsix Odpowiedź wydaje się mądry dla użytkownika Django. Należy jednak pamiętać, że lokalizacja zwrócona przez geolocator.reverse(query) jest listą, a nie obiektem Location; więc próba pobrania atrybutu address z tego spowoduje błąd.

Zazwyczaj pierwsza pozycja na tej liście zawiera najbliższe informacje adresowe. tak u można po prostu zrobić:

location = location[0] 
address = location.address 

Dodatkowo, zamiast przechodzącą ciąg szerokości geograficznej i długości metodą odwrotnej, można użyć krotki i musi być latitude przed longitude. Możesz zrobić:

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