#1 Thu 28 February 2013 17:27
- simo lay
- Participant assidu
- Date d'inscription: 8 Dec 2011
- Messages: 172
[PostGIS] : Fusionner les parcelles qui se touchent
Bonjour,
j'ai une table des parcelles sous postgis, mon objectif est de fusionner uniquement les parcelles qui se touchent j'utilise la fonction st_union lorsque les parcelles se touchent (st_touches) le problème c'est que quand j'ai uniquement 2 parcelles qui se touchent je les fusionne et j’obtiens un seul objet sans problème (c'est bon) mais dans le cas où j'ai 3 parcelle (ou plus) qui se touchent la fusion se fait par deux objets (parcelles) et du coup j’obtiens 2 objets au lieu d'avoir un seul.
avec une boucle je pense que c'est possible mais j'ai besoin de quelques pistes
sur l'image jointe le problème est plus claire
merci
Dernière modification par simo lay (Fri 01 March 2013 09:14)
Hors ligne
#2 Fri 01 March 2013 20:16
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3195
- Site web
Re: [PostGIS] : Fusionner les parcelles qui se touchent
bonjour,
a priori je vois pas trop, pour ma part j'ai solutionné ce problème en passant par la topologie sous postgis 2.0
avec un :
topology.TopoGeo_AddPolygon
pour transformer vos polygone en face, arc, nœud et récupérer la géométrie comme étant la composée des trois faces c'est trivial.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Sat 02 March 2013 00:51
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Bonsoir,
peut être que ça répondra à ta problématique :
Tu peux utiliser la fonction st_Union en prenant un tableau de géométries comme argument.
Cette fonction va te renvoyer un polygone avec un ring pour chaque groupe de parcelle contigües.
Ensuite grâce a St_Dump, tu vas extraire un à un chaque ring de ton polygone.
Code:
SELECT geom into "testUnion" FROM (SELECT (St_dump (St_Union (ARRAY( SELECT geom FROM data) ) ) ).geom AS geom ) AS t ;
Dernière modification par tumasgiu (Sat 02 March 2013 00:52)
Hors ligne
#4 Mon 04 March 2013 09:07
- simo lay
- Participant assidu
- Date d'inscription: 8 Dec 2011
- Messages: 172
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Bonjour,
merci à vous ChristopheV et tumasgiu j'ai testé la solution de tumasgiu et ça répond exactement à ce que je voulais faire.
merci beaucoup
Hors ligne
#5 Sat 10 October 2020 11:58
- Jkerebel04
- Participant occasionnel
- Lieu: Oraison
- Date d'inscription: 21 Apr 2020
- Messages: 26
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Bonjour
Je reviens vers vous pour une question complémentaire concernant ce sujet. Je souhaiterai ajouter une ou plusieurs conditions indexées sur des colonnes de la table "data". Est-il possible d'ajouter une commande GROUP BY. l'essai ci-dessous le fonctionne pas.
Pourriez-vous m'indiquer des pistes SVP ?
CREATE TABLE test_union AS SELECT geom
FROM
(SELECT (St_dump
(St_Union
( ARRAY( SELECT geom FROM data )
)
)
).geom AS geom
GROUP BY data.num
) AS t ;
« Patience et longueur de temps font plus que force et ni que rage » - Jean de La Fontaine, Le Lion et le Rat.
Hors ligne
#6 Mon 12 October 2020 09:35
- JP LLORENS
- Participant assidu
- Date d'inscription: 12 Nov 2008
- Messages: 231
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Bonjour
Votre requêt peut être simplifiée
Code:
SELECT (St_dump(St_Union(geom)).geom AS geom from FROM data GROUP BY data.num
Cordialement
JP
Hors ligne
#7 Mon 12 October 2020 19:21
- Jkerebel04
- Participant occasionnel
- Lieu: Oraison
- Date d'inscription: 21 Apr 2020
- Messages: 26
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Effectivement ! Cela fonctionne bien mieux. merci.
Est_il possible dans la même requête d'ajouter une condition st_intersect ?
Pour l'instant je réalise la requête en deux temps :
d'abord je met a jour une colonne de la table bâtiment'tab_bat' qui recupère id de la table parcelle 'tab_par' accueillant le batiment
UPDATE tab_bat SET id_par_asso = tab_par.id
FROM tab_par
-- lorsque le centroide sur la surface intersecte la geométrie de tab_bat.
WHERE st_intersects(ST_PointOnSurface(tab_bat.geom),tab_par.geom);
Ensuite je crée la table en unissant tout les batiment qui se touche issus de la même parcelle.
DROP TABLE IF EXISTS tab_union CASCADE;
-- creer la table tab_union avec la géomètrie issue de toutes les partie jointe
CREATE TABLE tab_union AS SELECT
-- Créé la géomètrie unique à partie des différents polygone
(st_dump(st_union(geom))).geom as singlegeom,
id_par_asso
FROM tab_bat
GROUP BY id_par_asso;
A+
« Patience et longueur de temps font plus que force et ni que rage » - Jean de La Fontaine, Le Lion et le Rat.
Hors ligne
#8 Tue 13 October 2020 21:34
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Bonsoir,
quelque chose dans le genre :
Code:
CREATE TABLE tab_union AS SELECT -- Créé la géomètrie unique à partie des différents polygone (st_dump(st_union(a.geom))).geom as singlegeom, b.id FROM tab_bat a LEFT JOIN tab_par b ON st_intersects(ST_PointOnSurface(a.geom),b.geom); GROUP BY b.id
Hors ligne
#9 Sat 17 October 2020 08:07
- Jkerebel04
- Participant occasionnel
- Lieu: Oraison
- Date d'inscription: 21 Apr 2020
- Messages: 26
Re: [PostGIS] : Fusionner les parcelles qui se touchent
Exactement. Et redoutable d'efficacité.
Merci.
Jérome
« Patience et longueur de temps font plus que force et ni que rage » - Jean de La Fontaine, Le Lion et le Rat.
Hors ligne