Openlayers 4-修改交互&;同一坐标下的多个要素

Openlayers 4-修改交互&;同一坐标下的多个要素,openlayers,Openlayers,我在向量层上启用了一个具有多个功能的修改交互。将特征移动到新位置效果良好。但是,如果同一坐标上有多个要素,则所有要素将同时移动 有什么办法可以避免吗?我找到的唯一解决方案是: 我有一个选择互动来选择功能 使用“平移交互”移动其中一个要素 或 在指针移动事件中,检测一个或多个特征是否在坐标处,然后选择其中一个 添加选定要素以修改要素图层并将其移动 还有别的办法吗 再生 RM还有另一种方法。您可以在映射上注册一个“pointermove”处理程序,在该处理程序中,您可以获得最顶层的功能,并将其设置为

我在向量层上启用了一个具有多个功能的修改交互。将特征移动到新位置效果良好。但是,如果同一坐标上有多个要素,则所有要素将同时移动

有什么办法可以避免吗?我找到的唯一解决方案是:

  • 我有一个选择互动来选择功能
  • 使用“平移交互”移动其中一个要素
  • 在指针移动事件中,检测一个或多个特征是否在坐标处,然后选择其中一个
  • 添加选定要素以修改要素图层并将其移动
  • 还有别的办法吗

    再生
    RM

    还有另一种方法。您可以在映射上注册一个“pointermove”处理程序,在该处理程序中,您可以获得最顶层的功能,并将其设置为源上修改交互工作的唯一功能。有关完整示例,请参见

    除了在代码中,您将把修改交互连接到一个源而不是集合,并且该源(
    modifySource
    )与向量层的源分离,并且最初为空。在
    pointermove
    处理程序中,您只需向该源添加一个功能:

    function pointermove(e) {
      if (e.dragging) {
        return;
      }
      var features = map.getFeaturesAtPixel(e.pixel, {
        layerFilter: function(l) {
          return l == vector;
        }
      });
      if (features && features[0] != modifySource.getFeatures()[0]) {
        modifySource.clear();
        modifySource.addFeature(features[0]);
      }
    }
    map.on("pointermove", pointermove);
    

    还要注意,在将修改交互添加到映射之前,必须注册此处理程序。

    还有另一种方法。您可以在映射上注册一个“pointermove”处理程序,在该处理程序中,您可以获得最顶层的功能,并将其设置为源上修改交互工作的唯一功能。有关完整示例,请参见

    除了在代码中,您将把修改交互连接到一个源而不是集合,并且该源(
    modifySource
    )与向量层的源分离,并且最初为空。在
    pointermove
    处理程序中,您只需向该源添加一个功能:

    function pointermove(e) {
      if (e.dragging) {
        return;
      }
      var features = map.getFeaturesAtPixel(e.pixel, {
        layerFilter: function(l) {
          return l == vector;
        }
      });
      if (features && features[0] != modifySource.getFeatures()[0]) {
        modifySource.clear();
        modifySource.addFeature(features[0]);
      }
    }
    map.on("pointermove", pointermove);
    

    还要注意,在将修改交互添加到映射之前,必须注册此处理程序。

    您已经有了2个解决方案。您寻找其他解决方案的具体原因是什么?第一个解决方案需要额外的单击(选择单击),我希望避免这种情况。当将功能从一层移动到另一层时,secound需要装订,这使得代码更加复杂,我希望我可以保持代码简单。这就是我寻找其他解决方案的原因。您已经有了2个解决方案。您寻找其他解决方案的具体原因是什么?第一个解决方案需要额外的单击(选择单击),我希望避免这种情况。当将功能从一层移动到另一层时,secound需要装订,这使得代码更加复杂,我希望我可以保持代码简单。这就是我寻找其他解决方案的原因。嗨,阿霍塞瓦尔,谢谢你的回答。我让它工作了。不允许在modifystart事件中更改要素样式吗?我得到了与中相同的错误,但是如果我首先在下面这样的更改事件中更改样式,它会起作用:
    modify.on(“modifystart”,function(e){foreach(e.features,function(elem,…){elem.once(“change”,function(event){elem.target.setStyle(…)}}})
    如果我修改了.on(“modifystart”,function(e){e.features[0].setStyle(…)})我得到了错误。知道为什么吗?嗨,ahocevar,谢谢你的回答。我让它工作了。不允许在modifystart事件中更改功能样式吗?我得到了与中相同的错误,但是如果我首先在下面这样的更改事件中更改样式,它会工作:
    modify.on(“modifystart”,function(e){foreach(e.features,function(elem,…){elem.once(“change”,function(event){elem.target.setStyle(…)}}})
    如果我修改了。在(“modifystart”,function(e){e.features[0].setStyle(…)})上我得到了错误。知道为什么吗?