QGISで行の方向を切り替えるにはどうすればよいですか?


51

うまくいけば、かなり簡単です。

QGISでポリライン/ラインの方向を交換できるようにしたいと思います。数年前にMapInfoでこれを行うためのカスタムツールを作成しましたが、QGISには何も見つからないようです。

誰でもこれを行うツールを知っていますか?

存在しない場合は、それを作成するために行って満足しています。すでに作成されている場合はしたくありませんでした。


3
持つのは素晴らしいでしょう。私はそのようなネイティブQGIS関数を知りません。
暗闇

3
どうやってこれを簡単に行うことができるか、良いアイデアがあります。今夜何かを立てることができるかどうかを確認します。
ネイサンW

すばらしいです!たぶん、ftools / vectorツールボックスに追加できます。
暗闇

1
すでにコアの面倒を見ているので、この質問に取り組むことはできますか? gis.stackexchange.com/questions/9286/... resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

1
チケットはこちらです:hub.qgis.org/issues/4936
マイクT

回答:


62

[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)

上記のコードを実行する前に:

  1. 編集するレイヤーを選択します。
  2. 編集をオンに切り替えます。
  3. このレイヤーで反転するフィーチャを選択します。

上記のPythonコードを実行するには:

  1. [プラグイン]> [Pythonコンソール]に移動します。
  2. コードをウィンドウにコピーして貼り付けます。
  3. Enterを2回押して実行します。

方向が入れ替わったフィーチャごとに「True」を出力する必要があります。「False」と出力された場合、その機能の方向は交換されていません。これは、レイヤーの編集がオンになっていない場合に発生します。

とても簡単!

というプラグインでラップしましSwap Line Directionた。QGISプラグインインストーラーで利用できます。

このプラグインは、プラグインインストーラーでは(2015年11月16日現在)使用できなくなりましたが、「プラグインビルダー」プラグインを使用して簡単に独自のプラグインを作成できます。

fToolsとの統合がいかに簡単かを見ていきます。


1
独自のソリューションを作成しました-よくできました-ftoolsに追加できますか?
マッパーズ

私はそれができると確信しています。fToolsのコーディング方法を見て、パッチを書くだけです。
ネイサンW

素晴らしい!このようなソリューションが、私がQGISを使用するのが好きな理由です。ナイスジョブネイサン-ところで、私はあなたの小さなカタログタイプのプラグインも気に入っています!
安藤

@安藤ありがとう!いくつかの新しいアイデアのベータテストを行っていますが、もっと時間を取って作業を進めたいと思います。
ネイサンW

3
ソリューションを非常に迅速かつエレガントに仕上げたことは本当に素晴らしいことです。オープンソースの力が再び勝ち取ります!
ライアンダルトン

14

GRASSプラグインをお持ちの場合は、v.flipオプションを使用してください-http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

ここに画像の説明を入力してください


hmmmはQGISのネイティブな方法を望んでいました。現時点ではGRASSをインストールしないでください。しかし、それはそうする人々にとって良いヒントです。
ネイサンW

Pythonで持って、underdarkで指摘されたftoolsに追加すると良いでしょう。
マッパーズ

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向けです
デニスルザウ



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を作成しましたか?
ホワイザー


今では、処理ツールボックスに逆方向ツールがあります。
AndreJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.