地址地理编码 - 获取某个地址的区域(谷歌API)

7

我有一个包含确切地址(街道、门牌号、城市、区域/地区、国家)的数据库。不过,我想知道是否有一种方法可以使用 Google API 获取一个城市的行政区划(例如,“曼哈顿”),如果我们在纽约的话?

除了行政区划以外,我已经拥有了所有其他信息,所以我只需要行政区划(当然,这仅适用于大城市)...

更新:

我在http://www.techques.com/question/1-3151450/Google-geolocation-API---Use-longitude-and-latitude-to-get-address上找到了这个函数,并尝试将formatted_address更改为子区域(甚至像short_name这样的其他内容),但它没有返回任何内容......任何帮助都将不胜感激!谢谢!!

function reverse_geocode($lat, $lon) {
    $url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false";
    $data = json_decode(file_get_contents($url));
    if (!isset($data->results[0]->formatted_address)){
        return "unknown Place";
    }
    return $data->results[0]->formatted_address;
}
3个回答

7
您可以这样访问子地区:
function reverse_geocode($lat, $lon) {
    $url = "http://maps.google.com/maps/api/geocode/json?latlng=$lat,$lon&sensor=false";
    $data = json_decode(file_get_contents($url));
    if (!isset($data->results[0]->address_components)){
        return "unknown Place";
    }

    if ($data->results[0]->address_components[2]->types[0]=="sublocality") {

        $return_array['type']="sublocality";
        $return_array['sublocality_long_name']=$data->results[0]->address_components[2]->long_name;
        $return_array['sublocality_short_name']=$data->results[0]->address_components[2]->short_name;

        return $return_array;
        }

}

3
当使用types属性进行设置时,在地理编码请求中存在结果时,您将在其中找到此信息。
 [ "sublocality", "political" ]

示例:317 Madison Ave, New York City


修改上述函数以便更轻松地访问响应组件:

  /**
    * @param $a mixed latitude or address
    * @param $b mixed optional longitude when $a is latitude
    * @return object geocoding-data
    **/

    function geocode($a, $b=null) {
    $params=array('sensor'=>'false');
    if(is_null($b))
    {
      $params['address']=$a;
    }
    else
    {
      $params['latlng']=implode(',',array($a,$b));
    }
    $url = 'http://maps.google.com/maps/api/geocode/json?'.http_build_query($params,'','&');
    $result=@file_get_contents($url);

     $response=new StdClass;
     $response->street_address               = null;
     $response->route                        = null;
     $response->country                     = null;
     $response->administrative_area_level_1 = null;
     $response->administrative_area_level_2 = null;
     $response->administrative_area_level_3 = null;
     $response->locality                    = null;
     $response->sublocality                 = null;
     $response->neighborhood                = null;
     $response->postal_code                 = null;
     $response->formatted_address           = null;
     $response->latitude                    = null;
     $response->longitude                   = null;
     $response->status                      = 'ERROR';

    if($result)
    {
      $json=json_decode($result);
      $response->status=$json->status;
      if($response->status=='OK')
      {
        $response->formatted_address=$json->results[0]->formatted_address;
        $response->latitude=$json->results[0]->geometry->location->lat;
        $response->longitude=$json->results[0]->geometry->location->lng;

        foreach($json->results[0]->address_components as $value)
        {
          if(array_key_exists($value->types[0],$response))
          {
            $response->{$value->types[0]}=$value->long_name;
          }
        }
      }
    }
  return $response;
}

//sample usage
echo '<hr/>'.geocode('317 Madison Ave,New York City')->sublocality;
  //Manhattan

echo '<hr/>'.geocode('foobar')->status;
  //ZERO_RESULTS

echo '<hr/>'.geocode('40.689758, -74.04513800000001')->formatted_address;
  //1 Liberty Is, Brooklyn, NY 11231, USA

谢谢Molle博士的回答和帮助!我找到了这个函数(请参见我的帖子更新),但如果我只是将formatted_address更改为其他内容,它会返回“未知地址”...您有任何想法如何仅使用此函数获取子地区? - Helmut
添加了一个修改过的函数,以便更轻松地访问响应的单个组件。 - Dr.Molle

0
我想到了以下内容。

function geocode() {
    var geocoder = new google.maps.Geocoder();
    var lat  = $('#latitude').val()
    var lng  = $('#longitude').val()
    var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)};

  geocoder.geocode(
    {'location': latlng},
    function(results, status) {
      if (status === 'OK') {
        for (var i = 0; i < results[0].address_components.length; i++)
        {
          if (status == google.maps.GeocoderStatus.OK) {
        if (results[0]) {
         for (var i = 0; i < results.length; i++) {
                //alert(results[i].types[0]+','+results[i].types[1]+','+results[i].address_components[0].long_name)
                //district
                if (results[i].types[0]=='political' && results[i].types[1]=='sublocality' ){
                  alert(results[i].address_components[0].long_name);
                }
                //City
                if (results[i].types[0]=='locality' && results[i].types[1]=='political' ){
                  alert(results[i].address_components[0].long_name);
                }
                //country
                if (results[i].types[0]=='country' && results[i].types[1]=='political' ){
                  alert(results[i].address_components[0].long_name);
                }
         }
        }
        else {console.log("No reverse geocode results.")}
       }
       else {console.log("Geocoder failed: " + status)}


        }
  }})
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


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