2013-11-24 200 views

回答

19

我使用Google的API。

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)) 

輸出:

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

這是偉大的,有沒有一種乾淨的方式來撿起城市和鄉村而不使用拆分? – godzilla

+0

是的,我已經修改了我的回覆城市和國家 –

+0

這工作正常,但是有沒有辦法在本地做到這一點?某種類型的api,延遲是我正在嘗試做的一個巨大瓶頸 – godzilla

1

一般來說,谷歌API是最好的方法。這不適合我的情況,因爲我必須處理大量條目,並且api速度很慢。

我編寫了一個相同的小版本,但首先下載了一個巨大的幾何圖形,然後計算機器上的國家。

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

這個點擴展也很有趣,也許不是很精確,因爲它基於一些參考點並做了一些插值:https://pypi.python.org/pypi/reverse_geocode/1.0 – linqu

相關問題