Rasterkaardi juhend

Praktiline juhend näidetega: rastertile'd Leaflet'i ja MapLibre'iga, ortofoto kihivahetus, WMTS-ühendus QGIS-is ning EPSG:3301 kihid OpenLayers'iga.

Baas-URL: rasterkaart elab aadressil https://pump.elemroot.com (nagu geoteenused): mitte api.elemroot.com, kus on vektorkaart.
Sisukord

Autentimine

Iga päring vajab key-parameetrit ja võtmel peab olema raster-teenus. Ilma võtmeta või vale võtmega vastab teenus 403 (keha {"error":"invalid_api_key"}). Võti võib olla seotud päritoluga: siis töötab ta ainult lubatud veebilehelt (brauser saadab Origin/Referer). Näidetes kasutatav docs_… võti on kiiruspiiranguga demo-võti (liiga tihedad päringud → 429); oma rakenduse jaoks küsi personaalne võti.

curl -s -o tile.png \
  'https://pump.elemroot.com/xyz/eestig/12/2329/1202.png?key=docs_382d376eaaa6d004b7b93b7d'

Kihid ja ruudustikud

KihtSisuRuudustikFormaatMax zoom
eestigElemrooti Eesti kaartEPSG:3857png18
eestio3857Maa-ameti ortofotoEPSG:3857jpeg18
eestiElemrooti Eesti kaartEPSG:3301 (L-EST97)png18
eestioMaa-ameti ortofotoEPSG:3301 (L-EST97)jpeg15

Kumba ruudustikku valida? Veebirakenduses kasuta EPSG:3857 kihte (eestig, eestio3857); need on standardses veebi-merkaatori ruudustikus, mida Leaflet ja MapLibre mõistavad ilma lisateekideta. EPSG:3301 kihid on Eesti riiklikus L-EST97 ruudustikus: neid vajad GIS-tarkvaras (WMTS kaudu) või kui su rakendus töötab L-EST97 koordinaatides; veebis nõuavad nad OpenLayers'it + proj4-t või Leafletit + Proj4Leafletit (vt allpool).

Kiirstart: Leaflet

Lihtsaim viis rasterkaart lehele saada (töötav täisnäide: Leaflet + EPSG:3301):

<div id="map" style="height: 400px"></div>
<script>
  const map = L.map('map').setView([59.437, 24.7536], 12); // Tallinn

  L.tileLayer('https://pump.elemroot.com/xyz/eestig/{z}/{x}/{y}.png?key=docs_382d376eaaa6d004b7b93b7d', {
    maxZoom: 18,
    attribution: '© Elemroot'
  }).addTo(map);
</script>

Ortofoto jaoks vaheta kiht: eestio3857/{z}/{x}/{y}.jpeg (atributsioon © Maa-amet).

MapLibre GL JS

MapLibre's on rastertile'd raster-tüüpi allikas. See sobib hästi ka siis, kui tahad ortofotot kuvada vektorkaardi kõrval või all:

const map = new maplibregl.Map({
  container: 'map',
  style: {
    version: 8,
    sources: {
      orto: {
        type: 'raster', tileSize: 256, maxzoom: 18,
        tiles: ['https://pump.elemroot.com/xyz/eestio3857/{z}/{x}/{y}.jpeg?key=docs_382d376eaaa6d004b7b93b7d'],
        attribution: '© Maa-amet'
      }
    },
    layers: [{ id: 'orto', type: 'raster', source: 'orto' }]
  },
  center: [24.7536, 59.4370],
  zoom: 12
});

Elus demo kihivahetusega (kaart ↔ ortofoto): näidete galerii „Rasterkaart kihivalikuga”.

WMTS ja QGIS

WMTS on iseennast kirjeldav standard: capabilities-dokument loetleb kihid, ruudustikud ja tile-URL-id. Anna GIS-tarkvarale capabilities-URL koos võtmega: võti kantakse tile-URL-idesse automaatselt edasi:

https://pump.elemroot.com/wmts/1.0.0/WMTSCapabilities.xml?key=docs_382d376eaaa6d004b7b93b7d

QGIS-is:

  1. Layer → Add Layer → Add WMS/WMTS Layer → New
  2. URL-i lahtrisse pane ülalolev capabilities-aadress (oma võtmega)
  3. Connect: vali kiht (nt eesti ruudustikuga est3301 või eestig ruudustikuga webmerc) → Add

EPSG:3301 kihid tulevad QGIS-is õigesse projektsiooni ilma ümberprojekteerimiseta; L-EST97 töövoo jaoks eelista neid.

