从城市名称获取邮政编码的最简单方法



我想处理我的一项任务,按城市名称而不是邮政编码搜索天气(我现在是如何设置的)。使用城市名称输入字符串并从中获取邮政编码的最简单方法是什么?非常感谢您的帮助!谢谢

谷歌可以在这里帮助您!

https://developers.google.com/maps/documentation/geocoding/

zip实际上被谷歌称为"postal_code"。

  "long_name": "94043",
  "short_name": "94043",
  "types": postal_code

例如,假设你想获得密歇根州克拉克斯顿的邮政编码…

http://maps.googleapis.com/maps/api/geocode/json?address=Clarkston+MI&传感器=真实

返回:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Clarkston",
               "short_name" : "Clarkston",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Oakland",
               "short_name" : "Oakland",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Michigan",
               "short_name" : "MI",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "48346",
               "short_name" : "48346",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "Clarkston, MI 48346, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 42.7418310,
                  "lng" : -83.41402409999999
               },
               "southwest" : {
                  "lat" : 42.7252370,
                  "lng" : -83.42880730000002
               }
            },
            "location" : {
               "lat" : 42.73511960,
               "lng" : -83.41929410
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 42.74331460,
                  "lng" : -83.40328670
               },
               "southwest" : {
                  "lat" : 42.72692350,
                  "lng" : -83.43530149999999
               }
            }
         },
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}

编辑

如果你在第一次通话中没有收到邮政编码,你就必须使用第一次通话的坐标对同一网络服务进行第二次通话。仍然非常简单-威斯康星州史蒂文斯角的呼叫如下:

http://maps.googleapis.com/maps/api/geocode/json?latlng=44.52357920000001,-89.5745630&传感器=真实

您可以从"location"获取lat/lng值。希望这能有所帮助!

上面最流行的答案是不完整的。请查看下面我的最新答案,我在这里描述了我个人验证的方法,以从谷歌地图API获得最准确的结果。在一个拥有超过1亿个独特位置的网站上进行了测试。

每个城市都有许多邮政编码。

我以前遇到过这样的问题,当时我必须为混合位置+关键字的网站地图生成超过100万个链接组合。

起初,我尝试添加关键字"中心","中心"&城市名称和国家的"中心",80%的时间都有效,由于我必须完成的工作量,这还不够好。

因此,我一直在寻找更好的解决方案,最终,我为Google Maps Geocode API找到了2个新参数,只需在查询URL中复制/粘贴部分结果。

请注意:谷歌没有记录这一点,虽然它现在正在工作,但将来可能不会工作。

第一个参数:

&components=country:UK // where "UK" is a country of choice, by utilising this method, rather than adding the Country to the City name, you will avoid clashes and reduce the risk of not getting the postcode.

第二个参数:

&location_type=GEOMETRIC_CENTER& // as is, this will get you a place closest to the central geometrical location of the town/city. 

完整示例:

var city_name = 'Edinburgh'; // City/Town/Place Name
var country_code = 'GB'; // Great Britain 
var key = 'AIzaSyBk********************cM' // Google API Key
var query = https://maps.googleapis.com/maps/api/geocode/json?address='+city_name+'&components=country:'+country_code+'&location_type=GEOMETRIC_CENTER&key='+key+'&sensor=false

此外,当通过JSON进行循环时,有时POSTCODE不在结果的第一层次结构中,因此,如果第一行缺少POSTCCODE,请确保通过第二行进行循环。

下面是一个遍历数组的循环示例:

url = geocode_query;
fetch(url)
.then(res => res.json())
.then((out) => {
   result = JSON.parse(out);
   postcode = get_postcode(result); // HERE is Your Postcode do what you need with it
})
.catch(err => { throw err });
function get_postcode(results){ 
    city_data = results['results'][0]['address_components'];
    for(i=0;i<city_data.length;i++){
        var cv = city_data[i];
        if(typeof cv['types'][0] != 'undefined')){
            if(cv['types'][0] === 'postal_code'){
                city['postcode'] = cv['long_name'];
            }else if(cv['types'][0] === 'postal_town'){
                city['place_name'] = cv['postal_town'];
            }
        }
    }
    if(typeof city == 'undefined'){
        city_data = results['results'][1]['address_components'];
        for(i=0;i<city_data.length;i++){
            var cv = city_data[i];
            if(typeof cv['types'][0] != 'undefined')){
                if(cv['types'][0] === 'postal_code'){
                    city['postcode'] = cv['long_name'];
                }
            }
        }
    }
    return city;
}

享受吧!

我这样做的方式是进行两次调用。

    On the first call my query is: geocode('address=' .$cty. ',' .$st, $key);
    $cty = city name - $st = state abbreviation - $key is my api key
    -
    On the second call my query is: geocode('latlng=' .$lat. "," .$lng, $key);
    $lat = latitude from first call - $lng = longitude from first call
---------
My function appears below.
--------------------------------------   
    function geocode($query, $key){
        global $lat, $lng, $zipcode, $city, $state;
        $url = 'https://maps.googleapis.com/maps/api/geocode/json?'.$query.'&key='.$key;
        $json_string = curlfun($url); // this uses CURL to access the url (false on fail)
        if($json_string){
            $parsed_json = json_decode($json_string, true);
        //  
            if ($parsed_json['status'] == "OK"){
                $lat = $parsed_json['results'] [0] ['geometry'] ['location'] ['lat'];
                $lng = $parsed_json['results'] [0] ['geometry'] ['location'] ['lng'];
                foreach($parsed_json['results'] [0] ['address_components'] as $a){
                    if($a ['types'] [0] == 'postal_code') $zipcode = $a ['long_name'];
                    if($a ['types'] [0] == 'locality') $city = $a ['long_name'];
                    if($a ['types'] [0] == 'administrative_area_level_1') $state = $a ['short_name'];   
                    }
                }
            else return false;
            }
        else return false;
        if(!$city) return false; // if there is no city just return false.
    return true;
        }
    ---------------------------------------------------

在函数调用之后,全局变量可用于脚本的其余部分。函数在失败时返回false,在成功时返回true。应该在主代码中进行适当的错误处理。

var res; // store response in res variable
var add_array  = res[0].address_components; //add_array = {
               "long_name" : "Clarkston",
               "short_name" : "Clarkston",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Oakland",
               "short_name" : "Oakland",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Michigan",
               "short_name" : "MI",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United States",
               "short_name" : "US",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "48346",
               "short_name" : "48346",
               "types" : [ "postal_code" ]
            }
    var add_array = add_array[add_array.length-1]; //add_array = {
                   "long_name" : "48346",
                   "short_name" : "48346",
                   "types" : [ "postal_code" ]
                }
    var zip = add_array.long_name;  //zip = 48346

最新更新