Клуб API Карт

Многоугольники, Interactivity и пр.

Пост в архиве.

На карту добавляются многоугольники - addOverlay

Затем посредством YMapsML также добавляются метки.

Функцинал должен добавлять по щелчку на пустом месте новую метку, но оверлей многоугольников похоже перекрывает что-то. (без слоя многоугольников или вне областей с многоугольниками все работает)

Если правильно понимаю, можно как-то порядок слоев отрегулировать, либо отключить реакции слоя многоугольников.

Как реализовать?

Несколько сумбурно написал, надеюсь понятно :)

7 комментариев
Sergey Konstantinov
28 января 2016, 07:18
Многоугольнику можно задать опцию interactive - в режиме YMaps.Interactivity.NONE многоугольники не реагируют на действия пользователя и пропускают через себя все события.

Отрегулировать порядок графических объектов и меток нельзя, графика всегда ниже.
Константин
28 января 2016, 07:18
Все работало - решил вывести загрузку многоугольников в XML, и теперь не могу YMaps.Interactivity.NONE приделать.



var gr = new YMaps.YMapsML('тут путь до файла/gr.xml', { interactive : YMaps.Interactivity.NONE });
map.addOverlay(gr);


все грузится, но интерактивность не отключается.

Вопрос №2: как можно пропустить событие при клике через многоугольник (добавление метки на карту), но при этом чтобы при попадании в область многоугольника всплывал hint?
У класса YMaps.YMapsML нет такой опции.
Вам нужно пройтись по всем объектам и у каждого из них отключить интерактивность.
Предположим, что у вас нет вложенных групп и все объекты - это многоугольники, тогда отключить у них интерактивность можно следующим образом:

YMaps.Events.observe(gr, gr.Events.Load, function (ml) {
    ml.get(0).forEach(function (obj) {
        obj.setOptions({ interactivity : YMaps.Interactivity.NONE });
    });
});
На второй вопрос я забыл ответить, извините.
Можно прокинуть событие на карту следующим образом:

var polygon = new YMaps.Polygon([
    new YMaps.GeoPoint(37.7,55.7),
    new YMaps.GeoPoint(37.7,55.8),
    new YMaps.GeoPoint(37.8,55.8),
    new YMaps.GeoPoint(37.8,55.7),
    new YMaps.GeoPoint(37.7,55.7)
], {
    hasHint : true,
    hasBalloon : false
});
polygon.name = "Имя многоугольника";
map.addOverlay(polygon);

YMaps.Events.observe(polygon, polygon.Events.Click, function (polygon, e) {
    var map = polygon.getMap();
   
    if (map) {
        YMaps.Events.notify(map, map.Events.Click, map, e);
    }
});

// Для проверки
YMaps.Events.observe(map, map.Events.Click, function (map, e) {
    alert("click: " + e.getGeoPoint());
});

Т. е. в обработчике клика по многоугольнику генерируется событие клика по карте (если многоугольник добавлен на карту).
Константин
28 января 2016, 07:18
Interactivity.NONE - не срабатывает.
Ваш обработчик работает, но только вне многоугольников.
Я вам привел пример для многоугольника, а вы применяете для ymapsml. Это совершенно разные объекты.

Вам необходимо в обработчике Load загрузки YMapsML-файла навесить на все многоугольники обработчики. Примерно так:

YMaps.Events.observe(gr, gr.Events.Load, function (ml) {
    var map = ml.getMap();
   
    ml.get(0).forEach(function (polygon) {
        YMaps.Events.observe(polygon, polygon.Events.Click, function (polygon, e) {
            var map = polygon.getMap();
           
            if (map) {
                YMaps.Events.notify(map, map.Events.Click, map, e);
            }
        });
    });
});
Константин
28 января 2016, 07:18
Работает.
Большое Вам спасибо!