Skip to article frontmatterSkip to article content
Sensorjournalistikk

Analyse med DuckDB πŸ¦†

Medieklyngen

Sanntidsdata er et svΓ¦rt nyttig verktΓΈy for Γ₯ orientere seg om ΓΈyeblikksbildet – hva som skjer her og nΓ₯. Det er ogsΓ₯ fint Γ₯ kunne spole tilbake i tid for Γ₯ se hvordan situasjonen sΓ₯ ut for fem, ti og femten minutter siden – eller i gΓ₯r, forrige uke og kanskje i fjor sommer.

Samtidig er det situasjoner hvor vi kanskje vet hva vi ser etter, eller hvor vi skal se, men ikke nΓΈdvendigvis vet nΓ₯r det riktige tidspunktet er. Vi har kanskje hex-koden til et fly vi vet har passert over Norge, men ikke tidspunktet. Hvor har politihelikopteret flydd den siste uken? Og hvilke helikoptre har blitt observert i et gitt geografisk omrΓ₯de?

For Γ₯ kunne jobbe effektivt med denne typen spΓΈrsmΓ₯l og problemstillinger, trenger vi et verktΓΈy som kan hΓ₯ndtere store mengder historiske data effektivt. Til dette skal vi bruke DuckDB.

Hva er DuckDB?ΒΆ

DuckDB er en lettvekts, relasjonell analytisk database optimalisert for analyse av store datamengder. Den er designet med fokus pΓ₯ ytelse, enkelhet og fleksibilitet, noe som gjΓΈr den svΓ¦rt velegnet for datajournalistisk analyse – for eksempel av store skips- og flytrafikkdatasett.

DuckDB kjΓΈrer lokalt pΓ₯ datamaskinen din, noe som betyr at du ikke trenger Γ₯ sette opp en kompleks server for Γ₯ hΓ₯ndtere dataene. Hvis du allerede har gjort de tekniske forberedelsene tidligere i dette kompendiet, har du alt du trenger pΓ₯ datamaskinen din for Γ₯ komme i gang.

DuckDB kan integreres direkte med verktΓΈy som Python og R, noe som gir oss muligheten til Γ₯ kombinere SQL-spΓΈrringer med andre dataanalyseverktΓΈy og biblioteker. Dette er svΓ¦rt nyttig for Γ₯ lage datadrevne historier som involverer statistisk analyse eller visualiseringer. Og hvis du trives i Excel, er det enkelt Γ₯ eksportere et filtrert datasett direkte til dette verktΓΈyet.

DuckDB, Parquet og historiske dataΒΆ

SΓ₯ hvordan fΓ₯r vi historiske data inn i DuckDB? Det finnes en rekke kilder tilgjengelig, bΓ₯de Γ₯pne og gratis og betalte og lukkede. For flytrafikk har f.eks. Medieklyngen et stort og avansert datasett som oppdateres i sanntid som tilbys til redaksjoner og journalister.

Siden vi har begrenset tid i dag, fokuserer vi pΓ₯ AIS-data levert av Kysverkets HAIS – Historisk AIS. Men teknikkene vi bruker fungerer akkurat like bra pΓ₯ flydata, og andre store datasett.

Dataene vi skal benytte oss av, er lagret i Parquet-formatet. Dette er et spesialisert dataformat som er utviklet for Γ₯ hΓ₯ndtere store datamengder effektivt gjennom optimalisering og komprimering.

I motsetning til radbaserte formater som CSV og Excel, lagrer Parquet data kolonnevis. Dette gir flere fordeler ved analyse av store datasett, siden det blir raskere Γ₯ hente ut og komprimere spesifikke kolonner. For fly- og skipsdata, som ofte inneholder mange attributter som posisjon, hastighet og hΓΈyde, gjΓΈr Parquet det enkelt Γ₯ trekke ut og behandle relevante felter, noe som gir betydelige ytelsesforbedringer sammenlignet med radbaserte formater.

Parquet-filer kan leses av mange ulike verktΓΈy og programmeringssprΓ₯k, noe som gir stor fleksibilitet. For eksempel kan Parquet-filer behandles i verktΓΈy som Apache Spark, Hadoop, Presto, Amazon Athena og DuckDB. Dette gir en robust og skalerbar lΓΈsning som er klargjort for fremtidig vekst i datamengdene. Den gode nyheten er at du ikke trenger Γ₯ forholde deg til denne kompleksiteten med mindre du ΓΈnsker Γ₯ gΓ₯ i dybden pΓ₯ et senere tidspunkt.

SpΓΈrresprΓ₯ket SQLΒΆ

DuckDB benytter det veletablerte spΓΈrresprΓ₯ket SQL. SQL har rΓΈtter tilbake til 1970-tallet, da det ble utviklet av IBM for Γ₯ hΓ₯ndtere data i relasjonsdatabaser. SprΓ₯ket er intuitivt bygget opp og relativt enkelt Γ₯ lΓ¦re seg pΓ₯ et grunnleggende nivΓ₯.

I DuckDBs SQL-dialekt bruker du enkle kommandoer for Γ₯ hente, manipulere og analysere data fra tabeller. Den grunnleggende strukturen bestΓ₯r av kommandoer som SELECT, som brukes for Γ₯ hente spesifikke kolonner fra en tabell, og FROM, som angir hvilken tabell (datakilde) du henter data fra. Du kan ogsΓ₯ bruke WHERE for Γ₯ filtrere dataene basert pΓ₯ bestemte kriterier.

Grunnstrukturen er:

SELECT [kolonner]
FROM [tabell]
WHERE [betingelser];

For eksempel kan en spΓΈrring se slik ut:

SELECT * FROM flights WHERE altitude > 10000;

Hente historiske dataΒΆ

HAIS tilbyr flere mΓ₯ter Γ₯ sΓΈke etter fartΓΈy pΓ₯ – enten geografisk eller basert pΓ₯ fartΓΈyinformasjon. FΓΈr vi starter, mΓ₯ vi ta stilling til:

Figur 1: Kystverket HAIS.

NΓ₯r disse valgene er gjort, kan vi begynne sΓΈket.

SkipstypeΒΆ

Hvis du kjenner skipstypen du vil filtrere pΓ₯, men ikke fartΓΈyets navn, kan du bruke skipstype-feltet. Du kan filtrere pΓ₯ blant annet:

Figur 2: SΓΈk pΓ₯ skipstype i HAIS.

SkipΒΆ

Hvis du kjenner navnet pΓ₯ fartΓΈyet, eller har MMSI, IMO eller kallesignal, kan du sΓΈke direkte. Skriver du inn Richard With, fΓ₯r du opp relevante treff. Du kan filtrere pΓ₯ flere fartΓΈy samtidig eller laste opp en CSV-liste.

Figur 3: SΓΈk pΓ₯ skip i HAIS.

KartutsnittΒΆ

Du kan avgrense sΓΈket geografisk ved Γ₯ tegne et omrΓ₯de i kartverktΓΈyet, eller ved Γ₯ laste opp en WKT-fil med polygon. Tjenesten tilpasser automatisk omrΓ₯det til dekningen som er tilgjengelig.

