Bagaimana saya bisa mengubah arah saluran di QGIS?


51

Sesuatu yang semoga cukup mudah.

Saya ingin bisa menukar arah polyline / baris di QGIS. Saya membuat alat khusus untuk melakukan ini di MapInfo beberapa tahun yang lalu, namun saya tidak dapat menemukan apa pun untuk QGIS.

Adakah yang tahu alat untuk melakukan ini?

Jika seseorang tidak ada maka saya senang untuk membuatnya, hanya tidak mau jika sudah dibuat.


3
Akan menyenangkan untuk dimiliki. Saya tidak tahu fungsi QGIS asli seperti itu.
underdark

3
Saya punya ide bagus bagaimana saya bisa melakukan ini dengan mudah, saya akan melihat apakah saya bisa menyiapkan sesuatu malam ini.
Nathan W

Bagus! Mungkin itu dapat ditambahkan ke kotak alat ftools / vektor.
underdark

1
karena Anda sudah mendapatkan inti yang diurus, ada kemungkinan Anda ingin menangani pertanyaan ini, tetapi untuk QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

Jawaban:


62

Ok di sini adalah Python yang saya gunakan untuk melakukannya:

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)

Sebelum menjalankan kode di atas:

  1. Pilih layer yang ingin Anda edit;
  2. Beralih Pengeditan aktif;
  3. Pilih fitur di lapisan ini yang ingin Anda balikkan.

Jalankan kode python di atas dengan:

  1. Pergi ke Plugin> Konsol Python;
  2. Menyalin dan menempelkan kode ke jendela;
  3. Tekan Enter 2x untuk menjalankan.

Seharusnya menampilkan "True" untuk setiap fitur yang arahnya ditukar. Jika itu menghasilkan "Salah" maka itu tidak menukar arah fitur itu. Ini akan terjadi jika layer tidak memiliki Editing yang diaktifkan.

Sangat mudah!

Saya telah membungkusnya dalam sebuah plugin bernama Swap Line Directiondan itu tersedia di installer plugin QGIS.

Pengaya ini tidak lagi tersedia (pada 11/16/2015) di penginstal pengaya, tetapi Anda dapat membuatnya sendiri dengan mudah menggunakan pengaya " Pengaya Pengaya ".

Saya akan melihat betapa mudahnya untuk terintegrasi dengan fTools.


1
jadi Anda membuat solusi Anda sendiri - dilakukan dengan baik - dapatkah itu ditambahkan ke ftools?
Mapperz

Saya yakin itu bisa, saya hanya harus melihat cara kode fTools dan menulis sebuah tambalan.
Nathan W

Fantastis! Solusi seperti ini adalah alasan saya suka menggunakan QGIS. Nice job Nathan - BTW Saya suka plugin tipe katalog kecil Anda juga!
Ando

@Ando Terima kasih! Saya sedang menguji beberapa ide baru, hanya berharap saya punya lebih banyak waktu untuk mengerjakannya sehingga saya bisa mengeluarkannya lebih cepat.
Nathan W

3
Sungguh luar biasa bahwa Anda mengerjakan solusi dengan begitu cepat dan elegan. Kekuatan Open Source menang lagi!
RyanDalton


6

Mengikuti jawaban Nathan, Anda bisa membuat aksi python di layer tempat Anda ingin bertukar baris:

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)

Anda akan dapat menukar baris dengan satu klik pada mereka. Ini sangat user-friendly!


1
kode ini untuk 2.x
Denis Rouzaud



4

Berdasarkan posting Nathan, saya telah membuat skrip pemrosesan untuk membalikkan arah fitur:

#!/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()

masukkan deskripsi gambar di sini


Bagaimana Anda membuat gif?
whyzar


Sekarang, ada alat arah terbalik di kotak alat pemrosesan.
AndreJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.