うまくいけば、かなり簡単です。
QGISでポリライン/ラインの方向を交換できるようにしたいと思います。数年前にMapInfoでこれを行うためのカスタムツールを作成しましたが、QGISには何も見つからないようです。
誰でもこれを行うツールを知っていますか?
存在しない場合は、それを作成するために行って満足しています。すでに作成されている場合はしたくありませんでした。
うまくいけば、かなり簡単です。
QGISでポリライン/ラインの方向を交換できるようにしたいと思います。数年前にMapInfoでこれを行うためのカスタムツールを作成しましたが、QGISには何も見つからないようです。
誰でもこれを行うツールを知っていますか?
存在しない場合は、それを作成するために行って満足しています。すでに作成されている場合はしたくありませんでした。
回答:
[OK]をここで私がそれを行うために使用した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コードを実行するには:
方向が入れ替わったフィーチャごとに「True」を出力する必要があります。「False」と出力された場合、その機能の方向は交換されていません。これは、レイヤーの編集がオンになっていない場合に発生します。
とても簡単!
というプラグインでラップしましSwap Line Direction
た。QGISプラグインインストーラーで利用できます。
このプラグインは、プラグインインストーラーでは(2015年11月16日現在)使用できなくなりましたが、「プラグインビルダー」プラグインを使用して簡単に独自のプラグインを作成できます。
fToolsとの統合がいかに簡単かを見ていきます。
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)
ワンクリックで行を交換できます。それは非常にユーザーフレンドリーです!
このプラグインは、ポリラインの方向を切り替えます。
このプラグインは、行の方向も逆にします。
https://hub.qgis.org/projects/swapvectordirection
プラグインアイコンをクリックする前に、機能を選択し、レイヤーを編集モードにする必要があります。
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()