2012-02-06 48 views
1

好吧,我有一個地圖上有一些標記。地圖上有一個點擊事件應該得到最接近的標記,但是當find_closest_marker(event)函數運行時,它會在map.markers.length中斷,說它的未定義。map.markers是未定義谷歌地圖API v3

這裏是什麼即時試圖http://jsfiddle.net/VyzFq/7/

任何人都可以請告訴我,我要去哪裏錯在這裏的鏈接。

回答

4

貌似有幾個問題:

1)map.markers陣列尚未聲明。在for循環之上聲明它,並將標記推到標記數組上。

... 
var infowindow = new google.maps.InfoWindow(); 

var marker, i; 
map.markers = []; // ADD THIS LINE 
for (i = 0; i < locations.length; i++) { 
    marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(locations[i][1], locations[i][2]), 
     map: map 
    }); 
    map.markers.push(marker); // ADD THIS LINE 
... 

2)find_closest_point函數看不到地圖變量。移動find_closest_point功能,在其中添加了click事件偵聽範圍:

// CHANGE THIS LINE 
google.maps.event.addListener(map, 'click', find_closest_marker); 

// TO: 

google.maps.event.addListener(map, 'click', function(event) { 
    var lat = event.latLng.lat(); 
    var lng = event.latLng.lng(); 
    var R = 6371; 
    var distances = []; 
    var closest = -1; 
    for(i=0;i<map.markers.length; i++) { 
     var mlat = map.markers[i].position.lat(); 
     var mlng = map.markers[i].position.lng(); 
     var dLat = rad(mlat - lat); 
     var dLong = rad(mlng - lng); 
     var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2); 
     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
     var d = R * c; 
     distances[i] = d; 
     if (closest == -1 || d < distances[closest]) { 
      closest = i; 
     } 
    } 

    alert(map.markers[closest].title); 
}); 
+0

我還忘了添加標題:位置[I] [0],到地圖的選擇,但它的偉大的工作。謝謝您的幫助! :) – MAc 2012-02-06 08:40:03

+0

這裏是其他人的工作版本的鏈接:http://jsfiddle.net/VyzFq/8/ – MAc 2012-02-06 08:41:30

+0

@Glen Robertson +1,你救了我的一天。現在我需要得到最接近的標記,當我告訴google.map分享我的位置,然後從綠色標記計算出我的db之一的紅色。 – HenryW 2013-11-24 18:51:53