代码之家  ›  专栏  ›  技术社区  ›  Shahriat Hossain

如何在openlayers 4.x中获得多边形内的所有点?

  •  -1
  • Shahriat Hossain  · 技术社区  · 6 年前

    我想使用Openlayers 4.x集成一个功能,就是我想得到地图上多边形内的所有点。目前我可以得到多边形本身的所有坐标。

    但我要多边形内的所有坐标或点。如果我解释得更多,那就意味着我想要地图上的所有点或坐标被多边形区域包围。

    3 回复  |  直到 4 年前
        1
  •  3
  •   Mike    6 年前

    var candidates = [];
    source.forEachFeatureIntersectingExtent(myPolygon.getGeometry().getExtent(),function(feature){
        if (feature.getGeometry().get('type') == 'Point') {
            candidates.push(feature);
        }
    });
    
    var selected = [];
    candidates.forEach(function(candidate){
        source.forEachFeatureIntersectingExtent(candidate.getGeometry().getExtent(),function(feature){
            if (feature === myPolygon) {
                selected.push(candidate);
            }
        });
    });
    

    同样对于单坐标点,我认为可以在一个步骤中完成:

    var selected = [];
    source.forEachFeatureIntersectingExtent(myPolygon.getGeometry().getExtent(),function(feature){
        if (feature.getGeometry().get('type') == 'Point' &&
            myPolygon.getGeometry().intersectsCoordinate(feature.getGeometry().get('coordinates')) {
                candidates.push(selected);
        }
    });
    

    关于划分成单元,类似这样的东西会为包含多边形的10x10网格的每个单元生成pinpush点。如果只有一个单元的一部分与多边形相交,则单元中心的pinpush可能位于几何体之外。

    var extent = myPolygon.getGeometry().getExtent();
    for (var i=extent[0]; i<extent[2]; i+=(extent[2]-extent[0])/10) {
        for (var j=extent[1]; j<extent[3]; j+=(extent[3]-extent[1])/10) {
            var cellExtent = [i,j,i+(extent[2]-extent[0])/10),j+(extent[3]-extent[1])/10];
            source.forEachFeatureIntersectingExtent(cellExtent,function(feature){
                if (feature === myPolygon) {
                   var pinPush = new ol.feature(new ol.geom.Point(ol.extent.getCenter(cellExtent)));
                   source.addFeature(pinPush); 
                }
            });
        }
    }
    
        2
  •  1
  •   willsters    6 年前

    使用 vectorSource.forEachFeatureIntersectingExtent() polygonGeom.getExtent() . 这会让你找到他们中大多数人的捷径。之后,您将需要自己实现poly中的point(网上有很多相关的资源),或者使用类似的库 https://github.com/bjornharrtell/jsts . OpenLayers仅提供与范围的几何体相交。

        3
  •  1
  •   Philip Attisano    6 年前

    我经常将turf.js库与专门用于此类任务的openlayers库放在一起。我的大多数几何图形都是geojson的原生版本,因此turf.js非常适合。如果您有一个geojson特性集合。您可以迭代.features数组(甚至是 [x, y] 点)并检查每个点是否在多边形内。如果有用的话,我可以做一把小提琴。

    // In this example I'm looking for all features
    // that have AT LEAST ONE point within  
    // the world extent (WGS84)
    const polygon = turf.bboxPolygon([-180, -90, 180, 90])
    myGeoJson.features.forEach(function(feature){
        const points = turf.explode(feature);
        const pointsWithin = turf.pointsWithinPolygon(points, polygon);
        if(pointsWithin.features && pointsWithin.features.length){
            // feature has AT LEAST ONE point inside the polygon
            // I can see what points by iterating the
            // pointsWithin.features array
        }else{
            // feature has ZERO points inside the polgyon
        }
    });
    

    http://turfjs.org/docs#pointsWithinPolygon