Как определить вхождение метки в коллекцию полигонов?

Люди добрые. Столкунлся с проблемой.

В карту добавляется коллекция полигонов районов города.

var myCollection = new ymaps.GeoObjectCollection();

 p9 = new ymaps.Polygon([[[33.9967073,45.0188305],[33.9967957,45.0146412],[33.9982684,45.0144175],[33.9990598,45.0152349],[34.0044352,45.0155271],[34.0049901,45.0171008],[34.0059437,45.0189984],[34.006411,45.0211516],[34.006432,45.0215641],[34.0060948,45.0214767],[34.0061177,45.0240635],[34.0009129,45.0240516],[33.9983283,45.0239652],[33.9979934,45.0235538],[33.9970247,45.0210183],[33.9967073,45.0188305]]], {hintContent: "район Аэрофлотский",balloonContentHeader: 'header',balloonContentBody: 'body',balloonContentFooter: 'footer', }, { fillColor: '#00FF00', fillOpacity: 0.3, strokeColor: '#00FF00', opacity: 1, zIndex: 20, strokeWidth: 2, strokeStyle: 'solid', strokeOpacity: 0.9 });

myCollection.add(p9);
            
p10 = new ymaps.Polygon([[[34.0347518,44.9954807],[34.0378191,44.9909103],[34.0397733,44.9888502],[34.0408051,44.9889261],[34.0409147,44.9928598],[34.0449782,44.9895491],[34.04526,44.9897],[34.0502774,44.9932948],[34.0472859,44.9959956],[34.0386682,44.9996306],[34.0347518,44.9954807]]], { hintContent: "район Центральный",balloonContentHeader: 'header',balloonContentBody: 'body',balloonContentFooter: 'footer',}, { fillColor: '#0000FF', fillOpacity: 0.3, strokeColor: '#0000FF', opacity: 1, zIndex: 1, strokeWidth: 2, strokeStyle: 'solid', strokeOpacity: 0.9 });

myCollection.add(p10);

myMap.geoObjects.add(myCollection);

Затем пользователем добавляется метка на карте.

 var placemark = new ymaps.Placemark([34.0044352,45.0155271], { 'hintContent': yandex_coordinats, 'balloonContent': 'Район Аэрофлотский'  }, {  'preset': 'islands#redDotIcon' });

myMap.geoObjects.add(placemark);

Как мне вывести alert() или понять, что метка находится в одном из полигонов и в каком именно полигоне? Уже с самого утра сижу, голову ломаю..


Ответы (2 шт):

Автор решения: DiD

function inside(point, vs) {
    // ray-casting algorithm based on
    // https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html/pnpoly.html
    // https://github.com/substack/point-in-polygon

    let [x,y] = point;

    let inside = false;
    for (let i = 0, j = vs.length - 1, l = vs.length; i < l; j = i++) {
        let [xi,yi] = vs[i];
        let [xj,yj] = vs[j];

        let intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }

    return inside;
};

let polygon = [ [0,0], [0,4], [4,4], 
                [4,3], [2,3], [2,1],
                [4,1], [4,0], [0,0] ];

console.log(inside([3,2],polygon));
console.log(inside([1,2],polygon));
svg { height: 100vh; }
body { margin: 0; }
* { box-sizing: border-box; }
<svg viewBox="-1 -1 7 10">
  <path d="M 0,0 L 0,4 4,4 4,3 2,3 2,1 4,1 4,0 Z" 
        stroke-width="0.1" fill="none" stroke="black" />
  <circle cx="3" cy="2" r="0.2" fill="red" />
  <circle cx="1" cy="2" r="0.2" fill="green" />
</svg>

Источник

→ Ссылка
Автор решения: Антон Вейда
myCollection.each(function(polygon) {
    if (polygon.geometry.contains(placemark.geometry.getCoordinates())) {
        console.log("Метка входит в полигон.")
    }
});
→ Ссылка