检查openlayers中多边形内部的坐标/位置

检查openlayers中多边形内部的坐标/位置,openlayers,openlayers-5,Openlayers,Openlayers 5,我有一些代码,可以用来检查多边形内部的位置或坐标。问题是,它可能有10000个或更多的位置,这会导致性能问题,而map的速度越来越慢。请在下面找到我的代码: places.forEach(p => { this.isInsidePolygons(p.latitude, p.longitude) }) isInsidePolygons(latitude: number, longitude: number): boolean {

我有一些代码,可以用来检查多边形内部的位置或坐标。问题是,它可能有10000个或更多的位置,这会导致性能问题,而map的速度越来越慢。请在下面找到我的代码:

    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);