Edheldor
@Edheldor

Как запретить сохранение полигона, если полигон пересекается с ранее созданными?

Использую leaflet и leaflet.draw.
Как запретить сохранение при создании нового полигона или редактировании уже существующих полигонов, если полигон пересекается с ранее созданными (создание нового через Draw Polygon, редактирование через Edit Layers из leaflet.draw)? (Пример на картинке)
5f316dafb7744675677975.png
  • Вопрос задан
  • 290 просмотров
Решения вопроса 1
Edheldor
@Edheldor Автор вопроса
Нашел решение, если кому интересно:
Нужно прослушивать события draw:edited и draw:created из leaflet.draw. Сравнение же полигонов с помощью turf js.

Как-то так:
this.map.on('draw:created', (e) => {
    const layer = e.layer;
    // проверяем есть ли какие-то существующие слои
    if (this.zonesLayers['_layers'] && Object.keys(this.zonesLayers['_layers']).length) {
        // проверяем пересекается ли этот созданный слой со всеми уже существующими слоями 
        for (const existingZoneLayerKey in this.zonesLayers['_layers']) {
            const existingZoneLayer = this.zonesLayers['_layers'][existingZoneLayerKey];
            if (this.intersectionPolygonLayersCheck(layer, existingZoneLayer)) {
                // пересечение полигонов!
                this.showIntersectionErrorWhenZoneCreating = true;
                return;
            }
        }
    }
   // тут если все ок - сохраняем

});

// при сохранении отредактированного
this.map.on('draw:edited', (e) => {
            let haveZonesIntersections = false;
            const layers = e.layers;
            //  начинаем проверку на пересечение полигонов 
            layers.eachLayer((layer) => {
                for (const existingZoneLayerKey in this.zonesLayers['_layers']) {
                    if (this.zonesLayers['_layers'][existingZoneLayerKey] !== layer) {
                        const existingZoneLayer = this.zonesLayers['_layers'][existingZoneLayerKey];
                        if (this.intersectionPolygonLayersCheck(layer, existingZoneLayer)) {
                            // пересечение полигонов!
                            haveZonesIntersections = true;
                            this.showIntersectionErrorWhenZoneCreating = true;
                            return;
                        }
                    }
                }
                if (!haveZonesIntersections) {
                    // если нет пересечений сохраняем куда-нибудь
                }

            });
intersectionPolygonLayersCheck(polygonLayerOne, polygonLayerTwo) {
                // приводим полигоны к виду, понятному turf js
                const polygonOne = polygonLayerOne.toGeoJSON();
                const polygonTwo = polygonLayerTwo.toGeoJSON();
                // проверяем пересечение с помощью turf js
                const intersectCheckResult = intersect(polygonOne, polygonTwo);
                // console.log(intersectCheckResult);
                if (intersectCheckResult === null) {
                    return false;
                } else {
                    // если результат пересенчения - полигон или мультиполигон то считаем что пересекаются
                    if (intersectCheckResult.geometry && intersectCheckResult.geometry.type === 'Polygon') {
                        return true;
                    } else if (intersectCheckResult.geometry && intersectCheckResult.geometry.type === ' MultiPolygon') {
                        return true;
                    } else {
                        // а если результат перессечения другой (документация говорит что может быть
                        // Point или MultiPoint или LineString или MultiLineString)
                        // то считаем что нет пересечения
                        return false;
                    }
                }
            },
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Karpion
Я не понял, откуда берутся полигоны.
Мне кажется, в случае заведомо выпуклых полигонов - можно найти более простое решение, чем в общем случае. Выпуклость гарантируется или нет?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы