Náttúrufræðistofnun (NÍ) — Open data

SkillDev tools

Náttúrufræðistofnun habitat types, species and geology via GeoServer WCS/WMS/WFS — vistgerðir 1:25k, 5 m raster.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Náttúrufræðistofnun (NÍ) — Open data skill

What this skill tells your AI

The instructions your AI receives, as published by jokull/icelandic-data in .agents/skills/natt/SKILL.md and read by ahel’s review.

Náttúrufræðistofnun Íslands (Icelandic Institute of Natural History) publishes habitat-type, species-distribution, and geological data as open data.

OGC services

NÍ runs a GeoServer at https://gis.natt.is/geoserver/. It hosts both NÍ's own layers and several layers federated from LMI / Hagstofan / Skógræktin.

  • WFS GetCapabilities: https://gis.natt.is/geoserver/wfs?service=WFS&version=2.0.0&request=GetCapabilities
  • WMS GetCapabilities: https://gis.natt.is/geoserver/wms?service=WMS&version=1.3.0&request=GetCapabilities
  • WCS GetCapabilities: https://gis.natt.is/geoserver/wcs?service=WCS&version=2.0.1&request=GetCapabilities
  • All layers are published in EPSG:3057 (ISN93 / LCC Iceland).
  • WFS supports outputFormat=application/json (GeoJSON) and CQL filters via CQL_FILTER=….
  • WCS spells the workspace separator __, WMS/WFS spell it :. The same coverage is vistgerdir__ni_vg25r_3utg_lzw (WCS) and vistgerdir:ni_vg25r_3utg_lzw (WMS).

Vistgerðir á Íslandi (3. útgáfa, 1:25.000) — habitat types

Habitat types ("vistgerðir") are NÍ's national EUNIS-aligned classification. There are 64 land-, 17 freshwater-, and 24 coastal-shore habitat types, documented in Fjölrit 54.

The 3rd edition is a raster. The polygonised vector edition LMI_vektor:vistgerd was withdrawn in 2026 (see Caveats) — the surviving national-coverage publication is:

ServiceNameNotes
WCS coveragevistgerdir__ni_vg25r_3utg_lzwGeoTIFF, the fetchable one
WMS layervistgerdir:ni_vg25r_3utg_lzwstyled vistgerdir:vistgerdakort_3utg

Grid (from DescribeCoverage):

propertyvalue
CRSEPSG:3057 (ISN93)
resolution5 m
size102928 × 72798 px (7.5 Gpx)
envelope244069.5 311026.7 758709.5 675016.7
band 1 GRAY_INDEXhabitat-type code — the old DN values, unchanged
band 2alpha; request rangeSubset=GRAY_INDEX to skip it

The legend is the DN → label inventory

GetLegendGraphic in JSON returns the raster colormap — 73 entries, each with a quantity (the DN) and a label (the old htxt string, correct UTF-8). One request replaces streaming 24M vector rows:

curl -sS "https://gis.natt.is/geoserver/wms?service=WMS&version=1.1.1\
&request=GetLegendGraphic&layer=vistgerdir:ni_vg25r_3utg_lzw\
&format=application/json" | jq -r '
  .Legend[0].rules[0].symbolizers[0].Raster.colormap.entries[]
  | "\(.quantity)\t\(.label)"' | sort -n

scripts/natt.py inventory does exactly this and writes data/raw/natt/vistgerdir/inventory.csv.

DN → habitat-type mapping (subset of interest)

DNCodeLabel
1–5L1.1–L1.5Melavistir (gravel/sand barrens)
6–8L3.1–L3.3Skriðuvistir (scree)
9–10L4.1–L4.2Eyrar / aurar (river plains)
11–13L5.1–L5.3Mosavistir (moss)
14–17L6.1–L6.4Hraunavistir (lava fields)
18L2.1Moldavist (eroded soil)
19–25L7.*Strandvistir (coastal terrestrial)
26–38L8.*Mýrar / flóar (mires / fens)
39–45L9.*Graslendi (grasslands)
46–55L10.*Móar / kjarrlendi (heaths / scrub)
61–64L12.1–L12.4Hveravistir (geothermal)
95L14.2Tún og akurlendi (cultivated hayfield + arable)
98V1Vötn (lakes)
99V2Ár (rivers)
108L13.1Jöklar og urðarjöklar (glaciers / rock glaciers)
122L1.6Landmelhólavist (inland dune)
130L8.7Rimamýravist (string fen)
150L14.1Þéttbýli og annað manngert land (urban / man-made)
152L11Birkiskógur (birch woodland)
153L14.3Skógrækt (forestry)
160L14.4Alaskalúpína (Alaska lupine — invasive)
161L14.5Uppgræðslur (revegetated land)
162L14.6Skógarkerfill ofl. þéttar tegundir (cow-parsley etc.)
175FFjöruvistir (intertidal)
176FX1.1Sjávarlón (coastal lagoons)

The DN values are not contiguous and not ordered by code — always take the full table from natt.py inventory rather than assuming a range.

Fetching one habitat type

Never ask for the whole 5 m grid in one request. scaleFactor downsamples server-side (nearest neighbour) and subset tiles it; both compose:

# whole country at 1 km — 377 KB, <1 s. Good for probes and sanity checks.
curl -sS "https://gis.natt.is/geoserver/wcs?service=WCS&version=2.0.1\
&request=GetCoverage&coverageId=vistgerdir__ni_vg25r_3utg_lzw\
&format=image/tiff&rangeSubset=GRAY_INDEX&scaleFactor=0.005" -o vg_1km.tif

