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 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"));
...

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

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

Floflo49fb a écrit:

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)


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

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)


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

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

 

Pied de page des forums

Powered by FluxBB