Skip to end of metadata
Go to start of metadata

You are viewing an old version of this content. View the current version.

Compare with Current View Version History

« Previous Version 3 Next »

Ladda SMHI klimatdata

SMHI har på sin hemsida en kartapplikation där många klimatindikationer finns samlade i ett nordentäckande rutnät.

I ett första skede så laddades ettan ett antal teman från klimatdata ner ochlagrades i tabellen smhi_rutnät. Värderna som är lagrade är avvikelser från normalvärden.

Varje tema består av nio klumner, tre scenarier och tre perioder:

Utsläpps-scenarier

  1. rpc2.6

  2. rpc4.5

  3. rpc8.5

Perioder

  1. 2011-2040

  2. 2041-2070

  3. 2071-2100

Teman:

  1. Torra dygn

  2. Frostdygn

  3. Vegitationsdygn

  4. Nederbörd dygn

  5. Nedbörd mm

  6. Kraftig nederbörd dygn

  7. Extrem Nederbörd

  8. Tempratur

Ny laddning av klimatdata med absoluta värden

Här beskrivs rutin för att ladda ner klimatdata som normalvärden. Metoden är inte automatiserad men är ändå effektiv. Det som tar lite tid är att skriva SQL-frågorna första gången

Ladda ner

SMHI fördjupad klimatscenariotjänst används för att ladda ner lager efter lager. För varje tema laddas nio lager ner för varje scenario respective period. Bilden visar nedladdning av temat frostdagar. Innehållet i varje -zip fil shape filer. Projektion är 3006 (SWEREF 99 TM)

image-20250108-072419.png

Lägg in filerna QGIS

Starta QGIS med kartföntret inställt i 3006. Markera alla de nio filerna för ett tema och dra dem in från filhanterare till lagerlistan. QGIS tar alla .zip filer och packar upp dem till lager från Shape-filer. Låt namnen vara som filerna.

Flytta lagren till Posgresdatabasen från QGIS

Se till att Postgres-databasen är öppen. Skapa ett temporärt schema t.ex. SMHI

Markera alla de nio lagren från temat och dra dem upp till schema-namnet i Postgres. Det blir tyst en lång stund men processen pågår att flytta lagren. Efter en lång stund meddelas att det är klart.

Nu finns alla lager för ett tema

Skapa tabellen smhi_rutor_absolute

Det fins redan en tabell där alla attribut finns för 8 teman som heter smhi_rutor. Kolumnnamnen är avkortade. Strävan är nu att skap en lika tabell men med absoluta värden. Det ny tabellen skapas efter SQL som beskrivs nedan

create table skfab_climate_24.smhi_rutnat_absolute
 as
 (
 /* Här lägger vi SQL frågan som konvererar lager från shapfiler till en enda tabell 
    Nedan visas SQL-frågan för ett tema. Alla övriga teman kan skapas på samma sätt*/
 )

I neda SQL fråga så används lika kolumnnamn som för smhi_rutor och även som alisas för tabellnamnet.

Utångstabellen för alla lager och teman är frostd_r26_pe1. Första kolumnen är Id och sista geom. Denna tabell är den enda med from (rad 12). Alla övriga är en spatial join på rutan.

När ett eller alla teman är klara så för frågan i ovanstående create table skfab_climate_24.smhi_rutnat_absolute

 select frostd_r26_pe1.id as id,
 frostd_r26_pe1.fd as frostd_r26_pe1,
 frostd_r26_pe2.fd as frostd_r26_pe2,
 frostd_r26_pe3.fd as frostd_r26_pe3,
 frostd_r45_pe1.fd as frostd_r45_pe1,
 frostd_r45_pe2.fd as frostd_r45_pe2,
 frostd_r45_pe3.fd as frostd_r45_pe3,
 frostd_r85_pe1.fd as frostd_r85_pe1,
 frostd_r85_pe2.fd as frostd_r85_pe2,
 frostd_r85_pe3.fd as frostd_r85_pe3,
 frostd_r26_pe1.geom
 from smhi."fd_ensmean_rcp26_ANN_30y_2011_2040.shp" frostd_r26_pe1
 join smhi."fd_ensmean_rcp26_ANN_30y_2041_2070.shp" frostd_r26_pe2 on ST_Contains( frostd_r26_pe1.geom, frostd_r26_pe2.geom)
 join smhi."fd_ensmean_rcp26_ANN_30y_2071_2100.shp" frostd_r26_pe3 on ST_Contains( frostd_r26_pe1.geom, frostd_r26_pe3.geom)
 join smhi."fd_ensmean_rcp45_ANN_30y_2011_2040.shp" frostd_r45_pe1 on ST_Contains( frostd_r26_pe1.geom, frostd_r45_pe1.geom)
 join smhi."fd_ensmean_rcp45_ANN_30y_2041_2070.shp" frostd_r45_pe2 on ST_Contains( frostd_r26_pe1.geom, frostd_r45_pe2.geom)
 join smhi."fd_ensmean_rcp45_ANN_30y_2071_2100.shp" frostd_r45_pe3 on ST_Contains( frostd_r26_pe1.geom, frostd_r45_pe3.geom)
 join smhi."fd_ensmean_rcp85_ANN_30y_2011_2040.shp" frostd_r85_pe1 on ST_Contains( frostd_r26_pe1.geom, frostd_r85_pe1.geom)
 join smhi."fd_ensmean_rcp85_ANN_30y_2041_2070.shp" frostd_r85_pe2 on ST_Contains( frostd_r26_pe1.geom, frostd_r85_pe2.geom)
 join smhi."fd_ensmean_rcp85_ANN_30y_2071_2100.shp" frostd_r85_pe3 on ST_Contains( frostd_r26_pe1.geom, frostd_r85_pe3.geom)

