我正在寻找以编程方式获取给定美国城市所在的美国县名的最佳/最简单方法。似乎没有可用于此类(看似简单)任务的简单 API?
5 回答
您可以免费下载县/市/邮政编码信息数据库,例如: http ://www.unitedstateszipcodes.org/zip-code-database/ (无需注册或付费)
将其全部或部分导入到本地持久数据存储(例如数据库)中,并在需要查找城市县时进行查询
注意:自发布此答案以来,县信息已从最初链接的 .csv 文件中消失。此链接不再包含县信息: http: //federalgovernmentzipcodes.us/free-zipcode-database.csv
1) 城市跨县
2) 邮编跨越市县,甚至不在同一条线上
任何使用 zip 作为中介的解决方案都会损坏您的数据(不,“zip+4”通常不会修复它)。您会发现城市到邮编到县的数据地图(#2)比更准确的模型(#1)有更多的城市到县匹配——这些都是错误的匹配。
您正在寻找的是免费的人口普查数据。您需要的联邦信息处理标准 (FIPS) 数据集称为“2010 ANSI Codes for Places”:https ://www.census.gov/geographies/reference-files/time-series/geo/name-lookup-tables.2010 .html
人口普查“地方”是我们问题的“城市”。这些文件将“地点”映射到一个或多个县。
由于县的奇怪多边形形状和城市的点位置,因此使用地理空间功能来完成这项任务并不容易。
最好的办法是参考城市及其各自县的数据库,尽管我不知道在哪里可以找到。也许得克萨斯州出版了一本?
CommonDataHub 不包含此信息。
下面是一段代码,用于使用 Google Maps API 以编程方式获取给定美国单个城市/州的美国县的名称。此代码速度慢/效率低,并且没有任何错误处理。但是,对我来说,将县与约 1,000 个城市的列表进行匹配对我来说非常有效。
#Set up googlemaps API
import googlemaps
google_maps = googlemaps.Client(key='API_KEY_GOES_HERE')
#String of city/state
address_string = 'Atlanta, GA'
#Geocode
location = google_maps.geocode(address_string)
#Loop through the first dictionary within `location` and find the address component that contains the 'administrative_area_level_2' designator, which is the county level
target_string = 'administrative_area_level_2'
for item in location[0]['address_components']:
if target_string in item['types']: #Match target_string
county_name = item['long_name'] #Or 'short_name'
break #Break out once county is located
else:
#Some locations might not contain the expected information
pass
这会产生:
>>> county_name
Fulton County
注意事项:
- 如果 google_maps.geocode() 未传递有效地址,代码将中断
- 某些地址不会返回与“administrative_area_level_2”对应的数据
- 这并不能解决美国城市跨越多个县的问题。相反,我认为 API 只是返回与关联的单个纬度/经度关联的县
address_string
最快和最不回避的方法可能是使用来自免费地理定位 API(在 Google 上很容易找到)的 JSON/XML 请求。这样您就不需要创建/托管自己的数据库。