2016-12-16 7 views
2

私は5000以上のLatLngポイントを持っており、それぞれについてどのフィーチャー(地域)が属しているかを調べたいと思います。機能はa kmz layer by Philippe Ivaldiから来て、GeoJSONに変換されます。いくつかの機能で多くの点を共有する最も良い方法は?

現在、私は二重のforループでturfjsでこれをやっています。予想どおり、計算はブラウザを10分間フリーズしますが、これはあまり便利ではありません。

は、ここに私のコードです:

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

、私はクライアント側でそれを実行する(と私のループが.someで作られています、古典的ではないforループなので、パフォーマンス面でさらに進歩する可能性があります)、決してフリーズしませんでした。

私の視点から見ると5000ポイントはピーナッツブラウザで扱うことができますが、ポリゴンが本当に複雑な場合(数十万の頂点数の場合)、プロセスが遅くなることがあります。

Brで、 ヴィンセント

+0

*ピーナッツ*私はちょうど私のジオコーディングプロバイダが私にLatlngsを 'string'で与えることに気づきました。それらを「フロート」にキャストすると、計算が数秒で実行されます。 ** head slam **まだ、私はあなたのアルゴリズムを試してみたら、あなたに戻ってきます。ありがとう! –

+0

これは高速です。よくやった。 –

0

本鎖子供の答えは、あなたのための過剰です

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

そして、それは私のために減速の原因だから、あなたの座標は、浮動小数点数ではなく文字列であることを確認した場合。

関連する問題