使用Google Maps Javascript API获取邮政编码V3反向地理编码

问题描述:

我试图使用邮政编码将数据提交到我的数据库,只要Google地图视口中心发生更改。我知道这可以通过反向地理编码来完成,例如:使用Google Maps Javascript API获取邮政编码V3反向地理编码

google.maps.event.addListener(map, 'center_changed', function(){ 
newCenter(); 
}); 
... 
function newCenter(){ 
var newc = map.getCenter(); 
geocoder.geocode({'latLng': newc}, function(results, status){ 
if (status == google.maps.GeocoderStatus.OK) { 
    var newzip = results[0].address_components['postal_code']; 
    } 
}); 
}; 

当然,这段代码实际上并不起作用。所以我想知道如何改变这个以便从结果数组中提取邮政编码。 谢谢

+0

编辑:它看起来像我别无选择,只能通过地址部件进行迭代并搜索一个与类型[0 ] =='邮政编码'? 有没有更好的方法来做到这一点? – 2011-03-17 15:28:36

+0

@RomainM是的,我会假设,除非你想手动解析它的结果 – kjy112 2011-03-17 15:31:41

+0

是的,你必须通过数组,并寻找在'types'数组中有'postal_code'的元素,这可能是最后的首先或任何地方之间。此外,哪些元素?您可能想要从'results [0] .address_components'或从'results'本身获取邮政编码:尝试使用两者,并查看在您关心的区域中哪些方法最好。一般来说,如果您关心的是完整地址的地方,我会推荐'results [0] .address_components';如果您在获取的邮政代码中严格控制您的latlng,则会推荐'results'。 – miguev 2016-07-08 15:14:19

好吧,所以我明白了。该解决方案比我想要的有点丑,我可能不需要最后一个for循环,但是这里是需要从address_components []中提取垃圾的其他人的代码。这是地理编码器回拨功能

for(i; i < results.length; i++){ 
      for(var j=0;j < results[i].address_components.length; j++){ 
       for(var k=0; k < results[i].address_components[j].types.length; k++){ 
        if(results[i].address_components[j].types[k] == "postal_code"){ 
         zipcode = results[i].address_components[j].short_name; 
        } 
       } 
      } 
    } 
+0

这不适用于我,我正在检查爱荷华州爱荷华州的邮政编码,它出现未定义。 – 2014-10-09 15:18:01

+0

这应该是获得批准的答案。这适用于没有将邮政编码作为最后一个组件的地址。 – jmiraglia 2015-01-05 15:30:31

+1

嗨@SamCromer我测试了上面的代码,答案也未定义。也许你也忘了在for循环之前把var i = 0。我补充说,它工作得很好! – 2015-01-15 00:38:54

总之,这是一个很大的努力。至少与V2 API,我也正是如此检索这些细节:

var place = response.Placemark[0]; 
var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]); 

myAddress = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName 

myCity = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName 

myState = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName 

myZipCode = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber 

有一定是检索各address_components没有通过你刚刚所经历的循环柔术去一个更优雅的方式。

+0

我希望你是对的,也许我只是不明白你应该如何与对象进行交互。如果你看教程的东西,很明显address_components是一个数组,因为Javascript没有关联数组,所以我能想到的唯一方法就是使用循环 http://code.google.com/ apis/maps/documentation/javascript/services.html#GeocodingResponses – 2011-03-17 22:43:07

我到目前为止已经意识到的是,在大多数情况下的ZIPCODE是总是内的每个最后一个返回值的地址,所以,如果你想要检索的第一个邮政编码(这是我的情况),您可以使用以下方法:

var address = results[0].address_components; 
var zipcode = address[address.length - 1].long_name; 
+0

啊,我们走了。这是一个很干净的地狱。谢谢 – 2011-03-18 15:51:17

+0

我不得不使用'address.length - 2'不知道你为什么不同? – 2014-07-08 11:52:50

+2

自从我发表了这个答案之后,我花了很长时间,但是我记得在另一个项目中,我发现索引会根据结果而变化。换句话说,邮政编码有时可能不是最后一项。 – Tuco 2014-07-10 01:17:42

这只需要两个for循环。一旦我们发现第一个“类型”为“postal_code”,“结果”数组就会更新。

