2016-10-24 26 views
1

これはフロントエンド側です。私はturf.jsを使用しています。Turf.jsポリゴン、マルチポリゴン、ジオメトリコレクションを持つ交差バッファ

シナリオ:現在の場所から10km以内のすべての警告とインシデントを取得します。

多くの機能を備えた警告またはインシデントを含むgeojsonフィードは、geometry.type='Point' || geometry.type='MultiPolygon' || geometry.type='GeometryCollection'のライブフィードを取得しています。

は私の現在の座標とバッファ機能エリアを作成し、事件は私の近く(10キロ)が発生した場合の比較:私がこれまで行ってきた何

geometry.type = 'Point'の場合、turf.inside(point、bufferPolygon)を使用して比較していますが、これは問題なく動作しています。

挑戦は、MultiPolygonやMultiPolygonsを持つGeometryCollectionなどの点ではありません。

両方のパラメータでポリゴンを受け付ける唯一の他の方法は、turf.intersect(polygon, bufferPolygon)です。

ここでは私のフィードにはgeometry.type ='Polygon'がありませんが、MultiPolygonまたはGeometryCollection(マルチポリゴンを持つ)です。

if(feature.geometry.type === 'Point') { 
    if(turf.inside(feature, bufferPolygon)) { 
     console.log("inside"); 
     feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
    } 
} else { 
    if(feature.geometry.type === 'GeometryCollection') { 
     $.each(feature.geometry.geometries, function(index, geo) { 
      if(geo.type === 'MultiPolygon') { 
       //console.log('MP:', geo.coordinates[0]); 
       var convertToPolygon = turf.polygon(geo.coordinates[0]); 
       console.log('convertToPolygon:',convertToPolygon); 
       //console.log('MP:intersect',turf.intersect(polygon, bufferPolygon)); 
       var isIntersecting = turf.intersect(convertToPolygon, bufferPolygon); 
       if(isIntersecting) { 
        feature.properties.feedType === 'warning' ? warningsNearBy++ : incidentsNearBy++; 
       } 
      } else if(geo.type === 'GeometryCollection') { 
       console.log('GC:', geo); 
      } 
     }); 
    } else { 
     console.log('not geo collection:', feature.geometry.type); 
    } 
} 

また、マルチポリゴンをポリゴンに変換しようとしましたが、うまく機能しませんでした。

ポイント、マルチポリゴン、およびGeometryCollectionを持つフィーチャコレクションのセットとbufferFeatureを比較する方法をお勧めしますか?

答えて

1

バッファを複数の点と比較しても大丈夫なら、1つのことは、ポリゴン/マルチポリゴンでturf.explode()を使用することです。ここにはドキュメンテーションへのリンクがあります。

http://turfjs.org/examples/turf-explode/

ターフ形状の頂点を表す点の特徴コレクションにポリゴンまたはマルチポリゴンを向けるだろう爆発。ポリゴン/マルチポリゴンでturf.explode()を実行したら、結果内の各フィーチャー(ポイント)を反復処理し、turf.inside()を使用してバッファーと比較する必要があります。この部分にはturf.within()を使用するほうが簡単でしょうが、必要に応じてturf.inside()を使用できます。

ポイントの1つがバッファの内側にある場合、ポイントが表すポリゴンの少なくとも一部もバッファ領域内にあるため、これは機能します。

これについてもう1つの方法は、距離を比較するためにバッファの代わりにポイントを使用することです。あなたがポイントを持っていた場合は、ちょうどturf.distance()を使用して、2つのポイントの間の距離を見ることができます。ポリゴン/マルチポリゴンがある場合は、それらをturf.explode()とすることができ、元のポイントとの距離を比較することができます。

ジオメトリコレクションについては、ジオメトリコレクションのさまざまな部分をタイプ別のフィーチャコレクションに分けない限り、芝生を使用して作業することはできません。

0

また、マルチポリゴンをポリゴンに変換しようとしましたが、動作しませんでした。

なぜ機能しなかったのですか?それをさらに説明できますか?

マルチポリゴンまたはポリゴンは、ポイントの集合ではありません。それを点の配列または点の特徴を含む配列に変換することができます。あなたはそれをこのような何か行うことができます

function unpackMultiPolCoords(features) { 
    var data = []; 
    featureEach(features, function(feature) { 
    var coordCollection = feature.geometry.coordinates; 
    coordCollection.forEach(function(coords) { 
     coords.forEach(function(coord) { 
     data.push(coord); 
     }); 
    }); 
    }); 
    return data; 
}; 

var unpacked = unpackMultiPolCoords(multiPoly); 

let toPoints = function(fc) { 
    let points = []; 
    fc.forEach((coord) => { 
    points.push(turf.point(coord)); 
    }); 
    return points; 
}; 

var points = toPoints(unpacked); 

は、その後、あなたのバッファに芝生の距離関数ですべてのポイントを比較することができhttp://codepen.io/bitHugger/pen/mOxwME

@完全なコードを参照してください。

関連する問題