WMTS REST tile-URL on /wmts/{kiht}/{grid}/{z}/{x}/{y}.{laiend} (TileMatrix/TileCol/TileRow; TileMatrix ID on capabilities'es nullitäidisega 00…20, aga ka paljas 6 sobib). Erinevalt XYZ-otsast on siin laiend kohustuslik ja peab vastama kihi formaadile: kaardikihtidel .png, ortofotol (eestio, eestio3857) .jpeg. Vale laiend, vale grid, tundmatu kiht või ruudustikust väljas tile annavad 400 OGC ExceptionReport-XML-i (InvalidParameterValue / TileOutOfRange). Liides on REST-only (KVP GetTile puudub); capabilities kannab võtme tile-mallidesse edasi.

EPSG:3301 kihid veebis (OpenLayers)

eesti ja eestio elavad Eesti riiklikus ruudustikus: bbox [-211000, 5732000, 1325000, 7268000], algresolutsioon 6000 m/px, iga zoom poolitab. XYZ-teljestik (rea 0 on põhjas). OpenLayers + proj4 näide (töötav täisnäide: OpenLayers + EPSG:3301; sama ruudustik Leafletiga: Leaflet + Proj4Leaflet):

proj4.defs('EPSG:3301',
  '+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 ' +
  '+lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs');
ol.proj.proj4.register(proj4);

const extent = [-211000, 5732000, 1325000, 7268000];
const resolutions = [];
for (let z = 0; z <= 18; z++) resolutions[z] = 6000 / Math.pow(2, z);

const map = new ol.Map({
  target: 'map',
  layers: [new ol.layer.Tile({
    source: new ol.source.XYZ({
      url: 'https://pump.elemroot.com/xyz/eesti/{z}/{x}/{y}.png?key=docs_382d376eaaa6d004b7b93b7d',
      projection: 'EPSG:3301',
      tileGrid: new ol.tilegrid.TileGrid({
        extent, resolutions, tileSize: 256,
        origin: [extent[0], extent[3]]   // NW-nurk = XYZ-teljestik
      }),
      attributions: '© Elemroot'
    })
  })],
  view: new ol.View({
    projection: 'EPSG:3301',
    center: [542000, 6589000],           // Tallinn L-EST97-s
    resolution: 6000 / Math.pow(2, 12)
  })
});

Parameetrid

* = kohustuslik; tabelid genereeritakse OpenAPI-YAML-ist.

XYZ: /xyz/{kiht}/{z}/{x}/{y}.png

ParamTähendusVõimalikud väärtused / näideVaikimisi
{kiht} *Kihteestig, eestio3857 (EPSG:3857) · eesti, eestio (EPSG:3301); tundmatu → 404—
{z} *Zoom-tase (rida 0 põhjas)0…max zoom (kihitabel; eestio 15, muud 18)—
{x} *Tile'i veerg (XYZ)täisarv; väljaspool ruudustikku → 404—
{y} *Tile'i rida (XYZ, y kasvab lõunasse)täisarv; väljaspool ruudustikku → 404—
key *API-võti (raster-teenusega); puudub/vale → 403 JSONdocs_382d376eaaa6d004b7b93b7d (demo, kiiruspiiranguga)—

WMTS REST: /wmts/{kiht}/{grid}/{z}/{x}/{y}.{laiend}

ParamTähendusVõimalikud väärtused / näideVaikimisi
{kiht} *Kihteestig, eestio3857 (grid webmerc) · eesti, eestio (grid est3301); tundmatu → 400—
{grid} *TileMatrixSet: peab vastama kihilewebmerc või est3301; vale → 400—
{z} *TileMatrix (zoom)6 või nullitäidisega 06—
{x} *TileColtäisarv; väljaspool → 400 TileOutOfRange—
{y} *TileRow (rida 0 põhjas)täisarv; väljaspool → 400 TileOutOfRange—
{laiend} *Faililaiend: kohustuslik, peab vastama kihi formaadilepng (eestig, eesti) või jpeg (eestio3857, eestio); vale → 400—
key *API-võti (raster-teenusega); puudub/vale → 403 JSONdocs_382d376eaaa6d004b7b93b7d (demo, kiiruspiiranguga)—

Millal mida kasutada

Sagedasemad ülesanded ja neile vastav kiht/ots. Kõik read on elusalt kontrollitud.

ÜlesanneKombinatsioonMiks
Kaart veebilehele (Leaflet, MapLibre, OpenLayers)/xyz/eestig/{z}/{x}/{y}.png?key=…standardne veebi-merkaator, lisateeke pole vaja
Ortofoto veebis/xyz/eestio3857/{z}/{x}/{y}.jpeg?key=…Maa-ameti orto EPSG:3857-s, JPEG
Ortofoto vektorkaardi all või kõrvalMapLibre raster-allikas eestio3857vt MapLibre näidet
GIS-tarkvara (QGIS jt)WMTS capabilities-URL koos võtmegakihid, ruudustikud ja tile-mallid tulevad automaatselt
L-EST97 rakendus / EPSG:3301 ruudustik/xyz/eesti/… või /xyz/eestio/… + OpenLayers proj4 / Leaflet Proj4Leafletilma ümberprojekteerimiseta
Terav, stiilitav ja kergem kaartvektorkaartraster ainult siis, kui vajad ortot, L-EST97 ruudustikku või klienti ilma WebGL-ita
Neli lõksu. (1) XYZ-otsal laiendit ei kontrollita, WMTS-otsal peab laiend klappima kihi formaadiga (.jpeg ortofotol). (2) Rida 0 on põhjas ja y kasvab lõunasse: ka EPSG:3301 ruudustikul (NW-nurk on origin). (3) Võtmeta 403 keha on JSON, kuigi Content-Type on pildi oma: ära parsi vastust laiendi järgi. (4) Tile'd tulevad 7-päevase Cache-Control-iga: kaardiuuendus jõuab brauserisse viivitusega.

Veakäsitlus

OlukordKoodTeade
Võti puudub, on vale või ilma raster-õiguseta403JSON {"error":"invalid_api_key"}
XYZ: tundmatu kiht404unknown layer: … (tekst)
XYZ: tile väljaspool ruudustikku404The requested tile is outside the bounding box of the tile map. (tekst, mitte pilt)
WMTS: vale laiend400OGC ExceptionReport invalid format (png). this tile set only supports (jpeg)
WMTS: vale grid / tundmatu kiht400InvalidParameterValue: unknown tilematrixset … / unknown layer …
WMTS: tile väljaspool ruudustikku400TileOutOfRange
Liiga tihedad päringud (demo-võti)429Too Many Requests
Allika ajutine rike (nt Maa-ameti WMS ei vasta)500no image returned from source WMS …; proovi hiljem uuesti

Formaadid ja viited

API viide (Swagger UI) → Kõik endpoint'id ja interaktiivne „proovi järele”. Elus näide → Rasterkaart kihivalikuga examples.elemroot.com lehel.

Näited galeriis