Figur 4: SΓΈk pΓ₯ geografisk omrΓ₯de.

KjΓΈring av sΓΈkΒΆ

NΓ₯r du er fornΓΈyd med sΓΈkeparametrene, trykker du Send inn. Systemet validerer sΓΈket basert pΓ₯ geografisk omrΓ₯de og tidsrom. Hvis du fΓ₯r feilmelding, har du trolig sΓΈkt for bredt – snevre inn sΓΈket i tid eller rom.

Godkjente sΓΈk blir satt i kΓΈ. Du mottar en e-post nΓ₯r dataene er klare. Tiden det tar, varierer etter sΓΈkets stΓΈrrelse og trafikk pΓ₯ systemet.

Analyse av dataeneΒΆ

Etter en stund fΓ₯r du e-post med lenker til zip-filer som inneholder Parquet-filer. Pakk dem ut og legg dem i en lett tilgjengelig mappe.

Neste steg er Γ₯ importere dataene i et verktΓΈy som DuckDB. Dette minner om arbeidsflyten vi brukte for ADS-B-data, med noen mindre forskjeller i datastruktur og import.

DatastrukturΒΆ

Kystverket benytter spesifikasjonen GeoParquet 1.0.0 til de historiske dataene. Her er Kystverkets egen beskrivelse datastrukturen:

KolonnerMeldingstypeDatatypeBeskrivelse
date_time_utc1,2,3,5,18,24,27DateTimeTidsstempel i UTC
mmsi1,2,3,5,18,27IntegerMaritime Mobile Service Identity-nummer (ID pΓ₯ fartΓΈyets transponder)
longitude1,2,3,18,27FloatLengdegrad
latitude1,2,3,18,27FloatBreddegrad
status1,2,3,18,27IntegerSkipets navigasjonsstatus (les mer)
course_over_ground1,2,3,18,27FloatFartΓΈyets kurs over bakken i henhold til kompassnord.
true_heading1,2,3,18,27IntegerDen retningen fartΓΈyet peker i henhold til kompassnord (0-359 grader)
speed_over_ground1,2,3,18,27FloatFartΓΈyets fart i knop
rate_of_turn1,2,3,18,27FloatRotasjonsrate
maneuvre1,2,3,18,27IntegerManΓΈverinformasjon
imo5,24IntegerSkrogets IMO-nummer (satt av International Maritime Organization).
callsign5,24StringRadiokallesignal
ship_name5,24StringSkipets navn
ship_type5,24IntegerSkipstype fra AIS
length5,24FloatLengde pΓ₯ skipet
draught5,24FloatSkipets dypgang
data_sourceGenerert kolonneStringDatakilde (g: bakkestasjon, s: satelitt)
date_utcGenerert kolonneDateDato-kolonne for filtrering pΓ₯ kun dato X
geometryGenerert kolonneStringGeometri-kolonne i WKB-format generert av ST_Point(lon, lat)
hex_14Generert kolonneIntegerH3-id for meldingens posisjon i opplΓΈsning 14

Her er det mye som minner oss om det vi har sett pΓ₯ tidligere. Vi merker oss felter for data/tid, registreringsnummer (mmsi), posisjon, status, og flere av de aktuelle punktene vi har sett pΓ₯ tidligere kapitler. Dette er nyttig. Vi ser ogsΓ₯ at det er en egen kolonne for geometri, og H3-id med opplΓΈsning 14. Dette er kjent materie for oss nΓ₯, og noe vi kan dra nytte av med det samme.

Analyse i DuckDBΒΆ

  1. Γ…pne Terminal (Mac/Linux) eller PowerShell (Windows), og naviger til mappen der du pakket ut Parquet-filene.

  2. Start DuckDB med fΓΈlgende kommando:

duckdb geoparquet-hais.db

DuckDB starter med et prompt som ser noenlunde slik ut:

v1.2.1 8e52ec4395
Enter ".help" for usage hints.
D

Installer og last inn utvidelserΒΆ

Dersom du ikke allerede har gjort det i tidligere kapitler, installerer du nΓΈdvendige utvidelser slik:

INSTALL httpfs;
INSTALL spatial;
INSTALL h3 FROM community;

Last dem deretter inn:

LOAD httpfs;
LOAD spatial;
LOAD h3;

Last inn dataΒΆ

Siden filene ligger lokalt, bruker vi fΓΈlgende kommando for Γ₯ opprette tabellen haisdata:

CREATE TABLE haisdata AS SELECT * FROM '*.parquet';

Dette leser inn alle .parquet-filer i mappen og legger dem i Γ©n tabell.

Utforske datasettetΒΆ

Sjekk datastrukturen med:

DESCRIBE haisdata;

Du vil se kolonner for tid, posisjon, kurs, fart, skipstype, navn og andre kjente parametre – inkludert geometri og H3-ID.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    column_name     β”‚  column_type  β”‚  null   β”‚   key   β”‚ default β”‚  extra  β”‚
β”‚      varchar       β”‚    varchar    β”‚ varchar β”‚ varchar β”‚ varchar β”‚ varchar β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ date_time_utc      β”‚ TIMESTAMP     β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ mmsi               β”‚ INTEGER       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ longitude          β”‚ DOUBLE        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ latitude           β”‚ DOUBLE        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ status             β”‚ TINYINT       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ course_over_ground β”‚ DOUBLE        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ true_heading       β”‚ SMALLINT      β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ speed_over_ground  β”‚ DOUBLE        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ rate_of_turn       β”‚ SMALLINT      β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ maneuvre           β”‚ SMALLINT      β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ imo                β”‚ INTEGER       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ callsign           β”‚ VARCHAR       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ ship_name          β”‚ VARCHAR       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ ship_type          β”‚ TINYINT       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ length             β”‚ SMALLINT      β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ draught            β”‚ DECIMAL(10,2) β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ data_source        β”‚ VARCHAR       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ ais_class          β”‚ VARCHAR       β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ hex_7              β”‚ BIGINT        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ hex_14             β”‚ BIGINT        β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”‚ geometry           β”‚ BLOB          β”‚ YES     β”‚         β”‚         β”‚         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 21 rows                                                          6 columns β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Antall datapunkterΒΆ

Tell antall rader i datasettet:

SELECT count(*) FROM haisdata;
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ count_star() β”‚
β”‚    int64     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚       236934 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

EksempelradΒΆ

Se ett datapunkt:

