Lynnedslagsdata fra MET, del 3 – analyse

I «Skaff og bruk lynnedslagsdata fra MET, hentet vi ned lyndata fra Meteorologisk institutt og filtrerte ut så bare registeringene av lynnedslag ble vist. Nå skal vi bruke usikkerhetsellipsene som finnes i datasettet for å se om noe av interesse kan ha blitt truffet av lyn.

NORSAR har noen seismiske stasjoner i Innlandet hvor sensorer over et stort område er koblet sammen med et dedikert kablet nett. Av og til detter en sensor ut, dette kan være forårsaket av et lynnedslag som har truffet kabelene. Da er det interessant å se om dette kan ha skjedd.

Kartet viser et utsnitt av NORSARs kabler sammen med lynnedslag for en valgt periode

Lyndataene har en usikkerhetsellipse, om denne overlapper en kabel, tolkes det som et mulig lynnedslag i kabelen. I QGIS finnes funksjonen «Geometry by expression» under «Vector geometry» i Processing Toolbox. Her kan vi kjøre funksjonen make_ellipse som trenger argumentene «major semi axis», «minor semi axis» og angle som vi kan hente fra lyndatasettet. Det er bare et lite problem, for at dette skal fungere må datasettet være lagret i en projeksjon med meter som enhet. Dataene som er hentet inn fra MET er i geografisk projeksjon med grader som enhet.

Første trinn er å få ønsket projeksjon på datasettet. Åpne Processing – Toolbox og finn «Reproject Layer» under «Vector General». Velg laget med lyndata og en passende projeksjon – gjerne UTM med riktig sone, i mitt tilfelle med data fra Hedmarken velger jeg ETRS89 UTM zone 32N.

«Reprojected» velger hvordan det nye laget skal lagres. Ved å la det stå som [Create temporary layer] lages et midlertidig lag som forsvinner når QGIS avsluttes. Trykk «Run» for å lage det nye midlertidige laget.

Fra lagoversikten i QGIS etter at jeg har kjørt «Reproject Layer» Ikonet i høyre kant ved «Reprojected» viser at det er et midlertidig lag

Da er neste trinn å lage ellipsene. Gå til Processing Toolbox igjen, finn Vector Geometry og Geometry by expression under denne. Velg det reprojiserte laget og skriv inn make_ellipse($geometry,major*1000,minor*1000,angle) i Geometry Expression. (Dette forutsetter at lynlaget er definert som beskrevet i del 1). Aksene må multipliseres med 1000 siden de er oppgitt i km og vi trenger dem i meter. Trykk eventuelt på sigma-knappen ved siden av for å få opp en større formeleditor med mulighet til å velge felter og andre parametere.

Trykk «Run» og vi får et nytt midlertidig lag «Modified geometry»

Lynnedslag med usikkerhetsellipser. De fleste har den ideelle systemusikkerheten på 200 meter, mens et par har registeringer som gir en høyere usikkerhet langs en akse.

Nå er vi en standard overlay unna å se hvilke kabler som kan ha blitt truffet av lynnedslag. Bruk Vector, Geoprocessing Tools, Intersection. Jeg velger kartet med kabler som input layer og kartet med usikkerhetsellipsene som Overlay layer.

Når dette kjøres, får vi et nytt midlertidig lag – «Intersection». Dette viser at i dette tilfellet var en kabel i faresonen, selv om akkurat dette tordenværet ikke gav noen driftsforstyrrelser.

Et kabelstrekk var i faresonen under dette tordenværet

Alt arbeidet som er gjort er lagret i midlertidige lag som forsvinner når QGIS avsluttes. Dersom vi ønsker å ta vare på noen av disse lagene, høyreklikk på det midlertidige laget, velg «Make permanent» og lagre det som et passende geodatasett. Eventuelt for postgis eller andre geodatabasebrukere: Gå til DB Manager, velg aktuell database (og schema for postgis, og muligens for andre) og «Import layer file».

Kommer snart: Hvordan få dataene rett inn i postgis og går det montro an å lage en animasjon ut av dette? – stay tuned.

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.