2012-10-17 1 views

Antwort

2

Sie können die Karten-API verwenden. Ich habe ein Snippet eingefügt, mit dem ich Marathon-Startpunkte berechnen kann, die in ein PointField mit Postgis mit Django umgewandelt wurden. Dies sollte dich auf den Weg bringen.

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

Prost, aber ich war nach Erhalt "Adresse" (als Ausgabe) von Lat & Long (als Eingabe). Ihr Beispiel ist das Gegenteil von dem, was ich will. Ich habe es funktioniert mit einem ähnlichen Ansatz https://maps.googleapis.com/maps/api/geocode/json?latlng= – Ernest

+1

anstelle der Adresse verwenden Sie Ihre lat langen Werte und überprüfen Sie die eingehenden Json-Ergebnisse. Sie werden die Adresse dort finden. – super9

5

Lösung - rufen Sie diese URL auf und parsen Sie JSON.

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

Verwenden Sie Geopy, es kann mehrere Geocoder einschließlich Googlev3 verarbeiten.

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 

mit pip installieren:

pip install geopy 

Infos gefunden auf: https://github.com/geopy/geopy

+1

I verwendet denselben Code, aber wenn print (location.address) bekam einen Fehler Traceback (jüngste Aufforderung zuletzt) ​​verwendet: Datei „“ Linie 1 in Attribute: ‚Liste‘ Objekt hat kein Attribut ‚-Adresse ' –

+0

Ich bekomme das gleiche beim Aufrufen von Reverse, eine Liste von Koordinaten –

1

@rawsix Antwort für einen django Benutzer intelligent zu sein scheint. Beachten Sie jedoch, dass der von geolocator.reverse(query) zurückgegebene Standort eine Liste und kein Objekt Location ist; Wenn Sie also versuchen, das Attribut address von ihm abzurufen, würde dies zu einem Fehler führen.

Normalerweise hat das erste Element in dieser Liste die Informationen zur nächstgelegenen Adresse. so kann u einfach tun:

location = location[0] 
address = location.address 

Zusätzlich stattdessen einen String geografische Breite und Länge auf der Rückseite Methode geben, können Sie ein Tupel verwenden und es muss die latitude vor dem longitude sein. Sie können:

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