Message posté par : Lucie D.
----------------------------------------
Bonjour et merci pour ce code!
Je n'avais pas vu votre poste 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.
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=334212#p334212
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net