Créer une vue spatiale dans PostGIS et l'ajouter en tant que couche dans QGIS?

49

Dans PostGIS 2.0, je cherche un moyen efficace de créer une vue activée spatialement et visible dans QGIS.

J'ai suivi le contexte de la deuxième partie de la réponse de @Mike Toews à Comment créer une table à partir de tables existantes (application de nouveaux schémas) dans la base de données Postgis? et la vue apparaît sous forme de couche de points (dans mon cas) dans la boîte de dialogue "Ajouter des couches PostGIS". Mais après avoir créé la vue et l'avoir spatialement activée, j'ai reçu l'erreur suivante lorsque j'essayais d'ajouter la vue à QGIS:

Vous devez sélectionner une table pour pouvoir ajouter une couche

Quelqu'un peut-il expliquer pourquoi la vue spatiale ne se chargera pas dans QGIS et ce que je dois faire pour la rendre chargeable en tant que couche dans QGIS?

J'utilise actuellement QGIS v1.8 à partir du programme d'installation OSGEO.

Je vois est construit à partir de la base de données geonames, chargée dans PostGIS. La table geoname / les données spatiales peuvent être sélectionnées / visualisées dans QGIS sans problème.

Lorsque j'essaie de sélectionner " mt_view ", QGIS voit la vue dans la boîte de dialogue, mais ne me laisse pas la sélectionner. Il donne un cadre en pointillé autour de la zone, mais ne met pas en surbrillance et ne sélectionne pas la vue.

QGIS ne peut pas sélectionner la mt_view en tant que couche


Je viens de remarquer que lorsque je lance ma première requête:

CREATE OR REPLACE VIEW data.test AS
SELECT * FROM data.geoname
WHERE admin1='MT'

la vue apparaît dans la boîte de dialogue Ajouter une couche QGIS, mais est non sélectionnable. Puis quand je cours:

SELECT Populate_Geometry_Columns('data.test'::regclass);

Je reçois le résultat de "0", où selon la documentation , je pense qu'il devrait retourner "1".

RyanDalton
la source
1
Je confirme le problème. Avec QGIS 1.8, PostGIS 2.0 et une vue créée à partir d'une table avec une clé primaire, cette vue est répertoriée dans les couches disponibles, mais le message d'erreur "Vous devez sélectionner une table pour pouvoir ajouter une couche" apparaît.
giohappy
2
Existe-t-il un autre moyen de définir automatiquement la clé primaire dans la fenêtre Ajouter une couche de Postgis lorsque nous travaillons avec des vues? Il est très difficile de sélectionner un champ de clé primaire dans cet écran pour toutes les couches / vues si vous imaginez un utilisateur SIG normal et une vue ayant de nombreux champs entiers.
@Pgimenez, je suggérerais de commencer une nouvelle question avec ce que vous avez dit ci-dessus, puis de référencer cette question dans votre propre URL. Cela lui donnera une visibilité beaucoup plus large.
RyanDalton
Il n'y a aucun moyen de visualiser un convexhull en qgis 1.8 lisboa? J'ai essayé de suivre les vues dans Postgis 1.5. On m'a dit d'utiliser une colonne id pour la publier dans Qgis. Si vous n'utilisez pas de colonne id, vous ne pourrez pas le charger quand même à cause d'une erreur. 1. créez ou remplacez la vue con_hull_baeume3 (enchère) en sélectionnant "0", ST_ConvexHull (ST_Collect (geom)) FROM baeume; 2. créez ou remplacez la vue con_hull_baeume4 (enchère) comme offre sélectionnée, ST_ConvexHull (ST_Collect (geom)) FROM groupe baeume par enchère; mais celui-ci fait une coque convexe sur chacun des points de géométrie. Je veux dire juste utiliser 'select ST_ConvexHull (ST_Collect (geom)) FROM baeume;' travaux
ulan
1
Bienvenue! Merci de poster ceci comme une nouvelle question, car cela ne semble pas répondre à l'original. Du moins s'il s'agit d'une question, puisque la dernière déclaration ne dit pas clairement si vous avez réussi ou non.
Lynxlynxlynx

Réponses:

54

Je peux confirmer qu'il n'est pas possible de sélectionner simplement une vue répertoriée.

