Các nút trích xuất của QGIS với các giá trị M để tham chiếu tuyến tính


10

Tôi có một lớp MultiLineStringZM trong cơ sở dữ liệu sqlite và tôi đang cố gắng trực quan hóa các số đo hoặc giá trị m ở các đỉnh. Tôi đã thử tìm kiếm thông tin về cách thực hiện điều này trong QGIS và về tất cả những gì tôi có thể thu thập được là điều này không thể thực hiện trực tiếp từ lớp linestring và các điểm cần được trích xuất thành một lớp riêng biệt.

Tôi đã sử dụng Vector-> Geometry Tools-> Extract nodesđể tạo một lớp đa điểm đại diện cho các đỉnh của lớp đa tuyến của tôi, nhưng quá trình này làm mất các giá trị m của các đỉnh. Tôi cần các giá trị m được bảo toàn bằng cách lưu giá trị m làm thuộc tính của điểm hoặc thứ gì khác?

Trong nội bộ, chúng tôi có một công cụ dòng lệnh chuyển đổi các linestrings thành một shapefile điểm với các giá trị m được lưu trữ như một thuộc tính trên mỗi điểm và tôi đã sử dụng nó để xác minh rằng có các giá trị m được gán cho các đỉnh và tôi có thể sử dụng rằng nếu tôi phải làm, nhưng nếu có thể thì thật tuyệt nếu điều này có thể được thực hiện trực tiếp bên trong QGIS.

EDIT - Lặp lại những gì tôi đã nói ở trên, nhưng nhấn mạnh lại thực tế là chúng ta có một công cụ dòng lệnh có thể đạt được kết quả mà tôi đang tìm kiếm sử dụng các thư viện GDAL, vì vậy một giải pháp chỉ hiển thị một phần câu trả lời trong PyQGIS không phải là câu trả lời tôi đang tìm kiếm. Tôi đang tìm kiếm một công cụ tích hợp, một plugin đã sẵn sàng cho QGIS hoặc một tập lệnh hoàn chỉnh có thể trích xuất (không tạo / tạo) và trực quan hóa các giá trị m từ hình học MultiLineStringZM hoặc LineStringZM.


Bạn có thể sử dụng plugin LRS để nhận các giá trị m. Bạn cần trích xuất các nút, sau đó lấy các số đo từ linestring bằng cách sử dụng plugin LRS hoặc khoảng cách dọc theo các công cụ đường.
jbalk

@jbalk Tôi đã thử các plugin LRS và QChainage và cả hai plugin đó dường như được thiết lập để tạo ra các biện pháp đều đặn, không sử dụng các biện pháp hiện có, trừ khi tôi thiếu một cái gì đó và tôi chỉ sử dụng các plugin không chính xác .
TJ Rockefeller

Từ trang plugin LRS: - Plugin hỗ trợ hiệu chuẩn, tạo các sự kiện đúng giờ và tuyến tính và tính toán các số đo cho điểm - Đây là trang web blazek.github.io/lrs Đặt câu hỏi về plugin LRS trên trang web này nếu bạn có thể Tôi nghĩ ra rồi.
jbalk

Có vẻ như bạn không thể làm gì với plugin LRS cho đến khi bạn hiệu chỉnh nó và để hiệu chỉnh nó, bạn cần một lớp điểm với các số đo được lưu trữ như một thuộc tính, đó chính xác là những gì tôi đang cố gắng lấy từ MultiLineStringZM của mình , vì vậy tôi không nghĩ nó sẽ hữu ích trong tình huống này.
TJ Rockefeller

Bạn có thể tạo các điểm cứ sau 1000m dọc theo đường của bạn để sử dụng để hiệu chuẩn. Hoặc xem khoảng cách dọc theo các công cụ đường thẳng trong hộp công cụ SAGA và GRASS trong QGIS để nhận các giá trị m.
jbalk

Câu trả lời:


6

Từ những gì tôi có thể tìm thấy dường như không phải là một giải pháp hiện có cho tình huống chính xác này, nhưng tôi vẫn muốn có thể làm điều này trong QGIS, vì vậy tôi đã lao vào kịch bản python.

