# ArcGIS

## Hvad det er

ArcGIS er det navn, Esri giver en hel familie af geoprogrammer, ikke ét enkelt
program, og delene skelnes lettest ved at se på, hvor hver af dem kører.

På skrivebordet er det aktuelle program ArcGIS Pro, og dets systemkrav nævner
Microsoft Windows og intet andet. Før Pro kom ArcMap, der blev solgt som en del
af ArcGIS Desktop. Esris side om produktets livscyklus angiver ArcMap som
udfaset og i »mature support«, med 10.8.x som den sidste række udgaver.

På en server er platformens centrum en portal: stedet, hvor indhold, brugere,
grupper og datatjenester oprettes og deles. Esri hoster én som ArcGIS Online, et
abonnementsbaseret software-as-a-service-produkt, og en organisation kan køre
sin egen med ArcGIS Enterprise. Data i en portal udgives som tjenester, hver med
sit eget REST-endepunkt. En featuretjeneste giver adgang til spatiale og
ikke-spatiale data i featurelag og tabeller og lader en klient tilføje,
opdatere, slette og forespørge på features. Vektorflise- og kortflisetjenester
gemmer og leverer fliser, og en billedtjeneste behandler rasterdata og sætter
dem sammen til mosaikker undervejs. Hvert lag har sin egen adresse på formen
`…/FeatureServer/0` og en `query`-operation, der tager en `where`-betingelse, en
liste over felter og et outputformat: HTML som standard, JSON, GeoJSON eller
protocol buffers.

På klientsiden udgiver Esri Maps SDKs til JavaScript, Kotlin, Swift, Flutter,
.NET, Qt og Java, plus plugins til Unity og Unreal Engine. Den samme
udviklerdokumentation dækker også åbne biblioteker, der kan tegne
ArcGIS-tjenester, nemlig Leaflet, MapLibre GL JS, OpenLayers og CesiumJS. Til
scripting findes ArcPy, Python-pakken til geoprocessing-værktøjer og
kortautomatisering inde i ArcGIS Pro, og ved siden af den ArcGIS API for Python
og ArcGIS REST JS til at arbejde med portaler og tjenester udefra. Adgang til
alt, der ikke er offentligt, går gennem API-nøgler, OAuth 2.0 eller en indlogget
bruger.

På disken er det formatet file geodatabase, der følger ArcGIS-data rundt: en
mappe, hvis navn ender på `.gdb`, med hver af sine tabeller gemt som
`.gdbtable`-filer. Uden for Esris software læser GDALs indbyggede
OpenFileGDB-driver file geodatabases, har skrevet og opdateret dem siden GDAL
3.6 og har håndteret rasterlag i dem siden 3.7.

## Hvorfor det betyder noget

Når en organisation allerede kører ArcGIS, står valget sjældent om, hvorvidt
platformen skal tages i brug. Valget står om, hvor dens grænse går: hvilke data
der bliver i portalen som tjenester, hvilke der kopieres over i en database, som
resten af stakken styrer, og i hvilken retning rettelser flyder mellem de to.

Inden for grænsen er meget gjort klar på forhånd. Redigering, symbologi, deling
med navngivne brugere og grupper, analysetjenester og app-byggere, der kræver
lidt eller ingen kode, arbejder alle mod den samme portal, og medarbejdere, der
kender ArcGIS Pro, kan arbejde videre, som de plejer. Når et lag udgives som
featuretjeneste, får ethvert andet system en adresse at læse det fra.

Grænsen kan krydses fra begge sider, og det gør valget til et reelt valg frem
for en indlåsning. En featuretjeneste taler JSON og GeoJSON over almindelig
HTTP. GDALs ESRIJSON-driver læser en tjenestes URL som en fil og bladrer selv
gennem resultatet, så `ogr2ogr` kan kopiere et hostet lag over i PostGIS eller
en GeoPackage med én kommando. Esris egen dokumentation viser Leaflet og
MapLibre GL JS, der tegner dens tjenester. Den anden vej har GDAL selv skrevet
file geodatabases siden 3.6, så data kan sendes tilbage i Esris eget format.

Det, der koster, er alt det, der lever på begge sider på én gang. Et lag
kopieret ud af en portal er en kopi nummer to, og en kopi nummer to kræver en
tidsplan, en ejer og en måde at se, hvornår den er gledet væk fra originalen.
Skrivebordsprogrammet kører kun på Windows og har en kommerciel licens, og det
afgør, hvem på et blandet team der kan åbne et projekt. Og ArcPy følger med
ArcGIS Pro og ArcGIS Server; selv installeret i et andet Python-miljø kræver
pakken stadig ArcGIS Pro på maskinen, så en pipeline bygget på den kører kun
dér, hvor ArcGIS gør.

## Sådan ser det ud i praksis

ArcGIS optræder i to projekter på dette site, og i begge er det én del af en
større stak.

Fra 2015 til 2022 bar rollen som teamlead for GIS-softwareudvikling
[mere end tredive GIS-projekter fra udvikling over udrulning til support](/da/portfolio/led-the-development-deployment-and-support-of-over-35/).
ArcGIS indgik i dem som en tjeneste udefra og ikke som platformen: kortene i
browseren brugte Mapbox GL og Leaflet, og i nogle projekter kaldte de ArcGIS'
eller HERE's API'er, mens app-laget var skrevet i JavaScript, Python, PHP og
SQL. Under dem lå PostgreSQL med PostGIS til geodataene, og QGIS og JOSM
klarede selve dataarbejdet, så ArcGIS stod ved siden af den stak som et sæt
API'er, kortene kunne kalde.

