Làm cách nào tôi có thể chuyển hướng đường trong QGIS?


51

Một cái gì đó hy vọng là khá dễ dàng.

Tôi muốn có thể hoán đổi hướng của một đa tuyến / dòng trong QGIS. Tôi đã tạo một công cụ tùy chỉnh để thực hiện điều này trong MapInfo vài năm trước, tuy nhiên tôi dường như không thể tìm thấy bất cứ điều gì cho QGIS.

Có ai biết một công cụ để làm điều này?

Nếu một cái không tồn tại thì tôi rất vui khi được tạo ra nó, chỉ là tôi không muốn nếu nó đã được tạo ra.


3
Sẽ là tuyệt vời để có. Tôi không biết bất kỳ chức năng QGIS bản địa nào như vậy.
underdark

3
Tôi có một ý tưởng tốt làm thế nào tôi có thể làm điều này khá dễ dàng, tôi sẽ xem liệu tôi có thể làm gì đó tối nay không.
Nathan W

Tuyệt quá! Có lẽ nó có thể được thêm vào hộp công cụ ftools / vector.
underdark

1
vì bạn đã được chăm sóc cốt lõi, bất kỳ cơ hội nào bạn muốn giải quyết câu hỏi này, nhưng đối với QGIS? gis.stackexchange.com/questions/9286/ Tài
RyanDalton

1
Đây là vé: hub.qgis.org/issues/4936
Mike T

Câu trả lời:


62

Ok đây là Python mà tôi đã từng làm nó:

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)

Trước khi chạy đoạn mã trên:

  1. Chọn lớp bạn muốn chỉnh sửa;
  2. Chuyển đổi Chỉnh sửa trên;
  3. Chọn các tính năng trong lớp này bạn muốn đảo ngược.

Chạy mã python ở trên bằng cách:

  1. Truy cập Plugins> Bảng điều khiển Python;
  2. Sao chép và dán mã vào cửa sổ;
  3. Nhấn Enter 2x để chạy.

Nó sẽ xuất "True" cho mỗi tính năng có hướng được hoán đổi. Nếu nó xuất ra "Sai" thì nó đã không trao đổi hướng của tính năng đó. Điều này sẽ xảy ra nếu lớp không có Chỉnh sửa được bật.

Khá dễ dàng!

Tôi đã gói nó trong một plugin có tên Swap Line Directionvà nó có sẵn trong trình cài đặt plugin QGIS.

Plugin này không còn khả dụng (kể từ ngày 16/11/2015) trong trình cài đặt plugin nhưng bạn có thể tự xây dựng khá dễ dàng với plugin " Plugin Builder ".

Tôi sẽ xem xét việc kết hợp với fTools dễ dàng như thế nào.


1
Vì vậy, bạn đã tạo ra giải pháp của riêng mình - hoàn thành tốt - nó có thể được thêm vào ftools không?
Mapperz

Tôi chắc chắn là có thể, tôi chỉ cần nhìn vào cách mã hóa fTools và viết một bản vá.
Nathan W

Tuyệt vời! Các giải pháp như thế này là lý do tôi thích sử dụng QGIS. Công việc tuyệt vời Nathan - BTW Tôi thích plugin loại danh mục nhỏ của bạn!
Ando

@Ando Cảm ơn! Tôi đang thử nghiệm một vài ý tưởng mới, chỉ ước tôi có nhiều thời gian hơn để làm việc với nó để tôi có thể đưa nó ra nhanh hơn.
Nathan W

3
Điều đó thực sự tuyệt vời khi bạn đã tạo ra một giải pháp rất nhanh chóng và thanh lịch. Sức mạnh của Nguồn mở chiến thắng một lần nữa!
RyanDalton

14

Nếu bạn có plugin GRASS, hãy sử dụng tùy chọn v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

nhập mô tả hình ảnh ở đây


hmmm đã hy vọng cho một cách bản địa hơn của QGIS, không cài đặt GRASS vào lúc này. Nhưng đó là một mẹo tốt cho những người làm.
Nathan W

sẽ là tốt để có trong python và thêm vào ftools được ghi chú bởi underdark.
Mapperz

6

Theo câu trả lời của Nathan, bạn có thể tạo một hành động trăn trong lớp nơi bạn muốn hoán đổi các dòng:

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)

Bạn sẽ có thể hoán đổi các dòng bằng một cú nhấp chuột vào chúng. Nó rất thân thiện với người dùng!


1
mã này dành cho 2.x
Denis Rouzaud



4

Dựa trên bài đăng của Nathan, tôi đã tạo một tập lệnh xử lý để đảo ngược hướng của các tính năng:

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

nhập mô tả hình ảnh ở đây


Làm thế nào bạn tạo ra gif?
sao Sa hoàng


Đến bây giờ, có một công cụ hướng ngược lại trong hộp công cụ xử lý.
AndreJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.