Pages: 1
- Sujet précédent - PostGIS - Requête pour réaliser des cercles concentriques - Sujet suivant
#1 Thu 03 March 2011 18:05
- Floflo49fb
- Participant assidu
- Lieu: Montpellier
- Date d'inscription: 29 Aug 2009
- Messages: 250
- Site web
PostGIS - Requête pour réaliser des cercles concentriques
Bonjour,
Voilà je suis en train de travailler sur la création d'une requête avec postgres/postgis pour obtenir des cercles concentriques tous les 5 mètres et j'aurais voulu savoir s'il était possible d'améliorer mon travail notamment en ne répétant pas le nom de la table à chaque requête et, ou en automatisant pour tous les x+5 mètres.
Comme je suis débutant n'hésitez pas à donner votre avis sur le code qui suit! De plus je joins le résultat obtenu en fichier joint.
Merci par avance.
Code:
DROP TABLE IF EXISTS cercle; CREATE TABLE cercle(gid serial NOT NULL Primary Key); ALTER TABLE cercle ADD COLUMN the_geom geometry; ALTER TABLE cercle add CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 2154); INSERT INTO cercle (the_geom) SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"; INSERT INTO cercle(the_geom) SELECT ST_SymDifference((SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"), (SELECT ST_Union(ST_Buffer(the_geom, '10')) from "Point")) AS difference_geom WHERE ST_Intersects((SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"), (SELECT ST_Union(ST_Buffer(the_geom, '10')) from "Point")); ...
Florian Boret
Dream it, Make it, Share it
Hors ligne
#2 Thu 03 March 2011 20:23
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostGIS - Requête pour réaliser des cercles concentriques
Bonjour,
Voilà je suis en train de travailler sur la création d'une requête avec postgres/postgis pour obtenir des cercles concentriques tous les 5 mètres et j'aurais voulu savoir s'il était possible d'améliorer mon travail notamment en ne répétant pas le nom de la table à chaque requête et, ou en automatisant pour tous les x+5 mètres.
Comme je suis débutant n'hésitez pas à donner votre avis sur le code qui suit! De plus je joins le résultat obtenu en fichier joint.
Merci par avance.Code:
DROP TABLE IF EXISTS cercle; CREATE TABLE cercle(gid serial NOT NULL Primary Key); ALTER TABLE cercle ADD COLUMN the_geom geometry; ALTER TABLE cercle add CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 2154); INSERT INTO cercle (the_geom) SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"; INSERT INTO cercle(the_geom) SELECT ST_SymDifference((SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"), (SELECT ST_Union(ST_Buffer(the_geom, '10')) from "Point")) AS difference_geom WHERE ST_Intersects((SELECT ST_Union(ST_Buffer(the_geom, '5')) from "Point"), (SELECT ST_Union(ST_Buffer(the_geom, '10')) from "Point")); ...
Bonsoir,
S'il s'agit de générer d'un coup une serie de cercles concentriques, la fonction generate_series est bien utile:
La requete ci-dessous genere une serie de 6 polygones, issus de l'union de buffers autour de deux points.
La sous-requete genere les points et la serie de valeurs, qui permet en fait d'iterer et de faire grossir les buffers autour des points.
A la fin, la difference de deux geometries de taille croissante est faite, pour optenir des polygones jointifs et sans recouvrement.
On peut mettre le tout dans une fonction, prenant par exemple en parametres les deux points, la distance du buffer, le nombre de polygones souhaités.
Code:
select idx, st_difference ( -- premiere geometrie: la plus grande st_union( st_buffer(pt1, (idx+1) * 5) , st_buffer(pt2, (idx+1) * 5)), -- deuxieme geom: la plus petite st_union( st_buffer(pt1, idx * 5) , st_buffer(pt2, idx * 5)) ) from -- fabrication des deux points et de la series de valeurs -- pour generer des buffers croissants ( select generate_series(0, 5) as idx, -- 5 iterations, pas de 1. 'POINT(0 0)'::geometry as pt1, 'POINT(15 0)'::geometry as pt2 ) as pt_query;
Ca donne ca (cf. image)
Nicolas.
Dernière modification par Nicolas Ribot (Thu 03 March 2011 20:46)
Hors ligne
#3 Thu 03 March 2011 21:54
- cedricd
- Participant occasionnel
- Lieu: Dijon
- Date d'inscription: 20 Mar 2006
- Messages: 19
Re: PostGIS - Requête pour réaliser des cercles concentriques
Bonsoir,
Nicolas a été le plus rapide, je propose quand même ma version.
Code:
-- 5 objets multi parts correspondants à 5 zones de distances -- de 0 m min à 25 m max avec pas de 5m -- Attention, la colonne "the_geom" est ici -- devient ici "geometrie" INSERT INTO cercle (geometrie,distance) SELECT --Différence des 2 cercles ST_SymDifference( --Premier cercle de distance d ST_Union(ST_Buffer(geometrie, increment)), --Deuxième cercle de distance d+5 ST_Union(ST_Buffer(geometrie, increment+5)) ) AS geometrie, increment FROM point, --Incrément des distances ici : 5 à 25m (20 = 25-5) generate_series(0,20,5) AS increment GROUP BY increment;
Visu en pièce jointe
Bonne soirée
Dernière modification par cedricd (Thu 03 March 2011 21:54)
Hors ligne
#4 Thu 03 March 2011 22:58
- Floflo49fb
- Participant assidu
- Lieu: Montpellier
- Date d'inscription: 29 Aug 2009
- Messages: 250
- Site web
Re: PostGIS - Requête pour réaliser des cercles concentriques
Re,
Merci beaucoup les gars pour ces explications, c'est exactement ce qu'il me fallait.
Je vais pouvoir continuer à avancer sur mon projet grâce à vous.
Bonne soirée.
Florian Boret
Dream it, Make it, Share it
Hors ligne
Pages: 1
- Sujet précédent - PostGIS - Requête pour réaliser des cercles concentriques - Sujet suivant