Ответ 1
Используйте API GeoCoding
Например, для поиска zip 77379 используйте такой запрос:
http://maps.googleapis.com/maps/api/geocode/json?address=77379&sensor=true
В основном я хочу получить список городов и состояний в zipcode. Является ли Google Geocode API способным это сделать? Я попытался изучить документацию, но нашел информацию подавляющей.
Любая помощь будет оценена по достоинству. Если есть другой способ выполнения такой задачи, пожалуйста, дайте мне знать.
Спасибо
EDIT: мне удалось получить город и штат через: http://maps.google.com/maps/geo?output=xml&q=14606, но есть ли ограничения на это?
Используйте API GeoCoding
Например, для поиска zip 77379 используйте такой запрос:
http://maps.googleapis.com/maps/api/geocode/json?address=77379&sensor=true
Я нашел несколько способов сделать это с помощью веб-интерфейсов API. Я думаю, что Почтовая служба США будет самой точной, поскольку Zip-коды - это их дело, но Ziptastic выглядит намного проще.
В соответствии с этой страницей на веб-сайте Почтовой службы США, которая документирует свой веб-API на основе XML, в частности раздел 4.0 (стр. 22) этот PDF-документ, у них есть URL-адрес, в котором вы можете отправить XML-запрос, содержащий 5-значный почтовый индекс, и они будут отвечать 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 имеет некоторые другие возможности: вы можете выполнять стандартизацию адресов и поиск почтовых индексов, а также весь набор отслеживания, доставки, ярлыков и т.д.
Обновление: по состоянию на 13 августа 2017 года Ziptastic теперь является платным API и может быть найден здесь
Это довольно новая услуга, но, согласно их документации, все, что вам нужно сделать, это отправить запрос GET на http://ziptasticapi.com, так:
GET http://ziptasticapi.com/48867
И они возвратят объект JSON по строкам:
{"country": "US", "state": "MI", "city": "OWOSSO"}
Действительно, он работает. Вы можете проверить это из командной строки, выполнив что-то вроде:
curl http://ziptasticapi.com/48867
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));
}
пару месяцев назад, у меня было одно и то же требование для одного из моих проектов. Я немного искал его и выяснил следующее решение. Это не решение только, но я нашел его одним из более простых.
Используйте веб-сервис в http://www.webservicex.net/uszip.asmx.
В частности, метод GetInfoByZIP()
.
Вы сможете запросить любой zipcode (ex: 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>
Надеюсь, что это поможет...