SELECT * FROM haisdata LIMIT 1;
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    date_time_utc    β”‚   mmsi    β”‚ longitude  β”‚ latitude β”‚ status β”‚ course_over_ground β”‚ true_heading β”‚ speed_over_ground β”‚ rate_of_turn β”‚ maneuvre β”‚   imo   β”‚ callsign β”‚      ship_name       β”‚ ship_type β”‚ length β”‚    draught    β”‚ data_source β”‚ ais_class β”‚       hex_7        β”‚       hex_14       β”‚                            geometry                            β”‚
β”‚      timestamp      β”‚   int32   β”‚   double   β”‚  double  β”‚  int8  β”‚       double       β”‚    int16     β”‚      double       β”‚    int16     β”‚  int16   β”‚  int32  β”‚ varchar  β”‚       varchar        β”‚   int8    β”‚ int16  β”‚ decimal(10,2) β”‚   varchar   β”‚  varchar  β”‚       int64        β”‚       int64        β”‚                              blob                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2025-03-12 19:51:43 β”‚ 257600000 β”‚ 4.02070333 β”‚ 60.85677 β”‚      0 β”‚              182.2 β”‚          178 β”‚              13.3 β”‚           14 β”‚        0 β”‚ 9854478 β”‚ LAGH7    β”‚ SYDSTRAUM            β”‚        80 β”‚    129 β”‚          6.00 β”‚ G           β”‚ A         β”‚ 608156020115505151 β”‚ 639681217504175135 β”‚ \x00\x00\x00\x00\x01@\x10\x153@\xF5\x12\xBC@Nm\xAA\xA3\xAD\x…  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Antall og oversikt over fartΓΈyΒΆ

Finn unike fartΓΈy i datasettet:

SELECT DISTINCT(mmsi), callsign, ship_name FROM haisdata ORDER BY ship_name;
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   mmsi    β”‚ callsign β”‚      ship_name       β”‚
β”‚   int32   β”‚ varchar  β”‚       varchar        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 235076245 β”‚ 2CVX9    β”‚  EDZARD SCHULTE      β”‚
β”‚ 247302900 β”‚ ICPE     β”‚ AIDASOL              β”‚
β”‚ 244120000 β”‚ PCYH     β”‚ ANTEOS               β”‚
β”‚ 244120000 β”‚ P C Y H  β”‚ ANTEOS               β”‚
β”‚ 636020363 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚
β”‚ 636023947 β”‚ 5LQF3    β”‚ ASPEN                β”‚
β”‚ 246598000 β”‚ PBTQ     β”‚ BEATRIX              β”‚
β”‚ 209356000 β”‚ 5BBK5    β”‚ BORIS DAVYDOV        β”‚
β”‚ 255806224 β”‚ CQAN6    β”‚ BOTHNIA              β”‚
β”‚ 257619000 β”‚ LFGV     β”‚ CAPRICE              β”‚
β”‚ 255805753 β”‚ CQCC     β”‚ CHRISTIAN ESSBERGER  β”‚
β”‚ 215349000 β”‚ 9HA2707  β”‚ CSL TRIMNES          β”‚
β”‚ 311023800 β”‚ C6XW3    β”‚ DEEP ARCTIC          β”‚
β”‚ 310767000 β”‚ ZCEC8    β”‚ DEEPSEA STAVANGER    β”‚
β”‚ 257089140 β”‚ LAIX8    β”‚ EAGLE BLANE          β”‚
β”‚ 538006249 β”‚ V7LA9    β”‚ ECO ROYALTY          β”‚
β”‚ 259665000 β”‚ JWMZ3    β”‚ EDDA FAUNA           β”‚
β”‚ 231700000 β”‚ OZ2077   β”‚ ELDBORG              β”‚
β”‚ 305530000 β”‚ V2ER8    β”‚ FITNES               β”‚
β”‚ 220151000 β”‚ OWQD     β”‚ FRIDA AMALIE         β”‚
β”‚     Β·     β”‚    Β·     β”‚          Β·           β”‚
β”‚     Β·     β”‚    Β·     β”‚          Β·           β”‚
β”‚     Β·     β”‚    Β·     β”‚          Β·           β”‚
β”‚ 257297000 β”‚ LLUO     β”‚ REM STAR             β”‚
β”‚ 310805000 β”‚ ZCEZ8    β”‚ RENAISSANCE          β”‚
β”‚ 311000627 β”‚ C6DB3    β”‚ RUDOLF SAMOYLOVICH   β”‚
β”‚ 231850000 β”‚ OZ2076   β”‚ SAEBORG              β”‚
β”‚ 232419000 β”‚ MZHR7    β”‚ SEVEN NAVICA         β”‚
β”‚ 257286000 β”‚ LDZH     β”‚ SIEM PEARL           β”‚
β”‚ 209190000 β”‚ 5BXG4    β”‚ SIF W                β”‚
β”‚ 253309000 β”‚ LXUB     β”‚ SIMON STEVIN         β”‚
β”‚ 259888000 β”‚ LAHA7    β”‚ STAVFJORD            β”‚
β”‚ 538010467 β”‚ V7A6081  β”‚ STI MYSTERY          β”‚
β”‚ 538006343 β”‚ V7MB8    β”‚ STI SPIGA            β”‚
β”‚ 246695000 β”‚ PCKX     β”‚ STORNES              β”‚
β”‚ 258527000 β”‚ JWRE     β”‚ STRIL MAR            β”‚
β”‚ 257129000 β”‚ LGLA     β”‚ STRIL MERKUR         β”‚
β”‚ 257600000 β”‚ LAGH7    β”‚ SYDSTRAUM            β”‚
β”‚ 241456000 β”‚ SVCL8    β”‚ THOMAS ZAFIRAS       β”‚
β”‚ 258390000 β”‚ LLVY     β”‚ VIKING ENERGY        β”‚
β”‚ 257271000 β”‚ LACZ8    β”‚ VOLANTIS             β”‚
β”‚ 257970000 β”‚ LAUR5    β”‚ XANTHIA              β”‚
β”‚ 311000634 β”‚ C6DC2    β”‚ YAKOV GAKKEL         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 75 rows (40 shown)                3 columns β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Se hvor mange datapunkter hvert fartΓΈy har:

