API
Gemeinsam für alle Endpunkte: kein API-Schlüssel, CORS offen (Access-Control-Allow-Origin: *), Fehler als application/problem+json nach
RFC 9457. Der Dienst begrenzt Anfragen je IP (Standard: 50 pro Sekunde, Spitze 300; Höhenabfragen zählen je 32 Punkte zusätzlich eins) und antwortet darüber mit 429 und Retry-After.
GET https://tiles.mapx.at/<datei>.pmtiles: die ganze PMTiles-Datei mit HTTP-Range. Das ist der Basisweg, MapLibre liest damit über das pmtiles://-Protokoll.
Dateinamen enthalten Stichtag und Hash und ändern sich nie. Aktuelle Namen: DTM.
curl -s -r 0-126 https://tiles.mapx.at/<datei>.pmtiles | xxd | headtilejson
Abschnitt betitelt „tilejson“GET https://tiles.mapx.at/v1/{tileset}.json, zum Beispiel /v1/dtm.json und /v1/dsm.json. {tileset} ist dtm, dsm oder der Tileset-Name aus dem Manifest
(relief-terrainrgb, relief-dsm-terrainrgb, mapx-basis, hoehenlinien, …); Vektor-Tilesets liefern zusätzlich vector_layers. Die Antwort trägt einen ETag und Cache-Control.
Antwort: TileJSON 3.0 mit tiles, minzoom, maxzoom, bounds, attribution, tileSize, encoding
und dem Stichtag. Damit lässt sich ein Tileset per URL in Clients einbinden, ohne den Dateinamen zu kennen.
{"tilejson": "3.0.0","name": "relief-terrainrgb","tiles": ["https://tiles.mapx.at/v1/dtm/{z}/{x}/{y}.webp"],"minzoom": 5, "maxzoom": 16,"bounds": [9.5306396, 46.3696741, 17.1661376, 49.0234614],"tileSize": 512, "encoding": "mapbox","attribution": "BEV – ALS-DTM 1 m (Stichtag 15.09.2025), CC BY 4.0"}Das Beispiel zeigt die Form; Zahlen entsprechen den PMTiles-Metadaten, die verbindliche Antwort liefert der Endpunkt.
GET https://tiles.mapx.at/v1/{tileset}/{z}/{x}/{y}.webp
Einzelne Kachel für Clients ohne PMTiles-Unterstützung (Leaflet, OpenLayers, QGIS). Inhalt wie in der PMTiles-Datei: WebP verlustfrei, 512 px, Terrain-RGB.
Die Endung passt zum Kacheltyp (webp, png, jpg, avif, bei Vektorkacheln pbf), sonst 404. Vektorkacheln kommen mit Content-Encoding: gzip, wenn der Client es annimmt.
Gibt es die Kachel nicht (außerhalb der Daten oder des Zoombereichs), antwortet der Dienst mit 404 als problem+json (wie Mapbox, nicht 204). ETag ist der Datei-Hash, If-None-Match liefert 304.
curl -s -o kachel.webp https://tiles.mapx.at/v1/dtm/12/2192/1439.webpelevation
Abschnitt betitelt „elevation“Höhe für einen Punkt, mehrere Punkte oder einen Pfad. Maschinenlesbar: openapi.yaml.
GET https://api.mapx.at/v1/elevation
| Parameter | Bedeutung |
|---|---|
points |
lon,lat;lon,lat;... (WGS84, Länge vor Breite) |
path |
lon,lat;lon,lat;..., Polylinie (2 bis 512 Stützpunkte); zusammen mit samples ein Profil entlang des Pfads |
samples |
Anzahl gleichmäßig nach Länge (Großkreis auf der Kugel) verteilter Messpunkte entlang path, 2 bis 1024, Standard 100 |
model |
dtm (Standard) oder dsm |
points und path schließen sich aus; points nimmt höchstens 512 Punkte. Die Höhe wird bilinear aus den z16-Kacheln (0,1-m-Raster) interpoliert.
Beispiel: Punkt
Abschnitt betitelt „Beispiel: Punkt“curl "https://api.mapx.at/v1/elevation?points=12.694,47.074&model=dtm"Antwort: GeoJSON FeatureCollection. Jedes Feature ist ein Punkt (Koordinaten [lon, lat]) mit den Eigenschaften elevation (m), resolution_m (Rasterweite der Quelle, 1 m), model und stichtag; bei path zusätzlich distance_m (Strecke vom Pfadanfang). Außerhalb der Daten ist elevation null (Antwort bleibt 200).
{"type": "FeatureCollection","features": [{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [12.694, 47.074] }, "properties": { "elevation": 0.0, "resolution_m": 1.0, "model": "dtm", "stichtag": "2025-09-15" }}]}Der Wert von elevation im Beispiel ist ein Platzhalter für die Form, kein Messwert.
Beispiel: Profil
Abschnitt betitelt „Beispiel: Profil“curl "https://api.mapx.at/v1/elevation?path=12.69,47.07;12.70,47.08&samples=50"Antwort wie oben, ein Feature je Messpunkt in Pfadreihenfolge.
application/problem+json mit type, title, status und detail:
{"type": "about:blank","title": "Bad Request","status": 400,"detail": "'12.5': erwartet lon,lat"}Typische Fälle: 400 (Parameter fehlen oder sind fehlerhaft), 404 (Tileset oder Kachel unbekannt), 429 (zu viele Anfragen, mit Retry-After), 503 (Dienst ausgelastet oder Höhenmodell nicht geladen).
type ist about:blank; title ist der Statustext, detail die Erklärung.
Alle Endpunkte antworten bei Fehlern mit application/problem+json (RFC 9457), nicht mit HTML.