如何在QGIS中切换线的方向?


51

希望这很容易。

我希望能够在QGIS中交换折线/线的方向。几年前,我在MapInfo中创建了一个自定义工具来执行此操作,但是对于QGIS我似乎找不到任何东西。

有人知道执行此操作的工具吗?

如果不存在,那么我很乐意尝试一下,只是不想做一个。


3
太好了。我不知道任何此类本机QGIS功能。
— 黑暗

3
我有一个很好的主意,我该如何轻松地做到这一点,我看看今晚是否可以做些事情。
— 内森·W

大!也许可以将其添加到ftools / vector工具箱中。
— 昏暗

1
既然您已经做好了核心工作,那么您有任何想解决这个问题的机会,但是对于QGIS? gis.stackexchange.com/questions/9286/... resources.arcgis.com/content/kbase?fa=articleShow&d=20961
— RyanDalton

1
这张票是:hub.qgis.org/issues/4936
— Mike T

Answers:


62

好的,这是我用来做的Python:

layer = qgis.utils.iface.mapCanvas().currentLayer()
for feature in layer.selectedFeatures():
   geom = feature.geometry()
   nodes = geom.asPolyline()
   nodes.reverse() 
   newgeom = QgsGeometry.fromPolyline(nodes)
   layer.changeGeometry(feature.id(),newgeom)

在运行上面的代码之前:

  1. 选择要编辑的图层;
  2. 开启编辑功能;
  3. 在该图层中选择要撤消的要素。

通过以下方式运行上述python代码:

  1. 转到插件> Python控制台;
  2. 复制代码并将其粘贴到窗口中;
  3. 点击Enter 2x运行。

对于方向已交换的每个要素,它应该输出“ True”。如果输出“ False”,则它没有交换该特征的方向。如果图层未启用“编辑”,则会发生这种情况。

相当容易!

我已经将其包装在一个名为的插件中Swap Line Direction,并且可以在QGIS插件安装程序中使用。

插件安装程序中不再提供此插件(自2015年11月16日起),但是您可以使用“ Plugin Builder ”插件轻松构建自己的插件。

我将看看与fTools集成有多么容易。


1
因此您创建了自己的解决方案-做得很好-可以将其添加到ftools吗?
— Mapperz

我敢肯定,我只需要看一下fTools的编码方式并编写补丁即可。
— 森W

太棒了!这样的解决方案是我喜欢使用QGIS的原因。Nathan做得好-顺便说一句,我也喜欢您的小目录类型插件!
— 安藤

@安藤谢谢!我正在Beta测试一些新的想法,只是希望我有更多的时间来研究它,这样我才能更快地解决它。
— 内森·W

3
您如此迅速而优雅地制定了一个解决方案,真是太棒了。开源的力量再次获胜!
— 瑞安·道尔顿


6

遵循Nathan的回答,您可以在要交换线的图层中创建python操作:

layer = QgsMapLayerRegistry.instance().mapLayer("_your_layer_id_")
r = QgsFeatureRequest([% $id %])
f = QgsFeature()
if layer.getFeatures(r).nextFeature(f):
  geom = f.geometry().asPolyline()
  geom.reverse()
  geom = QgsGeometry.fromPolyline(geom)
  if layer.changeGeometry([% $id %], geom):
    qgis.utils.iface.messageBar().pushMessage("Line swaped", QgsMessageBar.INFO, 2)
    qgis.utils.iface.mapCanvas().refresh()
  else:
    qgis.utils.iface.messageBar().pushMessage("Cannot swap line. Turn editing on.", QgsMessageBar.WARNING, 3)
else:
  qgis.utils.iface.messageBar().pushMessage("Cannot edit this feature.", QgsMessageBar.CRITICAL, 3)

只需单击一下即可交换行。这是非常用户友好的!


1
该代码适用于2.x
— Denis Rouzaud 2013年



4

根据Nathan的帖子,我创建了一个处理脚本来反转特征的方向:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# define Interface
##QGIS tools (QGIS 2.x)=group
##Reverse vector direction=name
##Input_layer=vector
##Only_selected_features=boolean true

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import *

from qgis.core import *
from qgis.gui import *
from qgis.utils import *

# get input parameters from GUI
inlayer = processing.getObject(Input_layer)
selected = Only_selected_features

# check 'Only selected features' option
if selected is True and inlayer.selectedFeatureCount () == 0:
    raise RuntimeError('No features selected on Layer \'' + inlayer.name() + '\'.')

# check if input layer is editable
if not inlayer.isEditable():
    inlayer.startEditing()

# reverse vector direction
def reverse():
    geom = feature.geometry()
    nodes = geom.asPolyline()
    nodes.reverse()
    newgeom = QgsGeometry.fromPolyline(nodes)
    inlayer.changeGeometry(feature.id(),newgeom)

if selected is True:
    for feature in inlayer.selectedFeatures():
        reverse()
else:
    for feature in inlayer.getFeatures():
        reverse()

# refresh input layer
inlayer.dataProvider().forceReload()

在此处输入图片说明


您是如何创建gif的?
— whyzar


到目前为止,在处理工具箱中有一个反向工具。
— AndreJ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.