关于开放层中的拓扑和多边形之间的关系,我有一个问题。
使用https://turfjs.org/,我正在使用两种方法检查多边形是否重叠:https://turfjs.org/docs/#booleanOverlap和https://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;
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;