# Geospatial

## Hvad det er

Geospatial bruges om data, analyser og software, hvor en placering på jorden er
en del af betydningen. En vindmåling er bare et tal, indtil den er knyttet til
den mast, den blev taget ved. En måleraflæsning bliver brugbar til planlægning,
når den kan placeres på en bestemt strækning af nettet, inden for et bestemt
kvarter eller tæt på en vejrstation. Ordet er et tillægsord og følger det, det
beskriver: geospatiale data, en geospatial join, geospatial modellering.

Rumlig er det bredere ord. Et printudlæg, en lagerplan målt i lokale meter og en
maskintegning er alle rumlige, og deres koordinater giver kun mening inden for
tegningen. Geospatiale data er forankret til kloden gennem et koordinatsystem,
så to datasæt, der aldrig er lavet til hinanden, alligevel kan lægges oven på
hinanden og sammenlignes.

Placering når et datasæt i flere former, og de er langt fra lige brugbare.

- **Koordinater**, som regel bredde og længde fra en GPS-modtager eller en
  geokoder, giver et punkt, som software kan regne direkte med.
- **Geometrier** beskriver linjer og flader foruden punkter: et kabeltracé,
  udbredelsen af en oversvømmelse, et forsyningsområde. Simple Features-modellen
  fra Open Geospatial Consortium (OGC), også udgivet som ISO 19125, definerer de
  figurer, som de fleste databaser og filformater deler.
- **Adresser og stednavne** bærer placering for mennesker, men de skal geokodes,
  altså omsættes til koordinater, før noget kan måles, og hver geokoder rammer
  med sin egen præcision.
- **Områdekoder** som postnumre, kommunenumre eller id'er for gitterceller
  fortæller, hvilket område noget ligger i, men ikke hvor i området.

Under det hele ligger en række åbne standarder, der lader geospatiale data
flytte mellem systemer uden at miste deres betydning. OGC udgiver
specifikationerne for geometri, for filer som GeoPackage og for webtjenester som
OGC API – Features. EPSG-registret giver hvert koordinatsystem en talkode, så
4326 betyder bredde og længde på WGS 84, hvor koden end optræder. PROJ, et open
source-bibliotek, omregner koordinater fra ét af de systemer til et andet og
understøtter mere end hundrede kortprojektioner.

## Hvorfor det betyder noget

Placering er en joinnøgle, som næsten alle datasæt allerede har.
Måleraflæsninger, vejrobservationer, kunderegistre og netkomponenter deler
sjældent et id, men hver af dem skete et sted. En geospatial join parrer rækker
efter, hvordan deres placeringer forholder sig til hinanden, den ene inde i den
anden, inden for en given afstand eller krydsende, i stedet for efter ens
værdier. Den forbinder data, som en fremmednøgle aldrig har bundet sammen, og
det er ofte den første grund til, at en organisation begynder at behandle sine
data som geospatiale: spørgsmålet går på tværs af datasæt, der kun mødes på
kortet.

Den anden grund er, at placering ændrer, hvad et gennemsnit betyder. Et landstal
for forbrug eller afbrydelser kan skjule ét område, der er ved sin grænse, mens
resten har luft, og den beslutning, der tæller, handler om netop det område:
hvor nettet skal forstærkes, hvor der skal investeres, og hvor en montør skal
sendes hen. At gruppere efter område eller afstand viser den spredning, som en
samlet total skjuler.

Placering vejer også tungere end selve analysen. Et kort spor af GPS-punkter fra
én telefon viser som regel, hvor ejeren sover og arbejder, så placeringsdata om
mennesker fortjener samme omhu som andre personoplysninger. I praksis betyder
det at indsamle dem med den præcision, formålet kræver, at gøre dem grovere, før
de deles, og at slette dem, når formålet er opfyldt.

## Sådan ser det ud i praksis

Smart-målere spredt over flere regioner leverede dataene bag
[over 500 analyserapporter skrevet i ren SQL](/da/portfolio/released-500-electricity-and-gis-data-analysis-reports-11/)
på PostgreSQL og BigQuery. Aflæsningerne havde geolokationskoordinater for hver
måler, så scriptene kunne bruge geospatiale joins sammen med CTE'er og window
functions til at finde regionale tendenser og anomalier. Hver rapport fulgtes af
sin annoterede SQL, så kolleger kunne genskabe og efterprøve den, og de
almindelige datakvalitetsproblemer blev skrevet ned med en anbefalet håndtering
af hvert enkelt. Rapporterne endte med at understøtte regional load balancing og
bidrog til en forbedring af driftsplanlægningens effektivitet på 10–15 %.