然后它使用新找到的数组集合更新原始数组并再次循环。

  var i, j, 
      result, types; 

      // Loop through the Geocoder result set. Note that the results 
      // array will change as this loop can self iterate. 
      for (i = 0; i < results.length; i++) { 

       result = results[i]; 

       types = result.types; 

       for (j = 0; j < types.length; j++) { 

        if (types[j] === 'postal_code') { 

         // If we haven't found the "long_name" property, 
         // then we need to take this object and iterate through 
         // it again by setting it to our master loops array and 
         // setting the index to -1 
         if (result.long_name === undefined) { 
          results = result.address_components; 
          i = -1; 
         } 
         // We've found it! 
         else { 
          postcode = result.long_name; 
         } 

         break; 

        } 

       } 

      } 
+0

这一个确实为衣阿华州爱荷华市工作:) – 2014-10-09 15:20:04

使用JQuery?

var searchAddressComponents = results[0].address_components, 
    searchPostalCode=""; 

$.each(searchAddressComponents, function(){ 
    if(this.types[0]=="postal_code"){ 
     searchPostalCode=this.short_name; 
    } 
}); 

SHORT_NAME或LONG_NAME将工作上面
的“searchPostalCode”变种将包含邮政(ZIP?)代码,如果 且仅当你得到一个从谷歌地图API。

有时您不会收到“邮政编码”作为您的查询的回报。

+1

这是一个很好的解决方法。谢谢。 – 2015-02-02 16:48:18

+1

它第一次工作! – 2016-04-07 03:41:46

places.getDetails(request_details, function(results_details, status){ 

       // Check if the Service is OK 
       if (status == google.maps.places.PlacesServiceStatus.OK) {     

        places_postal   = results_details.address_components 
        places_phone   = results_details.formatted_phone_number 
        places_phone_int  = results_details.international_phone_number 
        places_format_address = results_details.formatted_address 
        places_google_url  = results_details.url 
        places_website   = results_details.website 
        places_rating   = results_details.rating 

        for (var i = 0; i < places_postal.length; i++) { 
         if (places_postal[i].types == "postal_code"){ 
          console.log(places_postal[i].long_name) 
         } 
        } 

       } 
      }); 

这似乎对我很好,这是与新的谷歌地图API V3。如果这对任何人都有帮助,请发表评论,我正在讲我的脚本......所以它可能会改变。

你可以做到这一点很容易地使用underscore.js libraray:http://documentcloud.github.com/underscore/#find

_.find(results[0].address_components, function (ac) { return ac.types[0] == 'postal_code' }).short_name 
+0

感谢好友,相当不错的单行使用underscore.js'find() – jpincheira 2012-04-17 10:50:51

+0

下划线黑客非常好。我没有在我当前的项目中使用下划线,我不想为它添加另一个库,但我将这个答案加入书签:D – 2015-01-15 00:37:38

这个简单的代码对我的作品

for (var i = 0; i < address.length; i++) { 
     alert(address[i].types); 
     if (address[i].types == "postal_code") 
      $('#postalCode').val(address[i].long_name); 
     if (address[i].types == "") 
      $('#country').val(address[i].short_name); 
    } 

使用jQuery

  • 你不能肯定在address_components数组中的哪个位置存储邮政编码。有时在address_components中。长度 - 1> pincode可能不在那里。这在“地址到地址”地理编码中是正确的。
  • 您可以确定邮政编码将包含“邮政编码”字符串。所以最好的方法是检查。
var postalObject = $.grep(results[0].address_components, function(n, i) { 
            if (n.types[0] == "postal_code") { 
             return n; 
            } else { 
             return null; 
            } 
           }); 

           $scope.query.Pincode = postalObject[0].long_name; 

return $http.get('//maps.googleapis.com/maps/api/geocode/json', { 
      params: { 
       address: val, 
       sensor: false 
      } 
     }).then(function (response) { 
      var model= response.data.results.map(function (item) { 
       // return item.address_components[0].short_name; 
       var short_name; 
      var st= $.each(item.address_components, function (value, key) { 
        if (key.types[0] == "postal_code") { 
         short_name= key.short_name; 
        } 
       }); 
      return short_name; 

      }); 
       return model; 
     }); 

使用JSONPath,它很容易用一行代码完成:

var zip = $.results[0].address_components[?(@.types=="postal_code")].long_name; 

