在Google地图反向地理编码中获取确定的城市名称

时间:2014-12-17 11:19:18

标签: javascript google-maps google-maps-api-3

使用Google Maps Geocoding API,我可以获取特定坐标的格式化地址。要获得确切的城市名称,我正在执行以下操作:

$.ajax({
    url: 'http://maps.googleapis.com/maps/api/geocode/json?latlng='+lat+','+long+'&sensor=false',
    success: function(data){
        var formatted = data.results;
        var address_array = formatted[6].formatted_address.split(',');
        var city = address_array[0];
   }
});

其中使用浏览器坐标派生latlong。我的问题如下:

从坐标19.210072.1800,我将城市视为Mumbai,但是从距离大约3公里的类似坐标集中,我将城市视为Mumbai Suburban。如何在不更改代码成功功能的情况下获取Mumbai?在我看来,结果数组并不总是坚持在我显示城市名称时产生问题的相同格式。

3 个答案:

答案 0 :(得分:4)

所以我今天试图解决这个问题,如果能帮到任何人,我会找到这个解决方案。 Google地图附带了现在内置的Geocoder,因此您只需在API加载后创建地理编码器对象。

您可以轻松地将其包装在一个函数中,然后返回一个包含城市,州和邮政编码的对象。这个网站有助于我看到不同的'类型'意思是:Reverse Geocoding

var geocoder = new google.maps.Geocoder,
    latitude = 28.54, //sub in your latitude
    longitude = -81.39, //sub in your longitude
    postal_code,
    city,
    state;
geocoder.geocode({'location': {lat:latitude, lng:longitude}}, function(results, status) {
  if (status === google.maps.GeocoderStatus.OK) {
    results.forEach(function(element){
      element.address_components.forEach(function(element2){
        element2.types.forEach(function(element3){
          switch(element3){
            case 'postal_code':
              postal_code = element2.long_name;
              break;
            case 'administrative_area_level_1':
              state = element2.long_name;
              break;
            case 'locality':
              city = element2.long_name;
              break;
          }
        })
      });
    });
  }
});

答案 1 :(得分:3)

您需要查看结果的类型,而不是结果数组中的绝对索引。遍历结果数组,查找具有相应type的条目。看起来像是:

  • locality表示合并的城市或城镇政治实体

但数据可能因地区而异。

相关问题:Grabbing country from google geocode jquery

看起来你想要同时拥有' locality'和政治'类型:

{
   "long_name" : "Mumbai",
   "short_name" : "Mumbai",
   "types" : [ "locality", "political" ]
}

答案 2 :(得分:0)

对于它的价值,我一直在寻找类似的东西,并且正在尝试https://plus.codes/

如果剥离编码后的位,则会产生一个相当一致的城市,州,国家/地区名称:

const extractCityName = latlng => {
  googleMapsClient.reverseGeocode({ latlng }, (err, response) => {
    if (!err) {
      return response.json.plus_code.compound_code.split(' ').slice(1).join(' ');
    }
  });
};


// examples: 

console.log(extractCityName(40.6599718,-73.9817292));
// New York, NY, USA

console.log(extractCityName(37.386052, -122.083851));
// Mountain View, CA, USA

console.log(extractCityName(51.507351, -0.127758));
// Westminster, London, UK