miércoles, 7 de marzo de 2018

Método 'writeAsVectorFormat' de QgsVectorFileWriter en QGIS 3

En este post me toca referir el método 'writeAsVectorFormat' de QgsVectorFileWriter debido a que en la adaptación de un plugin se produjo un error en este método debido a que se estaban pasando los parámetros en el orden equivocado. La sintaxis considerada era prácticamente idéntica a la que se encontraba ejemplificada en el PyQGIS Cookbook de la versión 2.x porque, como verifiqué que la clase existía en QGIS 3, asumí erróneamente que los parámetros podrían ser los mismos.

Sin embargo, esa duda quedó despejada al observar la documentación detallada del comando. A pesar de los 19 posibles parámetros que podrían ser usados, me concentré sólo en la mínima capaz de funcionar. Ésta se presenta a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
layer = iface.activeLayer()

error = QgsVectorFileWriter.writeAsVectorFormat(layer,
                                                "C:/Users/Usuario/Desktop/PYTHON/my_shapes.shp",
                                                "CP1250",
                                                driverName="ESRI Shapefile")

if error[0] == QgsVectorFileWriter.NoError:
    print ("success!")
else:
    print (error[1])


Después de comprobar que el código anterior funcionaba me dediqué a explorar algunos métodos de QgsVectorFileWriter que permitían averiguar los formatos o drivers soportados por 'writeAsVectorFormat'. Estos corresponden a 'ogrDriverList' y 'supportedFiltersAndFormats'. En la versión anterior de QGIS la salida del método, tipo diccionario, puede observarse en la imagen siguiente para 'ogrDriverList':


En QGIS 3 se maneja como lista, lo cual preserva el orden alfabético por default (algo que no se puede hacer sin código adicional con los diccionarios); tal como se presenta a continuación:

1
2
3
4
driver_list = QgsVectorFileWriter.ogrDriverList()

for item in driver_list:
    print (item.longName + " : " + item.driverName)



La salida de 'supportedFiltersAndFormats' en la versión 2 de QGIS, también como diccionario, es la siguiente:


En QGIS 3 la salida de 'supportedFiltersAndFormats' también se maneja como lista. El código para producirla es el siguiente:

1
2
3
4
formats_list = QgsVectorFileWriter.supportedFiltersAndFormats()

for item in formats_list:
    print (item.filterString + " : " + item.driverName)

cuyo resultado de ejecución se puede observar en la imagen siguiente:


Finalmente, modifiqué el código en el plugin de acuerdo a lo aquí expuesto y funcionó tal como se esperaba. Puede ser corroborado en la imagen a continuación:



No hay comentarios: