E
E
Edheldor2020-08-10 18:58:30
JavaScript
Edheldor, 2020-08-10 18:58:30

How to forbid saving a polygon if the polygon intersects with previously created ones?

I use leaflet and leaflet.draw.
How to prevent saving when creating a new polygon or editing existing polygons, if the polygon intersects with previously created ones (creating a new one through Draw Polygon, editing through Edit Layers from leaflet.draw)? (Example in the picture)
5f316dafb7744675677975.png

Answer the question

In order to leave comments, you need to log in

2 answer(s)
E
Edheldor, 2020-08-17
@Edheldor

Found a solution if anyone is interested:
We need to listen to the draw:edited and draw:created events from leaflet.draw. Comparing polygons with turf js.
Something like this:

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;
                    }
                }
            },

K
Karpion, 2020-08-11
@Karpion

I didn't understand where the polygons come from.
It seems to me that in the case of deliberately convex polygons, a simpler solution can be found than in the general case. Is the convexity guaranteed or not?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question