如何在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.