Google Maps geoXML3: передача метки в собственный прослушиватель событий?

Я работаю над проектом в интрасети, поэтому мои файлы KML недоступны извне. Это означает, что я завишу от библиотеки geoXML3 для анализа моего XML на моей карте Google. Однако отсутствие документации по слушателям событий расстраивает. Я хочу вызвать прослушиватель кликов и передать метку geoXML3. Я пытаюсь сделать следующее, однако clickListener всегда получает последний полигон, обработанный в цикле afterParse, как p.

kml = new geoXML3.parser({
    suppressInfoWindows: true,
    map: map,
    afterParse: function (doc) {
        for (var i = 0; i < doc[0].placemarks.length; i++) {
            var p = doc[0].placemarks[i];
            google.maps.event.addListener(
                p.polygon,
                "click",
                function () { clickListener(p); }
            );
        }
    }
});
kml.parse(mapSettings.kmlLocation);

Если бы я использовал поддержку KML в Google Maps API, я мог бы сделать это и передать многоугольник слушателю.

kml = new google.maps.KmlLayer(mapSettings.kmlLocation, {
    suppressInfoWindows: true,
    preserveViewport: false,
    map: map
});
google.maps.event.addListener(
    kml,
    "click",
    clickListener
};

Есть ли способ (более предпочтительно) надежно передать правильную метку geoXML3 в clickListener или (менее предпочтительно) свойство в geoXML3.parser, к которому я могу привязать событие клика и получить kmlMouseEvent так, как я бы использовал Google Maps API кмл парсер? В конечном итоге мне нужно иметь возможность изменить стиль многоугольника и отслеживать, что в массиве он был выбран/отменен.


person WarrenB    schedule 04.02.2015    source источник


Ответы (1)


Используйте закрытие функции, чтобы связать метку с прослушивателем событий. Один из способов (вы также можете использовать анонимную функцию):

kml = new geoXML3.parser({
    suppressInfoWindows: true,
    map: map,
    afterParse: function (doc) {
        for (var i = 0; i < doc[0].placemarks.length; i++) {
            var p = doc[0].placemarks[i];
            clickablePolygon(p);
        }
    }
});
kml.parse(mapSettings.kmlLocation);
function clickablePolygon(p) {
  google.maps.event.addListener(
    p.polygon,
    "click",
    function () { clickListener(p); }
  );
}      
person geocodezip    schedule 04.02.2015