QGIS peut-il lire des vues spatiales?


11

J'ai créé une base de données spatialite qui couvre plusieurs années de données sur la criminalité. Pour faciliter un scénario réel où je peux simplifier l'interaction pour un utilisateur en introduisant une vue qui limite simplement la durée ou quels types de crimes sont renvoyés, je veux savoir s'il est possible pour QGIS de lire cette vue comme elle serait toute autre table spatiale dans ma base de données. Le point ici est que, de toute évidence, je ne veux pas créer une table distincte pour chaque vue possible que je peux utiliser, et j'essaie de faire simple en n'exigeant pas que l'utilisateur connaisse la base de données et le SQL approprié pour sous-définir les données elles-mêmes. Un flux de travail similaire dans le monde ArcGIS peut créer des fichiers de couches distincts que l'utilisateur pourrait ouvrir dans ArcMap et accéder à la base de données (par exemple, SQL Server) et présenter uniquement l'ensemble de données limité.

J'ai créé une vue dans ma base de données, mais elle n'apparaît pas dans la liste des classes d'entités que je peux importer lorsque je me connecte à la base de données spatialite dans QGIS. Peut-être que les vues ne sont pas considérées comme spatiales? (C'est quelque chose que je vais examiner plus tard, mais je pensais l'avoir déjà fait; je ne me souviens tout simplement pas de la conclusion.) En tout cas, comment pourrait-on reproduire le type de flux de travail que je veux ou l'alternative ArcGIS similaire ?

Réponses:


15

Je pense que vous devez enregistrer la vue dans la table geometry_columns pour pouvoir l'utiliser dans QGIS.

Une bonne ressource est "Écrire à la main votre propre VUE spatiale" avec l'exemple suivant:

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

Quoi qu'il en soit, vous devez enregistrer cette VUE dans les vues_geometry_columns, pour en faire une véritable vue spatiale.


Cela semble être le problème. J'ai créé la vue et vérifié les méta-tables. De toute évidence, la géométrie de la vue n'est pas répertoriée. Comment enregistrer la géométrie de la vue? J'ai essayé le RecoverGeometryColumn mais cela me dit que la table n'existe pas. Je pensais que j'étais sur une version 2.4, mais apparemment je travaille avec la bêta de Spatialite 3.0. Peut-être que j'implémente mal la commande? Peut-être que cela ne fonctionne pas sur les vues? (Cest mieux!); pour plus de clarté, ma commande était SELECT RecoverGeometryColumn ('tblName', 'SHAPE', 2226, 'POINT', 2);
Bryan Goodrich

4
Il existe une table spéciale pour gérer les vues basées sur la géométrie. Utilisez la syntaxe suivante INSERT INTO VIEWS_GEOMETRY_COLUMNS VALUES ('{TABLE NAME}', '{GEOM COLUMN NAME}', '{GEOM TYPE}', 2, {SRID}, 0);
Nathan W

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

Utilisez SELECT * FROM views_geometry_columns;pour voir ce qui doit être inséré. Plus d'infos sur gaia-gis.it/spatialite-3.0.0-BETA/spatialite-cookbook/html/…
Nathan W

2

Vous devrez peut-être également mettre un ID unique dans la vue, similaire à ce qui est expliqué ici: Dans PostGIS, est-il possible de créer une vue avec un ID unique?


À moins que je ne sélectionne pas explicitement le PK dans la création de la vue, un ID unique ne serait-il pas emporté? Au moins pour la simple requête de sélection que je fais ici.
Bryan Goodrich

@ BryanGoodrich- Essayez-le, mais cela ne fonctionne pas de cette façon avec les vues PostGIS, pour autant que je l'ai trouvé.
RyanKDalton

La vue a été créée par "SELECT * FROM crime WHERE ..." et je sous-ensemble par la clause where. Cela a renvoyé la colonne PK (rowname, que j'ai générée à partir des noms de colonne dans la table R que j'ai utilisée pour remplir la base de données SQLite). Le problème est comme souligné: il a besoin d'une référence géométrique dans les méta-tables. C'est ce que QGIS utilise pour identifier les tables spatiales, et la vue n'a aucun enregistrement dans ces méta-tables.
Bryan Goodrich

Bon à savoir. Merci d'avoir posé la question et d'avoir obtenu une bonne réponse
RyanKDalton

2

l'enregistrement de la vue dans geometry_columns de nos jours (année 2015) semble nécessiter un champ supplémentaire 'read_only' comme ceci:

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
Pourriez-vous s'il vous plaît ajouter un lien vers la documentation de support? Merci!
underdark

2

Pour SpatialLite 4.x, deux modifications à la réponse d'origine sont requises - l'ajout de la read_onlycolonne et la modification de toutes les valeurs insérées en minuscules. Le SQL mis à jour ressemblerait à ceci:

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);

Le read_onlychamp accepte 0 ou 1. (Voir le commentaire de Sandro Furieri dans Google Groupes pour plus de précisions.)

Plus de détails sur ces changements et sur d'autres 4.x peuvent être trouvés sur le wiki de passage à 4.0 .


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

NB: remplacer uniquement: nameOfView et geometryTable

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.