【问题标题】:Google maps with geocoding带有地理编码的谷歌地图
【发布时间】:2011-08-11 13:28:04
【问题描述】:

您好,我正在使用谷歌地图 javascript api v3

这是我绘制折线的代码。

for(var i=0; i < addressArr.length; i++){
     geocoder.geocode( { 'address': addressArr[i]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

        point = results[0].geometry.location;
        place.push(results[0].address_components[1].long_name);

        flightPlanCoordinates.push(point);
        if(flightPlanCoordinates.length == addressArr.length){
        flightPath = new google.maps.Polyline({path: flightPlanCoordinates,strokeColor: "#FF0000",strokeOpacity: 0.50,strokeWeight: 2 });
        flightPath.setMap(map);
        }

addressArr 是一个地址数组

问题出在我的 flightPlanCoordinates 中,它们不是我从 for 循环中传递 addressArr 的顺序。
假设我通过 addressArr=[1,2,3,4] 我的 flightPlanCoordinates 变为 [2,3,1,4]。 任何人都可以建议正在发生的事情。

【问题讨论】:

  • Gmaps4rails 也显示折线

标签: javascript ruby-on-rails google-maps maps google-geocoder


【解决方案1】:

这仅仅是因为您在循环内部进行了异步调用(geocoder.geocode),这需要不同的时间来完成。因此建议对数组中的第二个元素进行地理编码需要 1 秒,对第一个元素进行地理编码需要 3 秒。那么显然第二个元素的回调函数将在第一个元素之前被调用,从而将其推入第一个位置的 flightPlanCoordinates 中。

只需在代码中第二个 if 语句内的数组上调用 sort() 方法即可解决问题。

更新:

var i = 0;
function geocode(){
    geocoder.geocode({
        'address': addressArr[i]
    },
    function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            point = results[0].geometry.location;
            place.push(results[0].address_components[1].long_name);
            flightPlanCoordinates.push(point);
            i++;
            if(addressArr[i] != null)
                geocode();

            if (flightPlanCoordinates.length == addressArr.length) {
                flightPath = new google.maps.Polyline({
                    path: flightPlanCoordinates,
                    strokeColor: "#FF0000",
                    strokeOpacity: 0.50,
                    strokeWeight: 2
                });
                flightPath.setMap(map);
            }
        }
    }
}
geocode();

【讨论】:

  • 你说得对,这是问题,但排序并不能解决问题。路线显示不正确,因为我的数组包含纬度和经度。
  • 我可以让地理编码调用等到它返回第一个响应。
  • 当我在循环中添加一个警报时它起作用了,但这不是解决方案。
  • 您可以递归调用地理编码函数,而不是循环遍历元素,并且只在先前调用的回调函数中进行每个新的地理编码调用。在更新的答案中查看我的代码 sn-p。我不确定它是否会立即运行,因为我没有机会运行此代码,但我希望你能明白。
【解决方案2】:

不太清楚为什么它会返回这样的值,但是您可以对数组进行排序,这将解决您的问题。 flightPlanCoordinates.sort();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多