QGIS提取具有M值的节点以进行线性参考


10

我在sqlite数据库中有一个MultiLineStringZM层,并且试图在顶点处可视化度量或m值。我尝试查找有关如何在QGIS中执行此操作的信息,并且我能够收集到的所有信息是,这不可能直接从线串图层中实现,并且需要将点提取到单独的图层中。

我使用Vector-> Geometry Tools-> Extract nodes创建了一个多点层,该多层代表了我的线串层的顶点,但是该过程会丢失这些顶点的m值。我需要通过将m值保存为点的属性或其他方式来保留m值?

在内部,我们有一个命令行工具可以将线串转换为点shapefile,并将m值存储为每个点的属性,我已经使用它来验证是否有m值分配给了顶点,我可以使用如果必须的话,但是如果可以直接在QGIS内部完成,那就太好了。

编辑 -重复上述内容,但再次强调了我们确实有一个命令行工具可以使用GDAL库实现我要查找的结果,因此该解决方案仅显示了部分答案PyQGIS不是我要找的答案。我正在寻找内置工具,为QGIS准备的插件或可以从MultiLineStringZM或LineStringZM几何图形提取(而不是创建/生成)并可视化m值的完整脚本。


您可以使用LRS插件获取m值。您需要提取节点,然后使用LRS插件或沿线距离工具从线串中获取度量。
jbalk

@jbalk我尝试了LRS和QChainage插件,这两个插件似乎都设置为定期生成度量,而不是使用现有度量,除非我遗漏了一些东西,而我只是错误地使用了插件。
TJ洛克菲勒

在LRS插件页面上:-该插件支持校准,准时和线性事件的创建以及对点的度量的计算-这是网站 blazek.github.io/lrs 如果可以,请在此网站上询问有关LRS插件的问题不知道。
jbalk

看起来,在校准之前,您无法对LRS插件执行任何操作,并且要对其进行校准,您需要一个带有测量值作为属性存储的点层,这正是我要从MultiLineStringZM中获取的东西,因此在这种情况下我认为不会有所帮助。
TJ洛克菲勒

您可以沿线每1000m创建一个点用于校准。或在QGIS的SAGA和GRASS工具箱中沿线工具查看距离,以获取m值。
jbalk

Answers:


6

从我的发现中,似乎没有针对这种确切情况的现有解决方案,但是我仍然希望能够在QGIS中做到这一点,因此我投入了python脚本。

可以在这里找到编写处理算法的指南https://docs.qgis.org/2.18/zh/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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.