Answer the question
In order to leave comments, you need to log in
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)
Answer the question
In order to leave comments, you need to log in
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;
}
}
},
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question