寻找一个城市所属的县,州。

3

我有一个城市和州的信息,想要找到它所属的县。我尝试了几种方法,最接近的是使用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'

问题在于不清楚该县是否作为输出的一部分,如果是的话,如何使用代码提取它(字符串格式似乎会改变)。
获取某城市和州的县信息的最佳方法是什么?

所以第一个任务中的“县”应该是“库克县”?至于第二个任务,我不知道。OSM数据是零散的,我不确定你能不能做到这一点。print loc.raw会显示可用信息。 - roganjosh
你可以尝试使用pygeocoder。 - SH7890
5个回答

2

这里有一个能够帮助你获取县级数据的 地理编码解决方案。如果你还没有安装它,你可以使用 pip install geocoder 进行安装。

import geocoder

results = geocoder.google("Chicago, IL")

print(results.current_result.county)

enter image description here


1
AttributeError: 'NoneType' object has no attribute 'county' - DanielBell99

2
这是一种弱点,因为geopy在其响应中不能保证县。如果您愿意尝试其他API,则美国小型企业管理局有一个美国城市和县Web数据API,其中包含一个“特定城市的所有数据”终端,该终端包含对于城市和县都不明确的城市(例如旧金山市和县)的县信息。
该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

1
这个API似乎已经失效了,我从所谓的门户网站https://www.sba.gov/about-sba/sba-performance/sba-data-store/web-service-api/us-city-and-county-web-data-api得到了404错误。 - ericksonla

1
请使用以下代码提取最后一个单词,即国家名称。
from geopy.geocoders import Nominatim

geolocator = Nominatim(timeout=3)

location = geolocator.geocode('Chicago Illinois',language='en')

loc_dict = location.raw

print(loc_dict['display_name'])

print (loc_dict['display_name'].rsplit(',' , 1)[1])


location = geolocator.geocode('San Francisco California')

loc_dict = location.raw

print(loc_dict['display_name'])

print (loc_dict['display_name'].rsplit(',' , 1)[1])

1

同样可以使用Google 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中使用相同的方法。

2
“Country”和“County”是不同的。这可能是问题中的拼写错误,或者您可能误解了。 - roganjosh
对于Geopy,它也在这里:http://nominatim.openstreetmap.org/search/Chicago/Illinois?format=xml&polygon=1&addressdetails=1 <county>Cook County</county> - FieryCat
第二个例子呢?问题中已经显示了“Cook County”。 - roganjosh
这就是为什么如果您提供一个带有相关API限制的替代方案,我会点赞您的答案 :) 我在解析OSM数据时遇到了很大的困难,因为它对于完整数据来说非常不可靠。不幸的是,您提供了Google的链接。 - roganjosh
显示剩余3条评论

0

还有geocoder项目,它使得通过城市或城市和州进行地理编码查询变得非常容易。它支持多个提供者,请查看此表

使用“Google Maps Geocoding”提供程序的示例:

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选项。


2
谷歌地图现在需要一个密钥。 - Alex Kaszynski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接