2013-11-24 19 views

risposta

19

Io uso l'API di Google.

from urllib2 import urlopen 
import json 
def getplace(lat, lon): 
    url = "http://maps.googleapis.com/maps/api/geocode/json?" 
    url += "latlng=%s,%s&sensor=false" % (lat, lon) 
    v = urlopen(url).read() 
    j = json.loads(v) 
    components = j['results'][0]['address_components'] 
    country = town = None 
    for c in components: 
     if "country" in c['types']: 
      country = c['long_name'] 
     if "postal_town" in c['types']: 
      town = c['long_name'] 
    return town, country 


print(getplace(51.1, 0.1)) 
print(getplace(51.2, 0.1)) 
print(getplace(51.3, 0.1)) 

uscita:

(u'Hartfield', u'United Kingdom') 
(u'Edenbridge', u'United Kingdom') 
(u'Sevenoaks', u'United Kingdom') 
+0

questo è fantastico, c'è un modo pulito per prelevare città e paese senza utilizzare split? – godzilla

+0

Sì, ho rivisto la mia risposta per restituire la città e il paese –

+0

questo funziona bene, tuttavia esiste un modo per farlo localmente? una sorta di API, la latenza è un enorme collo di bottiglia per ciò che sto cercando di fare – godzilla

1

In generale l'API di Google è l'approccio migliore Non era adatto per il mio caso perché dovevo elaborare molte voci e l'api è lento.

Ho codificato una versione piccola che fa lo stesso ma scarica prima una geometria enorme e calcola i paesi sulla macchina.

from shapely.geometry import mapping, shape 
from shapely.prepared import prep 
from shapely.geometry import Point 


data = requests.get("https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson").json() 

countries = {} 
for feature in data["features"]: 
    geom = feature["geometry"] 
    country = feature["properties"]["ADMIN"] 
    countries[country] = prep(shape(geom)) 

print(len(countries)) 

def get_country(lon, lat): 
    point = Point(lon, lat) 
    for country, geom in countries.iteritems(): 
     if geom.contains(point): 
      return country 

    return "unknown" 

print(get_country(10.0, 47.0)) 
# Austria 
+0

questa estensione pip è anche interessante, forse non così accurata in quanto si basa su qualche punto di riferimento e fa qualche interpolazione: https://pypi.python.org/pypi/reverse_geocode/1.0 – linqu

Problemi correlati