#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
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@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@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@agriculture.gouv.fr
Hors ligne