Il semble nécessaire de sélectionner d'abord la "colonne de clé primaire". Ensuite, la table devient sélectionnable:

entrez la description de l'image ici

sous-bois
la source
1
Wow, je n'aurais jamais vu ça. Merci beaucoup! J'ai modifié le titre pour refléter que le problème concernait QGIS, et non la vue PostGIS.
RyanDalton
Il semble que ce soit un problème pour QGIS 1.8 (que je n’ai pas encore utilisé). Ces étapes ne sont pas nécessaires pour 1.7.
Mike T
C'est vrai, 1.7 a essayé de deviner la clé primaire. Mais ça n'a pas bien marché.
underdark
En passant, @underdark, QGIS accepte-t-il d'autres types de PK?
George Silva
1
Dans QGIS3, la colonne est intitulée "ID de fonction" et non pas "colonne de clé primaire" et (du moins pour moi), elle est en dehors du bord de la fenêtre par défaut (c'est-à-dire non visible) et rien n'indique qu'il y ait plus de colonnes! Je pense que je vais enregistrer une demande de fonctionnalité à laquelle on demande les détails (si nécessaire) après la sélection. Il semblerait que les développeurs partent du principe que les utilisateurs s’assureront que la première colonne contient une clé unique.
Russell Fulton
5

(Mise à jour légèrement ma réponse)

Tant que le champ OBJECTID (row_number) figure en premier dans la définition de colonne de la vue , QGIS le récupérera sans vous demander d'ajouter dans le menu "Ajouter un calque de vecteur".

CREATE OR REPLACE VIEW dqmt.addressverify AS 
 SELECT row_number() OVER (ORDER BY newaddresses.addressid) AS objectid,
    newaddresses.addressid
  , geom
   FROM dqmt.newaddresses;

Je viens de corriger quelques anciennes vues brisées conformément à la question initiale, mais le fait de déplacer le champ OBJECTID au début de la vue a résolu le problème!

DPSSpatial
la source
J'ai également utilisé la syntaxe "row_number () over ()" pour de nombreuses vues. J'ai généralement utilisé "gid" pour mon champ clé primaire. Est-ce que toutes vos autres vues utilisent "objectid" comme clé primaire?
RyanDalton
généralement objectid - ce qui a fonctionné dans l'exemple ci-dessus - mais essayera gid ... est-ce quelque chose que QGIS reconnaît avant tout autre champ 'id'?
DPSSpatial
GID n'a aucun effet sur ceci ...
DPSSpatial
Je rêve juste de possibilités. merci pour vérifier
RyanDalton
(En retard, mais ...) je suppose que si une table chargée est PRIMARY KEYdéfinie, QGIS la relève systématiquement: elle ne manque jamais de "choisir" le PK de toutes les tables dont le PK, bien que presque tous mes PK sont VARCHAR. Cela ne peut pas arriver avec a VIEWparce que PostgreSQL VIEWne peut pas avoir CONSTRAINTs. C’est pourquoi il est nécessaire de sélectionner VIEWmanuellement les PK lors de l’importation dans QGIS via le bouton «Ajouter des couches PostGIS». C’est pourquoi je les importe à l’aide d’un script Python.
GT.
4

Votre vue apparaît-elle dans le geometry_columnstableau? Selon le manuel, la vue devrait apparaître automatiquement en 2.0 mais je ne l'ai pas essayée.

Essayez de lancer ce qui suit pour vérifier:

SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims 
FROM geometry_columns
WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema';
Ian Turton
la source
Oui, cette vérification à mon encontre revient: the_geom, Point, 4269,2
RyanDalton
3

Votre vue utilise-t-elle un champ entier unique, tel qu'un "gid" ou un équivalent de PK, dans l'une des tables de votre vue?

Je sais que dans les versions précédentes de QGIS, je rencontrais des problèmes pour ajouter des vues à la carte alors qu'il n'y avait pas de champ entier unique. Cependant, j'ai reçu un message d'erreur différent soulignant ce problème, mais il serait peut-être utile de vérifier pour couvrir toutes les bases.

Ando
la source
Oui, la table geonames a "geonameid" qui est un ID unique et une contrainte PRIMARY KEY est définie sur ce champ.
RyanDalton