# one 100 km tile at 20 m — 26 MB, 30 s to a couple of minutes depending on
# server load. scaleFactor = 5 / target_metres.
curl -sS "https://gis.natt.is/geoserver/wcs?service=WCS&version=2.0.1\
&request=GetCoverage&coverageId=vistgerdir__ni_vg25r_3utg_lzw\
&format=image/tiff&rangeSubset=GRAY_INDEX&scaleFactor=0.25\
&subset=X(400000,500000)&subset=Y(350000,450000)" -o vg_tile.tif

Then mask band 1 to the code you want (arr == 95). scripts/natt.py habitat --dn 95 does the whole tiled mosaic and writes an ISN93 uint8 mask GeoTIFF plus a sidecar with the area. Cost is server-bound and scales with output pixels — measured, national coverage:

--restileswall timemask sizeL14.2 area
100 m4~1 min0.2 MB1,807.5 km²
50 m (default)6~2 min0.6 MB1,806.0 km²
20 m24~30 min2.7 MB1,805.8 km²

Country-scale renders in this repo draw at 120–200 m/px, so even 100 m is sufficient for a map; 20 m is for detail work.

Native 5 m — only if you need patch-level geometry. ~45 min end to end (582 of 1,924 tiles carry the class, found with a scaleFactor sampling pass first) versus ~2 min for the 50 m mask. Request compression=Deflate on GetCoverage — a tile drops ~18× (8.4 MB → 0.47 MB), which is what makes a native pass affordable at all. And gis.natt.is has returned a 502 partway through a long tile sequence, so cache per tile and retry before starting.

Regression check: L14.2 (cultivated land) must come out at ≈1,806 km², matching the ~1,800 km² on the natt.is habitat page. The three resolutions agree to within 0.1%, and an independent native-5 m extract lands at exactly 1,806 km² (Guðröður / gudrodur, cross-check on PR #14) — the number is a property of the data, not of the sampling.

Other vector layers in the WFS

The WFS exposes ~150 layers. The most useful for nature/agriculture work:

LayerWhat
vistgerdir:v_vg25v_fl_landGeothermal (L12) habitat polygons only — 360 rows
vistgerdir:v_vg25v_fl_vatnFreshwater habitat polygons (V1.1–V1.8), 54k rows
vistgerdir:v_vg25v_fl_fjorurLittoral-shore polygons (F1., F2., FX.*), 20k rows
ni:ni_vg25v_liRunning-water lines (rivers)
ni:ni_vg25v_ptCold/thermal-spring points
ni:vistgerdir_punktarField-survey sample points (8k; all L-codes)
ni:Floraisl_dreifingVascular-plant distribution (Flóra Íslands)
ni:Smadyr_dreifingInvertebrate distribution
ni:hvitabjorn_a_islandiPolar-bear sightings
land_og_skogur:natturulegt_birkilendiNatural birch woodland (Skógræktin)
land_og_skogur:raektad_skoglendiCultivated forest (Skógræktin)
land_og_skogur:jardvegsrofSoil erosion
CORINE:clc18_is, clc12_is, clc06_is, clc00_isCORINE Land Cover for Iceland

The three vistgerdir:v_vg25v_fl_* layers share one schema — string codes, not DN: id, vg1, vg1_texti, vg1_linkur, vg2 … vg5 (+_texti/_linkur), eunis_1, eunis_2, geom. vg1 is the top level (L/V/F), vg2vg5 drill down (vg2='F2', vg3='F2.3'). Filter with CQL, e.g. CQL_FILTER=vg3='F2.3'.

Caveats

  • 2026-08 — LMI_vektor:vistgerd was withdrawn. The polygonised vector edition of the habitat map (schema DN int + htxt str, ~24M rows) is gone from gis.natt.is, gis.lmi.is and ogc.gis.is alike; all three answer InvalidParameterValue: Feature type LMI_vektor:vistgerd unknown. It is not coming back under a new vector name — use the WCS raster above.
  • Trap: the new vistgerdir:v_vg25v_fl_* layers are NOT the replacement. The naming is actively misleading: v_vg25v_fl_land sounds like the land habitat map but its capabilities title is "Vistgerðir: Hverasvæði – Habitat types: Geothermal lands" and every one of its 360 rows is vg2='L12'. Its siblings cover freshwater (V*) and littoral shores (F*). The terrestrial habitats L1–L11, L13 and L14 — including L14.2 Tún og akurlendi — have no polygon layer on the WFS at all. Always check vg1/vg2 values with count=1 before assuming a layer covers what its name suggests.
  • The text-based GeoServer responses (GML/CSV) come through as cp1252-mojibake for Icelandic characters. Always request outputFormat=application/json for clean UTF-8. The legend JSON is already correct UTF-8.
  • Edition 3 (2023) reshuffled L-codes vs edition 1 — see vg25r_3utg_breytingar.pdf before mixing data across editions. The raster's DN values match edition 3's vector DN exactly, so pre-2026 DN-based code in this repo ports unchanged.
  • WCS scaleFactor is served off pyramid overviews and is fast (a full-country 1 km read is <1 s); a full-resolution national fetch is 7.5 Gpx and must be tiled. scripts/natt.py tiles at 5000 output px per request.

Signals

GitHub stars
53
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
natt
Source
github.com/jokull/icelandic-data