На карте много полигонов и точек. Как узнать к какому полигону относится точка?

Рейтинг: 0Ответов: 1Опубликовано: 13.06.2023

Ребята, помогите. Пока я не доделал "костыли")) Есть карта, на которой много (около 30) полигонов. Ну, типа, микрорайоны города. И есть список абонентов. Заливается через json. Обрабатываю через jquery. У абонентов бывает два статуса - оплатил/ не оплатил. Сейчас возникла идея сделать окно статистики. типа Полигон 1 - оплатили 30 чел. и т.д. Извлечь суммы оплат я могу. Но как реализовать эту фильтрацию по полигонам? Ход мыслей пока такой: jQuerry(myMap) => .each(pm)(пробегаемся по всем placemark) => 'тут должна быть умная строка кода типа извлечь полигон(pm) а дальше буду складывать. p.s. Прописать имя полигона в JSON не хочу, т.к. в приоритете -точка на карте.

Ответы

▲ 2Принят

Примерный код, который возможно поможет вам. Точка на карте для каждого абонента всё равно подразумевает что вы должны изначально знать координаты точки на карте от абонента

// Функция для определения принадлежности координат абонента полигону
function isPointInPolygon(point, polygon) {
var polygonCoords = polygon.geometry.coordinates[0];

var x = point[0],
 y = point[1];
var inside = false;

for (var i = 0, j = polygonCoords.length - 1; i < polygonCoords.length; j = i++) 
{
 var xi = polygonCoords[i][0],
  yi = polygonCoords[i][1];
 var xj = polygonCoords[j][0],
  yj = polygonCoords[j][1];

  var intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;

if (intersect) inside = !inside;
}

return inside;
}

$(document).ready(function () {
 $.getJSON("абоненты.json", function (data) {
$.each(data, function (index, abonent) {
  var coordinates = abonent.coordinates;
  var $polygon = $(".polygon").filter(function () {
    var polygonId = $(this).data("id");
    var polygon = geojson.features.find(function (feature) {
      return feature.properties.id === polygonId;
    });

    return isPointInPolygon(coordinates, polygon);
  });

  if (abonent.status === "оплатил") {
    var count = $polygon.data("paidCount") || 0;
    $polygon.data("paidCount", count + 1);
  }
});

$(".polygon").each(function () {
  var polygonId = $(this).data("id");
  var paidCount = $(this).data("paidCount") || 0;

  console.log("Полигон " + polygonId + " - оплатили " + paidCount + " чел.");
});
});
});



// Предположим, у вас есть GeoJSON-объект, представляющий полигоны на карте
var geojson = {
type: "FeatureCollection",
features: [
{
  type: "Feature",
  properties: { id: 1 },
  geometry: {
    type: "Polygon",
    coordinates: [
      [
        [55.753215, 37.622504], // Координаты вершин полигона 1
        [55.753215, 37.623504],
        [55.754215, 37.623504],
        [55.754215, 37.622504],
        [55.753215, 37.622504]
      ]
    ]
  }
},
{
  type: "Feature",
  properties: { id: 2 },
  geometry: {
    type: "Polygon",
    coordinates: [
      [
        [55.7558, 37.6176], // Координаты вершин полигона 2
        [55.7558, 37.6186],
        [55.7568, 37.6186],
        [55.7568, 37.6176],
        [55.7558, 37.6176]
      ]
    ]
  }
},
// Добавьте другие полигоны
]
};

Пример json Объекта который использовал я

[
{
"name": "Абонент 1",
"status": "оплатил",
"coordinates": [55.753215, 37.622504]
},
{
"name": "Абонент 2",
"status": "не оплатил",
"coordinates": [55.7558, 37.6176]
}
]