1

我正在使用 OpenLayers3ol.interaction.Draw让用户在地图上绘制一个形状,可以通过单击顶点或通过 Shift+Drag 来绘制自由多边形(这对我的应用程序很重要)。绘制形状后,我使用 turf.js 将绘制的形状与客户端中的 WFS 图层进行比较,运行intersect()以查看 WFS 特征是否与绘制的形状相交。但是,如果手绘形状有最轻微的自相交,turf.jsintersect()函数会失败并出现以下错误(我调用的是第 326 行intersect())。

turf.min.js:9 未捕获 [object Object]
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.jssimplify()ol.geom.Geometry.simplify()无济于事。有人对让 turf.jsintersect()处理手绘自相交多边形有什么建议吗?或者在运行交叉路口之前删除自交叉路口的方法?

4

2 回答 2

2

受到使用 JSTS 缓冲区识别自相交多边形的答案的启发(感谢@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);
      }
    });
于 2016-07-28T19:03:45.563 回答
0

您至少可以警告用户关于自相交。这些可以用 JSTS 检测到。请参阅Google Maps Polygons 自相交检测。移除自相交比较困难,但使用 JSTS 也应该可以:使用 JSTS 缓冲区来识别自相交多边形

于 2016-07-28T10:26:49.330 回答