2016-12-16 17 views
2

我有5000多个LatLng点,对于他们每个人我想知道他们属于哪个特征(区域)。这些功能来自a kmz layer by Philippe Ivaldi,转换为GeoJSON。分享多项功能的最佳途径?

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

这里是我的代码:

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

我能做些什么来避免冻结浏览器?

  • 使它成为异步?
  • 在服务器上用nodeturfjs进行计算吗?
  • 或在nodeleaflet-headless的服务器上部署leafletjs

...或者我应该只是处理它

谢谢!

回答

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

我有我自己的东西developped恰好做同样的事情还根据草皮,我在客户端上运行它(和我的循环与.some制作,而不是经典的for循环,所以它甚至可以在性能方面更进一步),而且我从未遇到冻结。

从我的角度来看,5000点是花生供浏览器处理,但如果你的多边形真的很复杂(成百上千的顶点),这可能会减慢过程。

BR, 文森特

+0

*确实是花生*。我只是意识到,我的地理编码提供商给了我'字符串'LatLngs,显然减缓turfjs没有警告!将它们投入“浮动”可以在几秒钟内完成计算。 **头部满贯**但是,一旦我尝试过你的算法,我会尽快回复你,这确实会提供一个很好的速度提升。谢谢! –

+0

速度更快。做得好。 –

0

如果绞合孩子的回答是矫枉过正你,

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

并确保您的坐标花车,而不是字符串,因为那是什么原因造成的减速箱。