2016-07-26 585 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:15个
e.exports @ turf.min.js: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); 
     } 
    }); 
相关问题