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 Tue 30 May 2017 16:14

Romain0730
Participant occasionnel
Date d'inscription: 19 Mar 2013
Messages: 12

QGIS: Superposition couches d'aléas

Bonjour à tous,

Je viens vers vous histoire de prendre un peu de recul par rapport à un problème qui se pose à moi. Il est possible que le sujet ait été traité mais il a peut être été nommé d'une autre manière, qui lui aurait permis de passer à travers les mailles de ma recherche...

J'ai plusieurs couches d'aléas et je souhaite les superposer de façon telle, qu'à ce qu'à la fin, je puisse avoir une couche qui contient tous les polygones croisés. Je m'explique :
J'ai un aléa A et un aléa B qui se coupent à un endroit donné, j'ai donc une zone sous A, B et la zone de croisement AB.
Si un troisième polygone C vient croiser le A, le B ou le AB, on peut avoir A, B, C, AC, AB, BC ou ABC.
Ainsi de suite avec un quatrième aléa, cinquième, sixième...

Le but final est donc de se retrouver avec une couche qui représente des polygones et qui notifie tous les aléas présents à l'intérieur de ceux-ci. On peut alors retrouver A, B, ABC, AE, EF, ABCDEF... Pour info j'ai une dizaine d'aléas d'où l'impossibilité de le faire manuellement.

Pourquoi ma question alors ?

De mon côté, j'ai bien essayé d'utiliser l'outil "Union" avec les couches A, B , C, D...
J'ai ensuite uni A avec B avec au final 3 polygones (A, B, AB) car les 2 couches d'aléas se croisent à un seul endroit.
Sur la couche d'union résultante, j'ai concaténé les champs contenant les identifiants correspondant au nom de la couche afin d'avoir des entités nommées A, B ou AB.
Cette nouvelle couche créée, je l'ai unie à nouveau avec l'aléa C pour avoir une nouvelle colonne avec les combinaisons entre A, B et C.
Puis ensuite concaténation des identifiants puis union avec D, etc...

Elle compte bien les zones de croisement mais le problème de cette méthode est que la dernière couche couvre les autres et certains résultats de croisements d'aléas sont donc cachés et représentés non découpés. Je n'ai donc pas le nombre d'entités égal aux nombres de polygones démontrant les superpositions.

Comment puis-je parvenir à mes fins ? Il doit me manquer une ou des étapes (autre outil de géotraitement ? SQL ?) à moins que ça ne soit pas du tout bon cheminement.

Merci d'avance smile

Dernière modification par Romain0730 (Tue 30 May 2017 16:15)

Hors ligne

 

#2 Fri 02 June 2017 10:21

Elodie11
Participant actif
Lieu: IN'ESS Le Grand Narbonne
Date d'inscription: 15 Feb 2008
Messages: 54
Site web

Re: QGIS: Superposition couches d'aléas

Bonjour,

nous avons peut-être quelques éléments de réponse à vous apporter dans le cadre de la mise à jour de notre base de données occupation du sol.

Je tiens déjà à remercier Mathieu Bossaert, Responsable du système d'information du CEN LR, qui par son aide précieuse nous a permis d'obtenir les résultats attendus. Les éléments de réponse ci-dessous ont été rédigés par ma collègue Claire Séard, actuellement en formation.


L’objectif était à partir de deux couches d’occupation du sol de deux dates différentes de pouvoir représenter spatialement chaque changement d’occupation du sol en faisant les traitements sous Postgresql/PostGIS.

Les évolutions possibles entre les deux couches sont les suivantes :
- polygones de géométrie identique,
- fusion de polygones,
- découpage de polygones,
- remodelage complet des polygones.

Pour identifier spatialement chaque changement à la fois géométrique et attributaire, nous avons voulu découper les polygones des 2 couches l’une par rapport à l’autre pour obtenir autant de polygones qu’il y a de changements possibles.

Dans un premier temps, nous avons tenté de lier les deux couches d’occupation du sol avec des requêtes spatiales comme ST_intersects, ST_Overlaps en combinaison avec une modification des géométries avec les fonctions ST_Intersection et ST_Difference pour découper les polygones. Les résultats n’ont pas été concluants car la couche résultat possède différents types de géométrie : points, lignes, multi-lignes, polygones, multi-polygones et collection de géométrie, ce qui biaise ensuite les traitements sur cette couche. De plus, la couche résultat possède des zones vides sans polygones, notamment là où il y a des fusions de polygones.

