查找美国城市所在的美国县的最佳方法是啥?
Posted
技术标签:
【中文标题】查找美国城市所在的美国县的最佳方法是啥?【英文标题】:What's the best way to lookup the US county a US city resides in?查找美国城市所在的美国县的最佳方法是什么? 【发布时间】:2011-09-29 03:42:27 【问题描述】:我正在寻找以编程方式获取给定美国城市所在的美国县名的最佳/最简单方法。似乎没有可用于此类(看似简单)任务的简单 API?
【问题讨论】:
路易斯安那分为教区,阿拉斯加分为自治市镇。所以我猜你的问题中只有 50 个中有 48 个是有效的 考虑到我的重点是德克萨斯州,我认为这是一个很好的限制。 无论如何你都应该需要一个数据库。所以我认为问题应该是“我需要什么样的数据库/数据结构?” 既然关注点在德克萨斯州,为什么不直接创建一个德克萨斯州所有城市/城镇的列表并与之匹配呢?***entry 是一个好的开始... 我没有包含我需要的信息的数据源。英语是我使用的语言。 【参考方案1】:您可以免费下载县/市/邮政编码信息数据库,例如: http://www.unitedstateszipcodes.org/zip-code-database/(无需注册或付费)
将其全部或部分导入到本地持久数据存储(例如数据库)中,并在需要查找城市县时进行查询
注意:自发布此答案以来,县信息已从最初链接的 .csv 文件中消失。 此链接不再包含县信息:http://federalgovernmentzipcodes.us/free-zipcode-database.csv
【讨论】:
里面没有县。为什么这是公认的答案? @ladieu:它曾经有县信息。自从我链接到该文件后,该文件必须已更新并且县信息已删除。感谢您的提醒。我会尝试找到更好的资源来替换链接的资源... @ladieu:找到了指向资源的新链接,其中包含与原始 .csv 相同的县列。 @ladieu 我正在寻找那个文件。你能分享一下吗?找不到它。 截至 2016 年 6 月的县都在这里:unitedstateszipcodes.org/zip_code_database.csv【参考方案2】: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
人口普查“地点”是我们问题的“城市”。这些文件将“地点”映射到一个或多个县。
【讨论】:
“2010 ANSI 地点代码”是我所需要的,但上面的人口普查链接已损坏,我无法在 .gov 网站的任何地方找到它。我确实发现它上传到data.world/nrippner/ansi-geographic-codes。我从没听说过 data.world,但我注册了,终于可以轻松下载文件了。【参考方案3】:由于县的多边形形状和城市的点位置很奇怪,因此使用地理空间功能来完成这项任务并不容易。
最好的办法是参考城市及其各自县的数据库,但我不知道在哪里可以找到。 也许得克萨斯州出版了一个? CommonDataHub 不包含此信息。
【讨论】:
这几乎是我遇到的问题。事实证明,要找到此信息的参考资料很困难。【参考方案4】:下面是一段代码,用于使用 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
关联的单个纬度/经度关联的县
【讨论】:
【参考方案5】:最快和最不回避的方法可能是使用来自免费地理定位 API 的 JSON/XML 请求(在 Google 上很容易找到)。这样您就不需要创建/托管自己的数据库。
【讨论】:
以上是关于查找美国城市所在的美国县的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章