2

我有 5000 多个 LatLng 点,对于每个点,我想找出它们属于哪个特征(区域)。这些特征来自Philippe Ivaldi 的 kmz 层,转换为 GeoJSON。

目前,我在双for循环中使用 turfjs 执行此操作。正如预期的那样,计算会冻结浏览器十分钟,这不是很方便。

这是我的代码:

function countCeaByLayer(geoJsonLayer){
    jQuery.getJSON('http://localhost/server/retrieveData.php', function(data){
            var turfPoints = [];
            for(var i = 0; i < data.length; i++){
                turfPoints.push(turf.point([data[i].longitudeWGS84, data[i].latitudeWGS84]));
            }

            var features = geoJsonLayer.toGeoJSON().features;
            for(var i = 0; i < features.length; i++){
                var turfPointsNew = [];
                for(var j = 0; j < turfPoints.length; j++){

                    var isInside = turf.inside(turfPoints[j], features[i]);
                    if(!isInside) turfPointsNew.push(turfPoints[j]);
                }
                turfPoints = turfPointsNew;
            }

            console.log("done");
    });
}

我该怎么做才能避免冻结浏览器?

  • 让它异步?
  • node在服务器上进行计算turfjs
  • 或者使用and部署leafletjs在服务器上?nodeleaflet-headless

...还是我应该处理它

谢谢!

4

2 回答 2

1

要优化您的代码,您应该这样做。

循环点。

对于每个点,当您迭代多边形以了解该点是否在其中一个点内时,首先获取多边形边界并查看该点是否在边界内。如果没有,您可以跳过进一步并转到下一个多边形。

如果它在边界内,请检查它是否在多边形本身内。

如果是这种情况,请打破遍历多边形的循环并切换到下一个点。

例如,它可能是:

points.forEach(function(point) {
    polygons.some(function(polygon) {
       if (polygon.getBounds().contains(point)) { // or other method if you are not playing with Leaflet features
           if (turf.isInside(polygon, point) { // for example, not sure this method actually exists but you get the concept
              // point is within the polygon, do tuff
              return true; // break the some loop
           }
       }
    });
});

我自己也基于草皮开发了一些完全相同的东西,我在客户端运行它(我的循环是用.some,而不是经典for循环,所以它甚至可以在性能方面走得更远)而且我从来没有经历冻结。

从我的角度来看,5000 个点对于浏览器来说是很容易处理的,但是如果你的多边形真的很复杂(几十万个顶点),这当然会减慢这个过程。

兄弟,文森特

于 2016-12-16T16:02:22.033 回答
0

如果 Stranded Kid 的回答对你来说太过分了,

geoJsonLayer.eachLayer(function(layer){
    var within = turf.within(turf.featureCollection(turfPoints),turf.featureCollection([layer.toGeoJSON()]));
    console.dir(within);
});

并确保您的坐标是浮点数而不是字符串,因为这就是导致我减速的原因。

于 2016-12-16T17:02:21.163 回答