#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: 3235
- 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: 1226
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: 27
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: 27
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
- Membre
- 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.idHors ligne
#9 Sat 17 October 2020 08:07
- Jkerebel04
- Participant occasionnel
- Lieu: Oraison
- Date d'inscription: 21 Apr 2020
- Messages: 27
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

