希望这很容易。

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

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

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

评论

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

我有一个很好的主意,我如何可以轻松地做到这一点,我看看我今晚是否可以做些什么。

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

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

这张票是:hub.qgis.org/issues/4936

#1 楼

好的,这里是我用来做的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)
 


运行上述代码之前:


选择要编辑的图层;
切换编辑;
在该层中选择要反转的特征。

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


转到“插件”>“ Python控制台”;
将代码复制并粘贴到窗口中;
单击“输入2x”以运行。

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

非常简单!

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

(自2015年11月16日起)该插件不再可用,但您可以使用“插件生成器”插件轻松地构建自己的插件。

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

评论


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

– Mapperz♦
2011年5月4日21:36

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

–内森·W
2011年5月4日在22:02

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

–安藤
2011年5月4日在22:05

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

–内森·W
2011年5月4日在22:17

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

– RyanKDalton
2011年5月4日22:20

#2 楼

如果您拥有GRASS插件,请使用v.flip选项-http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip



评论


hmmm希望采用一种更QGIS的本机方式,目前不安装GRASS。但这对这样做的人是一个很好的提示。

–内森·W
2011年5月4日下午5:55

最好在python中使用,并添加到underdark指出的ftools中。

– Mapperz♦
2011年5月4日13:41

#3 楼

该插件也可以反转线方向:

https://hub.qgis.org/projects/swapvectordirection

您必须选择一个要素,然后将图层转换为编辑模式,然后点击插件图标。

#4 楼

遵循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)
 


一键即可交换行。
它非常易于使用!

评论


该代码适用于2.x

–丹尼斯·鲁扎德(Denis Rouzaud)
2013年12月12日上午7:33

#5 楼

此插件将切换折线的方向。

http://plugins.qgis.org/plugins/DigitizingTools/

#6 楼

根据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的?

–为什么
17年3月18日在18:01

askubuntu.com/a/123515/666853

–eclipsed_by_the_moon
17年3月18日在18:17

到目前为止,在处理工具箱中有一个反向工具。

– AndreJ
18年3月20日在7:18