Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Fri 16 February 2018 19:34

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

QGIS / PostGIS: géométrie non-visible

Bonjour.

La question est peut-être de néophyte, mais c'est bien ce que je suis.

J'utilise QGIS avec un serveur PostgreSQL+PostGIS. J'ai une table qui recense des zones (vectorielles) sur la France entière, environ 17 000. Ces zones sont dans une table avec une colonne géométrie.
Je souhaite créer une géométrie unique pour toutes ces zones, car in fine, ces zones sont pour nous des "zones à éviter" et je veux pouvoir m'en servir comme filtre plus tard de manière simple.

Pour créer cette géométrie, j'ai utilisé la fonction ST_Collect de PostGIS.

Code:

INSERT INTO schema.matable
    ( définition, horodatage , commentaire , geom )
    VALUES
    (
        'toutes_les_zones', current_timestamp,     'Collection des géométries de zones  avec (ST_Collect)',
        (
            SELECT ST_Collect(geom) AS CollectedGeom FROM autre_schema.autre_table 
        )
    );

La requête s'exécute correctement dans pgAdmin, en quelques secondes.
Nota : j'avais hésité avec ST_Union mais ST_Collect est plus rapide.

Jusque là, ça va. Le problème est que je tente de visualiser dans QGIS, celui-ci ne 'détecte' pas de géométrie affichable (la table schema.matable n’apparaît pas la liste des tables utilisables comme couches dans QGIS.
A contrario, si je fais la même opération avec d'autres géométries moins nombreuses (quelques départements par exemple), cela fonctionne sans soucis (QGIS trouve la table comme une couche de données à afficher et peut l'afficher).
Et bien sûr, QGIS n'a pas de problème à détecter comme couche possible la table dont sont originaires les géométries ( autre_schema.autre_table ) et les afficher.

Alors pourquoi ce problème et comment le résoudre.

Hors ligne

 

#2 Fri 16 February 2018 20:31

Ted
Participant assidu
Date d'inscription: 16 Jan 2007
Messages: 181

Re: QGIS / PostGIS: géométrie non-visible

Bonsoir,

Qgis aime bien que les couches postgis possèdent un "id" pour chaque enregistrement, c'est peut-être une piste.

Bon week-end

Hors ligne

 

#3 Fri 16 February 2018 21:43

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

Re: QGIS / PostGIS: géométrie non-visible

Bonsoir.

Merci pour la suggestion mais j'avais déjà écarté cette possibilité :
- les enregistrements possèdent un 'id' (une clé primaire qui est un entier généré automatiquement - du datatype serial dans PostgreSQL).
- le problème serait alors systématique et se produirait aussi lorsque je fais des tests avec les quelques géométries simples, ce qui n'est pas le cas.

Hors ligne

 

#4 Fri 16 February 2018 22:10

Loic_GR
Moderateur
Lieu: Besancon
Date d'inscription: 12 May 2011
Messages: 1017
Site web

Re: QGIS / PostGIS: géométrie non-visible

Bonsoir,

Une suggestion :

La ou les tables en question sont bien référencées dans la table la vue geometry_columns du schema public ? Si les données sont dans un autre schéma assurez vous que cette les tables pointent bien sur le schéma adéquate.

Bon courage et tenez nous au courant.

Dernière modification par Loic_GR (Fri 16 February 2018 22:10)


Freelance traitements ETL FME certifié: www.sitdi-france.fr Twitter : @sitdifrance
Site perso ~ www.partir-en-vtt.com

Hors ligne

 

#5 Fri 16 February 2018 23:12

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

Re: QGIS / PostGIS: géométrie non-visible

Humm ... il y a peut-être quelque chose.
La création de la table a été faite avec le script suivant :

Code:

CREATE TABLE  schema.matable (
    pkid serial PRIMARY KEY,
    définition varchar(255) NOT NULL,
    horodatage timestamp NOT NULL,
    commentaire text,
    geom geometry 
);

Sous pgAdmin, la vue geometry_columns du schema public de la base contient bien quelque chose, mais je remarque que  :
- contrairement aux autres enregistrements de cette vue, le SRID est de 0
- le type est GEOMETRY
- coord_dimension vaut 2

Sauf que je ne sais pas ce que je dois en conclure ...?
Et c'est tout ! Ai-je manqué quelque chose ?
(Je suis sous PostgreSQL 9).

Hors ligne

 

#6 Mon 19 February 2018 08:55

trovez
Participant occasionnel
Lieu: Nantes
Date d'inscription: 17 Sep 2007
Messages: 24

Re: QGIS / PostGIS: géométrie non-visible

Bonjour,
Qgis a besoin de connaître la projection (SRID) de la couche et le type de géométrie.
Pour l'indiquer à posteriori (c'est mieux ce de le faire à la création ), il suffit d'utiliser
ALTER TABLE LaTable
  ALTER COLUMN geom TYPE geometry(MULTILINEPOLYGON, 2154)
    USING ST_SetSRID(geom,2154);
2154 peut être remplacé par le n° EPSG souhaité

Attention car St_collect crée des collections qui peuvent mélanger les types de géométrie,ce qui n'est pas supporté par Qgis.
Si c'est le cas, il faudra passer par ST_CollectionExtract pour ne conserver que les Polygones
http://postgis.net/docs/ST_CollectionExtract.html.

Hors ligne

 

#7 Mon 19 February 2018 12:01

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

Re: QGIS / PostGIS: géométrie non-visible

