QGIS’de hat yönünü nasıl değiştirebilirim?


51

Umarım oldukça kolay bir şey.

QGIS'de bir çoklu çizginin / çizginin yönünü değiştirebilmek istiyorum. MapInfo'da bunu birkaç yıl önce yapmak için özel bir araç yaptım, ancak QGIS için bir şey bulamıyorum.

Bunu yapmak için bir araç bilen var mı?

Eğer biri yoksa, o zaman başarabildiğim için mutluyum, zaten yapılmışsa istemedim.


3
Sahip olmak harika olurdu. Böyle bir yerel QGIS işlevini bilmiyorum.
underdark

3
Bunu nasıl kolayca yapabildiğime dair iyi bir fikrim var, bakalım bu gece bir şey hazırlayabilir miyim.
Nathan W

Harika! Belki ftools / vector alet kutusuna eklenebilir.
underdark

1
Çekirdeği zaten ilgilendiğiniz için, bu soruyu çözme şansınız var ama QGIS için? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

Yanıtlar:


62

Tamam, bunu yapmak için kullandığım 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)

Yukarıdaki kodu çalıştırmadan önce:

  1. Düzenlemek istediğiniz katmanı seçin;
  2. Düzenlemeye Geçiş;
  3. Bu katmanda tersine çevirmek istediğiniz özellikleri seçin.

Yukarıdaki python kodunu şu şekilde çalıştırın:

  1. Eklentilere Gitme> Python Konsolu;
  2. Kodun pencereye kopyalanması ve yapıştırılması;
  3. Çalıştırmak için 2x Enter tuşuna basın.

Yönü değiştirilen her özellik için "Doğru" vermelidir. Eğer "False" çıktısı varsa, o özelliğin yönünü değiştirmedi. Bu, katmanın Düzenleme özelliği açık değilse gerçekleşir.

Çok kolay!

Ben denilen bir eklenti içine sarılı Swap Line Directionve QGIS eklenti yükleyicide mevcut.

Bu eklenti eklenti yükleyicisinde artık mevcut değildir (11.06.2015 itibariyle) ancak " Plugin Builder " eklentisi ile kendinizinkini kolayca oluşturabilirsiniz .

FTools ile birleşmenin ne kadar kolay olduğuna bakacağım.


1
Böylece kendi çözümünüzü yarattınız - aferin - ftools'a eklenebilir mi?
Mapperz

Eminim yapabilirim, sadece fTools'un kodlanma biçimine bakmalı ve bir yama yazmalıyım.
Nathan W.

Fantastik! Bu gibi çözümler QGIS'i kullanmamın sebebi. Güzel iş Nathan - BTW Küçük katalog tip eklentinizi de beğendim!
Ando

@Ando Teşekkürler! Birkaç yeni fikri beta test ediyorum, sadece daha hızlı çalışabilmek için üzerinde çalışacak daha fazla zamanım olsaydı.
Nathan W

3
Bu kadar hızlı ve zarif bir çözüm bulmanız gerçekten harika. Açık Kaynak'ın gücü tekrar kazanıyor!
RyanDalton,


6

Nathan'ın cevabını takiben, katmanı değiştirmek istediğiniz katmanda bir python eylemi oluşturabilirsiniz:

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)

Çizgileri tek tıklamayla değiştirebileceksiniz. Çok kullanıcı dostu!


1
bu kod 2.x içindir
Denis Rouzaud



4

Nathan'ın gönderisine dayanarak, özelliklerin yönünü tersine çevirmek için bir işlem komut dosyası oluşturdum:

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

görüntü tanımını buraya girin


GIF'i nasıl yarattın?
neden


Şimdiye kadar, işleme araç kutusunda bir ters yön aracı var.
AndreJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.