【问题标题】:Openlayers - Avoid and adjust overlapping polygonsOpenlayers - 避免和调整重叠的多边形
【发布时间】:2021-10-15 15:43:58
【问题描述】:

我有一个项目使用 Openlayers 来绘制、编辑和显示多个多边形。我想添加到项目中的功能之一是自动避免重叠功能。

当用户绘制新特征时。应用程序应检查是否有任何现有功能被新功能重叠。这要感谢 Turf.js 库:Stackoverflow discussion on overlapping features.

我要添加的下一步是自动切断和删除与现有功能重叠的新功能的多余区域的功能。我已经在 Turf.js 文档上进行了搜索,但我无法找到执行此操作的函数。

【问题讨论】:

  • 多边形相交的地方可以使用 turf.difference
  • @Mike 感谢您的快速回答!我认为这可能是解决方案。我会试试看!
  • @Mike 感谢您的回答!我找到了一个合适的解决方案,结合了 Turf.js 库中的 intersect 和 difference 方法。

标签: openlayers polygon turfjs


【解决方案1】:

在 Mike 的帮助下,我创建了一个可行的解决方案。我遍历 VectorLayer 中存在的所有特征。我首先检查该特征是否确实是多边形。然后我将这些特征转换为 Turf Polygon 对象并检查它们是否相交。如果它们相交,我使用 Turf 中的差异函数并将特征的坐标设置为生成的多边形。

  const removeOverlappingAreasWithExistingFeatures = (feature) => {
    const format = new GeoJSON();

    store.state.layers.drawingLayer.getFeatures().forEach((existingFeature) => {
      if (
        existingFeature.getGeometry().getType() !== 'Polygon' ||
        !existingFeature.get('description') ||
        existingFeature.get('description') === feature.get('description')
      )
        return;

      var featurePoly = format.writeFeatureObject(feature);
      var existingFeaturePoly = format.writeFeatureObject(existingFeature);

      const intersection = turf.intersect(featurePoly, existingFeaturePoly);
      if (intersection) {
        var difference = turf.difference(featurePoly, intersection);

        difference.geometry.coordinates =
          difference.geometry.coordinates.filter(
            (coordinate) => coordinate.length > 0
          );

        feature.setGeometry(format.readFeature(difference).getGeometry());
      }
    });

    return feature;
  };

【讨论】:

  • 你不应该假设差异结果是一个多边形。如果交叉点将新多边形分成两部分,它将是一个多多边形。在codesandbox.io/s/vector-layer-forked-jb3i4?file=/main.js 中使用format.writeFeatureObject()format.readFeature().getGeometry() 会更安全。请注意,turf 可以返回带有空多边形的多面体,因为它会破坏 OpenLayers。
  • @Mike 感谢您的建议!我已经根据您的建议更新了代码。您能否检查一下我是否正确实施了您的建议?
  • 如果是多多边形结果中的空多边形,它们会破坏 readFeature,因此需要提前删除它们。我怀疑这只是减少现有多面体时的问题 - 例如加拿大在北极岛屿被移除的例子中。
  • @Mike 我已经更新了代码。现在我对 turf 对象进行过滤,然后将其转换为 Openlayers 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2022-11-11
  • 2019-08-05
  • 2015-04-16
相关资源
最近更新 更多