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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 03 October 2019 16:31

dhaulagiri
Participant occasionnel
Lieu: Nîmes, Gard
Date d'inscription: 1 Dec 2006
Messages: 46
Site web

Découpage d'objets postGIS et perte d'unicité de clé primaire

Bonjour,

J'ai intégré des données vectorielles de l'IGN (OCS GE) dans une base postgreSQL. En m'appuyant sur le descriptif de livraison, j'ai défini la clé primaire sur la colonne "id". Cet identifiant est stable d'une version à une autre. Les objets sont de type Multipolygon.

Les données sont fournies à l'échelon départemental. Comme je n'en ai besoin que sur un territoire plus petit, j'ai procédé à leur découpage en utilisant ce territoire comme pochoir (fonction ST_Intersection). Le résultat est stocké dans une vue matérialisée.

J'ai d'abord remarqué que certaines portions de mon territoire manquaient dans cette vue. Elles correspondaient toujours à des polygones initiaux non entièrement inclus dans mon territoire. Pour autant, d'autres polygones "à cheval" étaient bien découpés. Sans parvenir à expliquer vraiment ce problème, j'ai trouvé une parade en imbriquant la fonction ST_Intersection dans la fonction ST_Dump, qui crée des objets Polygon.

Tout est désormais correctement découpé mais quand un polygone qui intersecte mon territoire à au moins deux endroits différents (cf fichier joint), des polygones distincts sont créés avec le même id. Et QGIS de ne pas pouvoir ouvrir la vue au motif que cet id n'est plus unique.

Savez-vous comment je peux gérer ce problème sans perdre l'id de l'IGN? En dernier recours, je pourrai conserver les polygones intersectant mon territoire sans les découper. Visuellement, c'est moins "propre" et ça ne permet pas de recalculer les surfaces (par commune notamment).

Je vous remercie pour votre aide.

Dernière modification par dhaulagiri (Thu 03 October 2019 16:33)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Salutations, Nicolas.

Hors ligne

 

#2 Thu 03 October 2019 20:05

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Découpage d'objets postGIS et perte d'unicité de clé primaire

Salut,

difficile de dire ce qui cloche avec votre requête
si vous n'en donnez pas un extrait.

Cela dit, votre problème de perte d'unicité
provient du fait que vous utilisez st_dump,
qui explose vos multi polygones en plusieurs
polygones et donc repetant l'ID du multi_polygone
original.

Seule solution, pour avoir une seul ligne par id,
qui regrouperait tous les morceaux de polygones
intersectés, supprimez l'appel à st_dump et conservez
des multipolygones.
Si st_intersection renvoie une geometrycollection,
vous pouvez "forcer" son type en multipolygon
en utilisant la fonction ST_CollectionHomogenize.

Il se peut par contre que st_intersection renvoie
des collections de géométries composées de plusieurs type.
Dans ce cas, vous pouvez compter sur ST_CollectionExtract
(en filtrant pour ecarter les geometries résultantes qui sont vides,
exemple: st_intresection ne renvoyant que des lignes ou des points).

Mais même avec votre traitement actuel
vous ne perdez pas vraiment l'ID IGN puisqu'il est conservé
pour chaque polygone, il est seulement répété.
C'est sûr vous perdez l'unicité, mais est ce que vous en avez vraiment
besoin ?
Si oui, à la limite,
peut être pouvez  vous créer une clé primaire composite
id+géométrie ?
Tout cela pour dire, que définir une clé primaire n'a pas toujours de sens,
tout dépend de ce que vous faites avec vos données.
Si par exemple vous avez besoin de cet ID pour joindre votre vue avec
autre chose, le fait qu'il définisse la clé primaire peut ne pas être important.

Dernière modification par tumasgiu (Thu 03 October 2019 20:30)

En ligne

 

#3 Fri 04 October 2019 09:49

dhaulagiri
Participant occasionnel
Lieu: Nîmes, Gard
Date d'inscription: 1 Dec 2006
Messages: 46
Site web

Re: Découpage d'objets postGIS et perte d'unicité de clé primaire