Innan frågan körs är det lämpligt att indexera de ingående tabellerna och även att ta bort index. Även här används kolumnnamnet så att det ska gå enkelt att göra systematisk omdöpning för övriga teman.

--index
drop INDEX smhi.frostd_r26_pe1_idx;  
drop INDEX smhi.frostd_r26_pe2_idx; 
drop INDEX smhi.frostd_r26_pe3_idx;  
drop INDEX smhi.frostd_r45_pe1_idx;  
drop INDEX smhi.frostd_r45_pe2_idx;  
drop INDEX smhi.frostd_r45_pe3_idx;  
drop INDEX smhi.frostd_r85_pe1_idx; 
drop INDEX smhi.frostd_r85_pe2_idx;  
drop INDEX smhi.frostd_r85_pe3_idx;  

CREATE INDEX frostd_r26_pe1_idx  ON smhi."fd_ensmean_rcp26_ANN_30y_2011_2040.shp"  USING GIST (geom);
CREATE INDEX frostd_r26_pe2_idx  ON smhi."fd_ensmean_rcp26_ANN_30y_2041_2070.shp"  USING GIST (geom);
CREATE INDEX frostd_r26_pe3_idx  ON smhi."fd_ensmean_rcp26_ANN_30y_2071_2100.shp"  USING GIST (geom);
CREATE INDEX frostd_r45_pe1_idx  ON smhi."fd_ensmean_rcp45_ANN_30y_2011_2040.shp"  USING GIST (geom);
CREATE INDEX frostd_r45_pe2_idx  ON smhi."fd_ensmean_rcp45_ANN_30y_2041_2070.shp"  USING GIST (geom);
CREATE INDEX frostd_r45_pe3_idx  ON smhi."fd_ensmean_rcp45_ANN_30y_2071_2100.shp"  USING GIST (geom);
CREATE INDEX frostd_r85_pe1_idx  ON smhi."fd_ensmean_rcp85_ANN_30y_2011_2040.shp"  USING GIST (geom);
CREATE INDEX frostd_r85_pe2_idx  ON smhi."fd_ensmean_rcp85_ANN_30y_2041_2070.shp"  USING GIST (geom);
CREATE INDEX frostd_r85_pe3_idx  ON smhi."fd_ensmean_rcp85_ANN_30y_2071_2100.shp"  USING GIST (geom);

När tabellen smhi_rutor_absolute finns klar kan en ny fråga skapas för att användas i Geoserver för att ska kartografi.

ITH mms AS ( 
select 
 greatest (
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe3),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe3),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe3)) as g_frostd,
 least (
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe3),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe3),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe3)) as l_frostd,
 greatest (
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r26_pe3),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r45_pe3),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe1),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe2),
 PERCENTILE_CONT(0.99) WITHIN GROUP(ORDER BY frostd_r85_pe3)) 
 - 
 least (
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r26_pe3),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r45_pe3),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe1),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe2),
 PERCENTILE_CONT(0.01) WITHIN GROUP(ORDER BY frostd_r85_pe3)) as d_frostd
 from skfab_climate_24.skfab_climate_24.smhi_rutnat_absolute

 ), pro as ( -- calculate the procentage (0-100) from values
 select r.id, 
 ((frostd_r26_pe1-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r26_pe1,
 ((frostd_r26_pe2-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r26_pe2,
 ((frostd_r26_pe3-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r26_pe3,
 ((frostd_r45_pe1-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r45_pe1,
 ((frostd_r45_pe2-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r45_pe2,
 ((frostd_r45_pe3-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r45_pe3,
 ((frostd_r85_pe1-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r85_pe1,
 ((frostd_r85_pe2-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r85_pe2,
 ((frostd_r85_pe3-mms.l_frostd)*100/mms.d_frostd)::integer as frostd_r85_pe3
from skfab_climate_24.skfab_climate_24.smhi_rutnat_absolute r ,  mms 
 ) -- view the result
 select  h.*, r.geom 
 from skfab_climate_24.skfab_climate_24.smhi_rutnat_absolute r
 join pro h on h.id=r.id
  • No labels