//autocomplete is the text box where u will get the suggestions for an address. 

autocomplete.addListener('place_changed', function() { 
//Place will get the selected place geocode and returns with the address    
//and marker information. 
     var place = autocomplete.getPlace(); 
//To select just the zip code of complete address from marker, below loop //will help to find. Instead of y.long_name you can also use y.short_name. 
     var zipCode = null; 
     for (var x = 0 ; x < place.address_components.length; x++) { 
      var y = place.address_components[x]; 
      if (y.types[0] == 'postal_code') { 
       zipCode = y.long_name; 
      } 
     } 
    }); 
+0

使用自动完成文本框,您可以获得所需的邮政地址, – 2016-09-02 18:07:36

+1

请添加你的答案有点解释。它可以帮助OP了解你在这里发布的内容。 – 2016-09-02 18:11:29

您也可以使用此代码,这个功能将有助于在获取压缩按钮点击或onblur或keyup或keydown。

只需将地址传递给此函数即可。

使用带有效密钥和传感器选项的google api,因为它现在不需要。

function callZipAPI(addSearchZip) 
{  
    var geocoder = new google.maps.Geocoder(); 
    var zipCode = null; 

    geocoder.geocode({ 'address': addSearchZip }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 

      //var latitude = results[0].geometry.location.lat(); 
      //var longitude = results[0].geometry.location.lng(); 

      var addressComponent = results[0].address_components;    
      for (var x = 0 ; x < addressComponent.length; x++) { 
       var chk = addressComponent[x]; 
       if (chk.types[0] == 'postal_code') { 
        zipCode = chk.long_name; 
       } 
      } 
      if (zipCode) { 
       alert(zipCode); 
      } 
      else { 
       alert('No result found!!'); 
      } 
     } else {    
      alert('Enter proper address!!'); 
     } 
    }); 
} 
+0

如果你想要经纬度,只需从上述两行中删除注释部分即可。 – 2016-09-05 12:17:08

在PHP中,我使用这段代码。几乎在任何情况下它都可以工作。

$zip = $data["results"][3]["address_components"]; 
$zip = $index[0]["short_name"]; 

看来,现在它是更好地从宁静的API得到它,只需尝试:

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&key=YOUR_KEY_HERE

使用一个AJAX GET调用运行完美!

喜欢的东西:

var your_api_key = "***"; 
var f_center_lat = 40.714224; 
var f_center_lon = -73.961452; 

$.ajax({ url: "https://maps.googleapis.com/maps/api/geocode/json?latlng="+f_center_lat+","+f_center_lon+"&key="+your_api_key, 
      method: "GET" 
     }) 
     .done(function(res) { if (debug) console.log("Ajax result:"); console.log(res); 
      var zipCode = null; 
      var addressComponent = res.results[0].address_components; 
      for (var x = 0 ; x < addressComponent.length; x++) { 
       var chk = addressComponent[x]; 
       if (chk.types[0] == 'postal_code') { 
        zipCode = chk.long_name; 
       } 
      } 
      if (zipCode) { 
       //alert(zipCode); 
       $(current_map_form + " #postalcode").val(zipCode); 
      } 
      else { 
       //alert('No result found!!'); 
       if (debug) console.log("Zip/postal code not found for this map location.") 
      } 
     }) 
     .fail(function(jqXHR, textStatus) { 
      console.log("Request failed (get postal code via geocoder rest api). Msg: " + textStatus); 
     }); 

罗曼M. - 谢谢!如果你只需要找到从谷歌返回的第一个结果的邮政编码,你可以做2个循环:

for(var j=0;j < results[0].address_components.length; j++){ 
    for(var k=0; k < results[0].address_components[j].types.length; k++){ 
     if(results[0].address_components[j].types[k] == "postal_code"){ 
      zipcode = results[0].address_components[j].long_name; 
     } 
    } 
} 

我用这个代码来获得“邮政编码”和“地方”,但您可以使用它得到任何其他领域只是改变类型的值:

JAVASCRIPT

var address = results[0].address_components; 
var zipcode = ''; 
var locality = ''; 

for (var i = 0; i < address.length; i++) { 
    if (address[i].types.includes("postal_code")){ zipcode = address[i].short_name; }  
    if (address[i].types.includes("locality")){ locality = address[i].short_name; } 
}