检查openlayers中多边形内部的坐标/位置
我有一些代码,可以用来检查多边形内部的位置或坐标。问题是,它可能有10000个或更多的位置,这会导致性能问题,而map的速度越来越慢。请在下面找到我的代码:检查openlayers中多边形内部的坐标/位置,openlayers,openlayers-5,Openlayers,Openlayers 5,我有一些代码,可以用来检查多边形内部的位置或坐标。问题是,它可能有10000个或更多的位置,这会导致性能问题,而map的速度越来越慢。请在下面找到我的代码: places.forEach(p => { this.isInsidePolygons(p.latitude, p.longitude) }) isInsidePolygons(latitude: number, longitude: number): boolean {
places.forEach(p => {
this.isInsidePolygons(p.latitude, p.longitude)
})
isInsidePolygons(latitude: number, longitude: number): boolean {
let isInsidePolygon = false;
var coordinate = OlHelper.transformToEPSG3857([Number(longitude), Number(latitude)]);
var shapes = this.getShapes();
for (let i = 0; i < shapes.length; i++) {
let features = shapes[i].getSource().getFeatures();
if (!features || features.length == 0) continue;
for (let j = 0; j < features.length; j++) {
var geometry = features[j].getGeometry();
isInsidePolygon = geometry.intersectsCoordinate(coordinate);
if (isInsidePolygon) break;
}
if (isInsidePolygon) break;
}
return isInsidePolygon;
}
getShapes(): ol.layer.Vector[] {
var shapes = [];
this.MapControl.getLayers().forEach((layer) => {
if (layer instanceof ol.layer.Vector) shapes.push(layer);
});
return shapes;
}
places.forEach(p=>{
这是经度(p.纬度,p.经度)
})
isInsidePolygons(纬度:数字,经度:数字):布尔值{
设isInsidePolygon=false;
var坐标=OlHelper.transformToEPSG3857([数字(经度)、数字(纬度)]);
var shapes=this.getShapes();
for(设i=0;i{
if(ol.layer.Vector的层实例)shapes.push(层);
});
返回形状;
}
是否可以在一次检查中检查openlayers中多边形的所有位置,而不是每个位置都循环检查
let features = shapes[i].getSource().getFeatures();
if (!features || features.length == 0) continue;
for (let j = 0; j < features.length; j++) {
var geometry = features[j].getGeometry();
isInsidePolygon = geometry.intersectsCoordinate(coordinate);
if (isInsidePolygon) break;
}
这是较少的代码,但可能没有更多的效率
要针对更多的位置测试形状,您需要为您的位置创建向量源。使用形状的范围获得位置的短列表,并仅根据形状几何图形测试这些位置
let placesFeatures = [];
places.forEach((p) => {
placesFeatures.push(new Feature({
geometry: new Point(fromLonLat[p.longitude, p.latitude]))
id: [p.latitude, p.longitude].toString,
isInsidePolygon: false
}))
})
let placesSource = new VectorSource({features: placesFeatures});
for (let i = 0; i < shapes.length; i++) {
let features = shapes[i].getSource().getFeatures();
if (!features || features.length == 0) continue;
for (let j = 0; j < features.length; j++) {
var geometry = features[j].getGeometry();
let extent = features[j].getGeometry().getExtent();
let candidates = placesSource.getFeaturesInExtent(geometry.getExtent());
if (!candidates || candidates.length == 0) continue;
for (let k = 0; k < candidates.length; k++) {
isInsidePolygon = geometry.intersectsCoordinate(candidates[k].getGeometry().getCoordinates());
if (isInsidePolygon) {
candidates[k].set('isInsidePolygon', true);
}
})
}
}
您可以使用,特别是函数。
从一个多多边形或一个多边形和一列点函数开始,它返回多边形内的所有点,但复杂性与点的数量成线性关系。
如果我们使用turf.js,您必须转换GeoJSON中的功能
let format = new ol.format.GeoJSON();
let pointsInsidePolygon = turf.pointsWithinPolygon(
format.writeFeatureObject(points),
format.writeFeatureObject(polygon)
);
然后阅读GeoJson特性
let features = format.readFeatures(pointsInsidePolygon);
但是如果你现在只想知道多边形的内部或外部有一些点,但不知道你可以用多边形的范围玩哪一个点我也这样做了。但是,我通过从数据点的簇中创建边界框(使用其中一个turp.js cluster函数)来限制要搜索的多边形。然后将多边形限制为具有
featureEach(waterBodyFeatureCollection,async f=>{const bboxClipped=bboxClip(f,pointsBbox)作为特征的多边形;…
请参见(如果代码更改,方法为静态异步过滤器fromclusteredowdatabox(waterBodyFeatures:Feature[],要点:功能集合,图层:应用程序图层,图层名称:字符串):承诺
)
let format = new ol.format.GeoJSON();
let pointsInsidePolygon = turf.pointsWithinPolygon(
format.writeFeatureObject(points),
format.writeFeatureObject(polygon)
);
let features = format.readFeatures(pointsInsidePolygon);