如何传递地理编码请求的ID

时间:2013-12-06 16:18:12

标签: javascript google-maps-api-3 google-geocoder

我正在开发一个小API,它应该在Google地图上显示标记。我有一个可能的标记数据库,我需要设置地址的经度和纬度,以便我可以稍后在地图上显示它们,而不是每次都对所有地址进行地理编码。

我做了一个小实用程序来运行它一次并将这些必要的数据缓存到数据库中:

function processMissing(data) {
    var result;

    geocoder = new google.maps.Geocoder();
    for (var i=0;i<data.length;i++) {
        geocoder.geocode( { 'address' : data[i]['address']+','+data[i]['city']+','+data[i]['zipcode']+','+data[i]['ctrcode']}, function(results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
               result = data[i]['id'] + ': ' + results[0].geometry.location);
               //Store result to database
            }
        });
    }
}

我唯一的问题是,data[i]['id']当然会抛出数据[i]未定义错误,因为它不存在于函数内部,当地理编码器完成时称为async

问题是,如何通过geocoder.geocode传递此ID,或者我如何在功能内部与他联系?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用函数闭包将id与回调相关联:

function geocodeAddress(data) {
        geocoder.geocode( { 'address' : data['address']+','+data['city']+','+data['zipcode']+','+data['ctrcode']}, function(results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
               // save the result data in the input structure or write it to your database
               data['id'].result = data['id'] + ': ' + results[0].geometry.location);
               //Store result to database
            } else alert("id ="+data['id']+" could not be geocoded, status:"+status);
        });
}

function processMissing(data) {
    var result;

    geocoder = new google.maps.Geocoder();
    for (var i=0;i<data.length;i++) {
      geocodeAddress(data[i])
    }
}

答案 1 :(得分:1)

不确定这是否能解决您的问题,但我有类似的东西。 我们试一试:

// 2.9.1 set address
geocoder.geocode({ address: query.join(" ") }, function (result, status) {
    if (status === google.maps.GeocoderStatus.OK) {
        // center map
        loc = result[0].geometry.location;
        options = $.extend({}, cfg.mapOptions, { center: loc });

        // set map options & markers
        myProject.initMap(options);
        myProject.ajaxGetMarkers(loc.lat(), loc.lng());
    }
});

我的query对象与您的data[i]对象类似。考虑使用join(' ')

var query = data[i];
geocoder.geocode({ address: query.join(" ") }, function (result, status) {

});

成功后,result[0]会为您address_componentsformatted_addressgeometrytypes。你的结局看起来不错。只是将其添加为额外信息。

关于你的特殊问题: 考虑使用额外的数组,可以用来推querydata[i],但是你需要2个独立的for循环。可能不理想。

另一方面,如果您使用的是jQuery,则可以使用bind()$.proxy

var query = data[i];
geocoder.geocode({ address: query.join(" ") }, $.proxy(function (result, status) {
    // this refers to query
}, query));

使用ECMA5绑定添加到语言info

var query = data[i];
geocoder.geocode({ address: query.join(" ") }, function (result, status) {
    // this refers to query
}.bind(query));
IE9支持

bindinfo table) 如果您需要较旧的浏览器支持,请考虑使用polyfill

中所述的MDN