执行地理定位请求时获取UK outcode(邮政编码前缀)

时间:2015-02-02 17:22:52

标签: jquery google-maps-api-3

在SA的帮助下,当用户想要对其当前位置进行地理定位时,我设法获得了lat,lng和viewport边界。

今天,我们有人问我们是否也可以从请求中获取outcode(“postal_code_prefix”)。这是英国邮政编码的前三/四位数字。我说这应该不是问题,我甚至可以在控制台中看到outcode。我在这个帖子上读到Retrieving Postal Code with Google Maps Javascript API V3 Reverse Geocode,有几个好的和坏的答案,最简洁的是:

for (i = 0; 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_prefix") {
                outcode = results[i].address_components[j].short_name;
            } else if (results[i].address_components[j].types[k] == "postal_code") {
                outcode = results[i].address_components[j].short_name;
            }
        }
    }
}

我已经在3台不同的计算机上测试了它,并且它运行得很好。任何人都可以看到这个或改进的缺点吗?例如,拥有单行解决方案是理想的,例如:

var outcode = results[1].address_components.postal_code_prefix.short_name();

我搜索了一整天,发现没有简单的解决方案。

非常感谢。

1 个答案:

答案 0 :(得分:0)

所以,尽管对一个完全有效的问题进行了非理性的投票,但对于那些希望通过Google地方信息自动填充功能获得英国邮政编码的人来说,我有一个解决方案。

if (place.address_components) {
    for(var i=0; i < place.address_components.length; i++) {
    var component = place.address_components[i];
    if(component.types[0] == "postal_code_prefix") {
        outcode = component.long_name;
    } else if((component.types[0] == "postal_code") && (component.types[0] != "postal_code_prefix")) {
        zipcode = component.long_name;
        zipcode = zipcode.split(' ');
        outcode = zipcode[0];
        }
    } else {
        outcode = reverse_geocode(lat, lng);
    }
}

基本上我所做的就是告诉函数从Places中找到postal_code或postal_code_prefix,如果两者都没找到,那么从place.geometry.location.lat()获取纬度和经度;和place.geometry.location.lng();并将这些转发给反向对它们进行地理编码以获得输出代码的函数。反向地理编码功能如下:

function reverse_geocode(lat, lng) {
    var geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(lat,lng);
    geocoder.geocode({'latLng': latlng}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      if (results[0]) {
        // this code has been validated by Luke
        for(var i=0; i < results[0].address_components.length; i++) {
                var component = results[0].address_components[i];
                if(component.types[0] == "postal_code_prefix") {
                    appendHiddenFormField("outcode", component.long_name);
                    appendHiddenFormField("gz", "1");
                } else if((component.types[0] == "postal_code") && (component.types[0] != "postal_code_prefix")) {
                    zipcode = component.long_name;
                    zipcode2 = zipcode.split(' ');
                    appendHiddenFormField("outcode", zipcode2[0]);
                    appendHiddenFormField("gz", "1");
                }
            }
        } else {
            console.log("no results found");
            appendHiddenFormField("outcode", "");
        }
    } else {
        console.log('Geocoder failed due to: ' + status);
        appendHiddenFormField("outcode", "");
    }
  });
}

代码完美运行,没有任何控制台错误。请注意,我是初学者,但是这段代码是在SO贡献者的帮助下编写的,实际上决定提供帮助,而不是那些花费整个悲惨日子的人: - )