我知道有邮政编码的数据库,但我将如何基于此获取城市/州字段?这些数据库是否包含城市/州,还是我必须对网络服务进行某种查找?
5 回答
\开始{已经完成了}
重要认识:城市/县和邮政编码之间没有一对一的映射。邮政编码不是基于政治区域,而是根据为 USPS 内部使用而定义的分发区域。除非您有 +4 或整个街道地址来匹配 USPS 地址数据库中的记录,否则根据邮政编码查找城市是没有意义的;否则,您将不知道是 RICHMOND 还是 HENRICO,DALLAS 还是 FORT WORTH,只是没有足够的信息可以分辨。
这就是为什么许多电子商务供应商发现处理纽约州销售税令人沮丧的原因,因为该税收计划基于县,电子商务系统通常不要求县和邮政编码(唯一的他们提供的信息)在纽约可以跨越县界。
USPS 每个月都会更新其地址数据库,而且要花费真金白银,因此您在 Internet 上免费找到的几乎所有列表都将过时,尤其是在 USPS 关闭邮局以节省资金的情况下。
一个邮政编码可能跨越多个地名,而一个城市通常使用多个(但不一定是完整的)邮政编码。最后,邮政编码文件中列出的城市名称实际上可能并不代表收件人实际居住的地方;相反,它代表他们邮局的位置。我们办公室的邮件寄往 ASHLAND,但我们的工作地点距离该镇的实际政治限制约 7 英里。ASHLAND 恰好是我们承运人航线的发源地。
对于猜测某人的位置,例如搜索附近的兴趣点,这些来源和城市/州/邮政编码集可能很好,它们不需要准确。但是对于数据输入场景中的地址验证呢?绝对不 - 验证整个地址或根本不打扰。
只是一个友好的提醒,让我们退后一步,记住数据源的预期用途!
\end{已经完成了}
使用美国邮政服务HTTP/XML API
根据美国邮政服务网站上的此页面,该页面记录了他们基于 XML 的 Web API ,特别是此 PDF 文档的第 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 还有一些其他功能:您可以进行地址标准化和邮政编码查找,以及一整套跟踪、运输、标签等。
使用Ziptastic HTTP/JSON API
这是一项相当新的服务,但根据他们的文档,看起来您需要做的就是向http://ziptasticapi.com发送一个 GET 请求,如下所示:
GET http://ziptasticapi.com/48867
他们将返回一个JSON对象,如下所示:
{"country": "US", "state": "MI", "city": "OWOSSO"}
确实,它有效。您可以通过执行以下操作从命令行对此进行测试:
curl http://ziptasticapi.com/48867
我将尝试回答问题“我应该如何填充......”,而不是“我应该填充......”
假设您要多次执行此操作,您可能希望构建自己的数据库。这可能只是您从许多来源中下载的文本文件(请参阅此处的 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 中做所有事情。有关您的申请的更多详细信息可能会引起更详细的答复。