#1 Mon 09 January 2012 20:43
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
POSTGIS : snapping d'une table à une autre
Bonjour,
Sur Postgis, j'ai une table qui représente des zones d'enquêtes ZENQ qui se superpose à des communes COM.
J'aimerai que, lorsque le contour des ZENQ est à moins de 20mètres des COM, les ZENQ puissent suivre le contour des COM.
Autrement dit, est-ce possible de "snapper" des zones d'enquêtes aux communes?
Merci d'avance pour vos suggestions...
Pascal PLUVINET
Hors ligne
#2 Tue 10 January 2012 08:30
Re: POSTGIS : snapping d'une table à une autre
Bonjour
Est ce que les zones d'enquêtes doivent être sur toute une commune pour autoriser le snapping? Si c'est le cas, je ferai un trigger sur update, qui appelle une fonction faisant un buffer de 20m, et si ce buffer contient entièrement un objet de commune, alors tu découpes le buffer à la géométrie du polygone qu'il englobe.
Bon courage
Dernière modification par cyril_c (Tue 10 January 2012 08:31)
Hors ligne
#3 Tue 10 January 2012 09:28
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Bonjour,
et merci pour ce début de piste
Est ce que les zones d'enquêtes doivent être sur toute une commune pour autoriser le snapping?
non, les zones d'enquêtes peuvent englober plusieurs communes, être à cheval sur deux communes, ou encore, être plus petites qu'une commune.
Autre précision : les zones sont toutes accrochées entre elles et ne se chevauchent pas.
Merci d'avance pour vos autres propositions
Dernière modification par ppluvinet (Tue 10 January 2012 09:28)
Pascal PLUVINET
Hors ligne
#4 Tue 10 January 2012 09:49
Re: POSTGIS : snapping d'une table à une autre
Les zones d'enquêtes sont saisies de quelle manière? (une par une avec un logiciel SIG, tu reçois un fichier extérieur etc..) Et quelle est la finalité de vouloir coller les limites des ces zones?
Hors ligne
#5 Tue 10 January 2012 09:56
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Ces zones ont du être digitalisées il y a quelques années et devaient en partie suivre les contours communaux.
Je suis en train de nettoyer ces zones. Ces zones serviront à la fois pour faire de l'analyse spatiale, pour de la consultation, pour de la cartographie.
Si je n'arrive pas à faire ce "snapping" ce n'est pas trop grave, mais j'aurais trouvé très intéressant d'arriver à le faire avec les fonctions spatiales de POSTGIS.
Pascal PLUVINET
Hors ligne
#6 Tue 10 January 2012 10:25
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Bonjour,
Sur Postgis, j'ai une table qui représente des zones d'enquêtes ZENQ qui se superpose à des communes COM.
J'aimerai que, lorsque le contour des ZENQ est à moins de 20mètres des COM, les ZENQ puissent suivre le contour des COM.
Autrement dit, est-ce possible de "snapper" des zones d'enquêtes aux communes?
Merci d'avance pour vos suggestions...
Bonjour Pascal,
Pourrais-tu preciser un peu le type de snapping que tu souhaites ? faut-il que zenq et com soient confondues si la distance entre les deux est < a 20m ?
En gros, faudrait-il recreer des objets zenq a partir des contours des COM ?
Nicolas
Hors ligne
#7 Tue 10 January 2012 10:33
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Il faut effectivement recréer des objet ZENQ pour que les vertex des ZENQ qui sont à moins de 20m des COM s'accrochent aux limites des COM.
Dernière modification par ppluvinet (Tue 10 January 2012 10:33)
Pascal PLUVINET
Hors ligne
#8 Tue 10 January 2012 10:46
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Il faut effectivement recréer des objet ZENQ pour que les vertex des ZENQ qui sont à moins de 20m des COM s'accrochent aux limites des COM.
Alors oui, Postgis est capable de faire ca
(encore une question... (la rentree n'a pas encore eu lieu dans mon cerveau...): il faut que les zenq a moins de 20m soient snappées, ou les vertex a moins de 20m le soient ?)
ca doit necessiter un enchainement de requetes, mais je verrais un truc comme ca:
• Passer peut etre de polygones a lignes, pour manipuler les objets avec les outils de referencement lineaire
• Identifier les vertex a snapper
• snapper (st_line_interpolate_point)
• reconstruire les surfaces par attribut.
(hmm interessant comme pb )
Nicolas
Hors ligne
#9 Tue 10 January 2012 10:50
Re: POSTGIS : snapping d'une table à une autre
Est ce que tu as beaucoup de zones? Quelques fois c'est plus rapide de la faire à la main.
Sinon, je ne sais pas si c'est possible, mais il faudrait faire une boucle pour chaque point d'un polygone, faire un buffer de 20m, et s'il coupe une ligne, il faut changer le X et le Y de ce sommet.
Je viens de voir la réponse de Nicolas. Ca a l'air pas mal, mais je ne connais pas cette fonction!
Hors ligne
#10 Tue 10 January 2012 11:46
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
il faut que les zenq a moins de 20m soient snappées, ou les vertex a moins de 20m le soient ?)
Le mieux serait que ce soient les contours qui soient snappés sinon essayer de voir ce que ca donne avec les vertex.
Je pense que la solution de Nicolas est intéressante (l'exercice en lui même est intéressant ! ). Cela dit auriez vous quelques pistes même rapide en terme de code ?
Est ce que tu as beaucoup de zones?
Il y a environ 500 ZENQ et 1000 COM.
Dernière modification par ppluvinet (Tue 10 January 2012 11:46)
Pascal PLUVINET
Hors ligne
#11 Tue 10 January 2012 12:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Alors voila qqch qui pourrait le faire:
(je balance le script avant d'aller manger, explications apres )
Code:
-- extraction des contours et des sommets des polygones des zenq -- pour travailler en vertex (linear referencing) -- a adapter en cas de multiPG et/ou pg a trous drop table if exists zenq_points; create table zenq_points as select gid, (st_dumpPoints(st_exteriorRing(geometry))).path[1] as pt_order, (st_dumpPoints(st_exteriorRing(geometry))).geom as geom from zenq; -- extraction des linestring des communes (linear referencing) drop table com; create table com as select c.gid, nom, st_exteriorRing(st_geometryN(the_geom, 1)) as geom from communes c, zenq z where st_intersects(c.the_geom, z.geometry) ; -- projection des points des zenq sur les contours de communes, si les points sont a moins de -- 20 m des contours des communes. -- et mise a jour directe de la table des zenq_points avec les nouveaux sommets. --update zenq_points z set geom = q.geom from drop table snapped_vert ; create table snapped_vert as ( SELECT DISTINCT ON (pt_gid, pt_order) pt_gid, pt_order, com_gid, ST_line_locate_point(ln_geom, pt_geom) as locus, ST_line_interpolate_point(ln_geom, ST_line_locate_point(ln_geom, pt_geom) ) as geom FROM ( SELECT ln.geom AS ln_geom, pt.geom AS pt_geom, ln.gid AS com_gid, pt.gid AS pt_gid, pt.pt_order as pt_order, ST_Distance(ln.geom, pt.geom) AS d FROM zenq_points pt, com ln WHERE ST_DWithin(pt.geom, ln.geom, 20.0) ORDER BY pt.gid,d ) AS subquery ) as q where z.gid = q.pt_gid and z.pt_order = q.pt_order; -- reconstruction des zones a partir des points. drop table snapped_zenq; create table snapped_zenq as ( select gid, st_makePolygon(st_makeline(geom)) from ( select gid, pt_order, geom from zenq_points order by pt_order ) as q group by gid );
Le principe etant:
• d'exploser les zenq en leurs sommets (en gardant l'ordre des points)
• d'exploser les communes en leurs contours
• de snapper les points des zenq sur les contours si ceux-ci sont a moins de 20m
• de reconstruire les zenq: pts ->lines, puis lines -> pg
Les captures:
2.png: un extrait de communes avec un buffer de 200m autour (plutot que 20, pour des raisons de lisibilité) en noir
les zenq dessinées de mes blanches mimines: le but etant de "simuler" une numerisation non precise, dont les contours oscillent dans le buffer de 200m).
En rouge, les sommets des zenq.
En cercles violets, les sommets projetes sur les contours des communes (sommets contenus dans le buffer);
3.png: zenq reconstruite en prenant les nouveaux points snappés.
Pascal, c'est un truc comme ca que tu voulais, ou plus sioux, a savoir extraire les contours des communes et les injecter dans les zenq, pour les zenq a moins de 20m ?
Nicolas
Dernière modification par Nicolas Ribot (Tue 10 January 2012 14:34)
Hors ligne
#13 Tue 10 January 2012 14:42
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Chapeau bas pour la rapidité!
Hors ligne
#14 Tue 10 January 2012 14:49
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Bonjour,
Sur Postgis, j'ai une table qui représente des zones d'enquêtes ZENQ qui se superpose à des communes COM.
J'aimerai que, lorsque le contour des ZENQ est à moins de 20mètres des COM, les ZENQ puissent suivre le contour des COM.
Autrement dit, est-ce possible de "snapper" des zones d'enquêtes aux communes?
Merci d'avance pour vos suggestions...
Je crois que pour faire vraiment ce que tu veux, il faut aller un peu plus loin dans la methode que j'ai essayée:
celle-ci, en effet, conserve les sommets des zenq et ne reprend pas les sommets des contours des communes. Il y a donc des cas ou malgre le snapping des sommets, les zenq et les communes ne sont pas confondues, dans la limite des 20m.
Il faudrait alors snapper les points des zenq sur les sommets des communes (et pas juste snapper sur les arcs des communes).
Ceci est realisable en extrayant les sommets des communes et en choisissant, pour chaque sommet zenq a moins de 20m des communes, le sommet de la commune le plus proche.
Nico
Hors ligne
#15 Tue 10 January 2012 15:10
Re: POSTGIS : snapping d'une table à une autre
ou mais si tu fais le snapping par sommet, il faut s'assurer qu'entre 2 points de la zone qui accrochent 2 sommets continues d'une commune, qu'il n'y ai pas d'autres points (peut être supprimer les sommets en trop). Par exemple, si tu a 3 points sur une ligne de 100m de zenq et 2 points pour com, les 2 origines qui seront à moins de 20m seront confondus, mais quid de celui du milieu, qu'il faudrait supprimer.
Sinon, Nicolas, pourrais-tu m'expliquer la notion de vertex?
Hors ligne
#16 Tue 10 January 2012 15:31
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
ou mais si tu fais le snapping par sommet, il faut s'assurer qu'entre 2 points de la zone qui accrochent 2 sommets continues d'une commune, qu'il n'y ai pas d'autres points (peut être supprimer les sommets en trop). Par exemple, si tu a 3 points sur une ligne de 100m de zenq et 2 points pour com, les 2 origines qui seront à moins de 20m seront confondus, mais quid de celui du milieu, qu'il faudrait supprimer.
Sinon, Nicolas, pourrais-tu m'expliquer la notion de vertex?
Oui exact.
J'utilise parfois le terme anglais "vertex" a la place de "sommet", c'est a dire un point d'un graphe. bouh j'ai honte
Un blog de Paul Ramsey décrivait, il y a quelques temps, comment faire du snapping avec Postgis (s'etonnant lui-meme que postgis soit en fait capable de faire du snapping):
Les fonctions de referencement lineaires permettent de determiner la projection d'un point (x,y) sur une ligne, que ce point tombe sur la ligne ou non, la projection se faisant alors sur un prolongement de la ligne.
En combinaison avec un classement par distance la plus proche, ca permet "snapper" des points sur des lignes. Particulierement utile pour nettoyer des graphes, ou pour caler des points GPS sur un reseau routier, par exemple.
Nicolas
Hors ligne
#17 Tue 10 January 2012 16:29
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Merci Merci pour tout. Je pense qu'on est sur la bonne voie.
Je ne pourrais malheureusement pas le tester avant Jeudi (et oui j'ai deux mi-temps ! c'est la crise ! ). Je me hâte de tester ceci.
Encore mille fois merci et je pense que, si ca marche, ca va servir dans d'autres projets.
Je vous tiens au courant.
Pascal PLUVINET
Hors ligne
#18 Thu 12 January 2012 07:22
- freesnowpetrel
- Participant assidu
- Lieu: Pretoria, Afrique du Sud
- Date d'inscription: 1 Mar 2007
- Messages: 222
Re: POSTGIS : snapping d'une table à une autre
Bonjour,
Tres interessant cette manip !
En fait le mieux serait je pense de :
- creer un buffer de 20m autour des contours des communes
- faire un "aggregate" ST_Multi(ST_Union(geom)) sur ce buffer afin de supprimer tous les arcs qui se croisent a l'interieur du buffer
- recuperer les points d'intersection entre le contour de ce buffer et le contour des zenq
- recuperer les points d'intersection entre le contour des communes et le contour des zenq (pour le cas ou une zenq recouvre plusieurs communes)
- ajouter ces points comme sommets supplementaires aux contours des zenq (split polyline)
- creer un buffer de 20m autour du contour des zenq
- recuperer les sommets des communes contenu dans ce buffer
- ajouter ces points comme sommets supplementaires aux contours des zenq (split polyline), ceci afin d'ajouter les sommets des communes au zenq.
- finalement realiser le snapping, les etapes prealables ayant pour but en ajoutant des sommets de s'assurer que les contours des zenq situes a moins de 20m de ceux des communes suivent parfaitement ceux des communes.
La methode tiens aussi compte (je crois) du cas ou une zenq recouvre plusieurs communes, a tester.
A+
Rodolphe
Dernière modification par freesnowpetrel (Thu 12 January 2012 07:26)
Hors ligne
#19 Thu 12 January 2012 17:17
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Je suis en train de tester la solution proposée par Nicolas Ribot.
Je règle quelques problèmes topologiques et de mémoire puis je reviendrais vers vous.
A bientôt,
Pascal
Pascal PLUVINET
Hors ligne
#20 Mon 16 January 2012 11:36
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: POSTGIS : snapping d'une table à une autre
Et bien , j'ai bien testé la méthode proposée par Nicolat Ribot (inspirée de celle proposée par P. Ramsey http://blog.cleverelephant.ca/2008/04/s … stgis.html.
Ca marche très bien pour plus de 80% des cas! Mais le résultat est carrément inacceptable dès que les géométries sont complexes. J'abandonne pour l'instant car je manque de temps pour cela.
Toutefois, je vois quelques pistes améliorables :
- faire en sorte de prendre en compte les points de ZENQ qui ne sont pas à 20 m de COM mais qui sont encadrés par des points qui eux sont à moins de 20 m de COM.
- faire en sorte que l'ordre des sommets de ZENQ suivent également l'ordre des sommets de COM.
Si un jour j'ai du temps je tenterai également la solution de Rodolphe.
A très bientôt,
Dernière modification par ppluvinet (Mon 16 January 2012 15:33)
Pascal PLUVINET
Hors ligne
#21 Mon 16 January 2012 13:48
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS : snapping d'une table à une autre
Et bien , j'ai bien testé la méthode proposée par Nicolat Ribaot (inspirée de celle prposée par P. Ramsey http://blog.cleverelephant.ca/2008/04/s … stgis.html.
Ca marche très bien pour plus de 80% des cas! Mais le résultat est carrément inacceptable dès que les géométries sont complexes. J'abandonne pour l'instant car je manque de temps pour cela.
Toutefois, je vois quelques pistes améliorables :
- faire en sorte de prendre en compte les points de ZENQ qui ne sont pas à 20 m de COM mais qui sont encadrés par des points qui eux sont à moins de 20 m de COM.
- faire en sorte que l'ordre des sommets de ZENQ suivent également l'ordre des sommets de COM.
Si un jour j'ai du temps je tenterai également la solution de Rodolphe.
A très bientôt,
Bonjour Pascal,
Oui effectivement, en fonction des données et de leur topologie, il faut adapter.
Et notamment, comme l'indiquait Rodolphe, si les contours des zenq ne suivent pas bien les communes, on peut se retrouver avec des polygones aberrants.
Si vous avez des vraies données avec lesquelles on peut jouer...
Nicolas
Hors ligne