3 votos

¿Cómo puedo crear una capa vectorial en PyQGIS a partir de una tabla sin columna geom?

En QGIS tengo una base de datos Spatialite que contiene tablas sin columna de geometría. Con la interfaz gráfica de QGIS es perfectamente posible añadir dicha tabla como una "capa vectorial de Spatialite". Pero, ¿cómo hacer esto en Python?

En la consola he probado:

>>> uri = QgsDataSourceURI()
>>> uri.setDatabase('/<path>/test.sqlite')
>>> uri.setDataSource('', 'TestTableName','','','id')
>>> vlayer = QgsVectorLayer(uri.uri(), 'TestLayer', 'spatialite')
>>> QgsMapLayerRegistry.instance().addMapLayer(vlayer)

Sin resultado

>>> vlayer.isValid()
False

¿Qué está fallando?

Algunos análisis adicionales: Cuando añado esta capa por la GUI la descripción uri es la siguiente:

>>> qgis.utils.iface.activeLayer().dataProvider().dataSourceUri()
PyQt4.QtCore.QString(u'dbname=\'/<path>/test.sqlite\' table="TestTableName" sql=')

Cuando añado esta capa por la consola de Python como se ha descrito anteriormente, la descripción uri es algo diferente:

>>> uri.uri()
PyQt4.QtCore.QString(u'dbname=\'/<path>/test.sqlite\' table="TestTableName" () sql=')

¿Podrían los paréntesis vacíos causar un comportamiento diferente? ¿Así que tal vez QGIS 1.8.0 maneja los paréntesis vacíos de forma diferente a como lo hace sin paréntesis?

4voto

Ronny Brendel Puntos 2588

Finalmente, conseguí que funcionara. Mi análisis parece correcto. Los paréntesis en la uri causan el problema. Lo he solucionado de la siguiente manera:

>>> uri2 = QgsDataSourceURI(uri.uri().remove(' ()'))
>>> vlayer = QgsVectorLayer(uri2.uri(), 'TestLayer', 'spatialite')
>>> vlayer.isValid()
True

Parece que este problema no se produce en QGIS 1.9 >.

2voto

GreyCat Puntos 146

Nada

Con una capa SQLite (no espacial)

uri = QgsDataSourceURI()
uri.setDatabase('Midv_31370.sqlite')
uri.setDataSource('', 'obs_points','','','obsid')
vlayer = QgsVectorLayer(uri.uri(), 'TestLayer2', 'spatialite')
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
vlayer.isValid()
True

enter image description here

Si desea una capa espacial (Spatialite), debe indicar la columna de geometría:

uri = QgsDataSourceURI()
uri.setDatabase('Midv_31370.sqlite')
uri.setDataSource('', 'obs_points', 'geometry')
vlayer = QgsVectorLayer(uri.uri(), 'TestLayer2', 'spatialite')
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
vlayer.isValid()
True

enter image description here

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