通过Google Geocode API按邮编查找城市和州

86

我想获取某个邮编内城市和州的列表,谷歌的Geocode API能实现吗?我已经尝试研究了文档,但信息过于复杂。

如果有帮助的方法,请告诉我。感谢。

编辑:我通过以下方式获取了城市和州: http://maps.google.com/maps/geo?output=xml&q=14606 但是这样做会有限制吗?


您可以使用HERE Maps Geocoding REST API创建一个项目,并获取REST凭据。等待1小时使其生效(一开始会显示InvalidCredentials错误),然后调用例如geocoder.cit.api.here.com/6.2/geocode.json?PostalCode=2400&country=Denmark&app_id={APP_ID}&app_code={APP_CODE}&gen=9(您可以提供地址部分)。 - ᴍᴇʜᴏᴠ
4个回答

115

10
你的意思是 sensor=false 吗? - Rup
20
注意:Geocoding API 只能与 Google 地图一起使用;禁止在没有在地图上显示的情况下获取地理编码结果。 - Andy Ray
2
@Rup 传感器不再需要 - Dejell
4
搜索“城市邮政编码API”在Google上的第一个搜索结果,但显然这不是它 :( - RattleyCooper
9
@KevinLeary中的result_type并不限制于邮政编码。Google的地理编码器会误读邮政编码为街道地址号码(尝试使用邮编89100)。相反,应使用此处记录的格式:http://maps.googleapis.com/maps/api/geocode/json?components=country:US|postal_code:00001,其中包含国家代码和邮政编码信息,以避免这种混淆。详细信息请参见:https://developers.google.com/maps/documentation/geocoding/intro#ComponentFiltering - Mike Kormendy
显示剩余16条评论

56

我找到了几种使用Web API的方法。我认为美国邮政服务是最准确的,因为邮政编码是他们的专业,但Ziptastic更容易使用。

使用美国邮政服务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之前,USPS要求您先进行注册,但据我所知,访问API是免费的。此外,他们的API还有其他功能:您可以进行地址标准化和邮政编码查找,以及整套追踪、发货、标签等服务。

使用 Ziptastic HTTP/JSON API(不再受支持

更新:自2017年8月13日起,Ziptastic现为付费API,网址为此处

这是一个相当新的服务,但根据他们的文档,似乎您只需要向http://ziptasticapi.com发送GET请求即可:

GET http://ziptasticapi.com/48867

他们会返回类似于以下的JSON对象:

{"country": "US", "state": "MI", "city": "OWOSSO"}

确实有效。你可以通过命令行测试,例如执行以下操作:

curl http://ziptasticapi.com/48867 

9
非常喜欢Ziptastic的推荐。 <3! - ceejayoz
5
除非您使用美国邮政服务的API进行与邮寄特定相关的活动,否则他们很可能会拒绝您的访问请求。至少在我的经验中是这样的。 - eaj
2
Ziptastic不再受支持。不应再使用它。 - vaindil
1
对我来说,https://www.getziptastic.com/ 看起来并不像是“不受支持”的。话虽如此,除非他们改进了他们的API(他们可能已经这样做了),否则它只会返回一个邮编对应的城市/州。如果准确性很重要,这是相当不正确的。有时邮政编码甚至跨越州界,而且通常涵盖多个城市。 - RationalRabbit
2
@RationalRabbit:我提交了一份更新,指出Ziptastic现在是一个付费API。 - Richard Jones
显示剩余10条评论

18
function getCityState($zip, $blnUSA = true) {
    $url = "http://maps.googleapis.com/maps/api/geocode/json?address=" . $zip . "&sensor=true";

    $address_info = file_get_contents($url);
    $json = json_decode($address_info);
    $city = "";
    $state = "";
    $country = "";
    if (count($json->results) > 0) {
        //break up the components
        $arrComponents = $json->results[0]->address_components;

        foreach($arrComponents as $index=>$component) {
            $type = $component->types[0];

            if ($city == "" && ($type == "sublocality_level_1" || $type == "locality") ) {
                $city = trim($component->short_name);
            }
            if ($state == "" && $type=="administrative_area_level_1") {
                $state = trim($component->short_name);
            }
            if ($country == "" && $type=="country") {
                $country = trim($component->short_name);

                if ($blnUSA && $country!="US") {
                    $city = "";
                    $state = "";
                    break;
                }
            }
            if ($city != "" && $state != "" && $country != "") {
                //we're done
                break;
            }
        }
    }
    $arrReturn = array("city"=>$city, "state"=>$state, "country"=>$country);

    die(json_encode($arrReturn));
}

你的一部分代码对我有所帮助,非常感谢 :) - Kamlesh

6
几个月前,我有一个项目需要这样的需求。我进行了一些搜索,并找到了以下解决方案。这不是唯一的解决方案,但我发现它是其中一个更简单的解决方案。
使用http://www.webservicex.net/uszip.asmx上的web服务。特别是GetInfoByZIP()方法。
您将能够通过任何邮政编码(例如:40220)进行查询,您将会收到以下的响应...
<?xml version="1.0" encoding="UTF-8"?>
 <NewDataSet>
  <Table>
   <CITY>Louisville</CITY> 
   <STATE>KY</STATE> 
   <ZIP>40220</ZIP> 
   <AREA_CODE>502</AREA_CODE> 
   <TIME_ZONE>E</TIME_ZONE> 
  </Table> 
</NewDataSet>

希望这能帮上忙...

1
URL现在无法使用! - Tushar Shukla

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