SELECT mmsi, callsign, ship_name, COUNT(*) AS count
FROM haisdata
GROUP BY ALL
ORDER BY count DESC;
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”
β”‚   mmsi    β”‚ callsign β”‚      ship_name       β”‚ count β”‚
β”‚   int32   β”‚ varchar  β”‚       varchar        β”‚ int64 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 258390000 β”‚ LLVY     β”‚ VIKING ENERGY        β”‚ 24621 β”‚
β”‚ 257129000 β”‚ LGLA     β”‚ STRIL MERKUR         β”‚ 17671 β”‚
β”‚ 257105000 β”‚ LMEL     β”‚ G.O.SARS             β”‚ 16976 β”‚
β”‚ 257271000 β”‚ LACZ8    β”‚ VOLANTIS             β”‚ 16387 β”‚
β”‚ 231700000 β”‚ OZ2077   β”‚ ELDBORG              β”‚ 11514 β”‚
β”‚ 636023947 β”‚ 5LQF3    β”‚ ASPEN                β”‚  9821 β”‚
β”‚ 220151000 β”‚ OWQD     β”‚ FRIDA AMALIE         β”‚  9787 β”‚
β”‚ 538006343 β”‚ V7MB8    β”‚ STI SPIGA            β”‚  7860 β”‚
β”‚ 259014300 β”‚ JXQO     β”‚ REBEKKA L            β”‚  6115 β”‚
β”‚ 258906000 β”‚ LDLA     β”‚ JUANITA              β”‚  5990 β”‚
β”‚ 259665000 β”‚ JWMZ3    β”‚ EDDA FAUNA           β”‚  5765 β”‚
β”‚ 231099000 β”‚ OZ2088   β”‚ HAV NES              β”‚  5487 β”‚
β”‚ 636020363 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚  5288 β”‚
β”‚ 219597000 β”‚ OZOI     β”‚ L56 ANNA LISE        β”‚  4758 β”‚
β”‚ 257438000 β”‚ LCCC     β”‚ HAVILA HEROY         β”‚  4239 β”‚
β”‚ 257600000 β”‚ LAGH7    β”‚ SYDSTRAUM            β”‚  3430 β”‚
β”‚ 245974000 β”‚ PARE     β”‚ NATO WARSHIP A900    β”‚  3422 β”‚
β”‚ 231850000 β”‚ OZ2076   β”‚ SAEBORG              β”‚  3396 β”‚
β”‚ 258895000 β”‚ LDAD     β”‚ NORTH POMOR          β”‚  3378 β”‚
β”‚ 257089140 β”‚ LAIX8    β”‚ EAGLE BLANE          β”‚  2968 β”‚
β”‚     Β·     β”‚   Β·      β”‚         Β·            β”‚    Β·  β”‚
β”‚     Β·     β”‚   Β·      β”‚         Β·            β”‚    Β·  β”‚
β”‚     Β·     β”‚   Β·      β”‚         Β·            β”‚    Β·  β”‚
β”‚ 310767000 β”‚ ZCEC8    β”‚ DEEPSEA STAVANGER    β”‚   961 β”‚
β”‚ 258277000 β”‚ LAVS7    β”‚ HANNE KNUTSEN        β”‚   934 β”‚
β”‚ 538010467 β”‚ V7A6081  β”‚ STI MYSTERY          β”‚   898 β”‚
β”‚ 230688000 β”‚ OJTF     β”‚ JATULI               β”‚   890 β”‚
β”‚ 258152000 β”‚ LAWE7    β”‚ NORDSTRAUM           β”‚   846 β”‚
β”‚ 255806224 β”‚ CQAN6    β”‚ BOTHNIA              β”‚   768 β”‚
β”‚ 257297000 β”‚ LLUO     β”‚ REM STAR             β”‚   768 β”‚
β”‚ 311023800 β”‚ C6XW3    β”‚ DEEP ARCTIC          β”‚   684 β”‚
β”‚ 538006249 β”‚ V7LA9    β”‚ ECO ROYALTY          β”‚   629 β”‚
β”‚ 248221000 β”‚ 9HA2267  β”‚ KEY SOUTH            β”‚   628 β”‚
β”‚ 266235000 β”‚ SJLF     β”‚ FURE WEST            β”‚   619 β”‚
β”‚ 205771000 β”‚ ONJY     β”‚ JOAN                 β”‚   541 β”‚
β”‚ 310805000 β”‚ ZCEZ8    β”‚ RENAISSANCE          β”‚   428 β”‚
β”‚ 259827000 β”‚ LGPE     β”‚ NORMAND SIGMA        β”‚   407 β”‚
β”‚ 211210150 β”‚ DRAA     β”‚ GERMAN WARSHIP F219  β”‚   166 β”‚
β”‚ 636092960 β”‚ D5XR2    β”‚ GW ELENI             β”‚   162 β”‚
β”‚ 257286000 β”‚ LDZH     β”‚ SIEM PEARL           β”‚    38 β”‚
β”‚ 257619000 β”‚ LFGV     β”‚ CAPRICE              β”‚    36 β”‚
β”‚ 236111791 β”‚ ZDKS2    β”‚ KEY BREEZE           β”‚    13 β”‚
β”‚ 253309000 β”‚ LXUB     β”‚ SIMON STEVIN         β”‚     8 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 75 rows (40 shown)                        4 columns β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

SΓΈk i geografisk omrΓ₯deΒΆ

H3ΒΆ

H3 er et geografisk rutenett-system utviklet av Uber for Γ₯ effektivisere og forenkle geografiske analyser. Systemet deler jordkloden inn i sekskantede celler, kjent som heksagoner, i motsetning til tradisjonelle rutemΓΈnstre basert pΓ₯ kvadrater. Hver heksagon har en unik identifikator (H3 ID) og kan representere geografiske omrΓ₯der med hΓΈy presisjon.

H3-rammeverket gir en mer naturlig tilnΓ¦rming til romlige analyser sammenlignet med kvadratiske rutenett, som ofte introduserer skjevheter pΓ₯ grunn av jordens krumning. En annen fordel med heksagoner er at de overlapper i svΓ¦rt liten grad, i motsetning til for eksempel sirkler.

H3 opererer med 15 ulike opplΓΈsninger. Lavere opplΓΈsninger dekker stΓΈrre omrΓ₯der, mens hΓΈyere opplΓΈsninger gir mer detaljerte inndelinger. Dette gjΓΈr det mulig Γ₯ skalere geografiske analyser etter behov – for eksempel kan man undersΓΈke et helt kontinent med grov opplΓΈsning eller et spesifikt nabolag med hΓΈy detaljgrad.

Et heksagon i H3 kan ogsΓ₯ grupperes med sine Β«foreldreΒ» pΓ₯ hΓΈyere nivΓ₯er. Dette betyr at man enkelt kan aggregere data for stΓΈrre omrΓ₯der ved Γ₯ slΓ₯ sammen flere smΓ₯ heksagoner til stΓΈrre enheter. Slike hierarkiske strukturer er nyttige for analyser pΓ₯ tvers av forskjellige geografiske skalaer.

Det er mulig Γ₯ oversette vanlige koordinater til H3-heksagoner direkte i DuckDB ved hjelp av innebygde funksjoner. Men Kystverket har vΓ¦rt sΓ₯ elskverdige at de allerede har gjort denne jobben for oss. Det betyr at vi enkelt kan sΓΈke etter trafikk i en gitt H3-celle. Merk at H3-ID-ene i HAIS lagres som tallverdier, sΓ₯ vi mΓ₯ konvertere dem til heksadesimal. Det gode nyheten er at vi kan gjΓΈre det direkte i spΓΈrringen.

Den observante deltaker merket seg kanskje at vi installerte og lastet inn H3-utvidelsen i starten av dette kapittelet med fΓΈlgende kommandoer:

INSTALL h3 FROM community;
LOAD h3;