Hướng dẫn viết thuật toán xử lý có thể được tìm thấy tại đây https://docs.qgis.org/2.18/en/docs/user_manual/ Processing / scripts.html

Để sử dụng mã này, hãy mở hộp công cụ Xử lý, sau đó mở rộng Tập lệnh, sau đó mở rộng Công cụ. Chọn "Tạo tập lệnh mới" và sao chép và dán mã bên dưới vào cửa sổ tập lệnh (thận trọng khi sao chép và dán mã python vì khoảng trắng có ý nghĩa về mặt cú pháp. Nếu bạn gặp vấn đề, hãy đặt mã vào trình soạn thảo văn bản hiển thị khoảng trắng và đảm bảo mà nó sao chép chính xác). Lưu nó bất cứ nơi nào bạn muốn và có một nút script thực hiện ở đầu cửa sổ. Sau khi lưu, bạn có thể "Thêm tập lệnh từ tệp" và vĩnh viễn có tập lệnh trong "Tập lệnh người dùng".

Khi cửa sổ xử lý xuất hiện, chọn lớp chứa hình học vector và chọn chạy. Kịch bản hoạt động theo cách tương tự như "Trích xuất các nút" ngoại trừ việc nó thêm một cột được gọi MValuesvà hoặc ZValuestùy thuộc vào những gì có sẵn trong hình dạng đầu vào.

##input_layer=vector
##output_layer=output vector

from qgis.core import QgsWKBTypes, QgsField, QgsVectorFileWriter, QgsFeature, QgsGeometry
from PyQt4.QtCore import QVariant

def addVertices( geometry, writer, inFeature ):
    coordinateSequence = geometry.coordinateSequence()
    for rings in coordinateSequence:
        for points in rings:
            for point in points:
                feature = QgsFeature( fields )
                feature.setGeometry( QgsGeometry( point ) )
                type = point.wkbType()
                attributes = inFeature.attributes()
                if QgsWKBTypes.hasM( type ):
                    attributes.append( point.m() )
                if QgsWKBTypes.hasZ( type ):
                    attributes.append(point.z())
                feature.setAttributes( attributes )
                writer.addFeature( feature )
    return

inlayer = processing.getObject( input_layer )
provider = inlayer.dataProvider()
fields = provider.fields()
geomType = QgsWKBTypes.Type(inlayer.wkbType())
outputGeomType = QgsWKBTypes.Point

if QgsWKBTypes.hasM( geomType ):
    outputGeomType = QgsWKBTypes.addM( outputGeomType )
    fields.append( QgsField( "MValue", QVariant.Double ) )

if QgsWKBTypes.hasZ( geomType ):
    outputGeomType = QgsWKBTypes.addZ( outputGeomType )
    fields.append( QgsField( "ZValue", QVariant.Double ) )

layer_options = 'SHPT=' + QgsWKBTypes.displayString(outputGeomType)
writer = QgsVectorFileWriter( output_layer, 'UTF-8', fields,  outputGeomType , inlayer.crs(), layerOptions=[layer_options] )

features = inlayer.getFeatures()
featureCount = inlayer.featureCount()
featureIndex = 0

for f in features:
    percent = ( featureIndex/float( featureCount ) ) * 100
    progress.setPercentage( percent )
    g = f.geometry().geometry()
    addVertices( g, writer, f )
    featureIndex +=1

del writer

4

Với QGIS 3.0 hoặc mới hơn, nhiệm vụ này là không đáng kể. Trong "Hộp công cụ xử lý" (Mở bằng ctrl + alt + t hoặc Xử lý -> Hộp công cụ) tìm kiếm "Trích xuất các đỉnh" và chạy thuật toán đó.

Chọn dòng M hoặc ZM hoặc hình đa giác của bạn làm lớp Nhập liệu và chạy.

Các đỉnh sẽ được trích xuất với các giá trị M và Z nguyên vẹn tùy thuộc vào những gì có trong hình dạng ban đầu.

Nếu giá trị M là cần thiết như một trường trong bảng thuộc tính, thì máy tính trường có thể được sử dụng với một biểu thức như m($geometry)

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.