我知道有邮政编码的数据库,但我如何根据它获取城市/州的字段?这些数据库是否包含城市/州或我是否必须对Web服务进行某种查找?
答案 0 :(得分:7)
\ {开始被-有-完成 - 即}
重要实现:城市/县与邮政编码之间没有一对一的映射关系。邮政编码不是基于政治区域,而是基于USPS内部使用定义的分发区域。除非您拥有+4或整个街道地址以匹配USPS地址数据库中的记录,否则根据邮政编码查找城市是没有意义的;否则,你不会知道它是RICHMOND还是HENRICO,DALLAS还是FORT WORTH,还没有足够的信息可以告诉你。
这就是为什么,例如,许多电子商务供应商发现处理纽约州销售税令人沮丧,因为该税收计划是基于县,电子商务系统通常不要求县和邮政编码(他们提供的唯一信息)在纽约可以跨越县界。
USPS每月更新一次地址数据库并花费真金白银,因此几乎任何在互联网上免费提供的列表都会过时,特别是USPS关闭邮局以节省资金。
一个邮政编码可能跨越多个地名,一个城市通常使用多个(但不一定是完整的)邮政编码。最后,邮政编码文件中列出的城市名称实际上可能并不代表收件人实际居住的地方;相反,它代表了邮局的位置。我们的办公室邮件发往ASHLAND,但我们的工作距离该镇的实际政治限制大约7英里。 ASHLAND恰好是我们航空公司航线的起源地。
为了猜测某人的位置,例如搜索附近的兴趣点,这些来源和城市/州/邮政编码可能很好,他们不需要准确。但是对于数据输入场景中的地址验证?绝对不 - 验证整个地址或根本不打扰。
只是一个友好的提醒,退后一步,记住数据源的预期用途!
\ {端被-有-完成 - 即}
答案 1 :(得分:3)
答案 2 :(得分:1)
根据page on the US Postal Service website which documents their XML based web API,特别是this PDF document的第4.0节(第22页),他们有一个URL,您可以在其中发送包含5位邮政编码的XML请求,他们将使用XML进行响应包含相应城市和州的文件。
根据他们的文档,这是你要发送的内容:
http://SERVERNAME/ShippingAPITest.dll?API=CityStateLookup&XML=<CityStateLookupRequest%20USERID="xxxxxxx"><ZipCode ID= "0"><Zip5>90210</Zip5></ZipCode></CityStateLookupRequest>
这就是你要收到的东西:
<?xml version="1.0"?>
<CityStateLookupResponse>
<ZipCode ID="0">
<Zip5>90210</Zip5>
<City>BEVERLY HILLS</City>
<State>CA</State>
</ZipCode>
</CityStateLookupResponse>
USPS 确实要求您在使用API之前注册它们,但据我所知,访问是免费的。顺便说一下,他们的API还有一些其他功能:你可以做地址标准化和邮政编码查询,以及整套跟踪,运输,标签等。
答案 3 :(得分:1)
这是一项非常新的服务,但根据他们的文档,看起来您需要做的就是向http://ziptasticapi.com发送GET请求,如下所示:
GET http://ziptasticapi.com/48867
他们将返回一个JSON对象:
{"country": "US", "state": "MI", "city": "OWOSSO"}
确实,它有效。您可以通过执行以下操作从命令行对此进行测试:
curl http://ziptasticapi.com/48867
答案 4 :(得分:0)
我会尝试回答“我应该如何填充...”的问题,而不是“我应该填充......”
假设您要多次执行此操作,您可能希望构建自己的数据库。这可能只是您从许多来源中下载的文本文件(请参阅此处的Pentium10回复)。当您需要城市名称时,搜索ZIP,并提取城市/州文本。为了加快速度,您可以按ZIP的数字顺序对表进行排序,构建行的索引,并使用二进制搜索。
如果ZIP数据库看起来像(来自 sourceforge ):
"zip code", "state abbreviation", "latitude", "longitude", "city", "state"
"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama"
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama"
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama"
从文本中最简单的提取将类似于
$zipLine = lookup($ZIP);
if($zipLine) {
$fields = explode(", ", $zipLine);
$city = $fields[4];
$state = $fields[5];
} else {
die "$ZIP not found";
}
如果您只是在PHP中使用文本,那就是您所需要的。但是如果你有一个数据库应用程序,你将在SQL中做所有事情。有关您的申请的更多详细信息可能会引起更详细的回复。