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

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

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

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

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

ppluvinet a écrit:

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

ppluvinet a écrit:

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 smile

(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 smile )

Nicolas

Hors ligne

 

#9 Tue 10 January 2012 10:50

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

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 smile )

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)


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

Hors ligne

 

#12 Tue 10 January 2012 13:15

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

Re: POSTGIS : snapping d'une table à une autre

Chapeau bas pour la rapidité!

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

cyril_c a écrit:

Chapeau bas pour la rapidité!


wink

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

ppluvinet a écrit:

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

cyril_c
Participant assidu
Lieu: Périgueux
Date d'inscription: 13 Jan 2009
Messages: 176
Site web

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

cyril_c a écrit:

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

ppluvinet a écrit:

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

 

Pied de page des forums

Powered by FluxBB