Elleve eldistributionsoperatører havde driftsdataene, men kun lidt geospatial
analyse at basere deres beslutninger om forstærkning og investering på.
[Deres driftsdata blev bragt sammen med geospatial modellering](/da/portfolio/optimized-forecasting-and-investment-strategies-for-11-electricity-27/),
så hvert net kunne ses på kortet og stilles konkrete spørgsmål: hvilke
strækninger var på vej mod deres grænser, og hvilke områder retfærdiggjorde
investering først. Analysen blev tilpasset den måde, hver operatør faktisk drev
sit net på, i stedet for at blive udleveret som én fælles skabelon.

Geospatiale data skal også forblive hurtige, når mængden vokser. I en
PostgreSQL-applikation, hvor databaseforespørgsler på geospatiale data var
blevet langsomme sammen med tidsserierne for elforbrug,
[blev der oprettet GiST-indeks til de geospatiale data](/da/portfolio/accelerated-postgresql-performance-by-10x-via-strategic-indexing-15/),
og de geografiske data blev hash-partitioneret. Bagefter kørte geospatiale
opslag på millisekunder.

## Hvor det går galt

**Ukendte placeringer hober sig op på nul grader bredde og nul grader længde.**
Et kort over kunder eller enheder viser en tæt klynge i Guineabugten, hvor
ækvator krydser nulmeridianen, og regionale totaler medregner poster fra et
sted, hvor ingen kunde kan bo. En enhed uden GPS-fix, eller en import, der ramte
en tom celle, skrev nuller i stedet for at lade placeringen stå åben. Gem en
ukendt placering som NULL, tilføj en constraint, der afviser præcis parret 0, 0,
et punkt i åbent hav, og tæl de manglende placeringer i hver batch, så hver
rapport oplyser, hvor mange poster der stod uden placering.

**Joins på koordinater rammer kun en håndfuld rækker.** To datasæt beskriver de
samme transformerstationer, men en join på ens bredde og længde parrer kun få af
dem. Hver kilde målte eller afrundede sine koordinater på sin egen måde, og
koordinater er kommatal, så to positioner med få centimeters afstand er
simpelthen forskellige værdier. Join i stedet på afstand, med en tolerance valgt
ud fra kildernes nøjagtighed, gennem et prædikat, som det rumlige indeks kan
betjene. I PostGIS, med geography-kolonner målt i meter:

```sql
SELECT a.substation_id, b.asset_ref
FROM survey AS a
JOIN register AS b
  ON ST_DWithin(a.location, b.location, 15);
```

Gennemgå derefter de rækker, der fik mere end én partner, for en tolerance, der
er bred nok til at opsuge målefejl, kan også bygge bro mellem to
nabokomponenter.

**Punkter midt i postnummeret går for at være præcise positioner.** En
afstandsanalyse melder om snesevis af kunder, der bor på nøjagtig samme sted,
eller et heatmap viser skarpe toppe midt i hvert postnummer. Adresserne blev kun
geokodet ned til postnummeret, og hver kom tilbage som midtpunktet af sit
område, uden at analysen opdagede det. Gem det niveau, hvert punkt blev bestemt
på, som adresse, vej eller postnummer, i en kolonne ved siden af, og filtrér
eller vægt efter det niveau, før der måles afstande, der er kortere end selve
området.

**Sidste års regionale totaler ændrer sig efter en grænseopdatering.** En
rapport, der køres igen på uændrede historiske data, giver andre tal pr. region
end dem, der først blev offentliggjort. Punkterne blev joinet til det aktuelle
grænselag, og siden er kommuner lagt sammen, postnumre delt eller et
forsyningsområde tegnet om. Behold de rå koordinater frem for kun den region, de
faldt i, gem grænselag med de datoer, de var gyldige, join hver post til den
grænse, der gjaldt på dens tidsstempel, og skriv i hver rapport, hvilken
grænseversion der lå bag tallene.

## Læs mere

- [OGC Standards](https://www.ogc.org/standards/) — Open Geospatial Consortiums
  katalog over åbne geospatiale standarder, hver med sine
  specifikationsdokumenter.
- [Simple Feature Access – Part 1](https://www.ogc.org/standards/sfa/) — den
  fælles geometrimodel med punkter, linjer og polygoner, som databaser og
  formater deler.
- [EPSG Geodetic Parameter Dataset](https://epsg.org/) — registret bag koder som
  4326 og 3857, med den fulde definition af hvert referencesystem.
- [PROJ](https://proj.org/) — open source-biblioteket, der omregner koordinater
  mellem referencesystemer, med kommandolinjeværktøjer og API.
- [OGC API – Features](https://ogcapi.ogc.org/features/) — OGC-standarden for at
  udgive og forespørge geospatiale features over HTTP.

<https://engineer.company/da/glossary/geospatial/>
