11 votos

¿Puede QGIS leer las vistas de Spatialite?

Tengo una base de datos spatialite que he creado y que abarca varios años de datos sobre la delincuencia. Para facilitar un escenario del mundo real en el que puedo simplificar la interacción para un usuario mediante la introducción de una vista que simplemente limita el período de tiempo o qué tipos de delitos se devuelven, quiero saber si es posible que QGIS lea esta vista como lo haría con cualquier otra tabla espacial en mi base de datos. El punto aquí es que obviamente no quiero crear una tabla separada para cada posible Vista que pueda usar, y estoy tratando de hacerlo simple al no requerir que el usuario conozca la base de datos y el SQL apropiado para subconjuntar los datos ellos mismos. Un flujo de trabajo similar en el mundo de ArcGIS podría ser la creación de archivos de capas separadas que el usuario podría abrir en ArcMap que acceder a la base de datos (digamos, SQL Server) y presentar sólo el conjunto de datos limitados.

He creado una vista en mi base de datos, pero no aparece en la lista de clases de características que puedo importar cuando me conecto a la base de datos de spatialite en QGIS. ¿Quizás las Vistas no se consideran espaciales? (Esto es algo que voy a investigar más adelante, pero creía que ya lo había hecho; sólo que no recuerdo la conclusión). En cualquier caso, ¿cómo se podría replicar el tipo de flujo de trabajo que quiero o la alternativa similar de ArcGIS?

15voto

tobes Puntos 19

Creo que hay que registrar la vista en la tabla geometry_columns para poder usarla en QGIS.

Un buen recurso es "Escribir a mano su propia VISTA espacial" con el siguiente ejemplo:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column)
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry');

De todos modos hay que registrar este VIEW en el views_geometry_columns, para que se convierta en un verdadero Spatial View.

0 votos

Ese parece ser el problema. He creado la vista y he comprobado las meta tablas. Obviamente, la geometría de la vista no aparece. ¿Cómo puedo registrar la geometría de la vista? He probado el RecoverGeometryColumn pero me dice que la tabla no existe. Pensé que estaba en una versión 2.4, pero aparentemente estoy trabajando con la beta de Spatialite 3.0. ¿Quizás estoy implementando mal el comando? ¿Quizás no funciona en las vistas? (¡Mejor!); para que quede claro, mi comando era SELECT RecoverGeometryColumn('tblName', 'SHAPE', 2226, 'POINT', 2);

4 votos

Hay una tabla especial para manejar las vistas basadas en la geometría. Utilice la siguiente sintaxis INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);

0 votos

ejemplo: INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('Towns_v1', 'Geometry', 'POINT', 2, 32632, 0);

2voto

aditya Puntos 111

Es posible que también tenga que poner un ID único en la vista, similar a lo que se discute aquí: ¿En PostGIS es posible crear una Vista con un ID único?

0 votos

A menos que no seleccione explícitamente el PK en la creación de la vista, ¿no se llevaría un ID único? Al menos para la simple consulta de selección que estoy haciendo aquí.

0 votos

@BryanGoodrich- Pruébalo, pero no funciona así con las vistas de PostGIS, por lo que he encontrado.

0 votos

La vista se creó con "SELECT * FROM crime WHERE ..." y la subconjunto por la cláusula where. Esto devolvió la columna PK (rowname, que generé a partir de los nombres de las columnas de la tabla de R que utilicé para rellenar la BD de SQLite). El problema es lo que ha señalado Underdark: necesita una referencia de geometría en las meta tablas. Esto es lo que utiliza QGIS para identificar las tablas espaciales, y la vista no tiene ningún registro en esas meta tablas.

2voto

Jonas Klemming Puntos 126

El registro de la vista en geometry_columns hoy en día (año 2015) parece requerir un campo adicional 'read_only' así:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'ROWID', 'local_councils', 'geometry', 1);

1 votos

¿Podría añadir un enlace a la documentación de apoyo? Gracias.

2voto

Louis W Puntos 118

Para SpatialLite 4.x, son necesarios dos cambios en la respuesta original: la adición del read_only y cambiando todos los valores insertados a minúsculas. El SQL actualizado tendría el siguiente aspecto:

INSERT INTO views_geometry_columns
(view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only )
VALUES ('italy', 'geometry', 'rowid', 'local_councils', 'geometry', 1);

El read_only acepta 0 o 1. (Véase el comentario de Sandro Furieri en Grupos de Google para una mayor aclaración).

Puede encontrar más detalles sobre estos y otros cambios de la versión 4.x en la página wiki del cambio a 4.0 .

1voto

Klaus Thomsen Puntos 71
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

N.B: sólo reemplazar: nameOfView y geometryTable

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