Doğrusal Referans için M Değerli QGIS Ekstresi Düğümleri


10

Bir sqlite veritabanında bir MultiLineStringZM katman var ve ben ölçümleri veya köşe değerlerinde m-değerleri görselleştirmek çalışıyorum. QGIS'de bunun nasıl yapılacağı hakkında bilgi aramaya çalıştım ve toplayabildiğim her şey, bunun doğrudan linestring katmanından mümkün olmadığı ve puanların ayrı bir katmana çıkarılması gerektiği.

Çok satırlı katmanımın köşelerini temsil eden çok noktalı bir katman oluşturmak için Vector-> Geometry Tools-> Extract nodeskullandım, ancak süreç köşelerin m değerlerini kaybediyor. M-değeri noktası özniteliği olarak m değeri kaydederek veya başka bir şey tarafından korunan gerekir?

Dahili olarak, satırları bir nokta şekil dosyasına dönüştüren ve her noktada bir öznitelik olarak depolanan m değerlerine dönüştüren bir komut satırı aracımız var ve bunu köşe noktalarına atanmış m değerlerinin olduğunu doğrulamak için kullandım ve kullanabilirim eğer mecbur kalırsam, ama eğer mümkünse bunun doğrudan QGIS içinde yapılabilmesi hoş olurdu.

EDIT - Yukarıda söylediğim şeyi tekrarlamak, ancak GDAL kütüphanelerini kullanan aradığım sonuçları elde edebilecek bir komut satırı aracına sahip olduğumuzu yeniden vurgulayarak, sadece kısmi bir cevap gösteren bir çözüm PyQGIS aradığım cevap değil. Yerleşik bir araç, QGIS için hazır bir eklenti veya MultiLineStringZM veya LineStringZM geometrisinden m-değerlerini ayıklayabilen ve görselleştirebilen eksiksiz bir komut dosyası arıyorum.


M değerlerini almak için LRS eklentisini kullanabilirsiniz. Düğümleri çıkarmanız, ardından LRS eklentisini veya çizgi araçları boyunca mesafeyi kullanarak ölçüleri linestring'den almanız gerekir.
jbalk

@jbalk LRS ve QChainage eklentilerini denedim ve bu eklentilerin her ikisi de, bir şey eksik ve yanlış eklentileri yanlış kullanmadıkça, mevcut önlemleri kullanmak için değil, düzenli aralıklarla ölçümler oluşturmak için ayarlanmış gibi görünüyor .
TJ Rockefeller

LRS eklenti sayfasından: - Eklenti, kalibrasyonu, dakik ve doğrusal olayların oluşturulmasını ve puanlar için önlemlerin hesaplanmasını destekler - İşte web sitesi blazek.github.io/lrs Mümkünse bu sitedeki LRS eklentisi hakkında bir soru sorun anlamayacağım.
jbalk

Kalibre edene kadar LRS eklentisi ile hiçbir şey yapamayacağınız anlaşılıyor ve kalibre etmek için, nitelik olarak saklanan ölçümlerle bir nokta katmanına ihtiyacınız var, ki bu da MultiLineStringZM'imden almaya çalıştığım şey , bu yüzden bu durumda yardımcı olacağını sanmıyorum.
TJ Rockefeller

Kalibrasyon için kullanmak üzere hattınız boyunca her 1000 metrede bir puanlar oluşturabilirsiniz. Veya m değerlerini almak için QGIS içindeki SAGA ve GRASS araç kutularındaki çizgi araçları boyunca mesafeye bakın.
jbalk

Yanıtlar:


6

Bulabildiğim kadarıyla, bu kesin durum için mevcut bir çözüm gibi görünmüyor, ancak yine de bunu QGIS'de yapmak istedim, bu yüzden python komut dosyalarına daldım.

İşleme algoritmaları yazmak için bir kılavuz burada bulunabilir https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Bu kodu kullanmak için İşlem araç kutusunu açın, Komut Dosyaları'nı ve ardından Araçlar'ı genişletin. "Yeni komut dosyası oluştur" u seçin ve aşağıdaki kodu kod penceresine kopyalayıp yapıştırın (boşluk alanı sözdizimsel açıdan önemli olduğu için python kodunu kopyalayıp yapıştırırken dikkatli olun. Sorun yaşıyorsanız kodu boşluk gösteren bir metin düzenleyicisine yerleştirin ve doğru kopyalandığını unutmayın). İstediğiniz yere kaydedin ve pencerenin üst kısmında bir komut dosyası yürüt düğmesi vardır. Kaydettikten sonra "Dosyadan komut dosyası ekle" ve kalıcı olarak "Kullanıcı komut dosyaları" altında komut dosyası olabilir.

İşleme penceresi geldiğinde vektör geometrisini içeren katmanı seçin ve çalıştır'ı seçin. Komut dosyası , giriş geometrisinde neyin mevcut olduğuna MValuesve / veya buna ZValuesbağlı olarak bir sütun eklemesi dışında "Düğümleri Ayıkla" ile aynı şekilde davranır .

##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

QGIS 3.0 veya daha yenisi ile bu görev önemsizdir. "İşleme Araç Kutusu" nda (ctrl + alt + t veya İşleme -> Araç Kutusu ile Aç) "Köşeleri ayıkla" yı arayın ve bu algoritmayı çalıştırın.

M veya ZM çizginizi veya çokgen geometrisinizi Giriş katmanı olarak seçin ve çalıştırın.

Köşeler orijinal geometride ne olduğuna bağlı olarak M ve Z değerleri bozulmadan çıkarılır.

Nitelik tablosunda alan olarak M değeri gerekiyorsa, alan hesaplayıcısı aşağıdaki gibi bir ifadeyle kullanılabilir m($geometry)

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.