从地址解析器结果中获取城市?

| 从地址解析器获取不同数组内容时遇到问题。 item.formatted_address有效,但item.address_components.locality无效吗?
geocoder.geocode( {\'address\': request.term }, function(results, status) {

        response($.map(results, function(item) {

        alert(item.formatted_address+\" \"+item.address_components.locality)
    }            
}); 
//返回的数组是;
 \"results\" : [
      {
         \"address_components\" : [
            {
               \"long_name\" : \"London\",
               \"short_name\" : \"London\",
               \"types\" : [ \"locality\", \"political\" ]
            } ],
          \"formatted_address\" : \"Westminster, London, UK\" // rest of array...
任何帮助表示赞赏! 直流电     
已邀请:
        最后使用以下命令完成此工作:
var arrAddress = item.address_components;
var itemRoute=\'\';
var itemLocality=\'\';
var itemCountry=\'\';
var itemPc=\'\';
var itemSnumber=\'\';

// iterate through address_component array
$.each(arrAddress, function (i, address_component) {
    console.log(\'address_component:\'+i);

    if (address_component.types[0] == \"route\"){
        console.log(i+\": route:\"+address_component.long_name);
        itemRoute = address_component.long_name;
    }

    if (address_component.types[0] == \"locality\"){
        console.log(\"town:\"+address_component.long_name);
        itemLocality = address_component.long_name;
    }

    if (address_component.types[0] == \"country\"){ 
        console.log(\"country:\"+address_component.long_name); 
        itemCountry = address_component.long_name;
    }

    if (address_component.types[0] == \"postal_code_prefix\"){ 
        console.log(\"pc:\"+address_component.long_name);  
        itemPc = address_component.long_name;
    }

    if (address_component.types[0] == \"street_number\"){ 
        console.log(\"street_number:\"+address_component.long_name);  
        itemSnumber = address_component.long_name;
    }
    //return false; // break the loop   
});
    
        尝试了几个不同的请求: MK107BX 英国克利夫兰公园新月 就像您说的那样,返回的数组大小不一致,但是两个结果的Town似乎都在address_component项中,其类型为[\“ locality \”,\“ political \”]。也许您可以将其用作指标? 编辑:使用jQuery获取位置对象,将此添加到您的响应函数:
var arrAddress = item.results[0].address_components;
// iterate through address_component array
$.each(arrAddress, function (i, address_component) {
    if (address_component.types[0] == \"locality\") // locality type
        console.log(address_component.long_name); // here\'s your town name
        return false; // break the loop
    });
    
        我必须创建一个程序,当用户单击地图上的某个位置时,该程序将在用户表单中填写纬度,经度,城市,县和州字段。该页面可以在http://krcproject.groups.et.byu.net上找到,并且是一种用户表单,允许公众为数据库做出贡献。我没有声称自己是专家,但是效果很好。
<script type=\"text/javascript\">
  function initialize() 
  {
    //set initial settings for the map here
    var mapOptions = 
    {
      //set center of map as center for the contiguous US
      center: new google.maps.LatLng(39.828, -98.5795),
      zoom: 4,
      mapTypeId: google.maps.MapTypeId.HYBRID
    };

    //load the map
    var map = new google.maps.Map(document.getElementById(\"map\"), mapOptions);

    //This runs when the user clicks on the map
    google.maps.event.addListener(map, \'click\', function(event)
    {
      //initialize geocoder
      var geocoder = new google.maps.Geocoder()

      //load coordinates into the user form
      main_form.latitude.value = event.latLng.lat();
      main_form.longitude.value = event.latLng.lng();

      //prepare latitude and longitude
      var latlng = new google.maps.LatLng(event.latLng.lat(), event.latLng.lng());

      //get address info such as city and state from lat and long
      geocoder.geocode({\'latLng\': latlng}, function(results, status) 
      {
        if (status == google.maps.GeocoderStatus.OK) 
        {
          //break down the three dimensional array into simpler arrays
          for (i = 0 ; i < results.length ; ++i)
          {
            var super_var1 = results[i].address_components;
            for (j = 0 ; j < super_var1.length ; ++j)
            {
              var super_var2 = super_var1[j].types;
              for (k = 0 ; k < super_var2.length ; ++k)
              {
                //find city
                if (super_var2[k] == \"locality\")
                {
                  //put the city name in the form
                  main_form.city.value = super_var1[j].long_name;
                }
                //find county
                if (super_var2[k] == \"administrative_area_level_2\")
                {
                  //put the county name in the form
                  main_form.county.value = super_var1[j].long_name;
                }
                //find State
                if (super_var2[k] == \"administrative_area_level_1\")
                {
                  //put the state abbreviation in the form
                  main_form.state.value = super_var1[j].short_name;
                }
              }
            }
          }
        }
      });
    });
  }
</script>
    
        我假设您想获得城市和州/省:
var map_center = map.getCenter();
reverseGeocode(map_center);


function reverseGeocode(latlng){
  geocoder.geocode({\'latLng\': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
            var level_1;
            var level_2;
            for (var x = 0, length_1 = results.length; x < length_1; x++){
              for (var y = 0, length_2 = results[x].address_components.length; y < length_2; y++){
                  var type = results[x].address_components[y].types[0];
                    if ( type === \"administrative_area_level_1\") {
                      level_1 = results[x].address_components[y].long_name;
                      if (level_2) break;
                    } else if (type === \"locality\"){
                      level_2 = results[x].address_components[y].long_name;
                      if (level_1) break;
                    }
                }
            }
            updateAddress(level_2, level_1);
       } 
  });
}

function updateAddress(city, prov){
   // do what you want with the address here
}
不要尝试返回结果,因为您会发现它们是未定义的-异步服务的结果。您必须调用一个函数,例如updateAddress();。     
        我认为,谷歌没有提供某种功能来获取这些是很痛苦的。无论如何,我认为找到正确对象的最佳方法是:
geocoder.geocode({\'address\': request.term }, function(results, status){

   response($.map(results, function(item){

      var city = $.grep(item.address_components, function(x){
         return $.inArray(\'locality\', x.types) != -1;
      })[0].short_name;

      alert(city);
   }            
}); 
    
        这为我工作:
const localityObject = body.results[0].address_components.filter((obj) => {
  return obj.types.includes(\'locality\');
})[0];
const city = localityObject.long_name;
或一口气:
const city = body.results[0].address_components.filter((obj) => {
  return obj.types.includes(\'locality\');
)[0].long_name;
我正在Node中执行此操作,所以没关系。如果您需要支持IE,则需要使用fill9的polyfill或另一种方法。     
        
// Use Google Geocoder to get Lat/Lon for Address
function codeAddress() {
    // Function geocodes address1 in the Edit Panel and fills in lat and lon
    address = document.getElementById(\"tbAddress\").value;
    geocoder.geocode({ \'address\': address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            loc[0] = results[0].geometry.location.lat();
            loc[1] = results[0].geometry.location.lng();
            document.getElementById(\"tbLat\").value = loc[0];
            document.getElementById(\"tbLon\").value = loc[1];
            var arrAddress = results[0].address_components;
            for (ac = 0; ac < arrAddress.length; ac++) {
                if (arrAddress[ac].types[0] == \"street_number\") { document.getElementById(\"tbUnit\").value = arrAddress[ac].long_name }
                if (arrAddress[ac].types[0] == \"route\") { document.getElementById(\"tbStreet\").value = arrAddress[ac].short_name }
                if (arrAddress[ac].types[0] == \"locality\") { document.getElementById(\"tbCity\").value = arrAddress[ac].long_name }
                if (arrAddress[ac].types[0] == \"administrative_area_level_1\") { document.getElementById(\"tbState\").value = arrAddress[ac].short_name }
                if (arrAddress[ac].types[0] == \"postal_code\") { document.getElementById(\"tbZip\").value = arrAddress[ac].long_name }
            }
            document.getElementById(\"tbAddress\").value = results[0].formatted_address;
        }
        document.getElementById(\"pResult\").innerHTML = \'GeoCode Status:\' + status;
    })
}
    
        
            //if (arrAddress[ac].types[0] == \"street_number\") { alert(arrAddress[ac].long_name) } // SOKAK NO
            //if (arrAddress[ac].types[0] == \"route\") { alert(arrAddress[ac].short_name); } // CADDE
            //if (arrAddress[ac].types[0] == \"locality\") { alert(arrAddress[ac].long_name) } // İL
            //if (arrAddress[ac].types[0] == \"administrative_area_level_1\") { alert(arrAddress[ac].short_name) } // İL
            //if (arrAddress[ac].types[0] == \"postal_code\") { alert(arrAddress[ac].long_name); } // POSTA KODU
            //if (arrAddress[ac].types[0] == \"neighborhood\") { alert(arrAddress[ac].long_name); } // Mahalle
            //if (arrAddress[ac].types[0] == \"sublocality\") { alert(arrAddress[ac].long_name); } // İlçe
            //if (arrAddress[ac].types[0] == \"country\") { alert(arrAddress[ac].long_name); } // Ülke
    
        这是可以与lodash js库一起使用的一些代码:(只需将$ scope.x替换为您自己的变量名即可存储值)
    _.findKey(vObj.address_components, function(component) {

            if (component.types[0] == \'street_number\') {
                $scope.eventDetail.location.address = component.short_name
            }

            if (component.types[0] == \'route\') {
                $scope.eventDetail.location.address = $scope.eventDetail.location.address + \" \" + component.short_name;
            }

            if (component.types[0] == \'locality\') {
                $scope.eventDetail.location.city = component.long_name;
            }

            if (component.types[0] == \'neighborhood\') {
                $scope.eventDetail.location.neighborhood = component.long_name;
            }

        });
    
        我使用了一个名为find的lodash函数,该函数返回谓词为其返回true的对象。就如此容易!
let city = find(result, (address) => {
  return typeof find(address.types, (a) => { return a === \'locality\'; }) === \'string\';
});
    
        如果存在,则返回位置。如果不是,则返回
administrative_area_1
city = results[0].address_components.filter(function(addr){
   return (addr.types[0]==\'locality\')?1:(addr.types[0]==\'administrative_area_level_1\')?1:0;
});
    

要回复问题请先登录注册