Siden dette tillegget allerede er pΓ₯ plass, er det bare Γ₯ gΓ₯ i gang.

  1. Det fΓΈrste vi mΓ₯ gjΓΈre, er Γ₯ finne H3-sektoren til omrΓ₯det vi ΓΈnsker Γ₯ sΓΈke i. Til dette finnes det flere Γ₯pne lΓΈsninger, for eksempel denne: H3 Viewer.

  2. Finn omrΓ₯det du ΓΈnsker Γ₯ undersΓΈke, for eksempel Kristiansand. Etter hvert som du zoomer inn, vil du se at rutenettet av heksagoner endrer stΓΈrrelse. Velg et passende utsnitt hvor ett heksagon dekker omrΓ₯det du vil analysere. Noter Current H3 resolution ΓΈverst til hΓΈyre i skjermbildet.

  3. Klikk pΓ₯ ΓΈnsket heksagon. Denne kopieres da til utklippsboken din.

  4. KjΓΈr fΓΈlgende spΓΈrring, eventuelt tilpasset med din egen heksagon-ID og opplΓΈsning. OpplΓΈsningen spesifiserer du der det nΓ₯ stΓ₯r 4 (etter trace.h3_15), mens heksagon-ID-en settes til slutt pΓ₯ samme linje.

HAIS stΓΈtter H3-rammeverket, slik vi kjenner det fra tidligere kapitler. Det betyr at vi enkelt kan sΓΈke etter trafikk i en gitt H3-celle. Merk at H3-ID-ene i HAIS lagres som tallverdier, sΓ₯ vi mΓ₯ konvertere dem til heksadesimal.

  1. Finn ΓΈnsket H3-celle ved hjelp av et verktΓΈy som H3 Viewer.

  2. Bruk for eksempel 8409851ffffffff med opplΓΈsning 4. (Pass pΓ₯ Γ₯ velge et omrΓ₯de som er tilgjengelig i datasettet. Bruker du eksempelfilen fra tidligere, er den nevnte IDen et godt utgangspunkt.)

  3. KjΓΈr denne spΓΈrringen i DuckDB:

SELECT *
FROM haisdata
WHERE h3_cell_to_parent(to_hex(hex_14), 4) = '8409851ffffffff';

