QGIS Mengekstrak Node dengan Nilai-M untuk Referensi Linear

10

Saya memiliki lapisan MultiLineStringZM dalam database sqlite, dan saya mencoba memvisualisasikan ukuran atau nilai-m di vertex. Saya sudah mencoba mencari informasi tentang cara melakukan ini di QGIS, dan yang bisa saya kumpulkan adalah bahwa ini tidak mungkin secara langsung dari lapisan linestring dan bahwa poin-poin perlu diekstraksi ke lapisan yang terpisah.

Saya telah menggunakan Vector-> Geometry Tools-> Extract nodesuntuk membuat layer multipoint yang mewakili vertex dari layer multlinestring saya, tetapi prosesnya kehilangan nilai-m dari vertex tersebut. Saya perlu nilai-m dipertahankan dengan menyimpan nilai-m sebagai atribut dari titik, atau sesuatu yang lain?

Secara internal kami memiliki alat baris perintah yang mengubah linestrings ke shapefile titik dengan nilai-m yang disimpan sebagai atribut pada setiap titik, dan saya telah menggunakannya untuk memverifikasi bahwa ada nilai-m yang ditugaskan ke vertex, dan saya bisa menggunakan bahwa jika saya harus, tetapi jika mungkin akan lebih baik jika ini dapat dilakukan langsung di dalam QGIS.

EDIT - Mengulangi apa yang telah saya katakan di atas, tetapi menekankan kembali fakta bahwa kita memang memiliki alat baris perintah yang dapat mencapai hasil yang saya cari yang menggunakan pustaka GDAL, jadi solusi yang menunjukkan hanya sebagian jawaban di PyQGIS bukan jawaban yang saya cari. Saya mencari alat bawaan, plugin yang siap dibuat untuk QGIS, atau skrip lengkap yang dapat mengekstraksi (tidak membuat / menghasilkan) dan memvisualisasikan nilai-m dari MultiLineStringZM atau LineStringZM geometri.

TJ Rockefeller
sumber
Anda bisa menggunakan plugin LRS untuk mendapatkan nilai m. Anda perlu mengekstrak node, kemudian mendapatkan ukuran dari linestring menggunakan plugin LRS atau menjauhkan jarak sepanjang alat garis.
jbalk
@ jbalk Saya sudah mencoba plugin LRS dan QChainage, dan kedua plugin tersebut tampaknya diatur untuk menghasilkan ukuran secara berkala, bukan untuk menggunakan ukuran yang ada, kecuali jika saya kehilangan sesuatu dan saya hanya menggunakan plugin dengan salah. .
TJ Rockefeller
Dari halaman plugin LRS: - Plugin ini mendukung kalibrasi, pembuatan acara tepat waktu dan linier dan perhitungan ukuran untuk poin - Inilah situs web blazek.github.io/lrs Ajukan pertanyaan tentang plugin LRS di situs ini jika Anda dapat bisa mengetahuinya.
jbalk
Sepertinya Anda tidak dapat melakukan apa pun dengan plugin LRS hingga Anda mengkalibrasi, dan untuk mengkalibrasi, Anda memerlukan layer titik dengan ukuran yang disimpan sebagai atribut, yang persis apa yang saya coba dapatkan dari MultiLineStringZM saya , jadi saya tidak berpikir itu akan membantu dalam situasi ini.
TJ Rockefeller
Anda dapat membuat poin setiap 1000m di sepanjang garis Anda untuk digunakan untuk kalibrasi. Atau lihat jarak di sepanjang garis alat di kotak alat SAGA dan GRASS dalam QGIS untuk mendapatkan nilai m.
jbalk

Jawaban:

6

Dari apa yang saya temukan di sana tampaknya tidak ada solusi yang ada untuk situasi yang tepat ini, tapi saya masih ingin dapat melakukan ini di QGIS, jadi saya mengambil terjun ke skrip python.

Panduan untuk menulis algoritma pemrosesan dapat ditemukan di sini https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Untuk menggunakan kode ini, buka kotak alat Pemrosesan, kemudian perluas Skrip, lalu rentangkan Alat. Pilih "Buat skrip baru" dan salin dan tempel kode di bawah ini ke jendela skrip (hati-hati saat menyalin dan menempelkan kode python karena spasi putih secara sintaksis signifikan. Jika Anda mengalami masalah, masukkan kode ke editor teks yang menunjukkan spasi putih dan pastikan yang disalin dengan benar). Simpan di mana pun Anda inginkan dan ada tombol skrip eksekusi di bagian atas jendela. Setelah Anda menyimpannya, Anda dapat "Menambahkan skrip dari file" dan secara permanen memiliki skrip di bawah "Skrip pengguna".

Ketika jendela pemrosesan muncul pilih layer yang berisi geometri vektor dan pilih jalankan. Script berperilaku sama dengan "Extract Nodes" kecuali bahwa ia menambahkan kolom yang disebut MValuesdan atau ZValuestergantung pada apa yang tersedia dalam geometri input.

##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
TJ Rockefeller
sumber
4

Dengan QGIS 3.0 atau yang lebih baru, tugas ini sepele. Dalam "Memproses Toolbox" (Buka dengan ctrl + alt + t atau Memproses -> Toolbox) cari "Ekstrak simpul" dan jalankan algoritma itu.

Pilih garis M atau ZM atau geometri poligon sebagai lapisan Input, dan jalankan.

Verteks akan diekstraksi dengan nilai-nilai M dan Z utuh tergantung pada apa yang ada di geometri asli.

Jika nilai M diperlukan sebagai bidang dalam tabel atribut, maka kalkulator bidang dapat digunakan dengan ekspresi seperti m($geometry)

TJ Rockefeller
sumber