#1 Tue 09 July 2019 09:34
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
BdD Majic 3 - Regroupement de bati
Bonjour,
Nous travaillons sur une couche Bati d'un cadastre.
Nous souhaitons fusionner les bâtiments accolés qui ont le même nom de propriétaire mais aussi en fonction d'autres critères. Voici les critères :
1. Le nom du propriétaire est identique,
2. Distance entre les deux bâtiments = 0 (ou bâtiments accolés).
Attention, il s'agit d'une double condition.
Nous avons essayé plusieurs solutions :
1. L'outil regroupé de Qgis (mais cela ne marche pas),
2. Postgis avec des requêtes sql (st_union, within, group_by).
Nous sommes arrivés à groupé un lot de bâtiments accolés mais nous n'avons pas réussi à grouper en fonction du critère nom du propriétaire.
Et inversement, nous avons réussi à grouper les bâtiments appartenant au même propriétaire mais sans prendre en compte la considération qu'ils devaient être accolés.
Merci de votre retour.
Hors ligne
#2 Tue 09 July 2019 11:11
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: BdD Majic 3 - Regroupement de bati
Salut,
la fonction st_clusterwithin devrait répondre
à votre problème.
Code:
SELECT proprietaire, st_union(unnest(st_clusterwithin(the_geom, 0))) FROM bati GROUP BY proprietaire
Hors ligne
#3 Tue 09 July 2019 11:40
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
Re: BdD Majic 3 - Regroupement de bati
Merci pour ce premier retour très rapide.
Voici le message d'erreur que je reçoit en retour
ERREUR: les appels à la fonction d'agrégat ne peuvent pas contenir des appels à des
fonction SETOF
LINE 3: st_union(unnest(st_clusterwithin(b.geom, 0)))
^
Je comprends pas pourquoi.
Hors ligne
#4 Tue 09 July 2019 12:08
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: BdD Majic 3 - Regroupement de bati
Oups, comme à l'habitude, tapé trop vite.
On peut pas imbriquer des fonctions qui renvoient
des setof dans des fonctions d'agrégats.
De plus, même si c'était possible la requête aurait été fausse,
puisqu'elle aurait renvoyé une seule geom par propriétaire.
Et puis, on ne peut apparemment pas utiliser la valeur 0 avec st_clusterwithin,
mais vous pouvez peut être essayer avec st_clusterintersecting.
Cette requête devrait renvoyer un multipolygone par groupe
de bâti contiguë avec le même propriétaire.
Code:
SELECT proprietaire, st_collectionhomogenize(unnest(st_clusterintersecting(the_geom))) g FROM bati GROUP BY proprietaire
Dernière modification par tumasgiu (Tue 09 July 2019 14:07)
Hors ligne
#5 Tue 09 July 2019 16:54
- Julien Gondellon
- Participant actif
- Date d'inscription: 17 Apr 2014
- Messages: 67
Re: BdD Majic 3 - Regroupement de bati
Nous avons essayé cette manipulation.
Ça ne marche pas trop et d'ailleurs, nous ne comprenons pas comme se fait cette analyse.
Il groupe bien des logements ensemble cette union semble se faire de manière aléatoire.
Du coup voila ce que fait la requête :
Elle agglomère bien des bâtiments accolés. Mais ces derniers n'ont pas forcément le même nom de propriétaire. Alors que sur d'autres secteurs cela marche.
On coince.
En pièce jointe quelques exemples : on avons sélectionnée un bâtiment et résultats, ce tous les bloques des bâtiments accolés qui sont sélectionner avec des noms des propriétaires différents.
Merci.
Hors ligne
#6 Tue 09 July 2019 16:58
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: BdD Majic 3 - Regroupement de bati
Bonjour,
ne serait-ce pas plus simple de faire :
Code:
SELECT proprietaire, (st_dump(st_union(geom))).geom as geom FROM bati GROUP BY proprietaire
Bon courage,
Dernière modification par ppluvinet (Tue 09 July 2019 17:11)
Pascal PLUVINET
Hors ligne
#7 Tue 09 July 2019 17:15
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: BdD Majic 3 - Regroupement de bati
Bonjour,
ne serait-ce pas plus simple de faire :
Code:
SELECT
proprietaire,
(st_dump(st_union(geom)).geom as geom
FROM bati
GROUP BY proprietaire
Bon courage,
Très bien vu Pascal, c'est plus simple, plus portable,
et certainement plus rapide.
On perd juste les limites des polygones.
Sinon pour expliquer la requête avec cluster :
st_clusterintersecting ->
renvoie un tableau de geometry collection.
C'est une fonction d'agrégat qui fonctionne avec la clause
GROUP BY proprietaire.
Ca renverra donc pour chaque propriétaire un tableau
de geometries, chaque élément du tableau étant un ensemble
de bâti qui se "touchent".
unnest->
c'est une fonction qui transforme un tableau en ensemble de lignes.
st_collectionhomogenize->
essaie de trouver la représentation la plus simple d'une geometry.
Exemple :
GEOMETRYCOLLECTION(POINT (1 1), POINT (2 2), MULTIPOINT((3 3)))
-> MULTIPOINT((1 1), (2 2), (3 3))
Dernière modification par tumasgiu (Tue 09 July 2019 17:16)
Hors ligne
#8 Tue 09 July 2019 17:35
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: BdD Majic 3 - Regroupement de bati
Si vous voulez bien poster votre requête,
nous pourrions mieux vous aider.
Hors ligne
#9 Thu 11 July 2019 09:42
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: BdD Majic 3 - Regroupement de bati
Bonjour,
Regrouper par propriétaire est un non sens.
La seule possibilité est de regrouper par compte communal. La relation entre un immeuble (parcelle) et une personne est de type n à n.
Une parcelle a un à n "propriétaire" (titulaire de droit réel en fait)
Une personne exerce des droits sur une à n parcelles
Cela se traduit dans le compte communal.
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne