QGIS-витяжні вузли з M-значеннями для лінійних посилань


10

У мене є рівень MultiLineStringZM в базі даних sqlite, і я намагаюся візуалізувати заходи або m-значення у вершинах. Я намагався шукати інформацію про те, як це зробити в QGIS, і про все, що мені вдалося зібрати, це те, що це неможливо безпосередньо з шару рядків рядків і що точки потрібно витягти в окремий шар.

Я використовував Vector-> Geometry Tools-> Extract nodesдля створення багатоточкового шару, що представляє вершини мого багаторядкового шару, але процес втрачає m-значення вершин. Мені потрібні m-значення, збережені, або збереженням m-значення як атрибута точки, або чимось іншим?

Всередині у нас є інструмент командного рядка, який перетворює рядки рядків у файл форми форми з m-значеннями, що зберігаються як атрибут у кожній точці, і я використовував це для перевірки наявності m-значень, призначених вершинам, і я міг би використовувати що якщо мені доведеться, але, якщо можливо, було б непогано, якби це можна було зробити безпосередньо всередині QGIS.

EDIT - Повторюючи сказане вище, але ще раз підкреслюючи той факт, що у нас є інструмент командного рядка, який може досягти результатів, які я шукаю, використовуючи бібліотеки GDAL, тому рішення, що показує лише часткову відповідь у PyQGIS - це не відповідь, яку я шукаю. Я шукаю вбудований інструмент, плагін, готовий для QGIS, або повний скрипт, який може витягнути (не створити / генерувати) та візуалізувати m-значення з геометрії MultiLineStringZM або LineStringZM.


Ви можете використовувати плагін LRS для отримання m значень. Вам потрібно буде витягнути вузли, а потім отримати заходи з рядкової лінії, використовуючи плагін LRS або відстань уздовж лінійних інструментів.
jbalk

@jbalk Я спробував плагіни LRS та QChaining, і обидва ці плагіни, здається, створені для генерації заходів через рівні проміжки часу, а не для використання існуючих заходів, якщо я щось не пропускаю і я просто використовую плагіни неправильно .
TJ Rockefeller

На сторінці плагіна LRS: - Плагін підтримує калібрування, створення пунктуальних та лінійних подій та обчислення заходів для очок - Ось веб-сайт blazek.github.io/lrs Задайте питання про плагін LRS на цьому сайті, якщо можете не зрозумію.
jbalk

Схоже, ви не можете нічого робити з плагіном LRS, поки не відкалібруєте його, і для того, щоб його відкалібрувати, вам потрібен точковий шар із заходами, збереженими як атрибут, саме це я намагаюся отримати від свого MultiLineStringZM , тому я не думаю, що це буде корисним у цій ситуації.
TJ Rockefeller

Ви можете створювати точки на кожні 1000 м уздовж своєї лінії, щоб використовувати їх для калібрування. Або подивіться на відстань уздовж лінійних інструментів у скриньках інструментів SAGA та GRASS в межах QGIS, щоб отримати m-значення.
jbalk

Відповіді:


6

З того, що я можу знайти, не існує існуючого рішення для цієї точної ситуації, але я все ж хотів зробити це в QGIS, тому я взявся зануритися в сценарій пітона.

Посібник з написання алгоритмів обробки можна знайти тут https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Щоб скористатися цим кодом, відкрийте панель інструментів «Обробка», потім розгорніть «Сценарії», потім «Інструменти». Виберіть "Створити новий скрипт" і скопіюйте та вставте код нижче у вікно сценарію (будьте обережні, копіюючи та вставляючи код python, оскільки пробіл синтаксично значимий. Якщо у вас виникли проблеми, введіть код у текстовий редактор, який показує пробіл, і переконайтеся, що що це правильно скопійовано). Збережіть його куди завгодно, і вгорі вікна є кнопка виконання сценарію. Після збереження його ви можете "Додати скрипт з файлу" і постійно мати сценарій у розділі "Сценарії користувачів".

Коли з'явиться вікно обробки, виберіть шар, який містить векторну геометрію, і виберіть запуск. Сценарій поводиться так само, як "Витягнути вузли", за винятком того, що він додає стовпець, що називається, MValuesабо ZValuesзалежно від того, що є в геометрії введення.

##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 або новішою версією це завдання є тривіальним. У полі "Обробка інструментів" (Відкрити за допомогою ctrl + alt + t або Обробка -> Панель інструментів) знайдіть "Витягнути вершини" та запустіть цей алгоритм.

Виберіть лінію M або ZM або полігон в якості вхідного шару та запустіть.

Вершини будуть витягнуті зі значеннями M і Z неушкодженими залежно від того, що є в оригінальній геометрії.

Якщо значення M потрібне як поле в таблиці атрибутів, то калькулятор поля може бути використаний з виразом типу m($geometry)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.