Aggregate land cover area (m²) per Swiss cadastral parcel from official survey data (Amtliche Vermessung).
For each parcel, the tool clips every intersecting land cover polygon to the parcel boundary and calculates the area of each clipped piece. This produces a breakdown of how much area of each land cover type exists within each parcel.
The solution is available in three variants:
- Web App — Zero-install browser app. Upload a CSV, get results on a map with export to CSV/Excel/GeoJSON.
- Python CLI — Open-source, requires Python >= 3.10 and free dependencies. Processes locally with exact LV95 areas.
- FME — Requires a licensed copy of FME Form.
The browser-based version runs entirely client-side — no backend, no installation. Upload a CSV with ID and EGRID columns and the app will:
- Look up parcel geometries from swisstopo (
ch.kantone.cadastralwebmap-farbe) - Fetch land cover polygons from geodienste.ch WFS (
ms:LCSF) - Clip land cover to parcel boundaries using Turf.js
- Classify by SIA 416, DIN 277, green space, imperviousness, and VBS Kategorie
- Display results on an interactive map with table and summary panel
Multilingual — Available in German (DE), French (FR), Italian (IT), and English (EN) via ?lang= URL parameter.
- Interactive Map — MapLibre GL JS with parcel + land cover polygons, 4 basemaps (CARTO + swisstopo aerial), 3D building extrusions, scale bar
- Accordion Menu — Layer toggles, Geokatalog (all swisstopo layers), draw tools (placeholder)
- Search Bar — Search parcels by ID/EGRID, Swiss locations, and swisstopo map layers
- Table Widget — Tabs for Parcels and Land Covers, sortable columns, search filter, pagination (25/50/100), column visibility dropdown, resizable panel
- Summary Panel — Collapsible sections for parcel status, area analysis with donut chart, and key metrics. Aggregation dropdown switches between land cover, SIA 416, DIN 277, green space, imperviousness, VBS Kategorie, VBS Produktivität, and VBS Typ — updates chart, legend, and map polygon colors
- Context Menu — Right-click to copy coordinates, share, or report issues
- External Layers — Toggle official survey and habitat map overlays, or add any swisstopo layer via Geokatalog/search
- Layer Info — Click (i) to view swisstopo legend and metadata
- Export — Parcels CSV, Land Cover CSV, Excel (both sheets), GeoJSON
- Privacy — All data stays in the browser. Only EGRID and bounding box are sent to public APIs
- Responsive — Adapts to tablet and mobile screens with map-first layout
- Accessible — ARIA roles, keyboard navigation,
<label>elements,<noscript>fallback - i18n — Four languages (DE/FR/IT/EN) with localized SIA 416 terminology
| Web App | Python CLI | |
|---|---|---|
| Data coverage | 20 of 26 cantons via public WFS (JU, LU, NE, NW, OW, VD blocked) | All cantons via local GeoPackage |
| Area calculation | Spherical (Turf.js), ~0.1–0.5% error | Exact planar (LV95/EPSG:2056) |
| Data source | Live API queries per parcel | Local GeoPackage (all cantons at once) |
| Throughput | ~5 parcels in parallel, rate-limited | Bulk vectorised processing |
| Bauzonen analysis | Layer overlay only | --bauzonen flag |
| Habitat analysis | Layer overlay only | --habitat flag with area intersection |
| Offline | Requires internet | Fully offline with local GeoPackage |
Data coverage note: The Web App uses the geodienste.ch WFS, which requires cantonal approval in 6 cantons (JU, LU, NE, NW, OW, VD). Parcels in these cantons are found by EGRID but return 0 m² land cover. Coverage is also incomplete in TI, VS, and NE. See the User Guide for details.
Open index.html in a browser (requires a local server for ES modules):
cd landcover-survey
python -m http.server 8080
# Open http://localhost:8080Or deploy to any static hosting (GitHub Pages, Cloudflare Pages, etc.).
index.html Entry point (GitHub Pages compatible)
css/
tokens.css Design tokens (colors, spacing, typography, shadows)
styles.css Component styles + responsive breakpoints
js/
main.js State machine (upload → processing → results)
upload.js CSV/XLSX parsing with auto-delimiter detection
processor.js EGRID lookup + WFS query + Turf.js clipping (5x parallel)
map.js MapLibre map, controls, popups, layer management
table.js Table widget with tabs, sorting, pagination, column toggle
search.js Header search (parcels + locations + layers)
swisstopo.js External layer management, Geokatalog, layer info modal
config.js BBArt mappings (SIA 416, DIN 277, green space, sealed, VBS)
export.js CSV/XLSX/GeoJSON export
i18n.js Translations (DE, FR, IT, EN)
data/
example.csv Demo data (20 parcels with error test cases)
example-full.csv Full test set (1000 parcels)
docs/
MANUAL.md Multilingual user guide (DE/FR/IT/EN)
SPECIFICATION.md Full technical specification
assets/
swiss-logo-flag.svg Swiss coat of arms
| API | Purpose | Auth |
|---|---|---|
api3.geo.admin.ch/MapServer/find |
Parcel geometry by EGRID | None (CORS) |
geodienste.ch/db/av_0/{lang} WFS |
Land cover polygons (ms:LCSF) | None (CORS) |
api3.geo.admin.ch/SearchServer |
Location + layer search | None (CORS) |
api3.geo.admin.ch/CatalogServer |
Geokatalog tree | None (CORS) |
api3.geo.admin.ch/MapServer/{id}/legend |
Layer metadata + legend | None (CORS) |
wmts.geo.admin.ch |
swisstopo WMTS tiles | None |
wms.geo.admin.ch |
swisstopo WMS fallback | None |
See docs/SPECIFICATION.md for the full technical specification.
- Parcels — One row per parcel with identifiers, official and calculated area. In Mode 1, includes user-provided columns and error messages for unresolved EGRIDs. Disable with
--no-parcels. - Land Cover — One row per clipped land cover feature per parcel with type, area, EGRID, and green space classification. Disable with
--no-landcover. - Bauzonen (optional,
--bauzonen) — Addsbauzonenandbauzonen_m2columns to both Parcels and Land Cover outputs. - Habitat (optional,
--habitat) — Addshabitatandhabitat_m2columns to both Parcels and Land Cover outputs.
| Mode | Description | Input |
|---|---|---|
| 1 | User-provided parcel list | CSV or Excel with ID and EGRID columns |
| 2 | Full survey processing | All parcels from the AV GeoPackage (batched by municipality) |
- Python >= 3.10
- Dependencies:
geopandas,pandas,shapely >= 2.0,openpyxl - AV GeoPackage (
av_2056.gpkg) from geodienste.ch
cd python
pip install geopandas pandas shapely openpyxlcd python
# Mode 1: User-provided parcel list
python main.py --mode 1 --input ../data/example.csv
# Mode 1: Test with first 10 parcels
python main.py --mode 1 --input ../data/example.csv --limit 10
# Mode 2: All parcels (batched by BFSNr)
python main.py --mode 2 --limit 5
# With optional analyses
python main.py --mode 1 --input ../data/example.csv --bauzonen --habitat --limit 10 -v| Argument | Default | Description |
|---|---|---|
--mode {1,2} |
1 |
Processing mode |
--input PATH |
(required for Mode 1) | Path to user CSV or Excel file |
--gpkg PATH |
D:\AV_lv95\av_2056.gpkg |
Path to the AV GeoPackage |
--output-dir PATH |
(input file's directory) | Output directory |
--limit N |
(all) | Limit processing for testing |
--chunk-size N |
10000 |
Rows per processing chunk (Mode 1) |
--no-aggregate |
off | Disable area aggregation columns |
--no-parcels |
off | Skip parcels CSV export |
--no-landcover |
off | Skip land cover CSV export |
--bauzonen |
off | Intersect with Bauzonen Schweiz |
--habitat |
off | Intersect with BAFU Lebensraumkarte |
--verbose, -v |
off | Enable DEBUG logging |
The 26 land cover types (Art / BBArt) are defined in the official survey data model DM.01-AV-CH. The legal basis for the categories is TVAV Art. 14–19 (Technical Ordinance on the Official Cadastral Survey).
Art Code |
EN | DE | SIA 416 | DIN 277 | Sealed | Green Space | VBS Kat. | VBS Prod. | VBS Typ |
|---|---|---|---|---|---|---|---|---|---|
Gebaeude |
Building | Gebäude | GGF | BF | Yes | — | A | 2 | — |
Strasse_Weg |
Road, path | Strasse, Weg | BUF | UF | Yes | — | A | 2 | — |
Trottoir |
Sidewalk | Trottoir | BUF | UF | Yes | — | A | 2 | — |
Verkehrsinsel |
Traffic island | Verkehrsinsel | BUF | UF | Yes | — | A | 2 | — |
Bahn |
Railway | Bahn | BUF | UF | Yes | — | A | 2 | — |
Flugplatz |
Airfield | Flugplatz | BUF | UF | Yes | — | A | 2 | — |
Wasserbecken |
Water basin | Wasserbecken | BUF | UF | Yes | — | A | 2 | — |
uebrige_befestigte |
Other sealed | Übrige befestigte | BUF | UF | Yes | — | A | 2 | — |
Acker_Wiese_Weide |
Arable, meadow, pasture | Acker, Wiese, Weide | BUF | UF | No | Soil-covered | B | 1 | Typ 2 |
Reben |
Vineyards | Reben | BUF | UF | No | Soil-covered | B | 1 | Typ 2 |
uebrige_Intensivkultur |
Other intensive cultivation | Übrige Intensivkultur | BUF | UF | No | — | B | 1 | Typ 2 |
Gartenanlage |
Garden | Gartenanlage | BUF | UF | No | Soil-covered | B | 1 | Typ 1 |
Hoch_Flachmoor |
Raised/flat bog | Hoch-/Flachmoor | BUF | UF | No | Soil-covered | D | 1 | Typ 2 |
uebrige_humusierte |
Other soil-covered | Übrige humusierte | BUF | UF | No | Soil-covered | B | 1 | Typ 2 |
Gewaesser_stehendes |
Standing water | Stehendes Gewässer | UUF | UF | No | — | D | 1 | Typ 2 |
Gewaesser_fliessendes |
Flowing water | Fliessendes Gewässer | UUF | UF | No | — | D | 1 | Typ 2 |
Schilfguertel |
Reed belt | Schilfgürtel | UUF | UF | No | — | D | 1 | Typ 2 |
geschlossener_Wald |
Dense forest | Geschlossener Wald | UUF | UF | No | Wooded | C | 1 | Typ 2 |
Wytweide_dicht |
Dense wooded pasture | Wytweide dicht | BUF | UF | No | Soil-covered | B | 1 | Typ 2 |
Wytweide_offen |
Open wooded pasture | Wytweide offen | BUF | UF | No | Soil-covered | B | 1 | Typ 2 |
uebrige_bestockte |
Other wooded | Übrige bestockte | UUF | UF | No | Wooded | C | 1 | Typ 2 |
Fels |
Rock | Fels | UUF | UF | No | — | D | 2 | — |
Gletscher_Firn |
Glacier, firn | Gletscher, Firn | UUF | UF | No | — | D | 2 | — |
Geroell_Sand |
Scree, sand | Geröll, Sand | UUF | UF | No | — | D | 2 | — |
Abbau_Deponie |
Quarry, landfill | Abbau, Deponie | UUF | UF | No | — | A | 2 | — |
uebrige_vegetationslose |
Other unvegetated | Übrige vegetationslose | UUF | UF | No | — | D | 1 | Typ 2 |
SIA 416:2003 — GSF = GGF + UF, where UF = BUF + UUF. DIN 277:2021 — GF = BF + UF.
VBS Classification — Based on "Auswertung naturnahe VBS Flächen" (arImmo). VBS Kat. A–D = Siedlung / Landwirtschaft / Bestockt / Unproduktiv. VBS Prod. 1 = Biologisch produktiv, 2 = Biologisch unproduktiv (A + Fels/Gletscher/Geröll). VBS Typ = Typ 1 (Gartenanlage only) / Typ 2 (other productive) — only within biologically productive.
Official Swiss cadastral survey data (Amtliche Vermessung / mensuration officielle), data model DM.01-AV-CH:
- Download: https://www.geodienste.ch/services/av
- Manual: https://www.cadastre-manual.admin.ch/
- CRS: EPSG:2056 (CH1903+ / LV95)
- User Guide — Multilingual user manual (DE/FR/IT/EN) with FAQ and data coverage
- Technical Specification — Full specification including processing pipeline, data model, and architecture
- SIA 416:2003 — Flächen und Volumen von Gebäuden / Surfaces et volumes des bâtiments / Superfici e volumi di edifici
- DIN 277:2021 — Grundflächen und Rauminhalte im Hochbau
- DM.01-AV-CH — INTERLIS data model for the official cadastral survey
- TVAV (SR 211.432.21) — Technical Ordinance on the Official Cadastral Survey (Art. 14–19: land cover categories)
- GeoIG (SR 510.62) — Federal Act on Geoinformation
- VAV (SR 211.432.2) — Ordinance on the Official Cadastral Survey
- Cadastre Manual — Handbuch der Amtlichen Vermessung
| Library | Version | Purpose |
|---|---|---|
| MapLibre GL JS | 4.7.1 | Interactive vector map rendering |
| Turf.js | 7.x | Spatial operations (intersect, area, bbox, centroid) |
| SheetJS (xlsx) | 0.18.5 | Excel import/export (loaded on demand) |
| Material Symbols | — | UI icons (Google Fonts) |
| Source Sans 3 | — | Typography (Google Fonts) |
| CARTO Basemaps | — | Positron, Voyager, Dark Matter tiles |
| swisstopo APIs | — | Parcel lookup, search, WMTS/WMS tiles |
| geodienste.ch | — | Official surveying WFS (land cover) |
| Library | Version | Purpose |
|---|---|---|
| GeoPandas | >= 0.14 | GeoPackage I/O, spatial operations |
| Shapely | >= 2.0 | Geometry operations, make_valid() |
| pandas | >= 2.0 | Tabular data processing, CSV/Excel I/O |
| openpyxl | — | Excel (.xlsx) reading |
- SIA 416:2003 — Swiss standard for building surfaces and volumes
- DIN 277:2021 — German standard for floor areas and building volumes
See LICENSE.


