Lyndata fra MET, del 2 – sanntidsdata

Jeg har fortsatt planer om å skrive om analyse, lagring og animasjon av de arkiverte lyndataene fra Meteorologisk Institutt, men jeg fikk litt inside informasjon om at det finnes en SSE server på lyn.met.no/events som sender ut i sanntid de samme dataene som vises på lyn.met.no. Denne spytter ut fortløpende forenklede lyndata i et tekstformat som ser ut som dette:

event: lx
data: [{"Epoch":"2021-06-18T20:53:00.750210304Z","Point":[6.6587,55.3577]}]
data: [{"Epoch":"2021-06-18T20:53:00.752313088Z","Point":[6.6807,55.3637]}]
: heartbeat

(heartbeat blir sendt ut når det har gått for lang tid uten lyndata)

Dette var litt for kult til å la ligge…

For å få dette inn i QGIS, må vi ha en prosess som går i bakgrunnen og oppdaterer et datasett. Vi kan få til dette ved å bruke prosesseringsgrensesnittet. Det første forsøket var med å kjøre kode direkte i pythonkonsollet. Dette fungerte som et «proof of concept» for å få inn data, men var ellers fullstendig ubrukelig da pythonkonsollet kjører i samme tråd som brukerinterfacet så programmet var fullstendig uresponsivt mens scriptet kjørte…

Først av alt må vi opprette et lag som dataene kan legges inn i. Laget må lagre punkter og ha to felt. Et felt fid, integer og et felt Epoch, tekst, minst 30 tegn. (Noen dataformater forlanger at det finnes en feltid, fid). Når dette kartlaget er satt opp, kan prosesseringsscriptet kjøres. Last ned http://qgis.no/filer/lynprocess.py og åpne dette i prosesseringsverktøykassen.

Scriptet vil bli åpnet i et editor-vindu. Trykk på den grønne startpilen for å starte opp, da kommer prosesseringsdialog, velg kartlaget som ble laget og start prosesseringen. Hvis det er tordenværområder innen Skandinavia, vil lynregistreringene begynne å komme opp på kartet som punkter.

For å få et plott tilsvarende lyn.met.no, må det kontinuerlig beregnes hvor gamle registeringene er. Dette kan gjøres med et kalkulert felt. Gå inn i attributt-tabellen. Trykk ctrl-i eller kulerammeikonet for å åpne feltkalkulatoren. Hak av for å opprette et virtuelt felt, gi det et passende navn, «Age» for eksempel, og velg «Rediger funksjon»-fanen. Fjern alt som står i det øverste tekst-vinduet og skriv inn:

from qgis.core import *
from qgis.gui import *
from datetime import datetime

@qgsfunction(args='auto', group='Custom')
def ageOfEvent(value, feature, parent):
    """
    reads value as a timestamp, calculates age
    2021-06-20T18:39:48.624772864Z
    """
    eventtime=dt_object1 = datetime.strptime(value[:25], "%Y-%m-%dT%H:%M:%S.%f")
    age=(datetime.utcnow()-eventtime).total_seconds()
    return(age)

(I funksjonen kutter jeg nøyaktigheten på registeringstidspunktet fra nanosekunder til mikrosekunder siden dette er oppløsningen et python timestamp har, det er greit nok for det det skal brukes til her)

Trykk «Lagre og last funksjoner» og gå tilbake til Uttrykk. Skriv så inn

ageOfEvent("Epoch")

Hvis dette har fungert som det skal, skal det stå et tall i forhåndsvisningen nederst. Dette er alderen på en av registeringene i sekunder. Dette tallet kan brukes som grunnlag for en gradert symbologi.

0-46 sekunder er en stor gul ring – grensene er tilfeldige verdier fra datasettet jeg hadde inne da jeg satt det opp

Ved å gå på «Styr objektenes opptegningsrekkefølge» kan vi sørge for at de nyeste registreringene alltid kommer øverst. Sett uttrykk til «Epoch» og Stigende/Synkende til Stigende.

Finn fram popcornet og vent på tordenværet… Dataene i videoen under blinker litt. Det skyldes sannsynligvis at OSM er et litt for tungt bakgrunnskart for denne bruken. Tekstterminalen med gul bakgrunn kjører et python script som viser rådataene som kommer inn, QGIS prosesseringsvinduet som ligger halvveis i bakgrunnen viser tidspunkt for siste registering. Dette er kommentert ut i scriptet slik det ligger for nedlasting.

Dersom jeg skulle hatt dette systemet i drift, ville jeg sannsynligvis valgt å splitte det i to: En prosess som kjører og lytter til lyn.met.no/events og lagrer eventene fortløpende for eksempel i en postgis tabell. Deretter kan det settes opp et prosjekt i QGIS som leser dette datasettet og oppdaterer med passende frekvens. Dette vil sannsynligvis gi noe som er enklere å vedlikeholde, men en en ren QGIS-løsning vil ofte være enklere og raskere å få opp. Det kan sannsynligvis også være en ide å legge til et system i innlesingsprosessen som sletter data som har blitt for gamle, eldre enn en eller to timer for eksempel. Skal man bruke historiske lyndata er jo disse tilgjengelige som beskrevet i Skaff og bruk lynnedslagsdata fra MET, disse dataene inneholder også mer metainformasjon.