Du vil da fΓ₯ opp alle datapunkter som befinner seg innenfor den gitte H3-cellen:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    date_time_utc    β”‚   mmsi    β”‚ longitude  β”‚  latitude   β”‚ status β”‚ course_over_ground β”‚ true_heading β”‚ speed_over_ground β”‚ rate_of_turn β”‚ maneuvre β”‚   imo   β”‚ callsign β”‚      ship_name       β”‚ ship_type β”‚ length β”‚    draught    β”‚ data_source β”‚ ais_class β”‚       hex_7        β”‚       hex_14       β”‚                          geometry                           β”‚
β”‚      timestamp      β”‚   int32   β”‚   double   β”‚   double    β”‚  int8  β”‚       double       β”‚    int16     β”‚      double       β”‚    int16     β”‚  int16   β”‚  int32  β”‚ varchar  β”‚       varchar        β”‚   int8    β”‚ int16  β”‚ decimal(10,2) β”‚   varchar   β”‚  varchar  β”‚       int64        β”‚       int64        β”‚                            blob                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2025-03-12 23:59:57 β”‚ 636020363 β”‚ 3.99394833 β”‚   60.451285 β”‚      0 β”‚              193.8 β”‚          266 β”‚               2.1 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758256391 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\x9B.\x9A\x1CK@N9\xC3\xB4\xF…  β”‚
β”‚ 2025-03-12 23:59:47 β”‚ 636020363 β”‚ 3.99399666 β”‚ 60.45135666 β”‚      0 β”‚              195.8 β”‚          266 β”‚               2.0 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758258871 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\xB4\x85XD\x0F@N9\xC6\x0E\x1…  β”‚
β”‚ 2025-03-12 23:59:38 β”‚ 636020363 β”‚   3.994055 β”‚ 60.45143333 β”‚      0 β”‚              194.9 β”‚          267 β”‚               1.9 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758258927 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\xD3\x1B\x9Bf\xF9@N9\xC8\x91…  β”‚
β”‚ 2025-03-12 23:59:27 β”‚ 636020363 β”‚     3.9941 β”‚ 60.45150833 β”‚      0 β”‚              195.1 β”‚          267 β”‚               2.1 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234911 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\xEA\xB3g\xA0\xF9@N9\xCB\x06…  β”‚
β”‚ 2025-03-12 23:59:25 β”‚ 636020363 β”‚ 3.99410333 β”‚ 60.45151666 β”‚      0 β”‚              195.9 β”‚          267 β”‚               2.0 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234663 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\xECrY\x8E\xBD@N9\xCBLD&K      β”‚
β”‚ 2025-03-12 23:59:23 β”‚ 636020363 β”‚ 3.99412333 β”‚   60.451565 β”‚      0 β”‚              201.1 β”‚          268 β”‚               1.3 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234975 β”‚ \x00\x00\x00\x00\x01@\x0F\xF3\xF6\xEE\xB4S.@N9\xCC\xE1\xC…  β”‚
β”‚ 2025-03-12 23:59:18 β”‚ 636020363 β”‚ 3.99415166 β”‚ 60.45158166 β”‚      0 β”‚              200.1 β”‚          269 β”‚               1.9 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758233751 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\x05\xC9\x17\xB6\x80@N9\xCDm…  β”‚
β”‚ 2025-03-12 23:59:14 β”‚ 636020363 β”‚    3.99418 β”‚ 60.45161666 β”‚      0 β”‚              194.0 β”‚          269 β”‚               1.9 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758233743 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\x14\xA4\xD2\xB2\xC0@N9\xCE\…  β”‚
β”‚ 2025-03-12 23:59:13 β”‚ 636020363 β”‚   3.994185 β”‚ 60.45163166 β”‚      0 β”‚              196.2 β”‚          269 β”‚               1.6 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758233815 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\x17C\xE9c\xDC@N9\xCF\x10\xF…  β”‚
β”‚ 2025-03-12 23:59:08 β”‚ 636020363 β”‚ 3.99420833 β”‚ 60.45165666 β”‚      0 β”‚              200.5 β”‚          270 β”‚               1.8 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758233823 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4#\x7F6\x16\x12@N9\xCF\xE2\xA…  β”‚
β”‚ 2025-03-12 23:59:05 β”‚ 636020363 β”‚ 3.99423166 β”‚ 60.45167166 β”‚      0 β”‚              194.7 β”‚          270 β”‚               2.0 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758231911 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4/\xBA\x82\xC8G@N9\xD0`\x80\x…  β”‚
β”‚ 2025-03-12 23:59:04 β”‚ 636020363 β”‚   3.994235 β”‚   60.451685 β”‚      0 β”‚              194.7 β”‚          271 β”‚               2.0 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234519 β”‚ \x00\x00\x00\x00\x01@\x0F\xF41z\xCCN\xF9@N9\xD0\xD0g\x8C\…  β”‚
β”‚ 2025-03-12 23:58:58 β”‚ 636020363 β”‚   3.994265 β”‚ 60.45174333 β”‚      0 β”‚              195.9 β”‚          271 β”‚               1.9 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234119 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4A5Tu\xA3@N9\xD2\xB9\xB6D\xA0   β”‚
β”‚ 2025-03-12 23:58:56 β”‚ 636020363 β”‚ 3.99427833 β”‚ 60.45174333 β”‚      0 β”‚              193.8 β”‚          271 β”‚               2.1 β”‚         -127 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234119 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4H2s\xC5\xA0@N9\xD2\xB9\xB6D\…  β”‚
β”‚ 2025-03-12 23:58:47 β”‚ 636020363 β”‚   3.994325 β”‚    60.45182 β”‚      0 β”‚              196.8 β”‚          272 β”‚               2.0 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758234191 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4`\xAAd\xC2\xF8@N9\xD5<\xDD\x…  β”‚
β”‚ 2025-03-12 23:58:38 β”‚ 636020363 β”‚ 3.99437666 β”‚   60.451905 β”‚      0 β”‚              200.8 β”‚          273 β”‚               1.7 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758239087 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4{\xC0\x14\xD8\x7F@N9\xD8\x05…  β”‚
β”‚ 2025-03-12 23:58:27 β”‚ 636020363 β”‚ 3.99444166 β”‚ 60.45198666 β”‚      0 β”‚              204.8 β”‚          273 β”‚               2.0 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758237927 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\x9D\xD4;\xD6\xF1@N9\xDA\xB2…  β”‚
β”‚ 2025-03-12 23:58:18 β”‚ 636020363 β”‚   3.994515 β”‚ 60.45207333 β”‚      0 β”‚              207.1 β”‚          273 β”‚               1.7 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758238495 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\xC4G\xC3\x0D0@N9\xDD\x89\xF…  β”‚
β”‚ 2025-03-12 23:58:08 β”‚ 636020363 β”‚    3.99458 β”‚ 60.45214833 β”‚      0 β”‚              207.2 β”‚          273 β”‚               1.7 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619757651607 β”‚ \x00\x00\x00\x00\x01@\x0F\xF4\xE6[\xEA\x0B\xA2@N9\xDF\xFF…  β”‚
β”‚ 2025-03-12 23:57:58 β”‚ 636020363 β”‚ 3.99466166 β”‚   60.452235 β”‚      0 β”‚              205.4 β”‚          273 β”‚               1.8 β”‚            0 β”‚        0 β”‚ 9884801 β”‚ D5YW3    β”‚ AQUASMERALDA         β”‚        80 β”‚    182 β”‚          8.40 β”‚ G           β”‚ A         β”‚ 608153422381711359 β”‚ 639678619758284135 β”‚ \x00\x00\x00\x00\x01@\x0F\xF5\x11,\x22G\xD3@N9\xE2\xD6#\x…  β”‚
β”‚          Β·          β”‚     Β·     β”‚       Β·    β”‚       Β·     β”‚      Β· β”‚                 Β·  β”‚           Β·  β”‚                Β·  β”‚            Β· β”‚        Β· β”‚    Β·    β”‚  Β·       β”‚      Β·               β”‚         Β· β”‚      Β· β”‚            Β·  β”‚ Β·           β”‚ Β·         β”‚          Β·         β”‚          Β·         β”‚                              Β·                              β”‚
β”‚          Β·          β”‚     Β·     β”‚       Β·    β”‚       Β·     β”‚      Β· β”‚                 Β·  β”‚           Β·  β”‚                Β·  β”‚            Β· β”‚        Β· β”‚    Β·    β”‚  Β·       β”‚      Β·               β”‚         Β· β”‚      Β· β”‚            Β·  β”‚ Β·           β”‚ Β·         β”‚          Β·         β”‚          Β·         β”‚                              Β·                              β”‚
β”‚          Β·          β”‚     Β·     β”‚       Β·    β”‚       Β·     β”‚      Β· β”‚                 Β·  β”‚           Β·  β”‚                Β·  β”‚            Β· β”‚        Β· β”‚    Β·    β”‚  Β·       β”‚      Β·               β”‚         Β· β”‚      Β· β”‚            Β·  β”‚ Β·           β”‚ Β·         β”‚          Β·         β”‚          Β·         β”‚                              Β·                              β”‚
β”‚ 2025-03-13 19:16:16 β”‚ 219023236 β”‚   3.751666 β”‚   60.536666 β”‚      7 β”‚               97.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚ 9807786 β”‚ OXAB     β”‚ MYGGENES             β”‚        30 β”‚     33 β”‚          0.00 β”‚ S           β”‚ LRIT      β”‚ 608153424898293759 β”‚ 639678622280122647 β”‚ \x00\x00\x00\x00\x01@\x0E\x03iv\xBC\x1F\x00@ND\xB1x\xB3p\…  β”‚
β”‚ 2025-03-13 19:16:14 β”‚ 219023236 β”‚   3.751666 β”‚   60.536666 β”‚      7 β”‚               97.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚ 9807786 β”‚ OXAB     β”‚ MYGGENES             β”‚        30 β”‚     33 β”‚          0.00 β”‚ S           β”‚ LRIT      β”‚ 608153424898293759 β”‚ 639678622280122647 β”‚ \x00\x00\x00\x00\x01@\x0E\x03iv\xBC\x1F\x00@ND\xB1x\xB3p\…  β”‚
β”‚ 2025-03-13 00:08:05 β”‚ 209356000 β”‚   3.958333 β”‚   60.433333 β”‚      0 β”‚              174.0 β”‚              β”‚              13.0 β”‚              β”‚          β”‚ 9768394 β”‚ 5BBK5    β”‚ BORIS DAVYDOV        β”‚        84 β”‚    299 β”‚         12.10 β”‚ S           β”‚ LRIT      β”‚ 608153422868250623 β”‚ 639678620250946615 β”‚ \x00\x00\x00\x00\x01@\x0F\xAA\xAA}\xEDk\xA9@N7wt\xAB\xA3\…  β”‚
β”‚ 2025-03-13 00:05:06 β”‚ 209356000 β”‚   3.956666 β”‚      60.445 β”‚      0 β”‚              173.0 β”‚              β”‚              13.0 β”‚              β”‚          β”‚ 9768394 β”‚ 5BBK5    β”‚ BORIS DAVYDOV        β”‚        84 β”‚    299 β”‚         12.10 β”‚ S           β”‚ LRIT      β”‚ 608153422868250623 β”‚ 639678620245629839 β”‚ \x00\x00\x00\x00\x01@\x0F\xA7@\x80\xF9\x8F\xA3@N8\xF5\xC2…  β”‚
β”‚ 2025-03-13 00:05:06 β”‚ 209356000 β”‚   3.956666 β”‚      60.445 β”‚      0 β”‚              173.0 β”‚              β”‚              13.0 β”‚              β”‚          β”‚ 9768394 β”‚ 5BBK5    β”‚ BORIS DAVYDOV        β”‚        84 β”‚    299 β”‚         12.10 β”‚ S           β”‚ LRIT      β”‚ 608153422868250623 β”‚ 639678620245629839 β”‚ \x00\x00\x00\x00\x01@\x0F\xA7@\x80\xF9\x8F\xA3@N8\xF5\xC2…  β”‚
β”‚ 2025-03-13 23:59:20 β”‚ 219022165 β”‚ 3.81623666 β”‚ 60.42955666 β”‚      7 β”‚              212.6 β”‚          326 β”‚               0.2 β”‚         -127 β”‚        0 β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ A         β”‚ 608153419546361855 β”‚ 639678616932387447 β”‚ \x00\x00\x00\x00\x01@\x0E\x87\xA7\x16\x03\xF8]@N6\xFB\xB6…  β”‚
β”‚ 2025-03-13 22:25:48 β”‚ 219022165 β”‚ 3.83790833 β”‚ 60.37293666 β”‚      7 β”‚              356.9 β”‚          354 β”‚               2.6 β”‚            0 β”‚        0 β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ A         β”‚ 608153421962280959 β”‚ 639678619351091791 β”‚ \x00\x00\x00\x00\x01@\x0E\xB4\x09HS*\xF5@N/\xBCcs\x16\xF9   β”‚
β”‚ 2025-03-13 22:25:48 β”‚ 219022165 β”‚ 3.83790833 β”‚ 60.37293666 β”‚      7 β”‚              356.9 β”‚          354 β”‚               2.6 β”‚            0 β”‚        0 β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ A         β”‚ 608153421962280959 β”‚ 639678619351091791 β”‚ \x00\x00\x00\x00\x01@\x0E\xB4\x09HS*\xF5@N/\xBCcs\x16\xF9   β”‚
β”‚ 2025-03-13 23:57:29 β”‚ 219022165 β”‚      3.815 β”‚   60.428333 β”‚      7 β”‚              330.0 β”‚              β”‚               0.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153419546361855 β”‚ 639678616922679031 β”‚ \x00\x00\x00\x00\x01@\x0E\x85\x1E\xB8Q\xEB\x85@N6\xD3\x9D…  β”‚
β”‚ 2025-03-13 23:57:28 β”‚ 219022165 β”‚      3.815 β”‚   60.428333 β”‚      7 β”‚              330.0 β”‚              β”‚               0.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153419546361855 β”‚ 639678616922679031 β”‚ \x00\x00\x00\x00\x01@\x0E\x85\x1E\xB8Q\xEB\x85@N6\xD3\x9D…  β”‚
β”‚ 2025-03-13 23:54:29 β”‚ 219022165 β”‚   3.816666 β”‚   60.428333 β”‚      7 β”‚              318.0 β”‚              β”‚               0.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153419546361855 β”‚ 639678616922525039 β”‚ \x00\x00\x00\x00\x01@\x0E\x88\x88/\x0E\x0A\x85@N6\xD3\x9D…  β”‚
β”‚ 2025-03-13 22:27:28 β”‚ 219022165 β”‚   3.836666 β”‚   60.373333 β”‚      7 β”‚              359.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153421962280959 β”‚ 639678619351051575 β”‚ \x00\x00\x00\x00\x01@\x0E\xB1}\xF1\x9Df\xAE@N/\xC9`0\xC2@   β”‚
β”‚ 2025-03-13 22:24:27 β”‚ 219022165 β”‚   3.836666 β”‚   60.371666 β”‚      7 β”‚              355.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153421962280959 β”‚ 639678619351067943 β”‚ \x00\x00\x00\x00\x01@\x0E\xB1}\xF1\x9Df\xAE@N/\x92\xC0a\x…  β”‚
β”‚ 2025-03-13 21:06:28 β”‚ 219022165 β”‚   3.851666 β”‚      60.315 β”‚      7 β”‚              340.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619429798647 β”‚ \x00\x00\x00\x00\x01@\x0E\xD06C\x88\xEB\xCC@N(Q\xEB\x85\x…  β”‚
β”‚ 2025-03-13 21:03:27 β”‚ 219022165 β”‚   3.853333 β”‚   60.311666 β”‚      7 β”‚              339.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619430290455 β”‚ \x00\x00\x00\x00\x01@\x0E\xD3\xA0@|\xC7\xD2@N\x27\xE4\xAB…  β”‚
β”‚ 2025-03-13 21:03:27 β”‚ 219022165 β”‚   3.853333 β”‚   60.311666 β”‚      7 β”‚              339.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619430290455 β”‚ \x00\x00\x00\x00\x01@\x0E\xD3\xA0@|\xC7\xD2@N\x27\xE4\xAB…  β”‚
β”‚ 2025-03-13 20:54:27 β”‚ 219022165 β”‚   3.856666 β”‚   60.306666 β”‚      7 β”‚              345.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619433830087 β”‚ \x00\x00\x00\x00\x01@\x0E\xDAs\xB4,\xC2\xD7@N\x27@\xD4\xD…  β”‚
β”‚ 2025-03-13 20:54:27 β”‚ 219022165 β”‚   3.856666 β”‚   60.306666 β”‚      7 β”‚              345.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619433830087 β”‚ \x00\x00\x00\x00\x01@\x0E\xDAs\xB4,\xC2\xD7@N\x27@\xD4\xD…  β”‚
β”‚ 2025-03-13 20:54:27 β”‚ 219022165 β”‚   3.856666 β”‚   60.306666 β”‚      7 β”‚              345.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619433830087 β”‚ \x00\x00\x00\x00\x01@\x0E\xDAs\xB4,\xC2\xD7@N\x27@\xD4\xD…  β”‚
β”‚ 2025-03-13 20:51:28 β”‚ 219022165 β”‚   3.858333 β”‚   60.303333 β”‚      7 β”‚              345.0 β”‚              β”‚               2.0 β”‚              β”‚          β”‚       0 β”‚ OWBS     β”‚ HM228 PONDUS         β”‚        30 β”‚     28 β”‚          5.00 β”‚ S           β”‚ LRIT      β”‚ 608153422046167039 β”‚ 639678619434559663 β”‚ \x00\x00\x00\x00\x01@\x0E\xDD\xDD\xB1 \x9E\xDC@N&\xD3\x9D…  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 28451 rows (40 shown)                                                                                                                                                                                                                                                                                                                                         21 columns β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
D SELECT * FROM haisdata WHERE h3_cell_to_parent(to_hex(hex_14), 4) LIKE '8409851ffffffff';

Eksport av dataΒΆ

NΓ₯r vi eksporterer data fra DuckDB for videre analyse, er det viktig Γ₯ velge riktig format basert pΓ₯ hva vi ΓΈnsker Γ₯ gjΓΈre med informasjonen. De tre mest relevante formatene i denne sammenhengen er CSV, JSON og GeoJSON, som hver har sine styrker og svakheter avhengig av bruksomrΓ₯det.

CSVΒΆ

CSV (Comma-Separated Values) er det mest tilgjengelige formatet og fungerer utmerket nΓ₯r vi ΓΈnsker Γ₯ analysere data i regnearkprogrammer som Excel. Det er et enkelt, tekstbasert format der verdier skilles med komma, noe som gjΓΈr det lett Γ₯ Γ₯pne i en rekke verktΓΈy. I Datawrapper kan vi for eksempel laste opp en CSV-fil for Γ₯ lage interaktive grafer og diagrammer, mens Everviz gir muligheter for videre visualisering. CSV er spesielt godt egnet til numeriske analyser og tabellbasert behandling, men har begrensninger nΓ₯r det gjelder Γ₯ hΓ₯ndtere komplekse datastrukturer eller geografiske koordinater utover enkle lat/lon-verdier.

JSONΒΆ

Hvis vi trenger et format som stΓΈtter mer strukturert og hierarkisk data, er JSON (JavaScript Object Notation) et bedre valg. JSON er mye brukt i nettbaserte lΓΈsninger og API-er, fordi det er lett Γ₯ tolke i programmeringssprΓ₯k som Python og JavaScript. Dette formatet egner seg godt for videre databehandling og analyse i programmeringsmiljΓΈer og gir fleksibilitet nΓ₯r vi skal hΓ₯ndtere store og sammensatte datasett. Til forskjell fra CSV kan JSON hΓ₯ndtere nestede datastrukturer, men det kan vΓ¦re vanskeligere Γ₯ lese manuelt uten et spesialisert verktΓΈy.

GeoJSONΒΆ

NΓ₯r vi jobber med geografiske data, er GeoJSON et naturlig valg. Dette formatet er en utvidelse av JSON, spesialtilpasset geospatiale data, slik at det kan lagre informasjon om punkter, linjer, polygoner og andre geografiske objekter. GeoJSON er ideelt for kartvisualiseringer og kan brukes i verktΓΈy som GeoJSON.io for en rask visuell fremstilling eller i mer avanserte lΓΈsninger som MapTiler og GIS-programmer som QGIS. Fordi GeoJSON kan inneholde bΓ₯de attributter og geometriske data i samme fil, er det spesielt nyttig nΓ₯r vi ΓΈnsker Γ₯ visualisere flytrafikk, for eksempel ved Γ₯ plotte posisjonene til et spesifikt fly i lΓΈpet av en dag. Sammenlignet med CSV er GeoJSON mer detaljert, men dette fΓΈrer ogsΓ₯ til stΓΈrre filstΓΈrrelser og mer kompleksitet.

Hvilket format skal jeg velge?ΒΆ

Valget av eksportformat avhenger av hva slags analyse vi ΓΈnsker Γ₯ utfΓΈre. Skal vi jobbe med tall og enkle tabeller, er CSV det mest effektive. Trenger vi et fleksibelt format for videre programmering og datahΓ₯ndtering, er JSON bedre egnet. NΓ₯r det kommer til geografiske analyser og kartvisualiseringer, er GeoJSON uten tvil det beste valget. Uansett hvilket format vi velger, finnes det verktΓΈy som kan hjelpe oss med Γ₯ fΓ₯ mest mulig ut av dataene – enten det er Excel, Datawrapper, GeoJSON.io eller spesialiserte GIS-systemer.

La oss se pΓ₯ hvordan vi kan eksportere dataene i disse tre formatene fra DuckDB. Vi tar utgangspunkt i en spΓΈrring som filtrerer ut loggen til et spesifikt fartΓΈy – Juanita (MMSI: 258906000). Deretter bruker vi COPY, som rammer inn spΓΈrringen vΓ₯r i parenteser.

CSV-eksempelΒΆ

COPY (
    SELECT date_time_utc, mmsi, ship_name, longitude, latitude, speed_over_ground, true_heading 
    FROM haisdata
    WHERE mmsi = '258906000'
    ORDER BY date_time_utc
) TO 'juanita.csv' WITH (HEADER);

Filen ln-ora.csv dukker nΓ₯ opp i mappen der du startet DuckDB, og kan Γ₯pnes i valgfritt program – for eksempel Excel eller Numbers.

Figur 5: CSV-data Γ₯pnet i Numbers pΓ₯ Mac.

JSON-eksempelΒΆ

La oss prΓΈve det samme med JSON. Det er bare en ΓΈrliten justering som skal til.

COPY (
    SELECT mmsi, ship_name, ST_MakeLine(ARRAY_AGG(ST_POINT(longitude, latitude) ORDER BY date_time_utc)) AS geom
    FROM haisdata
    WHERE mmsi = '258906000'
    GROUP BY mmsi, ship_name
) TO 'juanita.json';

NΓ₯r vi Γ₯pner JSON-filen i en teksteditor, ser vi at den ikke har standard JSON-format. Dette er JSONL (JSON Lines), et format velegnet for store datamengder i sekvens. JSONL er like enkelt Γ₯ tolke programmatisk som standard JSON. Du kan lese mer om formatet pΓ₯ jsonlines.org.

GeoJSON-eksempelΒΆ

For eksport av geografiske data som punkter, linjer og polygoner bruker vi GeoJSON. For Γ₯ eksportere vΓ₯re geografiske punkter som en linje (LineString), benytter vi en aggregeringsfunksjon i spΓΈrringen:

COPY (
    SELECT ship_name, ST_MakeLine(ARRAY_AGG(ST_POINT(longitude, latitude) ORDER BY date_time_utc)) AS geom
    FROM haisdata
    WHERE mmsi = '258906000'
    GROUP BY ship_name
) TO 'juanita.geojson' WITH (FORMAT gdal, DRIVER 'GeoJSON');

Γ…pne filen i GeoJSON.io for Γ₯ se skipets rute visualisert pΓ₯ kart.

Bruk av DuckDBs webgrensesnittΒΆ

DuckDB har nylig lansert et webgrensesnitt, som lar oss bygge og kjΓΈre spΓΈrringer i nettleseren. Dette gjΓΈr det enklere Γ₯ mer intuitivt og jobbe med spΓΈrringer, og man kan ogsΓ₯ lagre dem i notebooks. Du synes kanskje det er rart at jeg forteller om dette nΓ₯, og ikke til Γ₯ begynne med, men det er av en grunn: Det er lettere Γ₯ mestre webgrensesnittet nΓ₯r man har prΓΈvd kommandolinjen fΓΈrst, enn omvendt. Og grensesnittet er ganske nytt, og ikke fullstendig stabilt enda. SΓ₯ bruk den arbeidsflyten som passer best for deg. Her kan du ogsΓ₯ plukke og mikse.

  1. Hvis DuckDB allerede kjΓΈrer i terminalen din, lukker du det ved Γ₯ skrive .exit

  2. Γ…pne Terminal (Mac/Linux) eller PowerShell (Windows), og naviger til mappen der du pakket ut Parquet-filene.

  3. Start DuckDB med fΓΈlgende kommando:

duckdb geoparquet-hais.db --ui

NΓ₯ vil det Γ₯pnes en ny fane i nettleseren din, og du vil kunne opprette notebooks der du kan kjΓΈre spΓΈrringene akkurat slik vi har gjort i terminalen frem til nΓ₯. NΓ₯r du har Γ₯pnet DuckDB pΓ₯ denne mΓ₯ten, kan du faktisk bruke webgrensesnittet og terminalen side om side.

OppgaverΒΆ