#1 Tue 17 September 2019 17:08
- zack
- Participant occasionnel
- Date d'inscription: 16 Jul 2014
- Messages: 33
Regroupement de polygones par voisinage
Salut,
Je poste ça ici parce que je pense qu'en postgis ça sera plus simple, mais peut-être que la solution existe directement sur QGIS ou autre...
J'ai des polygones, qui sont des parcelles, auxquels je veut agréger de plus petits polygones voisins (qui sont en réalités des "trous" entre les parcelles). J'ai construit ces petits polygones avec la fonction ST_StraightSkeleton.
J'ai essayé de récupérer les identifiants des polygones qui bordent le premier polygone et de calculer la longueur du segment commun, avec la fonction suivante, mais ça ne m'a pas sélectionné l'ensemble des polygones adjacents.
Code:
SELECT a.id AS gid_a, b.gid AS gid_b, ST_Length(ST_CollectionExtract(ST_Intersection(a.geom, b.geom), 2)) FROM polygones1 a, polygones2 b WHERE a.id < b.gid AND ST_Touches(a.geom, b.geom) order by gid_a;
En essayant simplement avec une sélection par localisation dans QGIS, pareil, je n'obtient pas l'ensemble des polygones (cf capture). Par contre, avec ArcGIS Pro, et l'option "share a line segment with" je dois admettre que ça donne un résultat parfait, sans les polygones en pointe (croix rouges)... mais je ne peux pas l'utiliser dans mon modèle qui est en pyqgis avec quelques fonctions en postgis.
Est-ce que quelqu'un a une solution? Qu'est-ce qui explique ces différences d'appréciation entre logiciels, alors qu'à l'origine c'est un même polygone découpé, et que la fonction "touche" de QGIS devrait marcher...
Hors ligne
#2 Tue 17 September 2019 18:05
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Regroupement de polygones par voisinage
Salut,
1)
St_Touches ne correspond peut être pas à ce que vous désirez,
puisque ce prédicat est valide même si un seul point est partagé
par les limites des deux arguments (ce qui a l'air d'être le cas
pour les 2 polygone jaunes tout en bas à droite et en haut à gauche
de votre exemple).
Pour n'obtenir que les polygones qui partagent exclusivement une ligne,
vous pouvez utiliser st_relate avec la matrice suivante (à vérifier):
FF*F1****
https://postgis.net/docs/ST_Relate.html
https://postgis.net/docs/using_postgis_ … tml#DE-9IM
2)
Il est possible que votre traitement ait légèrement modifié
les coordonnées de certains points, puisque celles ci sont exprimées
en nombres à virgule flottante, et que les calculs peuvent mener à une imprécision.
Postgis ne permet pas (encore) d'appliquer une tolérance aux prédicats spatiaux,
ce qu'ArcGis fait peut être.
Vous pouvez peut être essayer de vous en sortir en appliquant une grille,
ou de matcher les polygones qui ont une limite commune ou une surface.
Dernière modification par tumasgiu (Tue 17 September 2019 18:17)
Hors ligne
#3 Wed 18 September 2019 17:19
- zack
- Participant occasionnel
- Date d'inscription: 16 Jul 2014
- Messages: 33
Re: Regroupement de polygones par voisinage
Merci pour votre réponse. Malgré tous mes essais je n'ai pas réussi à sélectionner les polygones qui conviennent avec ST_Relate.
Je pense que j'ai des micro trous qui se sont créés entre certains de mes polygones qui fait qu'ils ne s'intersectent pas.
J'ai trouvé sur ce post https://gis.stackexchange.com/questions … -tolerance comment créer une fonction pour changer la tolérance du st_intersects. Cela m'oblige au préalable à passer mes types de champs de geométry à geography :
La fonction :
Code:
CREATE OR REPLACE FUNCTION ST_Intersects(geography, geography,float8) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_Distance($1, $2, 0.0, false) < $3' LANGUAGE 'sql' IMMUTABLE ;
La transformation en geography de mes couches :
Code:
create table poly1geog as SELECT id, geography(ST_Transform(geom, 4326)) FROM polygones1 create table poly2geog as SELECT gid, geography(ST_Transform(geom, 4326)) FROM polygones2
Et le st_interect avec une tolérance de 0.001 :
Code:
SELECT a.id AS gid_a, b.gid AS gid_b FROM poly1geog a, poly2geog b WHERE ST_Intersects(a.geography, b.geography, 0.001) order by gid_a, gid_b;
En résultat, j'obtiens bien tous les polygones qui sont autour de ma cible (pj), mais également ceux qui sont en pointe (croix rouges). Me reste plus qu'à voir pour les supprimer.
Hors ligne
#4 Thu 19 September 2019 08:43
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: Regroupement de polygones par voisinage
bonjour,
Est-ce que ce post (un peu vieux mais je pense d'actualité) peut t'aider :
https://georezo.net/forum/viewtopic.php?id=88912
Il me semble qu'à l'époque la réponse de N. RIBOT m'avait bien aidé.
Pascal PLUVINET
Hors ligne