У меня есть один вопрос относительно топологии и отношений между полигонами в открытых слоях.
Используя https://turfjs.org/, я использую два метода, чтобы проверить, перекрываются ли многоугольники, https://turfjs.org/docs/#booleanOverlap и https://turfjs.org/docs/#booleanWithin, но я получаю странное взаимодействие.
Как видите, в синем прямоугольнике многоугольник привязан к красному многоугольнику, и это нормально, но проблема связана с многоугольниками в желтом прямоугольнике, для них я получаю true и автоматически перекрывающийся красный стиль. Полигоны синего цвета и многоугольники желтого прямоугольника привязаны только к границе красного многоугольника.
Итак, у меня такой вопрос; Можно ли как-то игнорировать границу ограничивающего многоугольника (красный) или мне следует найти другой подход.
Пример кода, который я проверяю, не перекрываются ли многоугольники:
vectorLayer.getSource().on(OpenLayersEvents.AddFeature, (evt: any) => {
let feature = evt.feature;
// clip area function with return geometry value
let polygon = clipFieldArea(feature, this.myRestrictionVectorLayer);
let isFeatureOverlappingFlag = false;
//red polygons
if (this.restrictiveLayer.getSource().getFeatures().length > 0) {
isFeatureOverlappingFlag = arePolygonsOverlapping(feature, this.restrictiveLayer);
}
// checks if features are overlapping then set new style
feature.getGeometry().setCoordinates(polygon.getCoordinates());
if (isFeatureOverlappingFlag) {
feature.setStyle(this.featureOverlappingStyle);
} else {
feature.setStyle(this.fieldStyle);
}....
А вот метод arePolygonsOverlapping (), который проверяет топологию.
let geojsonFormat = new GeoJSON();
let areOverlapping: boolean = false;
let flagCheck: boolean = false;
let restrictionFeatures = restrictionLayer.getSource().getFeatures();
// create GeoJSON object and transform it in WGS84 for intersect method
let firstGeometryObject = geojsonFormat.writeFeatureObject(feature, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });
for (let featureRestrict of restrictionFeatures) {
let secondGeometryObject = geojsonFormat.writeFeatureObject(featureRestrict,
{ dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });
areOverlapping = booleanOverlap(firstGeometryObject as unknown as TurfPolygon, secondGeometryObject as unknown as TurfPolygon);
if (areOverlapping) {
flagCheck = true;
break;
}
}
return flagCheck;
ОБНОВЛЕНИЕ
Я попытался поиграть с решением, предложенным Майком, но получаю Uncaught TypeError: ol_proj__WEBPACK_IMPORTED_MODULE_3__.default.Projection is not a constructor
При попытке создать новую проекцию. А вот и обновленный метод
export function arePolygonsOverlapping(feature: any, restrictionLayer: VectorLayer): boolean {
let areOverlapping: boolean = false;
let flagCheck: boolean = false;
let restrictionFeatures = restrictionLayer.getSource().getFeatures();
//#region "Parameters for scaling down coordinates"
let viewProjection = Projection.get('EPSG:3857');
let smallProjection = Projection.get('small');
if (!smallProjection) {
smallProjection = new Projection.Projection({
code: 'small',
units: 'm'
});
Projection.addProjection(smallProjection);
let scale = Extent.getWidth(viewProjection.getExtent());
let smallTransform = function (coordinate: [number, number]) {
return [coordinate[0] / scale, coordinate[1] / scale];
}
let normalTransform = function (coordinate: [number, number]) {
return [coordinate[0] * scale, coordinate[1] * scale];
}
Projection.addCoordinateTransforms(viewProjection, smallProjection, smallTransform as any, normalTransform as any);
}
//#endregion "Parameters for scaling down coordinates"
// create GeoJSON object and transform it in WGS84 for intersect method
let firstGeometryObject = geojsonFormat.writeFeatureObject(feature, { dataProjection: smallProjection, featureProjection: viewProjection });
for (let featureRestrict of restrictionFeatures) {
let secondGeometryObject = geojsonFormat.writeFeatureObject(featureRestrict,
{ dataProjection: smallProjection, featureProjection: viewProjection });
areOverlapping = booleanOverlap(firstGeometryObject as unknown as TurfPolygon, secondGeometryObject as unknown as TurfPolygon);
if (areOverlapping) {
flagCheck = true;
break;
}
}
return flagCheck;
}
Вот мой импорт:
import Extent from 'ol/extent';
import Projection from 'ol/proj';
Забыл сказать, что использую v 4.6.2