Bonjour.

Merci pour ces éléments. Cela me permet aussi de me rendre compte que je n'ai pas toutes les colonnes de géométries de toutes les tables toujours dans le même SRID. Je vais donc rectifier cela.

Une première question à laquelle je ne trouve pas la réponse dans la documentation PostGIS :
Il est possible de créer une colonne geometry sans préciser rien de plus sur le type de données dans le CREATE TABLE.
Mais je vois dans les multiples exemples que l'on peut préciser plus de choses, comme le SRID ou le type de géométrie. Je ne trouve toutefois pas dans la documentation PostGIS ou PostgreSQL de documentation sur la syntaxe et les options possibles au type geometry.
Je comprends qu'il est préférable de spécifier le SRID, mais y a t'il un intérêt à spécifier le type de géométrie (MULTIPOLYGON, POINT, etc ...) ?

Tout ceci ne m'explique pas complément pourquoi dans un cas simple QGIS arrivait à afficher les géométries et pas dans un autre, mais j'aurai peut-être la réponse alors que j'en apprends plus.

Encore une fois, merci.

Hors ligne

 

#8 Mon 19 February 2018 12:14

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

Re: QGIS / PostGIS: géométrie non-visible

D'ailleurs, je me rends compte que :
- Si je définis le type comme MULTIPOLYGON (   ALTER COLUMN geom TYPE geometry(MULTIPOLYGON, 2154)
    USING ST_SetSRID(geom,2154)
), alors le résultat d'un ST_Collect de différentes géométries ne sera pas accepté lors d'un INSERT comme étant une géométrie valable. Par contre, le résultat d'un ST_Union le sera.

- A contrario, si je définis le type comme GeometryCollection (   ALTER COLUMN geom TYPE geometry(GeometryCollection, 2154)
    USING ST_SetSRID(geom,2154)
), alors le résultat d'un ST_Union de différentes géométries ne sera pas accepté lors d'un INSERT comme étant une géométrie valable, mais le résultat d'un ST_Collect le sera.

Correct ?

Il n'y a pas de doc pour tout ça ?
Et il n'y a pas de moyen de spécifier la colonne géométrie comme acceptant tous les sous-types de géométries ?

PS : pour la documentation, je viens de trouver ça ( http://www.postgis.fr/chrome/site/docs/ … tries.html ). Y a t'il plus complet ?

Dernière modification par Blue Monkey (Mon 19 February 2018 12:30)

Hors ligne

 

#9 Tue 20 February 2018 08:37

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1220
Site web

Re: QGIS / PostGIS: géométrie non-visible

Bonjour et bienvenue sur georezo,

dans les versions récentes de postgis, geometry column est une vue et non plus une table.

A ma connaissance, QGIS n'affiche pas les collections de géométrie.
Vous pouvez créer des vues à partie de votre table, une par type de géométrie possible dans la collection en utilisant la fonction st_collectionextract().

Enfin, st_union va retourner un MultiPolygon, pas une collection, PostgreSQL renvoie donc une erreur lors de la tentative d'insertion.

Et il n'y a pas de moyen de spécifier la colonne géométrie comme acceptant tous les sous-types de géométries ?


le type geometry géométrie est bel et bien le type générique.

La doc de PostGIS est là : https://postgis.net/documentation/


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#10 Tue 20 February 2018 17:29

Blue Monkey
Participant occasionnel
Date d'inscription: 9 Dec 2016
Messages: 23

Re: QGIS / PostGIS: géométrie non-visible

Bonjour, et merci pour votre réponse.

Finalement, j'ai eu recours au code suivant pour opérer

Code:

INSERT INTO schema.matable
    ( définition, horodatage , commentaire , geom )
    VALUES
    (
        'toutes_les_zones', current_timestamp,     'Collection des zones (sous forme d''un unique multipolygone 2D)',
        (
            SELECT ST_Multi(ST_Collect(dumpedGeometries)) AS singleMultiGeometry 
            FROM
            (
                SELECT ST_Force2D((ST_Dump(geom)).geom) AS dumpedGeometries
                FROM donnees.reserve_biologique
            ) AS dumpingGeometries
        )
    ) ;

En effet, j'ai fini par comprendre les points suivants :
- que ST_Collect renvoie une géométrie de type Multi* si on lui passe en paramètres uniquement des géométries simples du même type (ex: renvoie un multipolygone si on lui passe des polygones) ; mais que il renvoie un GeometryCollection dès que on lui passe en paramètre un objet de type multi* ou bien des objets de types différents.
Dans mon cas, mes objets d'entrée étant tous des multipolygones, ST_Collect renvoie une collection de multipolygones.
- ST_Multi() permet alors de transformer alors cette collection de multipolygones en un unique multipolygone.
- Même si mes géométries d'entrée viennent d'une colonne de type geometry(multipolygone), pour alimenter ST_Collect de manière homogène avec uniquement des polygones simples, j'ai donc eu recours à ST_Dump.
- j'ai dû ajouter ST_Force2D car certains des multipolygones étaient en 3D (alors qu'ils n'avaient pas de raison de l'être) et cela me faisait des erreurs.

Si quelqu'un de plus expérimenté avait une critique (constructive) de ce code, ce serait bienvenu.

Je ne trouve toutefois toujours nulle part dans la documentation de PostGIS de liste des sous-types du type geometry.

Hors ligne

 

Pied de page des forums

Powered by FluxBB