Pages: 1
- Sujet précédent - PostGIS - étendre une grille vecteur tout en conservant le calage - Sujet suivant
#1 Tue 07 July 2020 12:43
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
PostGIS - étendre une grille vecteur tout en conservant le calage
Bonjour à tous,
Je dispose d'une grille vecteur de 100x100m que je souhaite étendre à un périmètre plus large, tout ceci en conservant bien le calage des carreaux.
Auriez-vous une idée de script car là je sèche complètement. Je n'ai même pas de bout de code test à vous proposer cette fois-ci...:-/
Merci d'avance pour votre aide toujours aussi précieuse!
Bonne journée.
Bien cordialement,
Lucie D.
Hors ligne
#2 Tue 07 July 2020 13:03
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
Re: PostGIS - étendre une grille vecteur tout en conservant le calage
Proposition que je vais tester :
Je génère l'enveloppe englobante (boundingbox):
- de ma grille d'origine
- de mon périmètre d'étude
Je récupère les coordonnées exactes de ces deux boundingbox, ajoute aux coordonnées de la boundingbox de la grille un multiple de 100 pour coller au mieux à la boundingbox du périmètre d'étude. Avec ces nouvelles coordonnées, je crée une nouvelle grille.
C'est pas clair du tout désolée , mais je fais un test et poste le script SQL s'il fonctionne.
Bien cordialement,
Lucie D.
Hors ligne
#3 Tue 07 July 2020 15:41
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
Re: PostGIS - étendre une grille vecteur tout en conservant le calage
Bon, j'ai le code, mais j'ai un léger décalage entre mes carreaux dû au fait que generate_series fonctionne avec des entiers...
Une idée de fonction qui me permettrait de générer des séries avec des coordonnées non entières?
Merci!! =^_^=
Code:
create index l_grille_origine_100m_geom_gist on a_detc_smabb_strategie_fonciere.l_grille_origine_100m using gist(geom); drop table if exists a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise; create table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise as select ST_Multi(ST_Envelope(ST_Union(geom)))::geometry(MultiPolygon,2154) as geom from a_detc_smabb_strategie_fonciere.l_grille_origine_100m; drop table if exists a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise; create table a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise as select ST_Multi(ST_Envelope(ST_Union(geom)))::geometry(MultiPolygon,2154) as geom from a_detc_smabb_strategie_fonciere.l_perimetre_etude; drop table if exists a_detc_smabb_strategie_fonciere.l_grille_origine_100m_extend; create table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_extend as with coord as ( select ST_Xmin(b.geom) + (ceil((ST_Xmin(a.geom)-ST_Xmin(b.geom))::numeric/100)*100) as xmin, ST_Xmax(b.geom) + (ceil((ST_Xmax(a.geom)-ST_Xmax(b.geom))::numeric/100)*100) as xmax, ST_Ymin(b.geom) + (ceil((ST_Ymin(a.geom)-ST_Ymin(b.geom))::numeric/100)*100) as ymin, ST_Ymax(b.geom) + (ceil((ST_Ymax(a.geom)-ST_Ymax(b.geom))::numeric/100)*100) as ymax from a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise as a, a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise as b ), diagonale_simple as ( select generate_series(xmin::integer,xmax::integer-1,100) AS xmin_box, generate_series(ymin::integer,ymax::integer-1,100) AS ymin_box from coord ), grille as ( SELECT DISTINCT t1.xmin_box, t2.ymin_box FROM diagonale_simple as t1 CROSS JOIN diagonale_simple as t2 ) select xmin_box||'_'||ymin_box::character varying(80) AS id, ST_Multi(ST_SetSRID(ST_MakeBox2D(ST_Point(xmin_box,ymin_box),ST_Point(xmin_box + 100,ymin_box + 100)),2154))::geometry(MultiPolygon,2154) AS geom FROM grille WHERE xmin_box IS NOT NULL AND ymin_box IS NOT NULL;
Hors ligne
#4 Tue 07 July 2020 16:03
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: PostGIS - étendre une grille vecteur tout en conservant le calage
Bonjour,
Pour ces gestions de grilles régulières, j'utilise une fonction venant du forum postgis users:
Code:
-- AUTHOR : Mike Toews, -- SYNOPSYS : Creates a polygonal grid with specified dimensions -- IN : nrow: number of grid rows -- : ncol: number of grid columns -- : xsize: grid cell width -- : ysize: grid cell height -- : x0: x-origin of grid -- : y0: y-origin of grid -- -- OUT : row: int: row index -- : col: int col index -- : geom: geometry grid cell polygon -- -- OUTCALL : Néant -- -- USAGE : SELECT * from fn_createFishnet(100, 100, 1, 1, -180, -90) -- : as (row int, col int, geom geometry) -- -- : Code from Postgis User list: -- : http://trac.osgeo.org/postgis/wiki/UsersWikiCreateFishnet CREATE OR REPLACE FUNCTION st_CreateFishnet( nrow integer, ncol integer, xsize float8, ysize float8, x0 float8 DEFAULT 0, y0 float8 DEFAULT 0, OUT "row" integer, OUT col integer, OUT geom geometry) RETURNS SETOF record AS $$ SELECT i + 1 AS row, j + 1 AS col, ST_Translate(cell, j * $3 + $5, i * $4 + $6) AS geom FROM generate_series(0, $1 - 1) AS i, generate_series(0, $2 - 1) AS j, ( SELECT ('POLYGON((0 0, 0 ' || $4 || ', ' || $3 || ' ' || $4 || ', ' || $3 || ' 0,0 0))') :: geometry AS cell ) AS foo; $$ LANGUAGE sql IMMUTABLE STRICT;
En donnant en paramètre le point de votre grille à partir duquel vous voulez étendre la grille, plus les paramètres de la grille, vous devriez pouvoir étendre votre grille
Hors ligne
#5 Wed 08 July 2020 12:13
- Lucie D.
- Participant actif
- Date d'inscription: 21 Oct 2013
- Messages: 137
Re: PostGIS - étendre une grille vecteur tout en conservant le calage
Bonjour et merci pour ce code!
Je n'avais pas vu votre post du coup j'ai persévéré et voici donc mon code :
Code:
-- Création des enveloppes englobantes de la grille d'origine et du périmètre d'étude -- Grille 100x100m d'origine drop table if exists a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise; create table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise as select ST_Multi(ST_Envelope(ST_Union(geom)))::geometry(MultiPolygon,2154) as geom from a_detc_smabb_strategie_fonciere.l_grille_origine_100m; comment on table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise is 'Enveloppe englobante de la grille 100x100m d''origine.'; -- Périmètre d'étude drop table if exists a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise; create table a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise as select ST_Multi(ST_Envelope(ST_Union(geom)))::geometry(MultiPolygon,2154) as geom from a_detc_smabb_strategie_fonciere.l_perimetre_etude; comment on table a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise is 'Enveloppe englobante du périmètre d''étude.'; -- Création de la nouvelle grille 100x100m élargie à l'enveloppe englobante du périmètre d'étude drop table if exists a_detc_smabb_strategie_fonciere.l_grille_origine_100m_extend; create table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_extend as -- Récupération des coordonnées x,y des enveloppes englobantes -- La différence entre ces coordonnées est transformée en entier multiple de 100 pour conserver le calage des carreaux -- Extension des coordonnées de la grille 100x100m d'origine avec cette différence (positive ou négative) pour qu'elles englobent l'intégralité du périmètre d'étude with coord as ( select case when (ST_Xmin(b.geom)-ST_Xmin(a.geom)) < 0 then ST_Xmin(b.geom) when (ST_Xmin(b.geom)-ST_Xmin(a.geom)) > 0 then ST_Xmin(b.geom) - ceil((ST_Xmin(b.geom)-ST_Xmin(a.geom))::numeric/100)*100 end::double precision as xmin, case when (ST_Xmax(b.geom)-ST_Xmax(a.geom)) < 0 then ST_Xmax(b.geom) + ceil((ABS(ST_Xmax(b.geom)-ST_Xmax(a.geom)))::numeric/100)*100 when (ST_Xmax(b.geom)-ST_Xmax(a.geom)) > 0 then ST_Xmax(b.geom) end::double precision as xmax, case when (ST_Ymin(b.geom)-ST_Ymin(a.geom)) < 0 then ST_Ymin(b.geom) when (ST_Ymin(b.geom)-ST_Ymin(a.geom)) > 0 then ST_Ymin(b.geom) - ceil((ST_Ymin(b.geom)-ST_Ymin(a.geom))::numeric/100)*100 end::double precision as ymin, case when (ST_Ymax(b.geom)-ST_Ymax(a.geom)) < 0 then ST_Ymax(b.geom) + ceil((ABS(ST_Ymax(b.geom)-ST_Ymax(a.geom)))::numeric/100)*100 when (ST_Ymax(b.geom)-ST_Ymax(a.geom)) > 0 then ST_Ymax(b.geom) end::double precision as ymax from a_detc_smabb_strategie_fonciere.l_perimetre_etude_emprise as a, a_detc_smabb_strategie_fonciere.l_grille_origine_100m_emprise as b ), -- Création de séries de coordonnées avec un pas de 100m (= pas de la grille d'origine) diagonale_simple as ( select generate_series(xmin::numeric,xmax::numeric-1,100) AS xmin_box, generate_series(ymin::numeric,ymax::numeric-1,100) AS ymin_box from coord ), -- Suppression des carreaux en doublon grille as ( select distinct t1.xmin_box, t2.ymin_box from diagonale_simple as t1 cross join diagonale_simple as t2 ) -- Création de la grille grâce à la fonction ST_MakeBox2D select xmin_box||'_'||ymin_box::character varying(80) AS id, ST_Multi(ST_SetSRID(ST_MakeBox2D(ST_Point(xmin_box,ymin_box),ST_Point(xmin_box + 100,ymin_box + 100)),2154))::geometry(MultiPolygon,2154) AS geom from grille where xmin_box is not null and ymin_box is not null; comment on table a_detc_smabb_strategie_fonciere.l_grille_origine_100m_extend is 'Grille de 100x100m élargie à l''enveloppe englobante du périmètre d''étude et calée sur la grille 100x100m d''origine.';
Tout est dans le
Code:
select generate_series(xmin::numeric,xmax::numeric-1,100) AS xmin_box, generate_series(ymin::numeric,ymax::numeric-1,100) AS ymin_box
Au début je "castais" mes coordonnées en integer (xmin::integer), donc l'arrondi me créait un léger décalage...décalage que je n'ai plus grâce au ::numeric.
Je vais tester votre fonction, beaucoup plus concise que la mienne, si je puis dire!!! ;-)
Merci beaucoup!
Bien cordialement,
Lucie D.
Dernière modification par Lucie D. (Wed 08 July 2020 12:13)
Hors ligne
Pages: 1
- Sujet précédent - PostGIS - étendre une grille vecteur tout en conservant le calage - Sujet suivant