ฉันจะเปลี่ยนทิศทางของเส้นใน QGIS ได้อย่างไร?


51

สิ่งที่หวังว่าค่อนข้างง่าย

ฉันต้องการที่จะสลับทิศทางของ polyline / line ใน QGIS ฉันสร้างเครื่องมือที่กำหนดเองเพื่อทำสิ่งนี้ใน MapInfo เมื่อสองสามปีที่แล้ว แต่ดูเหมือนว่าฉันจะไม่พบสิ่งใดสำหรับ QGIS

ไม่มีใครรู้ของเครื่องมือในการทำเช่นนี้?

หากไม่มีอยู่ฉันก็ยินดีที่จะทำมันเพียงแค่ไม่ต้องการที่จะทำไปแล้ว


3
จะดีที่มี ฉันไม่รู้เกี่ยวกับฟังก์ชั่นพื้นเมือง QGIS
underdark

3
ฉันมีความคิดที่ดีว่าฉันสามารถทำสิ่งนี้ได้อย่างง่ายดายเพียงไรฉันจะดูว่าฉันสามารถทำอะไรบางอย่างในคืนนี้ได้ไหม
นาธาน W

ที่ดี! อาจเพิ่มกล่องเครื่องมือ ftools / vector ได้
underdark

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

คำตอบ:


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. เลือกคุณสมบัติในเลเยอร์นี้ที่คุณต้องการย้อนกลับ

เรียกใช้รหัสหลามข้างต้นโดย:

  1. ไปที่ปลั๊กอิน> Python Console;
  2. คัดลอกและวางรหัสลงในหน้าต่าง
  3. กด Enter 2x เพื่อเรียกใช้

มันควรจะส่งออก "จริง" สำหรับแต่ละคุณสมบัติที่มีการสลับทิศทาง หากมันแสดงผลเป็น "เท็จ" มันจะไม่สลับทิศทางของคุณสมบัตินั้น สิ่งนี้จะเกิดขึ้นหากเลเยอร์ไม่ได้เปิดใช้งานการแก้ไข

ค่อนข้างง่าย!

ฉันได้รวมไว้ในปลั๊กอินที่เรียกว่าSwap Line Directionและมันมีอยู่ในตัวติดตั้งปลั๊กอิน QGIS

ปลั๊กอินนี้ไม่สามารถใช้งานได้อีกต่อไป (ตั้งแต่วันที่ 11/16/2558) ในเครื่องมือติดตั้งปลั๊กอิน แต่คุณสามารถสร้างปลั๊กอินของคุณเองได้อย่างง่ายดายด้วยปลั๊กอิน " เครื่องมือสร้างปลั๊กอิน"

ฉันจะดูว่ามันง่ายที่จะรวมเข้ากับ fTools


1
ดังนั้นคุณสร้างโซลูชันของคุณเอง - ทำได้ดีมาก - สามารถเพิ่มไปยัง ftools ได้หรือไม่
Mapperz

ฉันแน่ใจว่าทำได้ฉันจะต้องดูวิธีที่รหัส fTools และเขียนแพทช์
นาธาน W

Fantastic! โซลูชันเช่นนี้เป็นเหตุผลที่ฉันชอบใช้ QGIS Nice job Nathan - BTW ฉันชอบปลั๊กอินประเภทแคตตาล็อกน้อยของคุณเช่นกัน!
Ando

@Ando ขอบคุณ! ฉันกำลังทดสอบความคิดใหม่ ๆ ไม่กี่รุ่นเบต้าฉันหวังว่าฉันจะมีเวลามากขึ้นในการทำงานกับมันเพื่อที่ฉันจะสามารถกำจัดมันได้เร็วขึ้น
นาธาน W

3
มันยอดเยี่ยมมากที่คุณคิดวิธีแก้ปัญหาอย่างรวดเร็วและสวยงาม พลังของ Open Source ชนะอีกครั้ง!
RyanDalton

14

หากคุณมีปลั๊กอินGRASS ให้ใช้ตัวเลือกv.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

ป้อนคำอธิบายรูปภาพที่นี่


อืมหวังว่าจะได้ QGIS แบบดั้งเดิมมากกว่านี้, ไม่ได้ติดตั้ง GRASS ในขณะนี้ แต่มันเป็นเคล็ดลับที่ดีสำหรับคนที่ทำ
นาธาน W

จะดีที่จะมีในงูหลามและเพิ่มไปยัง ftools บันทึกโดย underdark
Mapperz

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



4

ตามโพสต์ของนาธานฉันได้สร้างสคริปต์การประมวลผลเพื่อย้อนกลับทิศทางของคุณสมบัติ:

#!/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.