2017-05-26 131 views
2

我有一个城市+州的信息,我正试图找到县。 我试了几件事。我得到的最接近的是使用geopy。这里有一个例子:找到一个城市的州,州

from geopy.geocoders import Nominatim 
geolocator = Nominatim() 
loc = geolocator.geocode('Chicago Illinois') 
print(loc.address) 
# u'Chicago, Cook County, Illinois, United States of America' 
loc = geolocator.geocode('San Francisco California') 
print(loc.address) 
# u'SF, California, United States of America' 

的问题是,目前还不清楚,如果是全县输出的一部分,如果它是如何使用代码来提取它(字符串格式似乎改变)。

什么是获得城市+州的县信息的最佳方式?

+0

因此,第一个任务的“县”应该是“库克县”?第二,我不知道。 OSM数据是随意的,我不确定你能做到这一点。 'print loc.raw'会告诉你什么是可用的。 – roganjosh

+0

你可以试试pygeocoder。 – SH7890

回答

1

它可用于谷歌API以及列表 “address_components” 内[国家 - >状态 - >县 - > ...]:

request(
    'http://maps.googleapis.com/maps/api/geocode/json', 'GET', { 
     'address': 'Chicago Illinois' 
     'language': 'en', 
     'sensor': 'true' 
    } 
) 

在情况下,从第一个列表被带到太很多变化,你必须定义适当的长/纬度:

request(
    'http://maps.googleapis.com/maps/api/geocode/json', 'GET', { 
     'latlng': "${Latitude},${Longitude}", 
     'language': 'en', 
     'sensor': 'true' 
    } 
) 

另一个样本,雅虎API:

request('https://query.yahooapis.com/v1/public/yql', 'GET', { 
    'q': "select * from geo.places.parent where child_woeid in (select woeid from geo.places where text='Chicago, Illinois')", 
    'market': 'en-gb', 
    'format': 'json', 
    'env': 'store%3A%2F%2Fdatatables.org%2Falltableswithkeys', 
    'callback': '' 
}) 

假设,直接可以在任何GEO API中使用相同的方式。

+0

“国家”和“县”是不同的。这可能是一个错字或者你误解了。 – roganjosh

+0

@roganjosh,对不起,不留神,但它适用于县作为“address_components”的一部分https://developers.google.com/maps/documentation/geocoding/intro?hl=zh-CN – FieryCat

+0

好吧,这是一个不同的服务。如果这可以回答这两个示例的“县”问题,那么只要您包含任何API限制(每单位时间的请求数),我认为这是一个体面的答案。我不确定OSM是否可靠地传输这些数据。 – roganjosh

1

这是一个弱点,因为geopy不能保证县的回应。如果您愿意接受其他API,U.S. Small Business AdministrationU.S. City & County Web Data API包含“所有特定城市的数据”端点,其中包含城市县的模糊县,如City and County of San Francisco

该API有xmljson响应格式。 需要为您的例子唯一的变化是使用状态的缩写:

import requests 
import json 

locations = ['Chicago, IL', 'San Francisco, CA'] 

city_data_url = 'http://api.sba.gov/geodata/primary_links_for_city_of/%s/%s.json' 

for l in locations: 
    split_name = l.split(', ') 
    response = requests.get(city_data_url % tuple(split_name)) 

    resp_json = json.loads(response.text) 
    print resp_json[0]['full_county_name'] 

输出:

Cook County 
San Francisco County 
0

也有geocoder project,使得它很容易被城市或城市,使地理编码查找包括州。它支持多个提供商,请查看this table

样品使用“谷歌地图地理编码”供应商:

In [1]: import geocoder 

In [2]: GOOGLE_GEOCODE_API_KEY = "your_api_key" 

In [3]: result = geocoder.google("Chicago, IL", key=GOOGLE_GEOCODE_API_KEY) 

In [4]: result.country_long 
Out[4]: 'United States' 

In [5]: result.country 
Out[5]: 'US' 

Google Maps Geocoding API这里关键是可选的,但允许更好的API使用rate limits。当然,还有高级的API选项。