2 votos

Guardar una capa vectorial como .xyz con PyQGIS 3

Estoy escribiendo un script independiente para QGIS. En este script quiero importar un par de archivos de texto guardados como .xyz. Cuando los importo en QGIS tengo que usar "Importar capas como texto delimitado", por lo que no son rásters. Son archivos de texto con muchas filas y cada fila contiene coordenadas x,y y z.

Después de importarlos quiero comprobar una condición y exportarlos a una nueva carpeta. La parte de importación funciona bien pero no obtengo ningún archivo de exportación en mi carpeta de salida. Esa es la parte de exportación del script:

lyr = QgsVectorLayer(uri, name, "delimitedtext")
outDir = 'C:/Users/user/Desktop/output'
fields = lyr.fields()
QgsVectorFileWriter.writeAsVectorFormat(lyr, outDir, "utf-8", fields, "CSV",
                                        layerOptions=['GEOMETRY=AS_XYZ'])

Cuando intento ejecutar el script, no me aparece ningún mensaje de error pero tampoco hay archivos en mi carpeta de salida. No veo el error. ¿Puede alguien ayudarme?

Estoy usando QGIS 3.4.13

EDITAR

He comprobado las respuestas y he modificado el código pero sigue sin funcionar. Todavía no hay mensaje de error y todavía no hay archivos en mi carpeta de salida.

Esta es la función completa sin la condición:

def moveFiles(self):
    inputDir = self.dlg.input_folder.text() #directory of xyz files - "Users/denni/Desktop/xyz_data"
    outDir = self.dlg.output_folder.text()  #output directory - "C:/Users/denni/Desktop/output/"
    crs = "EPSG:25832"

    for file in glob.glob("*.xyz"):
        uri = "file:///" + inputDir +"/"+ file + "?type=csv&delimiter=%s&crs=%s&xField=%s&yField=%s" % (" ", crs, "field_1", "field_2")
        name = file.replace('.xyz', '')
        lyr = QgsVectorLayer(uri, name, "delimitedtext")
        outputPath = outDir + file
        QgsVectorFileWriter.writeAsVectorFormat(lyr, outputPath, 'utf-8', lyr.crs(), "CSV",
                                                layerOptions='GEOMETRY=AS_XYZ')

¿Cuál puede ser el problema?

4voto

BWW Puntos 302

Hay varias cuestiones aquí. Una corrección a continuación (probada antes de responder)

import os
from urllib.parse import urlparse

# URI should contain the path from your existing file not where you want to write
# Your extension must be csv (ps: tested with xyz extension and fails later)
uri = 'file:///home/thomasg/csv-pyqgis/points_xyz.csv?type=csv&detectTypes=yes&xField=x&yField=y&zField=z&crs=EPSG:4326&spatialIndex=yes&subsetIndex=no&watchFile=no'

lyr = QgsVectorLayer(uri, 'myname', "delimitedtext")
filename = urlparse(uri).path.split(os.path.sep)[-1].replace('.xyz', '.csv')
outDir = '/tmp/output'
# Create dir if not present
if not os.path.isdir(outDir):
    os.mkdir(outDir)

# Change arguments to match allowed signature of the function
# output path changed by concatenating directory output and file
# This path is where you want to write content
outfilepath = os.path.join(outDir, filename)
QgsVectorFileWriter.writeAsVectorFormat(lyr, outfilepath, 'utf-8', lyr.crs(), "CSV", layerOptions=['GEOMETRY=AS_XYZ'])

3voto

nitinsavant Puntos 6

writeAsVectorFormat método tiene tres usos diferentes . Su código no coincide con ninguno de ellos. El código es correcto sintácticamente, pero incorrecto lógicamente. Su código coincide con QgsVectorFileWriter método constructor.

lyr = QgsVectorLayer(uri, name, "delimitedtext")

outFilePath = 'C:/Users/user/Desktop/output/filename.csv'

QgsVectorFileWriter.writeAsVectorFormat(lyr,
                                        outFilePath,
                                        "utf-8",
                                        driverName="CSV",
                                        layerOptions=['GEOMETRY=AS_XYZ'])

Entonces cambia filename.csv en filename.xyz .

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