通过拖动移动矢量要素
Move vector features by dragging
如果我在图层上有多边形、线、文本和点,我希望能够 select 1 个特征,右键单击 select“移动”,然后能够将该要素拖到地图上的另一个位置,然后松开
鼠标按钮将新位置保存到我的数据库中。
我在哪里,我可以...
Select 要移动的要素
右键单击并select一个用于调用代码的“移动”动作
添加了 Translate 和 Select ol 对象。这不是 select 我传递给的功能
虽然翻译...我仍然需要单击该功能,然后才能拖动它。即使我
仅向翻译添加了 1 个功能我可以单击并拖动任何功能(我没想到的是
这样做将允许。
一旦进入select拖动地图项的模式,除了重新加载地图之外别无他法...我
不知道如何也没有在文档中看到如何捕捉“拖动完成”
我的代码
moveObject(){
//first get the selected object
const selectedObject = new Array<number>();
const selectedFeatures: Array<olFeature> = myFeatureLayer.getSource().getFeatures();
selectedFeatures.forEach((feature: olFeature) => {
selectedObject.push(feature.getId());
});
//get the feature
let selectedFeatures = this.myFeatureService.getFeature(selectedObject);
let select = new Select();
let translate = new Translate({
features: selectedFeatures, (this should restrict the move to just the feature passed in,but it
doesn't)
});
MapValues.map.addInteraction(translate);
MapValues.map.addInteraction(select);
//Here I want to automatically select the feature given and put it into "Move" mode.
// Here once move is done I want to catch "Dropping" the feature and add to the data base and
remove the Interactions.
}
更新:
我找到了 'translateend'
translate.on('translateend', evt => {
evt.features.forEach(feat => {
// process every feature
})
})
...但这不仅会在最后触发,还会随着点击向下和向上点击触发?我很困惑为什么要这样做,这个功能看起来像一个脊状框架?...我可能是错的,但有限的文档和示例让人很难理解翻译的能力。
非常感谢任何帮助
据我了解,一旦翻译交互具有可以与之交互的功能(即功能集合中具有功能),那么即使点击它也足以触发“translatestart”和“translateend”事件。
您可以做的一件事是监视功能的集合“添加”和“删除”事件。在“add”上,在几何对象本身上注册一个“change”事件,以检测在“translateend”事件触发时几何是否已更改(在“translateend”事件的处理程序方法中,您可以将特征标记为已更改)。在“删除”上,撤消功能上的标记。
这样,您将忽略对所选特征的简单“点击”,而只关心其几何形状是否发生了变化。
现场演示
我已经创建了一个小演示来说明我在 OpenLayers Translate 示例中的意思。参见:
https://codesandbox.io/s/translate-features-forked-p7kum?file=/index.html
如果我在图层上有多边形、线、文本和点,我希望能够 select 1 个特征,右键单击 select“移动”,然后能够将该要素拖到地图上的另一个位置,然后松开 鼠标按钮将新位置保存到我的数据库中。
我在哪里,我可以...
Select 要移动的要素
右键单击并select一个用于调用代码的“移动”动作 添加了 Translate 和 Select ol 对象。这不是 select 我传递给的功能 虽然翻译...我仍然需要单击该功能,然后才能拖动它。即使我 仅向翻译添加了 1 个功能我可以单击并拖动任何功能(我没想到的是 这样做将允许。
一旦进入select拖动地图项的模式,除了重新加载地图之外别无他法...我 不知道如何也没有在文档中看到如何捕捉“拖动完成”
我的代码
moveObject(){
//first get the selected object
const selectedObject = new Array<number>();
const selectedFeatures: Array<olFeature> = myFeatureLayer.getSource().getFeatures();
selectedFeatures.forEach((feature: olFeature) => {
selectedObject.push(feature.getId());
});
//get the feature
let selectedFeatures = this.myFeatureService.getFeature(selectedObject);
let select = new Select();
let translate = new Translate({
features: selectedFeatures, (this should restrict the move to just the feature passed in,but it
doesn't)
});
MapValues.map.addInteraction(translate);
MapValues.map.addInteraction(select);
//Here I want to automatically select the feature given and put it into "Move" mode.
// Here once move is done I want to catch "Dropping" the feature and add to the data base and
remove the Interactions.
}
更新: 我找到了 'translateend'
translate.on('translateend', evt => {
evt.features.forEach(feat => {
// process every feature
})
})
...但这不仅会在最后触发,还会随着点击向下和向上点击触发?我很困惑为什么要这样做,这个功能看起来像一个脊状框架?...我可能是错的,但有限的文档和示例让人很难理解翻译的能力。
非常感谢任何帮助
据我了解,一旦翻译交互具有可以与之交互的功能(即功能集合中具有功能),那么即使点击它也足以触发“translatestart”和“translateend”事件。
您可以做的一件事是监视功能的集合“添加”和“删除”事件。在“add”上,在几何对象本身上注册一个“change”事件,以检测在“translateend”事件触发时几何是否已更改(在“translateend”事件的处理程序方法中,您可以将特征标记为已更改)。在“删除”上,撤消功能上的标记。
这样,您将忽略对所选特征的简单“点击”,而只关心其几何形状是否发生了变化。
现场演示
我已经创建了一个小演示来说明我在 OpenLayers Translate 示例中的意思。参见:
https://codesandbox.io/s/translate-features-forked-p7kum?file=/index.html