1 votos

PyQGIS : QgsVectorFileWriter.writeAsVectorFormatV3 exportar dimensión Z no funciona

Estoy intentando hacer un plugin para QGIS usando pyQGIS. enter image description here

Me gustaría hacer un script que exporte la dimensión Z (con offset) usando este snippet:

QgsVectorFileWriter.writeAsVectorFormatV3(
    vl,
    filename,
    QgsProject.instance().transformContext(),
    QgsVectorFileWriter.SaveVectorOptions()
)

Pero la dimensión Z es NULA en QGIS después de esta exportación.

Tenga en cuenta que cuando acabo de importarlo en QGIS como capa virtual ( QgsProject.instance().addMapLayer(vl) ), la dimensión $z NO da NULL.

Así que concluyo que la exportación en GPKG borra el valor Z. Para parchear esto he añadido la siguiente opción:

options = QgsVectorFileWriter.SaveVectorOptions()
options.includeZ = True
QgsVectorFileWriter.writeAsVectorFormatV3(
    vl,
    filename,
    QgsProject.instance().transformContext(),
    options
)

Pero mismo resultado... ¿Alguien me puede decir cómo exportar en GPKG utilizando un método PyQGIS?

1voto

CodeBard Puntos 21

Para utilizar el includeZ parámetro de QgsVectorFileWriter.SaveVectorOptions también debe especificar el overrideGeometryType parámetro. En caso contrario includeZ no parece surtir efecto.

Cito la documentación de la API para includeZ :

Se establece en true para incluir la dimensión z en la salida. Esta opción sólo es válida si se establece overrideGeometryType.

Por lo tanto, su guión puede adaptarse de la siguiente manera:

options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "GPKG"
options.includeZ = True
options.overrideGeometryType = QgsWkbTypes.PointZ
options.layerName = 'test'
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer

QgsVectorFileWriter.writeAsVectorFormatV3(
    vl,
    r"D:\test.gpkg",
    QgsProject.instance().transformContext(),
    options)

# load exported layer and check for z value:
layer = QgsVectorLayer(r"D:\test.gpkg|layername=test", "Points", "ogr")
for feat in layer.getFeatures():
    print(feat.geometry().constGet().z())

Para simplificar, en mi ejemplo sólo he utilizado geometrías puntuales. Si usted tiene un tipo de geometría diferente, por supuesto, tiene que cambiar overrideGeometryType a MultiPointZ , LineStringZ , PolygonZ , MultiSurfaceZ etc.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X