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:
Tidsperiode (fraβtil)
TidsopplΓΈsning (full opplΓΈsning, hvert femte minutt, hver time)
Dataformat (CSV eller (Geo)Parquet β velg (Geo)Parquet)
E-postadresse for mottak av data
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:
Dykking
FiskebΓ₯ter
Forurensningsbekjempelse
FritidsbΓ₯t
HavnebΓ₯t
HΓΈyhastighetsfartΓΈy
Lasteskip
LosbΓ₯t
Medisinsk transport
Militær
Mudring/undervannsoperasjoner
Passasjerskip
Politi/lovhΓ₯ndhevelse
SΓΈk og redning (SAR)
SlepebΓ₯t
TaubΓ₯t
Tankskip
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:
| Kolonner | Meldingstype | Datatype | Beskrivelse |
|---|---|---|---|
| date_time_utc | 1,2,3,5,18,24,27 | DateTime | Tidsstempel i UTC |
| mmsi | 1,2,3,5,18,27 | Integer | Maritime Mobile Service Identity-nummer (ID pΓ₯ fartΓΈyets transponder) |
| longitude | 1,2,3,18,27 | Float | Lengdegrad |
| latitude | 1,2,3,18,27 | Float | Breddegrad |
| status | 1,2,3,18,27 | Integer | Skipets navigasjonsstatus (les mer) |
| course_over_ground | 1,2,3,18,27 | Float | FartΓΈyets kurs over bakken i henhold til kompassnord. |
| true_heading | 1,2,3,18,27 | Integer | Den retningen fartΓΈyet peker i henhold til kompassnord (0-359 grader) |
| speed_over_ground | 1,2,3,18,27 | Float | FartΓΈyets fart i knop |
| rate_of_turn | 1,2,3,18,27 | Float | Rotasjonsrate |
| maneuvre | 1,2,3,18,27 | Integer | ManΓΈverinformasjon |
| imo | 5,24 | Integer | Skrogets IMO-nummer (satt av International Maritime Organization). |
| callsign | 5,24 | String | Radiokallesignal |
| ship_name | 5,24 | String | Skipets navn |
| ship_type | 5,24 | Integer | Skipstype fra AIS |
| length | 5,24 | Float | Lengde pΓ₯ skipet |
| draught | 5,24 | Float | Skipets dypgang |
| data_source | Generert kolonne | String | Datakilde (g: bakkestasjon, s: satelitt) |
| date_utc | Generert kolonne | Date | Dato-kolonne for filtrering pΓ₯ kun dato X |
| geometry | Generert kolonne | String | Geometri-kolonne i WKB-format generert av ST_Point(lon, lat) |
| hex_14 | Generert kolonne | Integer | H3-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ΒΆ
Γ pne Terminal (Mac/Linux) eller PowerShell (Windows), og naviger til mappen der du pakket ut Parquet-filene.
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.
DInstaller 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.
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.
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.
Klikk pΓ₯ ΓΈnsket heksagon. Denne kopieres da til utklippsboken din.
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(ettertrace.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.
Finn ΓΈnsket H3-celle ved hjelp av et verktΓΈy som H3 Viewer.
Bruk for eksempel
8409851ffffffffmed opplΓΈsning4. (Pass pΓ₯ Γ₯ velge et omrΓ₯de som er tilgjengelig i datasettet. Bruker du eksempelfilen fra tidligere, er den nevnte IDen et godt utgangspunkt.)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.
Hvis DuckDB allerede kjΓΈrer i terminalen din, lukker du det ved Γ₯ skrive
.exitΓ pne Terminal (Mac/Linux) eller PowerShell (Windows), og naviger til mappen der du pakket ut Parquet-filene.
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.