map.markers не определен Google Map API v3 - PullRequest
1 голос
/ 06 февраля 2012

Хорошо, у меня есть карта с маркерами. На карте есть событие щелчка, которое должно получить ближайший маркер, однако при запуске функции find_closest_marker (событие) оно прерывается на map.markers.length, говоря, что оно не определено.

Вот ссылка на то, что я пытаюсь http://jsfiddle.net/VyzFq/7/

Может кто-нибудь, пожалуйста, покажите мне, где я иду не так.

1 Ответ

4 голосов
/ 06 февраля 2012

Похоже, есть пара проблем:

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 не может видеть переменную map.переместите функцию 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);
});
...