¿Puede QGIS leer vistas de Spatialite?

11

Tengo una base de datos espacial que creé que abarca varios años de datos sobre delitos. Para facilitar un escenario del mundo real en el que pueda simplificar la interacción para un usuario mediante la introducción de una Vista que simplemente limite el lapso de tiempo o qué tipos de delitos se devuelven, quiero saber si QGIS puede leer esta Vista como tal cualquier otra tabla espacial en mi base de datos. El punto aquí es que, obviamente, no quiero crear una tabla separada para cada Vista posible 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 subconjugar los datos ellos mismos. Un flujo de trabajo similar en el mundo de ArcGIS podría estar creando archivos de capa separados que el usuario podría abrir en ArcMap que acceden a la base de datos (por ejemplo, SQL Server) y presentan solo el conjunto de datos limitado.

Creé una Vista en mi base de datos, pero no aparece en la lista de clases de entidad que puedo importar cuando me conecto a la db espacial en QGIS. ¿Quizás las vistas no se consideran espaciales? (Esto es algo que analizaré más adelante, pero pensé que ya lo había hecho; simplemente no recuerdo la conclusión). En cualquier caso, ¿cómo podría uno replicar el tipo de flujo de trabajo que quiero o la alternativa ArcGIS similar? ?

Bryan Goodrich
fuente

Respuestas:

15

Creo que debe 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, debe registrar esta VISTA en las vistas_geometría_columnas, para que se convierta en una Vista espacial real.

bajo oscuro
fuente
Ese parece ser el problema. Creé la vista y verifiqué las tablas meta. Obviamente, la geometría de la vista no está en la lista. ¿Cómo registro la geometría de la vista? Intenté RecoverGeometryColumn pero me dice que la tabla no existe. Pensé que estaba en una versión 2.4, pero aparentemente estoy trabajando con la versión beta de Spatialite 3.0. Tal vez estoy implementando el comando mal? Tal vez no funciona en las vistas? (¡Es mejor!); para mayor claridad, mi comando fue SELECT RecoverGeometryColumn ('tblName', 'SHAPE', 2226, 'POINT', 2);
Bryan Goodrich
44
Hay una tabla especial para manejar vistas basadas en geometría. Use la siguiente sintaxis INSERTAR EN VIEWS_GEOMETRY_COLUMNS VALUES ('{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);
Nathan W
ejemplo: INSERTAR EN VIEWS_GEOMETRY_COLUMNS VALUES ('Towns_v1', 'Geometry', 'POINT', 2, 32632, 0);
Nathan W
Use SELECT * FROM views_geometry_columns;para ver lo que se necesita insertar. Más información en gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/…
Nathan W
2

Es posible que también deba colocar una ID única en la vista, similar a lo que se analiza aquí: en PostGIS, ¿es posible crear una Vista con una ID única?

RyanKDalton
fuente
A menos que no seleccione explícitamente el PK en la creación de la vista, ¿no se llevaría una identificación única? Al menos para la consulta de selección simple que estoy haciendo aquí.
Bryan Goodrich
@ BryanGoodrich: pruébalo, pero no funciona de esa manera con las vistas de PostGIS, por lo que he encontrado.
RyanKDalton
La vista fue creada por "SELECT * FROM crime WHERE ..." y subconjunto por la cláusula where. Esto devolvió la columna PK (nombre de fila, que generé a partir de los nombres de columna en la tabla R que usé para llenar el DB de SQLite). El problema es como señaló Underdark: necesita una referencia de geometría en las tablas meta. Esto es lo que QGIS usa para identificar tablas espaciales, y la vista no tiene ningún registro en esas metatablas.
Bryan Goodrich
Bueno saber. Gracias por hacer la pregunta y obtener una buena respuesta
RyanKDalton
2

registrar la vista en geometry_columns hoy en día (año 2015) parece requerir un campo adicional 'read_only' como este:

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);
KaeptnHaddock
fuente
1
¿Podría agregar un enlace a la documentación de respaldo? ¡Gracias!
oscuro
2

Para SpatialLite 4.x, se requieren dos cambios en la respuesta original: la adición de la read_onlycolumna y el cambio de todos los valores insertados a minúsculas. El SQL actualizado se vería 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);

El read_onlycampo acepta 0 o 1. (Consulte el comentario de Sandro Furieri en Grupos de Google para obtener más aclaraciones).

Se pueden encontrar más detalles sobre estos y otros cambios 4.x en la wiki de cambio a 4.0 .

Darren
fuente
1
INSERT INTO views_geometry_columns VALUES
('nameOfView' , 'geometry', 'rowid', 'geometryTable', 'geometry', 1);

NB: solo reemplace: nameOfView y geometryTable

Norbert Byiringiro
fuente