Bonjour et merci,

Vous avez raison, un exemple est toujours utile. Ma requête est vraiment simple:

Code:

create materialized view ma_vue as(
    select ma_table_source.id, st_intersection(ma_table_source.geom, mon_territoire.geom) as geom
    from ma_table_source, mon_territoire
    where st_intersects(from ma_table_source.geom, mon_territoire.geom)
)

J'ajoute quelques détails sur ce qu'elle renvoie.

Nombre d'objets par type de géométrie:
"ST_Polygon";29112
"ST_Point";1
"ST_MultiPolygon";129
"ST_GeometryCollection";11

Dans QGIS, 29241 objets sont affichés (c'est-à-dire les Polygon + les MultiPolygon). Les trous doivent donc correspondre à des GeometryCollection. Le cas du Point n'est pas significatif.

Nous sommes d'accord: l'insertion de ST_Dump() apporte uniquement une solution "géométrique" en ne renvoyant aucun trou dans mon territoire. Elle n'est évidemment pas satisfaisante, sinon je n'aurai pas demandé d'aide yikes)

Je teste St_CollectionExtract(), que j'avais déjà utilisée il y a pas mal de temps, ST_CollectionHomogenize(), que je ne connaissais pas. Je ferai un retour.

Merci encore


Salutations, Nicolas.

Hors ligne

 

#4 Fri 04 October 2019 10:34

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1160

Re: Découpage d'objets postGIS et perte d'unicité de clé primaire

Nous sommes d'accord: l'insertion de ST_Dump() apporte uniquement une solution "géométrique" en ne renvoyant aucun trou dans mon territoire. Elle n'est évidemment pas satisfaisante, sinon je n'aurai pas demandé d'aide yikes)


Pas de problèmei, je ne voulais vous offenser,
je n'étais juste pas certain que vous compreniez ce que st_dump faisait.

Pour votre exemple, il faudrait donc utiliser CollectionExtract ou collectionHomogenize sur le resultat de st_intersection,
et changer la clause where pour ne retenir que les couples s'intersectant au moins de manière surfacique,
avec st_relate.

En ligne

 

#5 Fri 04 October 2019 10:43

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3199
Site web

Re: Découpage d'objets postGIS et perte d'unicité de clé primaire

Bonjour

En matière de clef primaire il est toujours plus sain de générer les siennes que de dépendre du producteur de données et de transformer celle du producteur en attribut (champs) de votre objet. Ceci car vous ne maîtrisez pas le process du producteur.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#6 Fri 04 October 2019 14:41

dhaulagiri
Participant occasionnel
Lieu: Nîmes, Gard
Date d'inscription: 1 Dec 2006
Messages: 46
Site web

Re: Découpage d'objets postGIS et perte d'unicité de clé primaire

Merci. Je vous rassure, je ne me suis pas senti offensé. Je viens sur un forum pour aider (un peu), être aidé (souvent) et apprendre (toujours), sans réponses toutes faites ni fierté mal placée. Enfin je l'espère...

Votre aide m'a été utile:

Code:

create materialized view ma_vue as(
    select ma_table_source.id, st_multi(st_collectionextract(st_intersection(ma_table_source.geom, mon_territoire.geom), 3)) as geom
    from ma_table_source, mon_territoire
    where st_intersects(from ma_table_source.geom, mon_territoire.geom)
)

Dans mon cas, c'est suffisant a priori pour régler le problème: ST_CollectionExtract() gère les collections et ST_Multi() transforme tout en multipolygones. La requête de retourne pas de géométries invalides...

Pour ce qui est du choix de la clé primaire, j'avoue ne pas avoir d'arguments pour justifier ma façon de faire. Je fais confiance à l'IGN et à ses données. J'ai pourtant trouvé une fois des doublons dans une colonne de BD TOPO contenant en principe des valeurs uniques, ce qui donne raison à ChristopheV.

Dernière modification par dhaulagiri (Fri 04 October 2019 14:42)


Salutations, Nicolas.

Hors ligne

 

Pied de page des forums

Powered by FluxBB