Dans un second temps, pour éviter de découper les polygones entre eux, la réflexion s’est tournée sur la transformation des polygones en lignes. Cela permet d’obtenir la combinaison des limites des polygones de chacune des couches qui seront ensuite re-transformées en polygone.

La méthodologie, indiquée dans la requête ci-dessous, se décompose en plusieurs étapes de traitement :
- une première étape consiste donc à transformer les contours des polygones en polylignes avec la fonction ST_Boundary : 1ère sous-requête ci-dessous « polygones_ini » ;
- puis les lignes de l’association (UNION) de ces 2 couches sont unies avec la fonction ST_Union  pour éliminer les doublons : 2e sous-requête « limites » ;
- les polygones possibles sont ensuite crées à partir de ces lignes avec la fonction ST_Polygonize. Pour récupérer des polygones individuels, il faut combiner cette fonction avec ST_Dump : 3e  sous-requête « découpage ».

Code:

CREATE TABLE ocsol.evolution AS 
WITH polygones_ini as ( --- transformation des polygones en lignes
    SELECT st_boundary(the_geom) as geometrie
    FROM ocsol.ocsolannee1
    UNION
    SELECT st_boundary(the_geom) as geometrie
    FROM ocsol.ocsolannee2
)
, limites AS (--- union des lignes
    SELECT st_union(geometrie) as geometrie
    FROM polygones_ini 
)
, decoupage AS ( ---création des polygones
SELECT ((st_dump(ST_Polygonize(geometrie))).geom)::geometry(POLYGON,3943) AS geometrie 
---à rajouter pour verifier le type de géométrie : 
---,st_geometrytype((st_dump(ST_Polygonize(geometrie))).geom) as type_geom
FROM limites)

SELECT row_number() OVER() AS gid, geometrie
FROM decoupage;

Le résultat est une couche de polygones sans valeur attributaire avec un identifiant gid et une géométrie. Il est ensuite nécessaire d’attribuer à chacun de ces polygones les attributs des 2 couches d’occupation du sol pour évaluer les changements. Il faut rajouter des colonnes pour ces attributs et les mettre à jour en intersectant la couche obtenue avec les deux couches d’occupation du sol comparées. Étant donné la complexité des recoupements de géométries, une simple intersection des polygones entre eux ne suffit pas. La fonction ST_pointonsurface a donc été utilisée pour créer un point à l’intérieur de chaque polygone de notre couche résultat qui est ensuite intersecté avec chacune des 2 couches d’occupation du sol pour récupérer leurs attributs.


Code:

UPDATE ocsol.evolution SET (attribut1_annee1, attribut2_annee1) = (SELECT a. attribut1_annee1, a. attribut2_annee1 FROM ocsol.ocsolannee1 a WHERE ST_intersects(ST_pointonsurface(evolution.geometrie), a.the_geom));

UPDATE ocsol.evolution SET (attribut1_annee2, attribut2_annee2) = (SELECT a. attribut1_annee2, a. attribut2_annee2 FROM ocsol.ocsolannee2 a WHERE ST_intersects(ST_pointonsurface(evolution.geometrie), a.the_geom));

J'espère que ces éléments vous permettront d'apporter de l'eau à votre moulin,

Bonne journée.


Elodie SOLÉ
Responsable Direction Géomatique
Grand Narbonne Communauté d'Agglomération

Hors ligne

 

#3 Wed 07 June 2017 16:29

Romain0730
Participant occasionnel
Date d'inscription: 19 Mar 2013
Messages: 12

Re: QGIS: Superposition couches d'aléas

Merci beaucoup Elodie,

Je vais essayer d'utiliser cette manipulation tout en la transposant avec mes données.

De mon coté et l'espace d'un instant, j'ai cru m'en sortir avec l'outil "union" de la boite à outils saga (J'utilise le Qgis Nodebo) car celui-ci comprend un mode "split" qui permet de découper les "polygones de fusion" comme je voulais. Cela a fonctionné sur les fusions entre les 3-4 premières couches, mais des reliquats se sont ensuite rajoutés, sans vraiment savoir pourquoi.

Je reviendrai vers vous au cas où, mais l'idée de transformation des polygones en lignes a l'air de bien tenir la route. A moi de jouer même si le SQL n'est pas mon point fort...

Cordialement.

Hors ligne

 

Pied de page des forums

Powered by FluxBB