2016-07-26 67 views
0

OpenLayers3 ol.interaction.Drawを使用して、頂点をクリックするか、Shift +ドラッグで自由形状のポリゴンを描くことができます(これは重要です私のアプリケーションに)。図形が描画されると、turf.jsを使用して描画された図形をクライアントのWFSレイヤーと比較し、intersect()を実行して、WFSフィーチャが描画された図形と交差するかどうかを確認します。しかし、手描きの図形にもわずかな自己交差がある場合、turf.js intersect()関数は次のエラーで失敗します(行326はintersect()となります)。turf.js OpenLayers3からの自己交差ポリゴンの交差エラーDraw

turf.min.js:9キャッチされない[対象オブジェクト]
getResultGeometry @ turf.min.js:9
si.overlayOp turf.min.js @:9
交差点@ turf.min。 JS:turf.min.js @ 15
e.exports:16
(匿名関数)main.js @:326

従いますが、私のコードのスケッチです。

var features = new ol.Collection(); 

var vs = new ol.source.Vector({ 
    format: new ol.format.GeoJSON(), 
    url: function(extent) { 
    return XXXXXX; 
    }, 
    strategy: ol.loadingstrategy.bbox 
}); 

features.on('add', function() { 
    vs.forEachFeatureIntersectingExtent(extent, function(feature) { 
    // use to turf.js to intersect each feature with drawn feature 
    var bt = gjformat.writeFeatureObject(feature, {rightHanded: false}); 
    var dt = gjformat.writeFeatureObject(features.item(0), {rightHanded: false}); 

    var intersection = turf.intersect(bt, dt); 
    } 
}); 

私は無駄にturf.js simplify()ol.geom.Geometry.simplify()の両方を使用しようとしました。 turf.jsを手に入れようとする人はいませんか手描きの自己交差ポリゴンを扱うにはintersect()?または、交差点を走る前に自己交差点を削除する方法?

答えて

0

Using JSTS buffer to identify a self-intersecting polygon(@ahocevarのおかげでありがとう)の答えに触発されて、私は解決策をturf.jsに移植しました。描画されたフィーチャに0で自己交差をバッファリングすると、より小さい自己交差ポリゴンが削除され、intersect()を実行するためのクリーンなフィーチャが残ります。

features.on('add', function() { 
     vs.forEachFeatureIntersectingExtent(extent, function(feature) { 
     // create geojson of wfs features and drawn feature 
     var bt = gjformat.writeFeatureObject(feature, {rightHanded: false}); 
     var dt = gjformat.writeFeatureObject(features.item(0), {rightHanded: false}); 

     // check for kinks in the drawn feature 
     var kinks = turf.kinks(dt); 
     var dtf; 

     if(kinks.features.length > 0) { 
      // if there are self-intersections, buffer by 0 to get rid of them 
      dtf = turf.buffer(dt, 0, 'meters'); 
     } else { 
      // if there are no self-intersection, intersect by unbuffered features 
      dtf = dt; 
     } 

     var intersection = turf.intersect(bt, dtf); 
     } 
    }); 
0

少なくとも、自己交差についてユーザーに警告することはできます。これらはJSTSで検出できます。 Google Maps Polygons self intersecting detectionを参照してください。自己交差を削除するのは難しいですが、JSTSでも可能です:Using JSTS buffer to identify a self-intersecting polygon

+0

Turfjsが自己交差を検出するための方法、[よじれを()](http://turfjs.org/docs/#kinks)があるので、私はそれのために別のライブラリにジャンプする必要はありません、自己交差するポリゴンをきれいにするバッファリングを見ていきます。 –