2012-10-17 6 views

risposta

2

È possibile utilizzare l'API delle mappe. Ho incluso uno snippet che uso per calcolare i punti di inizio della maratona convertiti in PointField usando Postgis con Django. Questo dovrebbe metterti sulla tua strada.

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

Cheers ma ero dopo aver ottenuto "Indirizzo" (come output) da Lat & Long (come input). Il tuo esempio è il contrario di ciò che voglio. Ho funzionato usando un approccio simile https://maps.googleapis.com/maps/api/geocode/json?latlng= – Ernest

+1

invece di indirizzo, utilizzare i valori lat long e ispezionare i risultati json in arrivo. troverai l'indirizzo qui. – super9

5

Soluzione: chiama questo URL e analizza che è JSON.

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

Usa geopy, può gestire più geocoder, tra cui 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 

installano con pip:

pip install geopy 

informazioni trovate su: https://github.com/geopy/geopy

+1

Ho usato lo stesso codice, ma se usato di stampa (location.address) ottenuto un errore Traceback (chiamata più recente scorso): file "", linea 1, in AttributeError: 'list' oggetto non ha attributo 'indirizzo ' –

+0

Ottengo la stessa cosa quando si chiama il contrario, un elenco di coordinate –

1

@rawsix risposta sembra intelligente per un utente Django. Si noti tuttavia che la posizione restituita da geolocator.reverse(query) è un elenco e non un oggetto Location; quindi il tentativo di recuperare l'attributo address da esso provocherebbe un errore.

In genere, il primo elemento in tale elenco ha le informazioni sull'indirizzo più vicino. così u può semplicemente fare:

location = location[0] 
address = location.address 

Inoltre, invece di passare una latitudine e la longitudine di stringa al metodo inverso, è possibile utilizzare una tupla e deve essere la prima della latitudelongitude. Si può fare:

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