使用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'];
}
});
};
当然,这段代码实际上并不起作用。所以我想知道如何改变这个以便从结果数组中提取邮政编码。 谢谢
好吧,所以我明白了。该解决方案比我想要的有点丑,我可能不需要最后一个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;
}
}
}
}
这不适用于我,我正在检查爱荷华州爱荷华州的邮政编码,它出现未定义。 – 2014-10-09 15:18:01
这应该是获得批准的答案。这适用于没有将邮政编码作为最后一个组件的地址。 – jmiraglia 2015-01-05 15:30:31
嗨@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没有通过你刚刚所经历的循环柔术去一个更优雅的方式。
我希望你是对的,也许我只是不明白你应该如何与对象进行交互。如果你看教程的东西,很明显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;
啊,我们走了。这是一个很干净的地狱。谢谢 – 2011-03-18 15:51:17
我不得不使用'address.length - 2'不知道你为什么不同? – 2014-07-08 11:52:50
自从我发表了这个答案之后,我花了很长时间,但是我记得在另一个项目中,我发现索引会根据结果而变化。换句话说,邮政编码有时可能不是最后一项。 – 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;
}
}
}
这一个确实为衣阿华州爱荷华市工作:) – 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。
有时您不会收到“邮政编码”作为您的查询的回报。
这是一个很好的解决方法。谢谢。 – 2015-02-02 16:48:18
它第一次工作! – 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
感谢好友,相当不错的单行使用underscore.js'find() – jpincheira 2012-04-17 10:50:51
下划线黑客非常好。我没有在我当前的项目中使用下划线,我不想为它添加另一个库,但我将这个答案加入书签: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;
}
}
});
使用自动完成文本框,您可以获得所需的邮政地址, – 2016-09-02 18:07:36
请添加你的答案有点解释。它可以帮助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!!');
}
});
}
如果你想要经纬度,只需从上述两行中删除注释部分即可。 – 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; }
}
编辑:它看起来像我别无选择,只能通过地址部件进行迭代并搜索一个与类型[0 ] =='邮政编码'? 有没有更好的方法来做到这一点? – 2011-03-17 15:28:36
@RomainM是的,我会假设,除非你想手动解析它的结果 – kjy112 2011-03-17 15:31:41
是的,你必须通过数组,并寻找在'types'数组中有'postal_code'的元素,这可能是最后的首先或任何地方之间。此外,哪些元素?您可能想要从'results [0] .address_components'或从'results'本身获取邮政编码:尝试使用两者,并查看在您关心的区域中哪些方法最好。一般来说,如果您关心的是完整地址的地方,我会推荐'results [0] .address_components';如果您在获取的邮政代码中严格控制您的latlng,则会推荐'results'。 – miguev 2016-07-08 15:14:19