如何忽略边界而精确地检查一个多边形是否与另一个多边形重叠

问题描述 投票:0回答:1

关于开放层中的拓扑和多边形之间的关系,我有一个问题。

情况是这样的:enter image description here

使用https://turfjs.org/,我正在使用两种方法检查多边形是否重叠:https://turfjs.org/docs/#booleanOverlaphttps://turfjs.org/docs/#booleanWithin,但是我得到了一些奇怪的交互作用。

如您所见,在蓝色rectangle中,多边形被捕捉为红色多边形,这是很好的行为,但是黄色矩形中的多边形存在问题,因为我得到了[[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;
openlayers openlayers-3 openlayers-5 topology turfjs
1个回答
0
投票
我已经测试了booleanOverlap,尽管它似乎确实可以处理任何投影中的数字,但是为了符合草皮规范,建议通过缩小EPSG:3857坐标而不转换为投影来坚持较小的数字改变多边形的形状。缩放转换也可以比注释链接中的转换更简单。

import { getWidth } from 'ol/extent'; import { Projection, addCoordinateTransforms, addProjection, get as getProjection } from 'ol/proj'; .... .... let viewProjection = getProjection('EPSG:3857'); let smallProjection = getProjection('small'); if (!smallProjection) { smallProjection = new Projection({ code: 'small', units: 'm' }); addProjection(smallProjection); let scale = getWidth(viewProjection.getExtent()); let smallTransform = function(coordinate) { return [coordinate[0] / scale, coordinate[1] / scale]; } let normalTransform = function(coordinate) { return [coordinate[0] * scale, coordinate[1] * scale]; } addCoordinateTransforms(viewProjection, smallProjection, smallTransform, normalTransform); } 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: 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;

© www.soinside.com 2019 - 2024. All rights reserved.