Как определить вхождение метки в коллекцию полигонов?
Люди добрые. Столкунлся с проблемой.
В карту добавляется коллекция полигонов районов города.
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("Метка входит в полигон.")
}
});