Et storstilet geospatialt analyseprojekt, hvor rollen fra 2022 til 2024 var
dataingeniør, brugte ArcGIS som et af værktøjerne til reparation.
[Datasættenes spatiale fejl blev fundet og rettet med ArcGIS sammen med GDAL og QGIS](/da/portfolio/resolved-1-000-issues-in-geographical-data-and-7/),
og den oprydning, der kom igen og igen, blev lagt over i Bash. I PostgreSQL og
SQL Server omformede procedurer i PL/pgSQL og Transact-SQL de geografiske og
tidsmæssige data, og de spatiale forespørgsler og indeksene lå i PostGIS.
Resultatet var mere end 1.000 løste problemer og et bidrag til, at køretiden
for de spatiale forespørgsler faldt med 35 %.

## Hvor det går galt

Det meste besvær opstår ved grænsen mellem ArcGIS og alt andet, hvor hver side
går ud fra, at den anden opfører sig som den selv.

**En download af et lag stopper ved et rundt tal.** En featuretjeneste
returnerer højst `maxRecordCount` features pr. forespørgsel, en grænse, der
sættes for hver tjeneste. Når en forespørgsel rammer flere, sætter svaret
`exceededTransferLimit` til `true`, og en klient, der læser sine features og
overser det flag, står med et ufuldstændigt lag, der ser komplet ud. Hvor laget
melder `supportsPagination`, bladrer klienten med `resultOffset` og
`resultRecordCount` eller med `resultPaginationToken`, indtil flaget kommer
tilbage som `false`. GDALs dokumentation tilføjer, at paginering kun er
pålidelig med en sortering på et felt som `OBJECTID`:

```sh
url='https://gis.example.org/arcgis/rest/services/Matrikler/FeatureServer/0'
q='query?where=1=1&outFields=*&orderByFields=OBJECTID+ASC&f=json'
ogr2ogr -f GPKG matrikler.gpkg "ESRIJSON:$url/$q"
```

**Koordinater kommer i meter, hvor der ventedes grader.** Uden en
`outSR`-parameter returnerer en forespørgsel geometri i det spatiale
referencesystem, tjenestens kort bruger, og det kan være et projiceret system
målt i meter. Om GeoJSON-output skriver referencen, at resultatet fra 10.8 kun
følger RFC 7946, når `outSR` udelades eller sættes til 4326. Enhver anden værdi
giver projicerede koordinater i en fil, der stadig kalder sig GeoJSON, og et
webkort, der læser den, placerer features langt fra, hvor de hører hjemme. Bed
om `outSR=4326`, når modtageren forventer længde- og breddegrad.

**Et ArcMap-script holder op med at virke i ArcGIS Pro.** ArcGIS Desktop, som
omfatter ArcMap, brugte versioner af Python 2, og ArcGIS Pro kører Python 3, en
linje Esri selv beskriver som kun delvist kompatibel. I ArcPy blev modulet
`arcpy.mapping` fjernet og erstattet af `arcpy.mp`. Med ArcMap udfaset er
scripts skrevet til det en migrering, der venter på at ske. Værktøjet Analyze
Tools For Pro i ArcGIS Pro markerer de problemer, der ville forhindre
Python-kode eller Python-baserede geoprocessing-værktøjer i at køre, og det er
bedre at tage den gennemgang med vilje end at opdage problemerne den dag, en
maskine bliver udskiftet.

**En file geodatabase åbner skrivebeskyttet.** GDAL før 3.6 læste file
geodatabases gennem OpenFileGDB, men skrev dem kun gennem den separate
FileGDB-driver, som kræver Esris FileGDB API-bibliotek, når GDAL bygges.
Rasterlag i en `.gdb` kræver GDAL 3.7 eller nyere. Når en pipeline skriver en
`.gdb` på én maskine og fejler på en anden, så sammenlign GDAL-versionerne og
driverlisterne, før dataene får skylden.

## Læs mere

- [Developer documentation](https://developers.arcgis.com/documentation/) —
  Esris kort over platformen: SDK'er, portal og datatjenester samt sikkerhed.
- [Query (Feature Service/Layer)](https://developers.arcgis.com/rest/services-reference/enterprise/query-feature-service-layer/)
  — hver parameter til forespørgslen, herunder `outSR`, outputformaterne og de
  tre måder at paginere på.
- [Python migration from 10.x to ArcGIS Pro](https://pro.arcgis.com/en/pro-app/latest/arcpy/get-started/python-migration-for-arcgis-pro.htm)
  — hvad der ændrede sig mellem Python 2 og 3 og i selve ArcPy.
- [ArcMap Life Cycle](https://support.esri.com/en-us/products/arcmap/life-cycle)
  — ArcMaps supportstatus, og hvorfor 10.8.x er den sidste række.
- [ESRI File Geodatabase vector (OpenFileGDB)](https://gdal.org/en/stable/drivers/vector/openfilegdb.html)
  — GDALs driver til `.gdb`-mapper med de versioner, der tilføjede skrivning og
  rasterunderstøttelse.
- [ESRIJSON / FeatureService driver](https://gdal.org/en/stable/drivers/vector/esrijson.html)
  — at læse resultater fra featuretjenester med GDAL, og hvordan den automatiske
  paginering virker.

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