Processing math: 100%

3 votos

¿Cómo abrir y guardar la fuente de datos de QGIS con/en campos en minúsculas?

Quiero poder cambiar todos los nombres de los campos a minúsculas desde una fuente de datos al cargarlos en QGIS (SHP en particular).

  • ¿Es posible? A través de la GUI, a través de Python.

  • ¿Es posible convertir los nombres de los campos a minúsculas al guardar una capa con el diálogo "Guardar como"?

¿Por qué? Regularmente voy y vengo entre archivos GIS de portales OpenData y bases de datos como PostGIS o Spatialite. Hacer consultas con campos en mayúsculas requiere citar en estas bases de datos y quiero aliviar el dolor. Me gustaría convertir todos mis nombres de campo SHP a minúsculas.

Para información, he visto que es posible cuando se utiliza Grass por ejemplo el -w opción en v.in.ogr . He visto usar bash con ogrinfo también es posible, pero sigue siendo menos amigable, según la OMI.

4voto

Joe Puntos 16

SQLite no distingue entre mayúsculas y minúsculas en los nombres de tablas y columnas, siempre que contengan sólo caracteres ASCII. Sí respeta las mayúsculas y minúsculas en los nombres cuando se crean, pero no puedes tener campos "Test" y "tesT" en la misma tabla y si tienes un campo "Test" se encontrará con SELECT "aTest" . Sin embargo, los caracteres no ascii son sensibles a las mayúsculas y minúsculas en los nombres de las tablas y columnas, lo que puede sorprenderle a veces.

Puedes probarlo con estos comandos:

CREATE TABLE case_test (id);
ALTER TABLE "case_test" ADD COLUMN "a_test"; -- added
ALTER TABLE "case_test" ADD COLUMN "A_test"; -- error, duplicate name
ALTER TABLE "case_test" ADD COLUMN "ä_test"; -- added
ALTER TABLE "case_test" ADD COLUMN "Ä_test"; -- success!

En cuanto a su pregunta, como solución podría convertir todos los datos primero en Spatialite con ogr2ogr. Los campos se crean por defecto como lavados a minúsculas http://www.gdal.org/drv_sqlite.html . Para actualizar los nombres en el lugar el bash referenciado script me parece bien pero alguien más probablemente lo convertiría en un python script.

La solución de Spatialite puede utilizarse directamente desde QGIS. Sólo tiene que abrir su shapefile y guardarlo en un nuevo db de Spatialite a través de "Guardar como ".

2voto

BWW Puntos 302

Al final, elijo utilizar la API de QGIS Python. No estoy seguro de que es eficiente en comparación con el uso de la línea de comandos OGR pero hace el trabajo.

try:
    from qgis.core import Qgis
except ImportError:
    from qgis.core import QGis as Qgis

layer = qgis.utils.iface.activeLayer()
provider = layer.dataProvider()
fields = provider.fields()
new_fields = QgsFields()
for i in fields:
    new_fields.append(QgsField(i.name().lower(), i.type(), i.typeName(), i.length(), i.precision(), i.comment()))

if int(Qgis.QGIS_VERSION.split('.')[0]) == 2:
    geom_type = provider.geometryType()
else:
    geom_type = provider.wkbType()
writer = QgsVectorFileWriter("new_file2.shp", provider.encoding(), new_fields, geom_type, provider.crs(), "ESRI Shapefile")

for f in provider.getFeatures():
    # add a feature
    fet = QgsFeature()
    fet.setGeometry(f.geometry())
    fet.setAttributes(f.attributes())
    writer.addFeature(fet)

# delete the writer to flush features to disk
del writer

Editar nota : ahora compatible con QGIS 2.x y 3.x

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