Parim koht viienda aastaaja kogemiseks on Soomaa!
Soomaa pakub huvi eelkõige viienda aastaaja poolest ehk kui toimuvad ulatuslikud üleujutused. Vahest võib kõrgvee perioodil esineda ka krõbedad külmakraade ja üleujutatud aladest saavad liuväljad. Veetaseme jälgimiseks vaadeldakse operatiivseid ja ajaloolisi veetaseme ning vooluhulga andmeid. Soomaa veeolude hetkeseisu kohta annavad parima ülevaate Aesoo ja Riisa hüdromeetriajaamad:
Allolevatel graafikutel on kuvatud Aesoo hüdromeetriajaama arvutatud äravool ja veetasemed.
Äravoolu andmed
Aesoo hüdromeetriajaama tunnikeskmised äravoolud annavad ülevaate, kui palju vett jões voolab. Äravoolu suurenemine veebruari lõpus näitab suurvee algust ja intensiivsust.
# Äravool
library(dygraphs)
dygraph(hydro_data_1[,c("timeline_ts_utc","Äravool avg"),],
main = "Äravool keskmine",
ylab = "Tunni keskmine äravool, m3/s") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 24) %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.4,axisLineWidth = 0.7)
Veetasemed
Aesoo hüdromeetriajaama hüdroloogilise seire veetasemete tunniandmed annavad ülevaate veetasemetest huvipakkuval perioodil. Veetasemed on heaks indikaatoriks, millal on kõige sobivam aeg üleujutusalade külastamiseks. Veetasemete tippe on mitmeid, mistõttu ka õigeid Soomaa külastusaegu võib olla mitu. Parim aeg kõrgvee kogemiseks 2024. aastal oli märtsi alguses, kuid ka märtsi lõpus näitavad andmed veetasemete tõusu. Kuid 2025. aastal oli suurem üleujutuse periood jaanuari lõpus ca nädal aega, kuid olenevalt ilmast võib oodata veel üht kõrgveeperioodi.
# WL-veetasemed
library(dygraphs)
dygraph(hydro_data_1[,c("timeline_ts_utc","WL max","WL min"),],
main = "Tunni maksimaalne veetase (WL max) ja minimaalne veetase (WL min)",
ylab = "veetase, cm") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 24) %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.4)
Soomaa uisuväli pakub huvitavat kogemust
Uisuväli peale plusskraade
Soomaa suurvee tulek ja minek on oluliselt seotud meteoroloogiliste näitajatega, nagu sademed ja õhutemperatuur. Seega tuleks vaadata, mida näitavad andmed suurvee perioodil sellel ja eelmisel aastal. Kuna Soomaa asub kolme meteoroloogiajaama kolmnurgas peaagu keskel, siis nende jaamade info annab kõige parema ülevaate mõõdetud temperatuuridest ja sademetest:
Allolevatel graafikutel on kuvatud nendes meteoroloogiajaamades mõõdetud temperatuurid ja sademete hulgad.
Õhutemperatuur ja sademed
Türi, Pärnu ja Viljandi meteoroloogilise seire õhutemperatuuri tunniandmed annavad ülevaate, kuidas ilm mõjutab suurvee teket. Mida rohkem on külmakraade ja sademeid talvel, seda rohkem talletub vett ja seda rohkem on kevadel suurvett.
# Õhutemp täistunnil
library(dygraphs)
dygraph(kliima_data_TA,
main = "Õhutemperatuur täistunnil (hetkväärtus)",
ylab = "kraad(c)") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 24) %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
# Ühe tunni sademete summa
library(dygraphs)
dygraph(kliima_data_PR1H,
main = "Ühe tunni sademete summa",
ylab = "mm")%>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 3)%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
Droonifoto üleujutustest
Üleujutus pakub ka hea võimaluse avastusretkede tegemiseks kajakkide, kanuude jms
Hüdroloogiliste ja meteoroloogiliste andmete võrdlus
Suurvee kõrgaja leidmiseks vaadatakse, kuidas mõjutavad valitud hüdroloogilised ja meteoroloogilised näitajad üksteist. Kuna andmete skaalad on väga erinevad, siis võrdluse saamiseks andmed normaliseeritakse (nn kaalutud andmed). Loetava ja tõlgendatava graafiku saamiseks keskmistatakse temperatuuri andmed(30 päeva keskmine). Alloleva graafiku normaliseeritud väärtuste põhjal on näha, kuidas ilm mõjutab veetasemeid ja äravoolu.
# normaliseeritud väärtus
library(dygraphs)
dygraph(tulemus,
main = "Normaliseeritud andmed",
ylab = " Normaliseeritud väärtus")%>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 24)%>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
Ajaloolised andmed
Pikemas perspektiivis annab olulist infot just mitme aasta andmete võrdlus. EstModeli andmeteenusest saab veetasemete päevaandmeid seirekoha põhiselt ja valime välja Riisa hüdromeetriajaama (Lisainfo: EstModeli Riisa veetasemed).
# ajalolised Riisa veetasemed
library(dygraphs)
dygraph(hydro_EstModel_riisa[,c("x","min","median","max")],
main = "2019-2023 aasta Riisa hüdromeetriajaama veetasemed",
ylab = "m")%>%
dyRangeSelector()%>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2) %>%
dyRoller(rollPeriod = 7)
Lisaks on suurvesi seotud eelkõige temperatuuriga, seega saab teha 5 aasta temperatuuri andmete võrdlust. Loetavuse huvides kuvatakse 5 aasta miinimum, mediaan ja maksimum temperatuurid (2019-2023). Alloleva graafiku mediaani näitaja põhjal võib arvata, et parim aeg Soomaa külastuse planeerimiseks on märtsi lõpus. Samas tuleks jälgida jooksva aasta temperatuure, sest aastate lõikes temperatuur kõigub ja ilmaolud on muutlikud.
# ajalolised kliima andmed
library(dygraphs)
dygraph(kliima_data_PA[,c("x","min","median","max")],
main = "2019-2023 aasta temperatuurid",
ylab = " kraad(c)")%>%
dyRangeSelector()%>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2) %>%
dyRoller(rollPeriod = 7)
Keskkonnaagentuuri hüdroloogiline prognoos
Aesoo ja Riisa hüdromeetriajaamade hüdroloogilise mudelprognoosi päevaandmed annavad 10 päeva ulatuses prognoosi, mille abil on võimalik valida kõige õigem hetk, millal Soomaale minna. Keskkonnaagentuuri hüdroloogiline mudelprognoos on koostatud ekspertide poolt, kasutades selleks loodud mudelid. Soovitame vaadata ka prognoosi koostamise kirjeldust Graafikutel on toodud Aesoo vooluhulga prognoos ja Riisa veetasemete prognoos.
# max, min, keskmine vooluhulk
library(dygraphs)
dygraph(Aesoo_prognoos[,c("paev","vooluhulga prognoos","max vooluhulk","min vooluhulk","keskmine vooluhulk")],
main = "Aesoo hüdroloogiline mudelprognoos",
ylab = "vooluhulk") %>%
dyEvent(Aesoo_prognoos[12,c("paev")], "Täna", labelLoc = "bottom") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 0) %>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
# max min, keskmine veetase
library(dygraphs)
dygraph(Riisa_prognoos[,c("paev","veetaseme prognoos", "max veetase", "min veetase", "keskmine veetase")],
main = "Riisa hüdroloogiline mudelprognoos",
ylab = "veetase") %>%
dyEvent(Riisa_prognoos[12,c("paev")], "Täna", labelLoc = "bottom") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 0) %>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
Keskkonnaagentuuri meteoroloogiline prognoos
Lisaks hüdroloogilisele prognoosile tasub vaadata ka Keskkonnaagentuuri asukohapõhist meteoroloogilist prognoosi. Prognoosi andmed on Aesoo hüdromeetriajaama koordinaatide kohta. Ilm on kevadel heitlik, seega parima kogemuse saamiseks tasub lisaks veetasemetele arvestada sademeid, õhutemperatuuri ja tuult. Soovitame vaadata ka ilmaprognooside andmestiku kirjeldust
library(dygraphs)
dygraph(kliima_4[,c("aeg","TA","PR1H","Tuul")],
main = "Meteoroloogiline prognoos Aesmaa jaama koordinaatidel",
ylab = "temp(c), tuul(m/s), sademed(mm)") %>%
dySeries("TA", label = "Temp") %>%
dySeries("Tuul", label = "Tuul") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 0) %>%
dyHighlight(highlightSeriesOpts = list(strokeWidth = 3))%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2,labelsUTC = TRUE)
Soomaa veevõrk, seirejaamad ja huvipunktid
Kaardilt leiab Soomaa lähistel asuvad Aesoo ja Riisa hüdromeetriajaamad ning kolm lähimat meteoroloogiajaama. Lisaks on taustandmeteks veevõrk (järved ja vooluveekogud) ning Soomaa kaitseala. Soomaa rahvuspargi kohta saab täiendavat infot Soomaa külastuskeskusest, mis on ühtlasi ka hea alguspunkt üleujutatud alade külastamiseks. Soomaa viies aastaeg tekib kevadiste üleujutuste ajal, kui madalamad alad kattuvad veega. Kevadine ilm on heitlik ning tihti tuleb sulailmade vahele krõbedaid külmakraade. Kui üleujutatud alad külmuvad, avaneb unikaalne võimalus uisutamiseks. Jäätunud sood, niidud ja metsad tekitavad maagilise talvise maastiku, kus saab nautida looduse ilu. Uisutamine viienda aastaaja ajal on erakordne kogemus, mis viib külastajad looduse rüpesse. Jääle minekul tasub veenduda, et see kannab.
# Eesti koordinaatsüsteem tuleb täpsustada kuna leaflet kasutab wgs84
library(leaflet)
library(leaflet.extras)
## Teeme valmis kaardi leafletiga
# Tekitame kaardiobjekti
basemap <- leaflet(jaam,
width = "100%",
height = "1000px",
options = leafletOptions(
preferCanvas = TRUE,
#worldCopyJump = F,
crs = epsg3301)) %>%
#addTiles(urlTemplate = "//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", group = "Taustakaart",tileOptions(opacity = 0.9)) %>%
# Lisame kaardile MA aluskaardi VMS teenuse
addWMSTiles(
ma_alus,
#layers = "MA-ALUS",
layers = "MA-HALLKAART",
group = "Taustakaart",
options = WMSTileOptions(format = "image/png",
transparent = TRUE,
opacity=0.3,
minZoom = 1,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile vooluveekogude VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_vooluvesi",
group = "Vooluvesi",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 15,
continuousWorld = T)) %>%
# Lisame kaardile järvede VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_jarv",
group = "Järved",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile ramsari alade VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_ramsar",
group = "Kaitseala",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile meteoroloogiajaamad
addCircleMarkers(radius = 10,
#tekitame infoakna
lng = ~jaam$lon,
lat = ~jaam$lat,
color = "green",
group = "Jaamad/objektid",
popup = paste("Jaama nimi: ", jaam$jaam_nimi, "<br>",
"Jaama nimi (eng): ", jaam$jaam_nimi_eng, "<br>",
"Jaama kood: ", jaam$jaam_kood, "<br>",
"Jaama kõrgus merepinnast(m): ", jaam$korgus_merepinnast_m, "<br>",
"Pikkuskraad: ", jaam$lon, "<br>",
"Laiuskraad: ", jaam$lat, "<br>",
"Jaama algusaeg: ", jaam$jaam_periood_algus, "<br>"),
label = ~jaam_nimi) %>%
# Lisame kaardile hüdromeetriajaamad
addCircleMarkers(radius = 10,
lng = ~hydro_jaam$lon,
lat = ~hydro_jaam$lat,
color = "#FFC300",
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste("Jaama nimi: ", hydro_jaam$jaam_nimi, "<br>",
"Jaama kood: ", hydro_jaam$jaam_kood, "<br>",
"Valgala nimi: ", hydro_jaam$valgala_nimi, "<br>",
"Valgala suurus km2: ", hydro_jaam$valgala_suurus_km2, "<br>",
"Kaugus suudmest km: ", hydro_jaam$kaugus_suudmest_km, "<br>",
"Veekogu nimi: ", hydro_jaam$veekogu_nimi, "<br>",
"Pikkuskraad: ", hydro_jaam$lon, "<br>",
"Laiuskraad: ", hydro_jaam$lat, "<br>"),
label = ~hydro_jaam$jaam_nimi) %>%
# Lisame kaardile Soomaa rahvuspargi külastuskeskuse
addMarkers(#radius = 10,
lng = 25.031412,
lat = 58.431158,
#color = "#FFC300",
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste(" ", "Soomaa rahvuspargi külastuskeskus", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/10764' target='_blank'>Külastuskeskuse info</a></b>", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/1268' target='_blank'>Kopraraja lisainfo</a></b>", "<br>",
"Pikkuskraad: ", "25.031412", "<br>",
"Laiuskraad: ", "58.431158", "<br>"),
label = "Soomaa rahvuspargi külastuskeskus") %>%
addPolygons(
lng = sapply(polygon_coords, function(x) x[2]), # Pikkuskraadid (lon)
lat = sapply(polygon_coords, function(x) x[1]), # Laiuskraadid (lat)
color = "cyan", # Piiri värv
weight = 2, # Piiri paksus
fillColor = "cyan", # Täitevärv
fillOpacity = 0.5,
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste(" ", "Uisutamisala Halliste jõe ääres", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/toramaa-puisniidu-lokkekoha-vaatetorn' target='_blank'>Tõramaa puisniidu lõkkekoha vaatetorn</a></b>", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/1269' target='_blank'>Tõramaa puisniidu lõkkekoht</a></b>", "<br>",
#c(58.422, 24.997),
"Pikkuskraad: ", "24.997", "<br>",
"Laiuskraad: ", "58.422", "<br>"),
label = "Uisutamisala") %>%
# Jäägem eesti piiridesse seega täpsustame kaardiaknas kuvatavaid piire
setMaxBounds(21.58448, 60.08641, 28.39045, 57.07625) %>%
# Lisame legendi
addLegend(
title = "Legend",
position = "bottomright",
values = c(1, 2,3,4,5),
labels = c("Vooluvesi", "Järved","meteo. jaamad","hüdro. jaamad","kaitsealad","uisuala"),
colors = c("blue", "blue","darkgreen","yellow","lightblue","cyan"))%>%
# Lisame kihtide sisse/välja lülitamise funktsionaalsuse
addLayersControl(
#baseGroups = c("Taustakaart","Kaitseala"),
overlayGroups = c("Vooluvesi","Järved","Jaamad/objektid","Kaitseala","Taustakaart"),
options = layersControlOptions(collapsed = FALSE))
# vajadusel saab kaarti ka erladiseisvalt salvestada htmli
#library(plotly) ;htmlwidgets::saveWidget(as_widget(basemap), "basemap.html")
basemap
Talvel saab uisutada väga suurel alal
Soodsate ilmaolude korral on lume all sile jää ja on näha hästi, mis on jää all
Eesmärk
„Keskkonnaagentuuri avaandmete ja andmeteenuste kasutamine Soomaa näitel“ rakenduse eesmärgiks on anda ilma- ja keskkonnavaldkonna andmete kasutajatele andmelugu, mis oleks juhendmaterjaliks ning mille koodi saaks kasutada põhjana Keskkonnaagentuuri andmemaailmas orienteerumiseks ja avaandmete kasutamiseks. Soomaa andmelugu on mõeldud kasutajatele, kes soovivad luua enda rakendusi-tööriistu, teha analüüse või kasutada andmeid muudes infosüsteemides.
Teema: Soomaa
Soomaa on üks huvitavamaid vaatamis- ja kogemisväärsusi Eestis, mis muutub aina populaarsemaks ja seda just viiendal aastaajal. Soomaa külastaja või loodusretke korraldaja soovib tõenäoliselt tabada seda kõige õigemat aega külastuseks ehk kus suurvee tasemed on kõige kõrgemad. Ilm on aga keeruline nähtus, mis erineb aastate lõikes ning viies aastaaeg ei alga kindla kuupäevaga. Antud andmelugu sisaldab andmepõhist ülevaadet Soomaast, põhifookusega suurvee ajale.Eesmärgiks on anda võimalikult palju avaandmetega seotud infot ühest kohast.
Kellele suunatud
Andmelugu on suunatud mitmele kasutajagrupile.
Keskkonnaagentuuri andmetele lisandub järjepidevalt uusi avaandmete teenuseid. Avaandmete populariseerimise eesmärgiks on suurendada avaandmete kasutamist ning andmetest uue väärtuse loomist.
Andmed
Andmete kasutamise näide R-is illustreerib protsessi, mis tuleb läbida, et andmeid saaks kasutada või väärindada. Takistuseks võib olla andmetest arusaamine ja õigete andmeallikate “otsade” leidmine. Andmelugu koos vastava koodiga on loodud selle probleemi lahendamiseks. Andmetest arusaamine võib olla valdkonna välisetele kasutajatele keeruline ja seetõttu on antud näite puhul lisatud linke ja juhismaterjali kood, et andmete kasutajad leiaksid vajaliku info ning teaksid, kuidas on üles ehitatud andmekataloog (sh andmestike/levituse info, andmekirjeldused ja andmeteenused). Kasutatud on erinevaid andmeid erinevatest allikatest, peamiselt andmeteenustena, sealhulgas ruumiandmeteenuseid.
Andmelugu sisaldab järgmisi andmeid:
Soomaa suurvee andmeloo jaoks valiti välja kaks olulisemat hüdromeetriajaama ja kolm lähimat meteoroloogiajaama (vaata kaarti). Lisaks saab lugeda Soomaa rahvuspargi ja loodusala kohta Keskkonnaportaalist.
Andmetöötlus ja skriptid
Koodi kirjutamine võiks hea praktika kohaselt olla taaskasutamine. Andmeloos on kasutatud erinevat tüüpi andmeid ja iga andmestik on spetsiifilises formaadis (nt kuupäevade formaat).Andmeloo koodi taaskasutamise tulemusena saab järgmine andmete ja koodi kasutaja hoida kokku andmetöötluseks kuluvat aega. Andmelugu annab põhiinfo andmete kasutamiseks, kood on võimalikult puhas ja lihtne ning minimaalselt on kasutatud R-i spetsiifilist süntaksit. R on lihtne programmeerimiskeel, mis sobib andmeteaduseks, andmeanalüüsiks ja kiirelt valmivate lahenduste loomiseks või prototüüpimiseks. Sel põhjusel on ka see kood üsna arusaadav ja kasutatav või ülevõetav teistes programmeerimiskeeltes ja keskkondades. Kood on ära toodud andmeloo skriptide sektsioonis ning selle kasutamisel tuleks vaadata ka juhiseid.
Andmete võrdlus ja prognoos
Koodi loetavuse ja arusaadavuse tagamiseks on kasutatud lihtsaid näiteid andmete võrdluseks ning kasutatud peamiselt olemasolevaid prognoosandmeid. Keda huvitab Vooluhulkade ja veetasemete prognoosi Soomaa kohta saabvaadata Keskkonnaagentuuri hüdroloogilisest ja meteoroloogilisest mudelprognoosist. Lisatud on mõned andmevõrdlused, et näidata nende andmete analüüsi ja väärindamise võimalusi ning anda andmeloo kasutajale võimalus teha ise järeldusi. Andmete kasutamise näidised on olemas ja igaüks saab andmeid edasi analüüsida ja luua endale sobilike prognoosmudeleid ning täiendada selle andmeloo skripte.
Kontakt
Mustamäe tee 33, 10616 Tallinn
+372 666 0901
Kuidas kasutada skripte?
Siit sektsioonist leiab juhised, kuidas taaskasutada selle andmeloo loomiseks kasutatud koodi.
Andmed on seisuga 2025-03-13 ja ei uuene automaatselt. Seega tuleb andmeid uuendada, et saada ajakohased graafikud.
R-iga tehtud lahenduse kood koosneb 2 failist (soomaa.Rmd, Andmed.R).
Faili soomaa.Rmd saab alla laadida kui vajutada päises oleval nupul Code ja valida Download Rmd või siit: soomaa.Rmd
Faili Andmed.R koodi saab kopeerida järgmiselt menüüsakilt Andmed.R või alla laadida siit: Andmed.R
Fail soomaa.Rmd sisaldab ainult graafikute loomiseks vajalikku koodi, kuid mitte andmete sisselugemise ja töötluse koodiosa, sest siis läheks kood väga pikaks ja poleks tagatud loetavus. Fail Andmed.R sisaldab ka graafikute loomise koodi baastasemel, et oleks näha tulemused (graafikud, kaart) ka neil, kes faili soomaa.Rmd ei kasuta.
Juhis andmeloo taasloomiseks:
Pythoniga loodud lahendus sisaldab ainult skripti koodinäidistega ning on allalaetav menüüsakilt Andmed.py või siit: Andmed.py
Koodi nägemiseks Vajuta paremal pool oleval nuppul “show”
###############################
#### Andmetöötluse skript
# Sisaldab avaandmete andmeteenuste kasutamise näiteid ning viiteid andmete kirjeldustele ja keskkondadele
# Lisaks peamisi andmetöötluse tegevusi, andmete võrdlusi, graafikute loomist ja kaartide tegemise näiteid
###############################
### Hüdroloogilise seire andmed
## Loeme sisse hüdroloogilise seire andmed (https://keskkonnaportaal.ee/et/avaandmed/keskkonna-ja-ilma-valdkonna-andmeteenused)
# Üldine päring andmetele, et näha mis seal sees on ja kuna päringumaht on piiratud siis filtritega (limiit 20000 rida)
library(jsonlite)
hydro_data <- fromJSON("https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=lt.2024-01-02T03:00:00&timeline_ts_utc=gt.2024-01-01T23:00:00&jaam_kood=eq.41137")
# Meid huvitab aint teatud osa andmestikust, seega vaatame mida saaks välja rookida
names(hydro_data)
# Andmekirjeldusest põhjal võiks meid huvitada tunniandmetest veetase(cm) ja tunni äravool(m3/s)
#https://keskkonnaportaal.ee/et/avaandmed/hudroloogilise-seire-andmestik/hudroloogilise-seire-andmestiku-kirjeldus
# Vaatame, mis parameetrid meil andmetes tegelikult on
unique(hydro_data$aegrida_nimi)
# Võtame ainult meid huvitava valiku aga on vaja on kodeerida õigesti andmepäring (https://www.w3schools.com/tags/ref_urlencode.ASP)
hydro_data1 <- fromJSON("https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=gt.2024-01-12T23:00:00&timeline_ts_utc=lte.2024-08-01T23:00:00&aegrida_nimi=in.(WL%20min,WL%20max,%C3%84ravool+avg)&jaam_kood=eq.41137")
hydro_data2 <- fromJSON("https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=gt.2024-08-01T23:00:00&aegrida_nimi=in.(WL%20min,WL%20max,%C3%84ravool+avg)&jaam_kood=eq.41137")
# Liidame 2 päringu andmed kokku
hydro_data <- rbind(hydro_data1,hydro_data2)
# Meil valitud ainult Aesoo hüdromeetriajaam, seega pole vaja jaamade üldandmeid
hydro_data=hydro_data[,c("timeline_ts_utc", "aegrida_nimi","vaartus" )]
# Paneme andmed kõrvuti ühte tabelisse, et saaks graafiku teha
library(tidyr)
hydro_data_1=spread(hydro_data, key = aegrida_nimi, value = vaartus)
# Kontrollime üle, kas on kõik unikaalne
sum(duplicated(hydro_data_1$timeline_ts_utc))
# Kuupäev on erilises vormis ja tuleb vaeva näha, et saaks neist datetime teha mida vajab graafik
hydro_data_1$timeline_ts_utc= gsub("T"," ",hydro_data_1$timeline_ts_utc)
hydro_data_1$timeline_ts_utc= as.POSIXlt(hydro_data_1$timeline_ts_utc, format='%Y-%m-%d %H:%M:%S',tz = "UTC")
## Teeme graafikud
# Äravool
library(dygraphs)
dygraph(hydro_data_1[,c("timeline_ts_utc","Äravool avg"),],
main = "Äravool keskmine",
ylab = "Tunni keskmine äravool, m3/s") %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.4)
# Graafiku järgi on andmetes 16ndal ja 17ndal auk sees
# Veetase
library(dygraphs)
dygraph(hydro_data_1[,c("timeline_ts_utc","WL max","WL min"),],
main = "Tunni max ja min veetase",
ylab = "veetase, cm") %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.4)
###############################
### Kliima andmed
## Loeme sisse kliima andmed (https://keskkonnaportaal.ee/et/avaandmed/keskkonna-ja-ilma-valdkonna-andmeteenused)
# Üldine päring andmetele, et näha mis seal sees on ja kuna päringumaht on piiratud siis filtritega (limiit 20000 rida)
library(jsonlite)
kliima_data <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=eq.2023&kuu=gt.10&paev=lt.8&jaam_kood=in.(AJVILJ01,AJPARN01,AJTURI01)")
# Meid huvitab aint teatud osa andmestikust, seega vaatame mida saaks välja rookida
names(kliima_data)
# Andmekirjelduse ütleb meile, et meid võiks huvitada tunniandmetes täistunni õhutemperatuur ning sademete summa
#https://keskkonnaportaal.ee/et/avaandmed/kliimaandmestik/kliimaandmestiku-kirjeldus
# Vaatame, mis parameetrid meil andmetes tegelikult on
unique(kliima_data$element_kood)
# Võtame ainult meid huvitava valiku ja teeme jaamapõhised päringud
# Kuna päringu limiit on 20000 rida siis peame päringud tükeldama näitajate ja jaamade lõikes
# Türi meteoroloogiajaam
kliima_data_1 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJTURI01&element_kood=eq.TA")
kliima_data_2 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJTURI01&element_kood=eq.PR1H")
# Liidame andmed kokku ja roogime välja mittevajalikud väljad
kliima_data_t=merge(
kliima_data_1[,c("aasta","kuu","paev","tund","vaartus")],
kliima_data_2[,c("aasta","kuu","paev","tund","vaartus")],
by=c("aasta","kuu","paev","tund"),all=T,suffixes = c("TA","PR1H"))
names(kliima_data_t) = c("aasta","kuu","paev","tund","TA","PR1H")
# Pärnu rannikujaam
kliima_data_1 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJPARN01&element_kood=eq.TA")
kliima_data_2 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJPARN01&element_kood=eq.PR1H")
# Liidame andmed kokku ja roogime välja mittevajalikud väljad
kliima_data_p=merge(
kliima_data_1[,c("aasta","kuu","paev","tund","vaartus")],
kliima_data_2[,c("aasta","kuu","paev","tund","vaartus")],
by=c("aasta","kuu","paev","tund"),all=T,suffixes = c("TA","PR1H"))
names(kliima_data_p) = c("aasta","kuu","paev","tund","TA","PR1H")
# Viljandi meteoroloogiajaam
kliima_data_1 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJVILJ01&element_kood=eq.TA")
kliima_data_2 <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.AJVILJ01&element_kood=eq.PR1H")
# Liidame andmed kokku ja roogime välja mittevajalikud väljad
kliima_data_v=merge(
kliima_data_1[,c("aasta","kuu","paev","tund","vaartus")],
kliima_data_2[,c("aasta","kuu","paev","tund","vaartus")],
by=c("aasta","kuu","paev","tund"),all=T,suffixes = c("TA","PR1H"))
names(kliima_data_v) = c("aasta","kuu","paev","tund","TA","PR1H")
# Puhastame töölauda
rm(kliima_data_1,kliima_data_2)
# Normaliseerime ajalise mõõtme ja viime selle datetime formaati, et saaks graafikuid teha
kliima_data_t$timeline_ts_utc= paste0(kliima_data_t$aasta,"-",kliima_data_t$kuu,"-",kliima_data_t$paev," ",kliima_data_t$tund,":00:00")
kliima_data_p$timeline_ts_utc= paste0(kliima_data_p$aasta,"-",kliima_data_p$kuu,"-",kliima_data_p$paev," ",kliima_data_p$tund,":00:00")
kliima_data_v$timeline_ts_utc= paste0(kliima_data_v$aasta,"-",kliima_data_v$kuu,"-",kliima_data_v$paev," ",kliima_data_v$tund,":00:00")
# Kuvame andmed et näha mis toimub graafikul
kliima_data_t$timeline_ts_utc= as.POSIXlt(kliima_data_t$timeline_ts_utc, format='%Y-%m-%d %H:%M:%S',tz = "UTC")
kliima_data_p$timeline_ts_utc= as.POSIXlt(kliima_data_p$timeline_ts_utc, format='%Y-%m-%d %H:%M:%S',tz = "UTC")
kliima_data_v$timeline_ts_utc= as.POSIXlt(kliima_data_v$timeline_ts_utc, format='%Y-%m-%d %H:%M:%S',tz = "UTC")
## Teeme graafikud
# Kuna temperatuur ja sademed on hästi võrreldavad erinevate asukohatde lõikes siis paneme jaamade andmed kokku näitaja alusel
# õhutemp täistunnil
kliima_data_TA =merge(kliima_data_t[,c("timeline_ts_utc","TA")],kliima_data_p[,c("timeline_ts_utc","TA")],by="timeline_ts_utc")
kliima_data_TA =merge(kliima_data_TA,kliima_data_v[,c("timeline_ts_utc","TA")],by="timeline_ts_utc")
names(kliima_data_TA)=c("timeline_ts_utc","Türi","Pärnu","Viljandi")
library(dygraphs)
dygraph(kliima_data_TA) %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
# Ühe tunni sademete summa
kliima_data_PR1H =merge(kliima_data_t[,c("timeline_ts_utc","PR1H")],kliima_data_p[,c("timeline_ts_utc","PR1H")],by="timeline_ts_utc")
kliima_data_PR1H =merge(kliima_data_PR1H,kliima_data_v[,c("timeline_ts_utc","PR1H")],by="timeline_ts_utc")
names(kliima_data_PR1H)=c("timeline_ts_utc","Türi","Pärnu","Viljandi")
library(dygraphs)
dygraph(kliima_data_PR1H)
###############################
### Andmete võrdlus
## Paneme hüdroloogilised ja meteoroloogilised andmed kokku võrdluse jaoks
kliima_koos= merge(kliima_data_TA,kliima_data_PR1H,by="timeline_ts_utc",suffixes = c(".TA",".PR1H"))
kliima_koos= merge(kliima_koos,hydro_data_1,by="timeline_ts_utc")
# POSIXlt tuleb muuta POSIXct formaati
kliima_koos$timeline_ts_utc= as.POSIXct(kliima_koos$timeline_ts_utc)
# Eemaldame hüdroloogilistes andmetes oleva augu
kliima_koos= kliima_koos[complete.cases(kliima_koos),]
## korrelatsioon
tulemus=cor(kliima_koos[,-1])
# Teeme korrelatsiooni graafiku et näha andmete erinevusi
library(plotly)
plot_ly(x=colnames(tulemus),
y=rownames(tulemus),
z = tulemus,
type = "heatmap",
zauto = F, zmin = 0, zmax = 1,
colors = colorRamp(c("red", "green"))) %>%
layout(margin = list(l=120))
# Andmed on kohati suhteliselt võrreldamatud, sest on erineva skaalaga ja tuleks normaliseerida
## Normaliseerime andmed kasutame scale() ja rollmean funktsioone loetava graafiku saamiseks
library(zoo)
x1=scale(kliima_koos[,c(8,9,10)])
x1=cbind(kliima_koos[,"timeline_ts_utc"],as.data.frame(x1))
x2=rollmean(scale(rowMeans(kliima_koos[,c(2,3,4)])),30,fill = 0,align ="right" )
x2=cbind(kliima_koos[,"timeline_ts_utc"],as.data.frame(x2))
names(x2)=c("kliima_koos[, \"timeline_ts_utc\"]","TA")
tulemus= merge(x1,x2,by="kliima_koos[, \"timeline_ts_utc\"]")
# Teeme normaliseeritud andmetega graafiku
library(dygraphs)
dygraph(tulemus,
main = "Normaliseeritud andmed",
ylab = "Normaliseeritud väärtus")%>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 0)%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
### Võrdleme veetasemete andmeid 5 aasta lõikes
## Hüdro andmed EstModelist
library(jsonlite)
# H-veetase, Q-vooluhulk, T-veetemperatuur
hydro_EstModel_riisa <- fromJSON("https://estmodel.envir.ee/stations/SJA4385000/measurements?parameter=H&start-year=2019") # Riisa
hydro_EstModel_riisa$timeline_ts_utc= as.POSIXlt(hydro_EstModel_riisa$startDate, format='%Y-%m-%d',tz = "UTC")
hydro_EstModel_riisa=hydro_EstModel_riisa[,c("timeline_ts_utc", "value")]
# Loome aasta, kuu ja päeva erladi et saaks luua võrdlusi
library(lubridate)
hydro_EstModel_riisa$aasta= year(hydro_EstModel_riisa$timeline_ts_utc)
hydro_EstModel_riisa$kuu= month(hydro_EstModel_riisa$timeline_ts_utc)
hydro_EstModel_riisa$paev= day(hydro_EstModel_riisa$timeline_ts_utc)
# Normaliseerime ajalise mõõtme
hydro_EstModel_riisa$timeline_ts_utc= paste0(hydro_EstModel_riisa$kuu,"-",hydro_EstModel_riisa$paev)
# Viskame välja üleliigsed väljad aga jätame sisse kuu ja päeva, et järjekord sassi ei läheks
hydro_EstModel_riisa=hydro_EstModel_riisa[,c("aasta","kuu","paev","timeline_ts_utc","value")]
# Paneme andmed kõrvuti ühte tabelisse, et saaks graafiku teha
library(tidyr)
hydro_EstModel_riisa=spread(hydro_EstModel_riisa, key = aasta, value = value)
# Eemaldame kuu ja päeva
hydro_EstModel_riisa=hydro_EstModel_riisa[,c(3:ncol(hydro_EstModel_riisa))]
#kliima_data_PA$timeline_ts_utc= as.POSIXlt(kliima_data_PA$timeline_ts_utc, format='%m-%d',tz = "UTC")
# Et graafik oleks puhas ja arusaadav arvutame min,max ja keskmise väärtuse
hydro_EstModel_riisa$median = apply(hydro_EstModel_riisa[,c(2:ncol(hydro_EstModel_riisa))], 1, median, na.rm=T)
hydro_EstModel_riisa$min = apply(hydro_EstModel_riisa[,c(2:ncol(hydro_EstModel_riisa))], 1, min, na.rm=T)
hydro_EstModel_riisa$max = apply(hydro_EstModel_riisa[,c(2:ncol(hydro_EstModel_riisa))], 1, max, na.rm=T)
# eemaldame 02-29 kuna see päev annab parsimise errorit (NA)
hydro_EstModel_riisa=hydro_EstModel_riisa[hydro_EstModel_riisa$timeline_ts_utc!="2-29",]
# lisame x päeva numbriliselt, et dygraph oskaks teha õige graafiku aastate lõikes
hydro_EstModel_riisa$x =c(1:nrow(hydro_EstModel_riisa))
# ja teeme kuupäevad
library(lubridate)
hydro_EstModel_riisa$x = parse_date_time(x = hydro_EstModel_riisa$x, orders = "j")
hydro_EstModel_riisa=as.data.frame(hydro_EstModel_riisa)
## Teeme graafikud
library(dygraphs)
dygraph(hydro_EstModel_riisa[,c("x","min","median","max")])%>%
dyRangeSelector()%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2) %>%
dyRoller(rollPeriod = 10)
### Võrdleme temperatuuri andmeid 5 aasta lõikes
# Loeme sisse 5 aasta temperatuuri päevaandmed
library(jsonlite)
kliima_data_PA <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_paev?jaam_kood=eq.AJTURI01&element_kood=in.(DTA08)&aasta=in.(2019,2020,2021,2022,2023)") #türi
# Normaliseerime ajalise mõõtme
kliima_data_PA$timeline_ts_utc= paste0(kliima_data_PA$kuu,"-",kliima_data_PA$paev)
# Viskame välja üleliigsed väljad aga jätame sisse kuu ja päeva, et järjekord sassi ei läheks
kliima_data_PA=kliima_data_PA[,c("aasta","kuu","paev","timeline_ts_utc","vaartus")]
# Paneme andmed kõrvuti ühte tabelisse, et saaks graafiku teha
library(tidyr)
kliima_data_PA=spread(kliima_data_PA, key = aasta, value = vaartus)
# Eemaldame kuu ja päeva
kliima_data_PA=kliima_data_PA[,c(3:8)]
#kliima_data_PA$timeline_ts_utc= as.POSIXlt(kliima_data_PA$timeline_ts_utc, format='%m-%d',tz = "UTC")
# Et graafik oleks puhas ja arusaadav arvutame min,max ja keskmise väärtuse
kliima_data_PA$median = apply(kliima_data_PA[,c(2:6)], 1, median, na.rm=T)
kliima_data_PA$min = apply(kliima_data_PA[,c(2:6)], 1, min, na.rm=T)
kliima_data_PA$max = apply(kliima_data_PA[,c(2:6)], 1, max, na.rm=T)
# eemaldame 02-29 kuna see päev annab parsimise errorit (NA)
kliima_data_PA=kliima_data_PA[kliima_data_PA$timeline_ts_utc!="2-29",]
# lisame x päeva numbriliselt, et dygraph oskaks teha õige graafiku aastate lõikes
kliima_data_PA$x =c(1:nrow(kliima_data_PA))
# ja teeme kuupäevad
library(lubridate)
kliima_data_PA$x = parse_date_time(x = kliima_data_PA$x, orders = "j")
kliima_data_PA=as.data.frame(kliima_data_PA)
## Teeme graafikud
library(dygraphs)
dygraph(kliima_data_PA[,c("x","min","median","max")])%>%
dyRangeSelector()%>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2) %>%
dyRoller(rollPeriod = 10)
###############################
### Hüdroloogiline mudelprognoos
# https://keskkonnaportaal.ee/et/avaandmed/hudroloogiline-mudelprognoos
# Andmed asuvad siin: https://avaandmed.keskkonnaportaal.ee/dhs/Active/documentList.aspx?ViewId=919192b7-3e4e-4694-a3f7-7b856da7aeac
# ID muutuvad, seega tuleb vaada järgi mis on ajakohase faili ID: https://avaandmed.keskkonnaportaal.ee/swagger/index.html
## Loeme sisse Aesoo vooluhulga ja Riisa veetasemete andmed
library(readr)
# Loeme sisse Aesoo vooluhulga andmed
Aesoo_prognoos <- read_table("https://avaandmed.keskkonnaportaal.ee/_vti_bin/RmApi.svc/active/items/4244784/files/1", col_names = FALSE)
# Loeme sisse Riisa veetasemete andmed
Riisa_prognoos <- read_table("https://avaandmed.keskkonnaportaal.ee/_vti_bin/RmApi.svc/active/items/4244794/files/1", col_names = FALSE)
# Loeme sisse Riisa vooluhulga andmed aga kuna saame errorit siis jätame välja esialgu
#Riisa_prognoos_vooluhulk <- read_table("https://avaandmed.keskkonnaportaal.ee/_vti_bin/RmApi.svc/active/items/488066/files/1", col_names = FALSE)
# Andmetel pole pealkirju ja need saame siit: https://keskkonnaportaal.ee/et/avaandmed/hudroloogilise-prognoosi-andmestik/hudroloogilise-prognoosi-kirjeldus
names(Aesoo_prognoos) =c("aeg","vooluhulga prognoos","max vooluhulk","min vooluhulk","keskmine vooluhulk","test")
names(Riisa_prognoos) =c("aeg","veetaseme prognoos","max veetase","min veetase","keskmine veetase")
# Kuna andmetes on kuupäevad erilises formaadis (aasta + numbriline päeva arv(julian day)) siis eemaldame aasta
Aesoo_prognoos$paev = as.numeric(sub("^....", "", Aesoo_prognoos$aeg))
Riisa_prognoos$paev = as.numeric(sub("^....", "", Riisa_prognoos$aeg))
# Ja teeme numbri kuupäevaks
library(lubridate)
Aesoo_prognoos$paev=parse_date_time(x = Aesoo_prognoos$paev, orders = "j")
Riisa_prognoos$paev=parse_date_time(x = Riisa_prognoos$paev, orders = "j")
# viime tagasi data.frame formaati
Aesoo_prognoos=as.data.frame(Aesoo_prognoos)
Riisa_prognoos=as.data.frame(Riisa_prognoos)
## Teeme graafikud
# Aesoo vooluhulk
library(dygraphs)
dygraph(Aesoo_prognoos[,c("paev","vooluhulga prognoos","max vooluhulk","min vooluhulk","keskmine vooluhulk")]) %>%
dyEvent(Aesoo_prognoos[12,c("paev")], "Täna", labelLoc = "bottom") %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
# Riisa veetasemed
library(dygraphs)
dygraph(Riisa_prognoos[,c("paev","veetaseme prognoos", "max veetase", "min veetase", "keskmine veetase")]) %>%
dyEvent(Riisa_prognoos[12,c("paev")], "Täna", labelLoc = "bottom") %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2)
# kirjelduses on kirjas, et täna on 11 rida aga kuupäev ei klapi. Ilmselt on KP läinud nihkesse (29.02)
###############################
### Ilmaprognoosid
## 4 päeva ilmaprognoos Aesoo kohta
# Andmeteenuse info: https://ilmmicroservice.envir.ee/api_doc/#api-Forecasts-GetV1ForecastsModelforecastbylocation
# Loeme sisse Aesoo hüdromeetriajaama ilmaprognoosi andmed ja paneme andmed dataframei
url4= "https://publicapi.envir.ee/v1/forecasts/modelForecastByLocation?latitude=25.061826&longitude=58.515303&outputFormat=application%2Fjson"
kliima_4 <- fromJSON(url4)
kliima_4 =kliima_4$entries$entry
# Väärtused on eraldatud komaga ja ühes tulbas seega lammutame selle erladi tulpadeks
kliima_4 = do.call("rbind", strsplit(kliima_4$vaartus, ","))
kliima_4 = data.frame(apply(kliima_4, 2, as.numeric))
# Ümardame numbrilised andmed
library(dplyr); kliima_4=kliima_4 %>% mutate_if(is.numeric, round, digits=1)
# Kuna andmed ei ole kirjeldatud siis katseeksitus meetodi tulemused
# Esimene väärtus on x13
# Temp on 1 rida, sademed on 6 rida, tuul on 15 rida, õhurõhk on 10 rida
kliima_4 = kliima_4[c(1,6,15,10),c(13:50)]
kliima_4 = as.data.frame(t(kliima_4))
# Kuna aega andmetes ei ole siis arvutame selle positsioonilt x13 ehk kliima_4 algusest
aeg=trunc(Sys.time(),units= "hours")
for (i in 1:nrow(kliima_4)-1) {aeg[i+1]= aeg + hours(i)}
# Lisame ajavektori andmetele
kliima_4$aeg=aeg
# Anname arusaadavad nimed tulpadele
colnames(kliima_4) = c("TA","PR1H","Tuul","Õhurõhk","aeg")
## Teeme graafiku
library(dygraphs)
dygraph(kliima_4[,c("aeg","TA","PR1H","Tuul")],
main = "Meteoroloogiline prognoos Aesmaa jaama koordinaatidel",
ylab = "temp(c), tuul(m/s), sademed(mm)") %>%
dySeries("TA", label = "temp") %>%
dySeries("Tuul", label = "Tuul") %>%
dyRangeSelector()%>%
dyRoller(rollPeriod = 0) %>%
dyOptions(fillGraph = TRUE, fillAlpha = 0.2,labelsUTC = TRUE)
## Hetke data koordinaadi põhiselt
url_p=("https://ilmmicroservice.envir.ee/api/forecasts/mobileLocationForecast?latitude=58.515303&longitude=25.061826&stationId=54")
kliima_p <- fromJSON(url_p)
kliima_p =kliima_p$entries$entry
kliima_p=t(kliima_p)
###############################
### Teemakaart
## Tekitame jaamade üldandmed
# Kõigepealt Aesoo hüdroloogilise jaam andmed
library(dplyr)
hydro_jaam <- fromJSON("https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=lt.2024-01-02T03:00:00&timeline_ts_utc=gt.2024-01-01T23:00:00&jaam_kood=in.(41137,41140)")
# Andmetes on kaks jaama seega vajame unikaalseid jaama andmeid
hydro_jaam = hydro_jaam[,c("jaam_kood","jaam_nimi","valgala_nimi","valgala_suurus_km2","kaugus_suudmest_km",
"jaam_laiuskraad","jaam_pikkuskraad","jaam_taisnimi","veekogu_nimi")]
hydro_jaam = distinct(hydro_jaam)
# Anname veel leafletile asusaadavad koordinaatide nimed (lat,lon)
names(hydro_jaam) = c("jaam_kood","jaam_nimi","valgala_nimi","valgala_suurus_km2","kaugus_suudmest_km",
"lat","lon","jaam_taisnimi","veekogu_nimi")
# Siis Türi, Pärnu ja Viljandi meteoroloogiajaamade andmed, mis on eraldi päringuga saadaval
jaam <- fromJSON("https://keskkonnaandmed.envir.ee/f_kliima_jaam_vaatlus?jaam_kood=in.(AJVILJ01,AJPARN01,AJTURI01)")
# Andmetes on kolm jaama seega valime ainult jaamade üldandmed ja seejärel jätame unikaalsed kirjed
jaam = jaam[,c("jaam_kood","jaam_nimi","jaam_nimi_eng","jaam_periood_algus",
"jaam_periood_lopp","pikkuskraad","laiuskraad","korgus_merepinnast_m")]
jaam = distinct(jaam)
# Andmetes on 3 pärnu meteoroloogiajaama ja mul on vaja ainult viimast (lõpukuupäev on tulevikus)
jaam =jaam[jaam$jaam_periood_lopp=="3999-12-31T23:59:00",]
# Anname veel leafletile asusaadavad koordinaatide nimed (lat,lon)
names(jaam) = c("jaam_kood","jaam_nimi","jaam_nimi_eng","jaam_periood_algus",
"jaam_periood_lopp","lon","lat","korgus_merepinnast_m")
# Lisame uisuvälja ala polygoni
polygon_coords <- list(
c(58.422, 24.997), # Punkt 1
c(58.422, 25.003), # Punkt 2
c(58.394, 25.018), # Punkt 3
c(58.390, 25.014), # Punkt 4
c(58.408, 25.009), # Punkt 5
c(58.422, 24.997) # Tagasi alguspunkti (sulgeme polügooni)
)
## Lisames muud taustandmed mida on vaja kaardi tegemiseks
# https://register.keskkonnaportaal.ee/register/internationally-important-area/8957851
# Urlid mida kasutada WMS teenuste puhul
ma_alus <- "https://kaart.maaamet.ee/wms/hallkaart"
eelis <- "https://gsavalik.envir.ee/geoserver/eelis/ows"
# Peaks saama ka otse geojsonit kasutada aga ei õnnestunud toimima saada
# geojson <- jsonlite::fromJSON("https://gsavalik.envir.ee/geoserver/eelis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=eelis%3Akr_jarv&maxFeatures=50&outputFormat=application%2Fjson")
# Eesti koordinaatsüsteem tuleb täpsustada kuna leaflet kasutab wgs84
library(leaflet)
library(leaflet.extras)
epsg3301 <- leafletCRS(crsClass = "L.Proj.CRS",
code = "EPSG:3301",
#proj4def = "+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs",
proj4def = "+proj=lcc +lat_0=57.5175539305556 +lon_0=24 +lat_1=59.3333333333333 +lat_2=58 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs +type=crs",
resolutions = c(2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0.5), # 8192 down to 0.5
origin = c(0, 0))
## Teeme valmis kaardi leafletiga
# Tekitame kaardiobjekti
basemap <- leaflet(jaam,
width = "100%",
height = "600px",
options = leafletOptions(
preferCanvas = TRUE,
#worldCopyJump = F,
crs = epsg3301)) %>%
#addTiles(urlTemplate = "//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", group = "Taustakaart",tileOptions(opacity = 0.9)) %>%
# Lisame kaardile MA aluskaardi VMS teenuse
addWMSTiles(
ma_alus,
#layers = "MA-ALUS",
layers = "MA-HALLKAART",
group = "Taustakaart",
options = WMSTileOptions(format = "image/png",
transparent = TRUE,
opacity=0.3,
minZoom = 1,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile vooluveekogude VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_vooluvesi",
group = "Vooluvesi",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 15,
continuousWorld = T)) %>%
# Lisame kaardile järvede VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_jarv",
group = "Järved",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile ramsari alade VMS teenuse
addWMSTiles(
eelis,
layers = "eelis:kr_ramsar",
group = "Kaitseala",
options = WMSTileOptions(format = "image/png",
transparent = T,
minZoom = 0,
maxZoom = 14,
continuousWorld = T)) %>%
# Lisame kaardile meteoroloogiajaamad
addCircleMarkers(radius = 10,
#tekitame infoakna
lng = ~jaam$lon,
lat = ~jaam$lat,
color = "green",
group = "Jaamad/objektid",
popup = paste("Jaama nimi: ", jaam$jaam_nimi, "<br>",
"Jaama nimi (eng): ", jaam$jaam_nimi_eng, "<br>",
"Jaama kood: ", jaam$jaam_kood, "<br>",
"Jaama kõrgus merepinnast(m): ", jaam$korgus_merepinnast_m, "<br>",
"Pikkuskraad: ", jaam$lon, "<br>",
"Laiuskraad: ", jaam$lat, "<br>",
"Jaama algusaeg: ", jaam$jaam_periood_algus, "<br>"),
label = ~jaam_nimi) %>%
# Lisame kaardile hüdromeetriajaamad
addCircleMarkers(radius = 10,
lng = ~hydro_jaam$lon,
lat = ~hydro_jaam$lat,
color = "#FFC300",
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste("Jaama nimi: ", hydro_jaam$jaam_nimi, "<br>",
"Jaama kood: ", hydro_jaam$jaam_kood, "<br>",
"Valgala nimi: ", hydro_jaam$valgala_nimi, "<br>",
"Valgala suurus km2: ", hydro_jaam$valgala_suurus_km2, "<br>",
"Kaugus suudmest km: ", hydro_jaam$kaugus_suudmest_km, "<br>",
"Veekogu nimi: ", hydro_jaam$veekogu_nimi, "<br>",
"Pikkuskraad: ", hydro_jaam$lon, "<br>",
"Laiuskraad: ", hydro_jaam$lat, "<br>"),
label = ~hydro_jaam$jaam_nimi) %>%
# Lisame kaardile Soomaa rahvuspargi külastuskeskuse
addMarkers(#radius = 10,
lng = 25.031412,
lat = 58.431158,
#color = "#FFC300",
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste(" ", "Soomaa rahvuspargi külastuskeskus", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/10764'>Külastuskeskuse info</a></b>", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/1268'>Kopraraja lisainfo</a></b>", "<br>",
"Pikkuskraad: ", "25.031412", "<br>",
"Laiuskraad: ", "58.431158", "<br>"),
label = "Soomaa rahvuspargi külastuskeskus") %>%
# Lisame kaardile Soomaa rahvuspargi uisutamise ala
addPolygons(
lng = sapply(polygon_coords, function(x) x[2]), # Pikkuskraadid (lon)
lat = sapply(polygon_coords, function(x) x[1]), # Laiuskraadid (lat)
color = "cyan", # Piiri värv
weight = 2, # Piiri paksus
fillColor = "cyan", # Täitevärv
fillOpacity = 0.5,
group = "Jaamad/objektid",
#tekitame infoakna
popup = paste(" ", "Uisutamisala Halliste jõe ääres", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/toramaa-puisniidu-lokkekoha-vaatetorn'>Tõramaa puisniidu lõkkekoha vaatetorn</a></b>", "<br>",
" ", "<b><a href='https://rmk-loodusegakoos-veebikaart.rmk.ee/#/kuhuminna/rahvuspargid/soomaa-rahvuspark/1269'>Tõramaa puisniidu lõkkekoht</a></b>", "<br>",
#c(58.422, 24.997),
"Pikkuskraad: ", "24.997", "<br>",
"Laiuskraad: ", "58.422", "<br>"),
label = "Uisutamisala") %>%
# Jäägem eesti piiridesse seega täpsustame kaardiaknas kuvatavaid piire
setMaxBounds(21.58448, 60.08641, 28.39045, 57.07625) %>%
# Lisame legendi
addLegend(
title = "Legend",
position = "bottomright",
values = c(1, 2,3,4,5),
labels = c("Vooluvesi", "Järved","meteo. jaamad","hüdro. jaamad","kaitsealad","uisuala"),
colors = c("blue", "blue","darkgreen","yellow","lightblue","cyan"))%>%
# Lisame kihtide sisse/välja lülitamise funktsionaalsuse
addLayersControl(
#baseGroups = c("Taustakaart","Kaitseala"),
overlayGroups = c("Vooluvesi","Järved","Jaamad/objektid","Kaitseala","Taustakaart"),
options = layersControlOptions(collapsed = FALSE))
# vajadusel saab kaarti ka erladiseisvalt salvestada htmli
#library(plotly) ;htmlwidgets::saveWidget(as_widget(basemap), "basemap.html")
basemap
Pythoni kasutajatele jaoks on R-i kood teisendatud Pythonisse ja koodi nägemiseks vajuta paremal pool oleval nuppul “show”
#repl_python()
#!pip install pandas
#!pip install requests
#!pip install plotly
import pandas as pd
import requests
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# Hüdroloogilise seire andmed
hydro_data_url = "https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=gt.2024-01-02T23:00:00&aegrida_nimi=in.(WL%20min,WL%20max,%C3%84ravool+avg)&jaam_kood=eq.41137"
response = requests.get(hydro_data_url)
hydro_data = response.json()
# Loome DataFramei ja teisendame vajalikud veerud
hydro_df = pd.DataFrame(hydro_data)
hydro_df = hydro_df[['timeline_ts_utc', 'aegrida_nimi', 'vaartus']]
# Muudame andmed laiemasse formaati, et saaks teha graafiku
hydro_df_pivot = hydro_df.pivot(index='timeline_ts_utc', columns='aegrida_nimi', values='vaartus')
# Kuupäevade vormindamine
hydro_df_pivot.index = pd.to_datetime(hydro_df_pivot.index.str.replace('T', ' '))
# Graafik keskmise äravoolu kohta
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1, subplot_titles=('Äravool Keskmine', 'Veetase Max ja Min'))
# Äravoolu graafik
fig.add_trace(go.Scatter(x=hydro_df_pivot.index, y=hydro_df_pivot['Äravool avg'], mode='lines', name='Äravool Keskmine', fill='tozeroy'), row=1, col=1)
# Veetaseme graafik (Max ja Min)
fig.add_trace(go.Scatter(x=hydro_df_pivot.index, y=hydro_df_pivot['WL max'], mode='lines', name='Veetase Max', fill='tonexty'), row=2, col=1)
fig.add_trace(go.Scatter(x=hydro_df_pivot.index, y=hydro_df_pivot['WL min'], mode='lines', name='Veetase Min', fill='tonexty'), row=2, col=1)
# Graafiku seadistamine
fig.update_layout(height=600, title_text="Hüdroloogiline Seire", showlegend=True)
fig.update_xaxes(title_text="Kuupäev")
fig.update_yaxes(title_text="m3/s", row=1, col=1)
fig.update_yaxes(title_text="cm", row=2, col=1)
# Kuvame graafiku
fig.show()
###############################
### Kliima andmed
## Loeme sisse kliima andmed (https://keskkonnaportaal.ee/et/avaandmed/keskkonna-ja-ilma-valdkonna-andmeteenused)
# Üldine päring andmetele, et näha mis seal sees on ja kuna päringumaht on piiratud siis filtritega (limiit 20000 rida)
import pandas as pd
import requests
import plotly.graph_objs as go
# Loeme sisse kliima andmed (Türi, Pärnu, Viljandi jaamadest)
def load_climate_data(station_code, element_code):
url = f"https://keskkonnaandmed.envir.ee/f_kliima_tund?aasta=in.(2023,2024)&jaam_kood=eq.{station_code}&element_kood=eq.{element_code}"
response = requests.get(url)
data = response.json()
return pd.DataFrame(data)
# Türi meteoroloogiajaam
kliima_data_1 = load_climate_data("AJTURI01", "TA")
kliima_data_2 = load_climate_data("AJTURI01", "PR1H")
# Liidame andmed kokku ja roogime välja mittevajalikud väljad
kliima_data_t = pd.merge(
kliima_data_1[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
kliima_data_2[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
on=['aasta', 'kuu', 'paev', 'tund'],
how='outer',
suffixes=('_TA', '_PR1H')
)
kliima_data_t.columns = ['aasta', 'kuu', 'paev', 'tund', 'TA', 'PR1H']
# Pärnu rannikujaam
kliima_data_1 = load_climate_data("AJPARN01", "TA")
kliima_data_2 = load_climate_data("AJPARN01", "PR1H")
kliima_data_p = pd.merge(
kliima_data_1[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
kliima_data_2[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
on=['aasta', 'kuu', 'paev', 'tund'],
how='outer',
suffixes=('_TA', '_PR1H')
)
kliima_data_p.columns = ['aasta', 'kuu', 'paev', 'tund', 'TA', 'PR1H']
# Viljandi meteoroloogiajaam
kliima_data_1 = load_climate_data("AJVILJ01", "TA")
kliima_data_2 = load_climate_data("AJVILJ01", "PR1H")
kliima_data_v = pd.merge(
kliima_data_1[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
kliima_data_2[['aasta', 'kuu', 'paev', 'tund', 'vaartus']],
on=['aasta', 'kuu', 'paev', 'tund'],
how='outer',
suffixes=('_TA', '_PR1H')
)
kliima_data_v.columns = ['aasta', 'kuu', 'paev', 'tund', 'TA', 'PR1H']
# Parandatud funktsioon datetime veeru loomiseks
def create_datetime_column(df):
# Loome datetime stringi ja teisendame selle datetime formaati
df['timeline_ts_utc'] = pd.to_datetime(df['aasta'].astype(str) + '-' +
df['kuu'].astype(str).str.zfill(2) + '-' +
df['paev'].astype(str).str.zfill(2) + ' ' +
df['tund'].astype(str).str.zfill(2) + ':00:00',
format='%Y-%m-%d %H:%M:%S')
return df
# Normaliseerime ajalise mõõtme ja viime selle datetime formaati
kliima_data_t = create_datetime_column(kliima_data_t)
kliima_data_p = create_datetime_column(kliima_data_p)
kliima_data_v = create_datetime_column(kliima_data_v)
# Paneme kokku temperatuuride andmed
kliima_data_TA = pd.merge(kliima_data_t[['timeline_ts_utc', 'TA']], kliima_data_p[['timeline_ts_utc', 'TA']], on='timeline_ts_utc', suffixes=('_Türi', '_Pärnu'))
kliima_data_TA = pd.merge(kliima_data_TA, kliima_data_v[['timeline_ts_utc', 'TA']], on='timeline_ts_utc')
kliima_data_TA.columns = ['timeline_ts_utc', 'Türi', 'Pärnu', 'Viljandi']
# Teeme graafiku õhutemperatuuride kohta
fig = go.Figure()
fig.add_trace(go.Scatter(x=kliima_data_TA['timeline_ts_utc'], y=kliima_data_TA['Türi'], mode='lines', name='Türi'))
fig.add_trace(go.Scatter(x=kliima_data_TA['timeline_ts_utc'], y=kliima_data_TA['Pärnu'], mode='lines', name='Pärnu'))
fig.add_trace(go.Scatter(x=kliima_data_TA['timeline_ts_utc'], y=kliima_data_TA['Viljandi'], mode='lines', name='Viljandi'))
fig.update_layout(title='Õhutemperatuur (Türi, Pärnu, Viljandi)', xaxis_title='Aeg', yaxis_title='Temperatuur (°C)', showlegend=True)
fig.show()
# Paneme kokku sademete andmed
kliima_data_PR1H = pd.merge(kliima_data_t[['timeline_ts_utc', 'PR1H']], kliima_data_p[['timeline_ts_utc', 'PR1H']], on='timeline_ts_utc', suffixes=('_Türi', '_Pärnu'))
kliima_data_PR1H = pd.merge(kliima_data_PR1H, kliima_data_v[['timeline_ts_utc', 'PR1H']], on='timeline_ts_utc')
kliima_data_PR1H.columns = ['timeline_ts_utc', 'Türi', 'Pärnu', 'Viljandi']
# Teeme graafiku sademete kohta
fig = go.Figure()
fig.add_trace(go.Scatter(x=kliima_data_PR1H['timeline_ts_utc'], y=kliima_data_PR1H['Türi'], mode='lines', name='Türi'))
fig.add_trace(go.Scatter(x=kliima_data_PR1H['timeline_ts_utc'], y=kliima_data_PR1H['Pärnu'], mode='lines', name='Pärnu'))
fig.add_trace(go.Scatter(x=kliima_data_PR1H['timeline_ts_utc'], y=kliima_data_PR1H['Viljandi'], mode='lines', name='Viljandi'))
fig.update_layout(title='Sademete Summa (Türi, Pärnu, Viljandi)', xaxis_title='Aeg', yaxis_title='Sademed (mm)', showlegend=True)
fig.show()
### Võrdleme veetasemete andmeid 5 aasta lõikes
import pandas as pd
import requests
import plotly.graph_objs as go
from datetime import timedelta
# Loeme sisse hüdroloogilised andmed EstModelist
url = "https://estmodel.envir.ee/stations/SJA4385000/measurements?parameter=H&start-year=2019&time-step=P1D"
response = requests.get(url)
data = response.json()
# Loome DataFrame ja teisendame datetime veeru
hydro_EstModel_riisa = pd.DataFrame(data)
hydro_EstModel_riisa['timeline_ts_utc'] = pd.to_datetime(hydro_EstModel_riisa['startDate'], format='%Y-%m-%d')
# Loome aasta, kuu ja päeva eraldi veerud
hydro_EstModel_riisa['aasta'] = hydro_EstModel_riisa['timeline_ts_utc'].dt.year
hydro_EstModel_riisa['kuu'] = hydro_EstModel_riisa['timeline_ts_utc'].dt.month
hydro_EstModel_riisa['paev'] = hydro_EstModel_riisa['timeline_ts_utc'].dt.day
# Normaliseerime ajalise mõõtme (Kuu ja päev)
hydro_EstModel_riisa['timeline_ts_utc'] = hydro_EstModel_riisa['kuu'].astype(str) + '-' + hydro_EstModel_riisa['paev'].astype(str)
# Valime vajalikud veerud
hydro_EstModel_riisa = hydro_EstModel_riisa[['aasta', 'kuu', 'paev', 'timeline_ts_utc', 'value']]
# Paneme andmed kõrvuti ühe tabelisse aastate lõikes
#hydro_EstModel_riisa_pivot = hydro_EstModel_riisa.pivot(index=['timeline_ts_utc','kuu', 'paev'], columns='aasta', values='value')
hydro_EstModel_riisa_pivot = hydro_EstModel_riisa.pivot(index='timeline_ts_utc', columns='aasta', values='value')
# Arvutame min, max ja keskmise väärtuse
hydro_EstModel_riisa_pivot['median'] = hydro_EstModel_riisa_pivot.median(axis=1)
hydro_EstModel_riisa_pivot['min'] = hydro_EstModel_riisa_pivot.min(axis=1)
hydro_EstModel_riisa_pivot['max'] = hydro_EstModel_riisa_pivot.max(axis=1)
# Lisame numbrilise x-telje päeva alusel
hydro_EstModel_riisa_pivot['x'] = range(1, len(hydro_EstModel_riisa_pivot) + 1)
# Loome kuupäevad päevade numbrite järgi
start_date = pd.to_datetime("01-01", format="%m-%d")
hydro_EstModel_riisa_pivot['xx'] = [start_date + timedelta(days=int(x) - 1) for x in hydro_EstModel_riisa_pivot['x']]
#hydro_EstModel_riisa_pivot['xx'] = [start_date + timedelta(days=int(x) - 1) for x in hydro_EstModel_riisa_pivot['xx']]
# Teeme graafiku kasutades Plotly
fig = go.Figure()
# Minimaalne veetase
fig.add_trace(go.Scatter(x=hydro_EstModel_riisa_pivot['x'], y=hydro_EstModel_riisa_pivot['min'], mode='lines', name='Min veetase'))
# Keskmine veetase
fig.add_trace(go.Scatter(x=hydro_EstModel_riisa_pivot['x'], y=hydro_EstModel_riisa_pivot['median'], mode='lines', name='Keskmine veetase', line=dict(width=2)))
# Maksimaalne veetase
fig.add_trace(go.Scatter(x=hydro_EstModel_riisa_pivot['x'], y=hydro_EstModel_riisa_pivot['max'], mode='lines', name='Max veetase'))
# Graafiku seadistamine
fig.update_layout(title='Veetase aastate lõikes (Riisa)',
xaxis_title='Kuupäev',
yaxis_title='Veetase (m)',
#xaxis=dict(type='date'),
yaxis=dict(rangemode='tozero'),
showlegend=True)
# Kuvame graafiku
fig.show()
### Võrdleme temperatuuri andmeid 5 aasta lõikes
# Loeme sisse 5 aasta temperatuuri päevaandmed
import pandas as pd
import requests
import plotly.graph_objs as go
from datetime import timedelta
# Loeme sisse 5 aasta temperatuuri andmed Türi jaamast
url = "https://keskkonnaandmed.envir.ee/f_kliima_paev?jaam_kood=eq.AJTURI01&element_kood=in.(DTA08)&aasta=in.(2019,2020,2021,2022,2023)"
response = requests.get(url)
data = response.json()
# Loome DataFrame ja normaliseerime ajalise mõõtme (kuu ja päev)
kliima_data_PA = pd.DataFrame(data)
kliima_data_PA['timeline_ts_utc'] = kliima_data_PA['kuu'].astype(str) + '-' + kliima_data_PA['paev'].astype(str)
# Valime vajalikud veerud
kliima_data_PA = kliima_data_PA[['aasta', 'kuu', 'paev', 'timeline_ts_utc', 'vaartus']]
# Paneme andmed kõrvuti ühe tabelisse aastate lõikes
kliima_data_PA_pivot = kliima_data_PA.pivot(index='timeline_ts_utc', columns='aasta', values='vaartus')
# Arvutame min, max ja keskmise väärtuse
kliima_data_PA_pivot['median'] = kliima_data_PA_pivot.median(axis=1)
kliima_data_PA_pivot['min'] = kliima_data_PA_pivot.min(axis=1)
kliima_data_PA_pivot['max'] = kliima_data_PA_pivot.max(axis=1)
# Lisame numbrilise x-telje päeva alusel
kliima_data_PA_pivot['x'] = range(1, len(kliima_data_PA_pivot) + 1)
# Loome kuupäevad päevade numbrite järgi
start_date = pd.to_datetime("01-01", format="%m-%d")
kliima_data_PA_pivot['x'] = [start_date + timedelta(days=int(x) - 1) for x in kliima_data_PA_pivot['x']]
# Teeme graafiku kasutades Plotly
fig = go.Figure()
# Minimaalne temperatuur
fig.add_trace(go.Scatter(x=kliima_data_PA_pivot['x'], y=kliima_data_PA_pivot['min'], mode='lines', name='Min temperatuur'))
# Keskmine temperatuur
fig.add_trace(go.Scatter(x=kliima_data_PA_pivot['x'], y=kliima_data_PA_pivot['median'], mode='lines', name='Keskmine temperatuur', line=dict(width=2)))
# Maksimaalne temperatuur
fig.add_trace(go.Scatter(x=kliima_data_PA_pivot['x'], y=kliima_data_PA_pivot['max'], mode='lines', name='Max temperatuur'))
# Graafiku seadistamine
fig.update_layout(title='Temperatuur aastate lõikes (Türi)',
xaxis_title='Kuupäev',
yaxis_title='Temperatuur (°C)',
xaxis=dict(type='date'),
yaxis=dict(rangemode='tozero'),
showlegend=True)
# Kuvame graafiku
fig.show()
###############################
### Hüdroloogiline mudelprognoos
# https://keskkonnaportaal.ee/et/avaandmed/hudroloogiline-mudelprognoos
# Andmed asuvad siin: https://avaandmed.keskkonnaportaal.ee/dhs/Active/documentList.aspx?ViewId=919192b7-3e4e-4694-a3f7-7b856da7aeac
# ID muutuvad, seega tuleb vaada järgi mis on ajakohase faili ID: https://avaandmed.keskkonnaportaal.ee/swagger/index.html
import pandas as pd
import requests
import plotly.graph_objs as go
from datetime import datetime, timedelta
# Loeme sisse Aesoo vooluhulga andmed
url_aesoo = "https://avaandmed.keskkonnaportaal.ee/_vti_bin/RmApi.svc/active/items/1337361/files/1"
aesoo_prognoos = pd.read_csv(url_aesoo, sep="\t", header=None)
# Loeme sisse Riisa veetaseme andmed
url_riisa = "https://avaandmed.keskkonnaportaal.ee/_vti_bin/RmApi.svc/active/items/488068/files/1"
riisa_prognoos = pd.read_csv(url_riisa, sep="\t", header=None)
# Andmetel pole pealkirju, lisame need
aesoo_prognoos.columns = ["aeg", "vooluhulga prognoos", "max vooluhulk", "min vooluhulk", "keskmine vooluhulk", "test"]
riisa_prognoos.columns = ["aeg", "veetaseme prognoos", "max veetase", "min veetase", "keskmine veetase"]
#TEST
def julian_to_date(julian_date):
# Eraldame aasta ja päeva
year = int(str(julian_date)[:4]) # Esimesed 4 numbrit on aasta
day_of_year = int(str(julian_date)[4:]) # Ülejäänud numbrid on aasta päev
# Arvutame kuupäeva, alustades aasta algusest
return datetime(year, 1, 1) + timedelta(days=day_of_year - 1)
# Rakendame funktsiooni DataFrame'i veeru peale
aesoo_prognoos['paev'] = aesoo_prognoos['aeg'].apply(julian_to_date)
riisa_prognoos['paev'] = riisa_prognoos['aeg'].apply(julian_to_date)
# Aesoo vooluhulk graafik
fig_aesoo = go.Figure()
fig_aesoo.add_trace(go.Scatter(x=aesoo_prognoos['paev'], y=aesoo_prognoos['vooluhulga prognoos'], mode='lines', name='Vooluhulga prognoos'))
fig_aesoo.add_trace(go.Scatter(x=aesoo_prognoos['paev'], y=aesoo_prognoos['max vooluhulk'], mode='lines', name='Max vooluhulk'))
fig_aesoo.add_trace(go.Scatter(x=aesoo_prognoos['paev'], y=aesoo_prognoos['min vooluhulk'], mode='lines', name='Min vooluhulk'))
fig_aesoo.add_trace(go.Scatter(x=aesoo_prognoos['paev'], y=aesoo_prognoos['keskmine vooluhulk'], mode='lines', name='Keskmine vooluhulk'))
fig_aesoo.update_layout(title="Aesoo Vooluhulga Prognoos", xaxis_title="Kuupäev", yaxis_title="Vooluhulk (m3/s)", showlegend=True)
fig_aesoo.show()
# Riisa veetase graafik
fig_riisa = go.Figure()
fig_riisa.add_trace(go.Scatter(x=riisa_prognoos['paev'], y=riisa_prognoos['veetaseme prognoos'], mode='lines', name='Veetaseme prognoos'))
fig_riisa.add_trace(go.Scatter(x=riisa_prognoos['paev'], y=riisa_prognoos['max veetase'], mode='lines', name='Max veetase'))
fig_riisa.add_trace(go.Scatter(x=riisa_prognoos['paev'], y=riisa_prognoos['min veetase'], mode='lines', name='Min veetase'))
fig_riisa.add_trace(go.Scatter(x=riisa_prognoos['paev'], y=riisa_prognoos['keskmine veetase'], mode='lines', name='Keskmine veetase'))
fig_riisa.update_layout(title="Riisa Veetaseme Prognoos", xaxis_title="Kuupäev", yaxis_title="Veetase (cm)", showlegend=True)
fig_riisa.show()
# ###############################
# ### Ilmaprognoosid
# ## 4 päeva ilmaprognoos Aesoo kohta
# # Andmeteenuse info: https://ilmmicroservice.envir.ee/api_doc/#api-Forecasts-GetV1ForecastsModelforecastbylocation
# # Loeme sisse Aesoo hüdromeetriajaama ilmaprognoosi andmed ja paneme andmed dataframei
#
# import requests
# import pandas as pd
# import numpy as np
# import plotly.graph_objs as go
# from datetime import datetime, timedelta
#
# # Loeme sisse Aesoo hüdromeetriajaama ilmaprognoosi andmed
# url4 = "https://publicapi.envir.ee/v1/forecasts/modelForecastByLocation?latitude=25.061826&longitude=58.515303&outputFormat=application%2Fjson"
# response = requests.get(url4)
# data = str(response.content)
#
# response.headers.get('Content-Type')
# js = response.json()
#
#
#
# # Saame andmed, eraldades väärtused komade kaupa
# forecast_entries = [entry['vaartus'].split(",") for entry in data['entries']['entry']]
#
# # Loome DataFrame ja teisendame numbrilisteks väärtusteks
# kliima_4 = pd.DataFrame(forecast_entries).apply(pd.to_numeric)
#
# # Valime temperatuur (1. rida), sademed (6. rida), tuul (15. rida) ja õhurõhk (10. rida)
# kliima_4_selected = kliima_4.iloc[[0, 5, 14, 9], 12:49].transpose()
#
# # Ümardame numbrilised andmed ühe komakohaga
# kliima_4_selected = np.round(kliima_4_selected, 1)
#
# # Loome ajavektori alates käesolevast tunnist
# aeg = [datetime.now().replace(minute=0, second=0, microsecond=0) + timedelta(hours=i) for i in range(len(kliima_4_selected))]
#
# # Lisame aja andmetele
# kliima_4_selected['aeg'] = aeg
# kliima_4_selected.columns = ['TA', 'PR1H', 'Tuul', 'Õhurõhk', 'aeg']
#
# # Kuvame andmed graafikus Plotly abil
# fig = go.Figure()
#
# # Temperatuur (TA)
# fig.add_trace(go.Scatter(x=kliima_4_selected['aeg'], y=kliima_4_selected['TA'], mode='lines', name='Temperatuur (°C)'))
#
# # Sademed (PR1H)
# fig.add_trace(go.Scatter(x=kliima_4_selected['aeg'], y=kliima_4_selected['PR1H'], mode='lines', name='Sademed (mm)'))
#
# # Tuul (Tuul)
# fig.add_trace(go.Scatter(x=kliima_4_selected['aeg'], y=kliima_4_selected['Tuul'], mode='lines', name='Tuule kiirus (m/s)'))
#
# # Graafiku seadistamine
# fig.update_layout(title="Meteoroloogiline prognoos Aesmaa jaama koordinaatidel",
# xaxis_title="Aeg",
# yaxis_title="Väärtused",
# showlegend=True)
#
# # Kuvame graafiku
# fig.show()
###############################
### Teemakaart
#!pip install folium
#!pip install requests
#!pip install json
import folium
import requests
import json
## Tekitame jaamade üldandmed
# Kõigepealt Aesoo hüdroloogilise jaam andmed
# API päring hüdroloogiliste jaamade andmetele
hydro_url = "https://keskkonnaandmed.envir.ee/f_hydroseire?timeline_ts_utc=lt.2024-01-02T03:00:00&timeline_ts_utc=gt.2024-01-01T23:00:00&jaam_kood=in.(41137,41140)"
hydro_data = requests.get(hydro_url).json()
# Hüdroloogiliste jaamade vajalike andmete väljavõte
hydro_stations = []
for item in hydro_data:
hydro_stations.append({
'jaam_kood': item['jaam_kood'],
'jaam_nimi': item['jaam_nimi'],
'valgala_nimi': item['valgala_nimi'],
'valgala_suurus_km2': item['valgala_suurus_km2'],
'kaugus_suudmest_km': item['kaugus_suudmest_km'],
'lat': item['jaam_laiuskraad'],
'lon': item['jaam_pikkuskraad'],
'veekogu_nimi': item['veekogu_nimi']
})
# Siis Türi, Pärnu ja Viljandi meteoroloogiajaamade andmed, mis on eraldi päringuga saadaval
weather_url = "https://keskkonnaandmed.envir.ee/f_kliima_jaam_vaatlus?jaam_kood=in.(AJVILJ01,AJPARN01,AJTURI01)"
weather_data = requests.get(weather_url).json()
# Meteoroloogiajaamade vajalike andmete väljavõte
weather_stations = []
for item in weather_data:
if item['vaatlus_periood_lopp'] == "3999-12-31T23:59:00":
weather_stations.append({
'jaam_kood': item['jaam_kood'],
'jaam_nimi': item['jaam_nimi'],
'jaam_nimi_eng': item['jaam_nimi_eng'],
'lat': item['laiuskraad'],
'lon': item['pikkuskraad'],
'korgus_merepinnast_m': item['korgus_merepinnast_m'],
'vaatlus_periood_lopp': item['vaatlus_periood_lopp']
})
## Lisame muud taustandmed mida on vaja kaardi tegemiseks
# https://register.keskkonnaportaal.ee/register/internationally-important-area/8957851
# Urlid mida kasutada WMS teenuste puhul
# ma_alus = "https://kaart.maaamet.ee/wms/hallkaart"
eelis = "https://gsavalik.envir.ee/geoserver/eelis/ows"
## Teeme valmis kaardi foliumiga
# Tekitame kaardiobjekti, mis on keskendatud Eesti alale
m = folium.Map(location=[58.5953, 25.0136], zoom_start=8,tiles=None)
# Lisame kaardile hüdromeetriajaamad
for station in hydro_stations:
folium.Marker(
location=[station['lat'], station['lon']],
popup=(
f"Jaama nimi: {station['jaam_nimi']}<br>"
f"Veekogu nimi: {station['veekogu_nimi']}<br>"
f"Valgala nimi: {station['valgala_nimi']}<br>"
f"Valgala suurus km2: {station['valgala_suurus_km2']}<br>"
f"Kaugus suudmest km: {station['kaugus_suudmest_km']}<br>"
),
icon=folium.Icon(color='blue', icon='info-sign')
).add_to(m)
# Lisame kaardile meteoroloogiajaamad
for station in weather_stations:
folium.Marker(
location=[station['lat'], station['lon']],
popup=(
f"Jaama nimi: {station['jaam_nimi']}<br>"
f"Jaama nimi (eng): {station['jaam_nimi_eng']}<br>"
f"Jaama kood: {station['jaam_kood']}<br>"
f"Jaama kõrgus merepinnast (m): {station['korgus_merepinnast_m']}<br>"
),
icon=folium.Icon(color='green', icon='cloud')
).add_to(m)
# # Lisame kaardile MA aluskaardi WMS teenuse
# folium.raster_layers.WmsTileLayer(
# url=ma_alus,
# name='Hallkaart',
# fmt='image/png',
# transparent=True,
# layers='MA-HALLKAART',
# overlay=True,
# control=True
# ).add_to(m)
folium.raster_layers.TileLayer(
tiles='openstreetmap',
transparent=True,
opacity=0.5,
overlay=True,
name='Open street aluskaart'
).add_to(m)
# Lisame kaardile vooluveekogude WMS teenuse
folium.raster_layers.WmsTileLayer(
url=eelis,
name='Vooluvesi',
fmt='image/png',
transparent=True,
layers='eelis:kr_vooluvesi',
overlay=True,
control=True
).add_to(m)
# Lisame kaardile järvede WMS teenuse
folium.raster_layers.WmsTileLayer(
url=eelis,
name='Järved',
fmt='image/png',
transparent=True,
layers='eelis:kr_jarv',
overlay=True,
control=True
).add_to(m)
# Lisame kaardile Ramsari alade WMS teenuse
folium.raster_layers.WmsTileLayer(
url=eelis,
name='Kaitseala',
fmt='image/png',
transparent=True,
layers='eelis:kr_ramsar',
overlay=True,
control=True
).add_to(m)
# Lisame kaardile Soomaa rahvuspargi külastuskeskuse
folium.Marker(
location=[58.431158, 25.031412],
popup=(
f"Soomaa rahvuspargi külastuskeskus<br>"
f"<b><a href='https://loodusegakoos.ee/kuhuminna/rahvuspargid/soomaa-rahvuspark/10764/'>Külastuskeskuse info</a></b><br>"
f"<b><a href='https://loodusegakoos.ee/kuhuminna/rahvuspargid/soomaa-rahvuspark/1268/'>Kopraraja lisainfo</a></b><br>"
f"Pikkuskraad: 25.031412<br>"
f"Laiuskraad: 58.431158<br>"
),
icon=folium.Icon(color='red', icon='info-sign')
).add_to(m)
# Lisame legendi
legend_html = '''
<div style="position: fixed;
bottom: 50px; left: 50px; width: 200px; height: 150px;
background-color: white; z-index:9999; font-size:14px;">
<b>Legend</b><br>
Blue: Hydro Station <br>
Green: Weather Station <br>
Red: Soomaa Center<br>
WMS layers: Hallkaart, Vooluvesi, Järved, Kaitseala<br>
</div>
'''
m.get_root().html.add_child(folium.Element(legend_html))
# Lisame kihtide sisse/välja lülitamise funktsionaalsuse
folium.LayerControl().add_to(m)
# Salvestame kaardi HTML failina
m.save("map_with_layers.html")
# Kuvame kaardi (kui kasutate Jupyter Notebooks)
m