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 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...


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#2 Tue 17 September 2019 18:05

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

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.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#4 Thu 19 September 2019 08:43

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

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

 

Pied de page des forums

Powered by FluxBB