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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 12 September 2007 17:45

J. Caba
Juste Inscrit !
Lieu: Auzeville-Tolosan
Date d'inscription: 11 Sep 2006
Messages: 6

Requête spatiale entre polygones

Bonjour,

J'ai dans une BD postgis :
- Une table des zonages supracommunaux composés de n communes dont les géométries sont réunies par un GeomUnion.
- Une table des communes, celles ci bougent géométriquement (fusion, séparation...) dans le temps

- Je souhaite retrouver les zonages pour les communes dont la géométrie a changé, ça, à priori, c'est pas trop dur. Par contre, j'ai pas mal de communes donc je ne veux pas refaire les GéomUnion des toutes les
communes. Je voudrais ne rajouter que les communes ayant changé et étant situées à la limite du zonage (je me moque de celles qui sont strictement à l'intérieur sans lien avec la limite).

Pour vérifier cette relation spatiale, j'ai testé les opérateurs listés dans la doc pgis et je n'arrive pas à trouver mon bonheur
- Crosses est toujours vrai que ce soit pour les polygones avec limite commune ou les autres ;
- Touches est utilisé pour connaitre les polygones de frontière commune mais ne s'intersectant pas

Quelqu'un a t'il une idée pour ne sélectionner que des polygones strictement à l'intérieur d'un autre mais étant aussi strictement situés en limite de ce dernier ? Peut être ai je mal lu la doc ?

Merci beaucoup

--
Jérôme

Hors ligne

 

#2 Wed 12 September 2007 21:52

JonathanB
Participant occasionnel
Date d'inscription: 3 Jul 2007
Messages: 10
Site web

Re: Requête spatiale entre polygones

Bonjour,

En utilisant d'abord l'opérateur Within, on obtient les polygones strictement à l'intérieur.

Par la suite, sur la même sélection, Touches permet d'obenir ceux situés en limite.

Jonathan

Hors ligne

 

#3 Wed 12 September 2007 23:46

Guillaume Sueur
Participant assidu
Lieu: Toulouse
Date d'inscription: 23 Sep 2005
Messages: 331
Site web

Re: Requête spatiale entre polygones

Bonjour,

Si vous utilisez les opérateurs (&& etc), ce sont les bounding boxes qui sont comparées.
Pour comparer les géométries elles-mêmes il faut utiliser les fonctions topologiques. Mais c'est ce que vous semblez faire puisque vois citez Touches et Crosses. Ce n'est donc peut-être qu'un problème de vocabulaire
Pour trouver vos polygones, essayez peut-être un WHERE DISTANCE(a.the_geom, b.the_geom) = 0. Je sais que ça marche pour des polygones non superposés, peut-être que ça marche aussi dans votre cas
puisque la fonction distance travaille avec le contour.
Cependant, je vous conseillerais plutôt une autre approche. Une procédure stockée associée à un trigger pourrait faire le calcul lors d'un UDPATE de la table commune. Toute modification entrainerait la mise
à jour, même celles sans effet sur le regroupement, mais vous auriez au moins la certitude de travailler sur un jeu de données valide.

Cordialement,

--
Guillaume SUEUR

Hors ligne

 

#4 Thu 13 September 2007 13:08

J. Caba
Juste Inscrit !
Lieu: Auzeville-Tolosan
Date d'inscription: 11 Sep 2006
Messages: 6

Re: Requête spatiale entre polygones

Merci à Guillaume et à Jonathan pour leur réponses.
J'ai réussi à faire ce que je voulais avec la fonction ST_RELATE

> Message posté par : Guillaume Sueur (guillaume.sueur@texte-a-enlever.neogeo-online.net)
> Cependant, je vous conseillerais plutôt une autre approche. Une procédure stockée associée à un trigger pourrait faire le calcul lors d'un UDPATE de la table commune. Toute modification entrainerait la mise  à jour, même celles sans effet sur le regroupement, mais vous auriez au moins la certitude de travailler sur un jeu de données valide.
>   
C'est vrai mais là c'est une mise à jour de pas mal de zonages donc la mise à jour des communes aurait été pénalisée si j'avais du reconstruire pour chacune d'elle tous les zonages sur la base d'un trigger.

> Message posté par : Jonathan Boudreau (jonathan.boudreau@texte-a-enlever.fadq.qc.ca)
> En utilisant d'abord l'opérateur Within, on obtient les polygones strictement à l'intérieur.
> Par la suite, sur la même sélection, Touches permet d'obenir ceux situés en limite.
L'opérateur Touches ne permet de connaître que ceux qui touchent (!) mais qui sont à l'exterieur (adjacent).

La solution trouvé (on s'y est mis à 2 quand même :-) ) est de passer par la fonction ST_Relate. Cela donne pour la clause where de la requête
: [...]
ST_Relate(communes.the_geom_dgi,zones.the_geom_zone_supracommunale,'T***T****')
Le plus dur est de trouver la bonne configuration pour  les critères de
relations spatiales, ici le 1er true pour "Interieur de communes à
l'intérieur de zone" et le 2nd pour "Boundary de commune correspond à
boundary de zone".

Au passage, je l'ai converti en fonction. C'est vraiment une fonction toute bête mais au moins je n'aurais pas à me (re?)creuser le tête la prochaine fois. La voici :
CREATE OR REPLACE FUNCTION
bdnt_zonage_source."DIG_WITHINTOUCHES"(geometry, geometry)
  RETURNS boolean AS
$BODY$
begin
        Return ST_RELATE($1,$2,'T***T****') ;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Merci à tous

--
Jérôme Caba
CERIT
Département Information Géographique
BP 12668
31326 CASTANET TOLOSAN Cedex
téléphone : 05.61.28.94.00
fax     : 05.61.28.92.82
mail : jerome.caba@texte-a-enlever.agriculture.gouv.fr

Hors ligne

 

Pied de page des forums

Powered by FluxBB