从地理编码结果中获取城市?

从Geocoder结果中获取不同的数组内容时遇到问题。

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... 

任何帮助赞赏!

DC

得到这个工作到底使用:

 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似乎是在types为[“locality”,“political”]的address_component项目中。 也许你可以用它作为一个指标?

编辑 :使用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 }); 

当用户点击地图上的一个位置时,我必须创build一个程序来填写用户表单中的纬度,经度,城市,县和州的字段。 该页面可以在http://krcproject.groups.et.byu.netfind,并且是一个允许公众贡献数据库的用户表单。; 我不是自称是专家,但是效果很好。

 <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 } 

不要试图返回结果,因为您会发现它们是未定义的 – 这是asynchronous服务的结果。 你必须调用一个函数,比如updateAddress();

我认为这是一个真正的痛苦,谷歌不提供某种function来获得这些。 无论如何,我认为find正确的对象的最佳方式是:

 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); } }); 
 // 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库的代码:(只需要用你自己的variables名replace$ 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; });