Vektorkaardi juhend

Praktiline juhend näidetega: kaart lehele MapLibre'iga, stiili ja TileJSON-i kasutamine, oma stiili ehitamine ning tile'de avamine QGIS-is.

Baas-URL on teine. Vektorkaart elab aadressil https://api.elemroot.com: mitte pump.elemroot.com, kus on geoteenused.
Sisukord

Autentimine

Stiili-, sprite-, TileJSON- ja tile-päringud nõuavad API-võtit query-parameetriga key; ainult query-stringis (päise või küpsisega võtit edastada ei saa; positsioon query's ei loe). Ainult fondid ja /health on võtmeta. Võtmel peab olema vektorkaardi (tiles) teenuseõigus ja see võib olla seotud päritoluga; siis töötab ta ainult lubatud veebilehelt (brauser saadab Origin/Referer).

...&key=docs_382d376eaaa6d004b7b93b7d
Demo-võti. Näidetes kasutatav docs_… võti on avalik demo-võti proovimiseks: sama, mis geoteenustel (roteerub regulaarselt ja on kiiruspiiranguga). Oma rakenduse jaoks küsi personaalne võti.

Server kirjutab stiili ja TileJSON-i sees olevad URL-id ümber nii, et sinu võti liigub automaatselt kaasa; piisab, kui annad võtme ühe korra, stiili-URL-is.

Kiirstart: kaart lehele (MapLibre GL JS)

Täielik minimaalne leht: kopeeri, asenda võti ja ava brauseris:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <script src="https://unpkg.com/maplibre-gl@5/dist/maplibre-gl.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5/dist/maplibre-gl.css">
  <style> html, body, #map { margin: 0; height: 100%; } </style>
</head>
<body>
  <div id="map"></div>
  <script>
    const map = new maplibregl.Map({
      container: 'map',
      style: 'https://api.elemroot.com/styles/v1/elemroot/style.json?key=docs_382d376eaaa6d004b7b93b7d',
      center: [24.75, 59.44],   // [pikkus, laius]: Tallinn
      zoom: 10
    });
    map.addControl(new maplibregl.NavigationControl());
  </script>
</body>
</html>

Rohkem ei olegi vaja: stiil viitab ise õigetele tile-, sprite- ja fondi-URL-idele. Töötav näide: examples.elemroot.com/vector-map.

Stiil ja sprite'd

RessurssAadress
Stiilhttps://api.elemroot.com/styles/v1/elemroot/style.json?key=…
Spritehttps://api.elemroot.com/styles/v1/elemroot/sprite.json?key=… / sprite.png?key=…
Sprite @2x…/sprite@2x.json?key=… / sprite@2x.png?key=…

Stiil on MapLibre style spec'i (version: 8) dokument nimega Elemroot v1. See ühendab kaks allikat: planet_baltics-v1 (põhikaart) ja globallandcover-v1 (maakatte taust); ning defineerib kihtide kujunduse. Sprite'id sisaldavad kaardimärke ja mustreid.

TileJSON ja oma stiili ehitamine

Kui tahad kujundada kaardi ise, kasuta allikana TileJSON-i. Vastuses on tile-URL-i mall, zoom-vahemik ja kihtide loend koos väljadega (vector_layers):

Päring
curl "https://api.elemroot.com/tiles/v1/planet_baltics-v1.json?key=docs_382d376eaaa6d004b7b93b7d"
Vastus (lühendatult)
{
  "tilejson": "3.0.0",
  "name": "OpenMapTiles + OpenMapTiles",
  "scheme": "xyz",
  "minzoom": 0,
  "maxzoom": 14,
  "center": [24.904322, 56.98397, 14],
  "tiles": [
    "https://api.elemroot.com/tiles/v1/planet_baltics-v1/{z}/{x}/{y}.mvt?key=docs_382d376eaaa6d004b7b93b7d"
  ],
  "vector_layers": [ { "id": "aerodrome_label", "fields": { … } }, … ]
}

Oma stiilis viita allikale nii:

"sources": {
  "elemroot_map": {
    "type": "vector",
    "url": "https://api.elemroot.com/tiles/v1/planet_baltics-v1.json?key=SINU_VOTI"
  }
},
"glyphs": "https://api.elemroot.com/fonts/{fontstack}/{range}.pbf"

Tile'de otsekasutus

Üksik tile on gzip-pakitud Mapbox Vector Tile (protobuf), XYZ-skeemis. Tavaliselt pärib neid kaarditeek ise; käsitsi kontrolliks:

curl -s --compressed -o tile.mvt -w "%{http_code} %{content_type}\n" \
  "https://api.elemroot.com/tiles/v1/planet_baltics-v1/10/584/305.mvt?key=docs_382d376eaaa6d004b7b93b7d"

Vastuse sisutüüp on application/x-protobuf ja tile on alati gzip-pakitud (Content-Encoding: gzip, ka ilma Accept-Encoding päiseta); kaarditeegid pakivad ise lahti; käsitsi salvestades kasuta --compressed. Tühja koha (andmeteta) tile vastab 204 No Content: see on normaalne, mitte viga. Ruudustik on Web Mercator (EPSG:3857), tile'i sisemine ulatus 4096; x/y väärtus väljaspool 0…2z−1 ei anna 404, vaid mähitakse ümber (mod 2z); 404 tuleb ainult tundmatu tileset'i või liiga suure z korral.

Fondid (glyph'id)

Kohanimede kuvamiseks laeb kaarditeek glyph-PBF faile mustriga /fonts/{fontstack}/{range}.pbf (võtmeta, vahemikud sammuga 256):

curl -s -o glyphs.pbf "https://api.elemroot.com/fonts/Noto%20Sans%20Regular/0-255.pbf"

Saadaval on täpselt need fontstack'id: üksikfondid Noto Sans Regular, Noto Sans Bold, Noto Sans Italic, Roboto Regular, Roboto Medium, Roboto Bold, Roboto Italic, Open Sans Regular, Open Sans Semibold, Arial Unicode MS Regular ning eelehitatud varufondiga stack'id Roboto Regular,Noto Sans Regular, Roboto Medium,Noto Sans Regular, Roboto Bold,Noto Sans Bold, Roboto Italic,Noto Sans Italic, Open Sans Regular,Arial Unicode MS Regular.

Oma stiilis kasuta text-font väärtusena täpselt ühte ülaltoodutest; server ei koosta fonte lennult: muu kombinatsioon (nt Noto Sans Bold,Roboto Regular) annab 404 ja sildid jäävad kaardilt ära. Vahemikud on ainult 256-kaupa (0-255, 256-511 …).

Tileset'id ja kihid

TilesetSisuZoom
planet_baltics-v1Põhikaart OpenMapTiles skeemis: transportation, building, place, water, waterway, landuse, landcover, boundary, poi, housenumber jt kihid. Kaetus: kogu maailm ülevaatlikult (z0–11), detailne Baltikum (Eesti, Läti, Leedu koos lähiümbrusega) z12–14; mujal on z12–14 tile'd tühjad (204)0–14
globallandcover-v1Globaalne maakate (ESA WorldCover): taust, mida stiil kasutab madalatel zoom'idel0–9

Mõlema tileset'i TileJSON bounds on kogu maailm: kaardi algvaate jaoks anna center/zoom ise (stiili enda vaikevaade on maailmakaart). Atributsioon: valmis stiil kuvab selle ise; © Elemroot © OpenStreetMap (OpenMapTiles skeem) ja maakattekihil © ESA WorldCover; oma stiili ehitades säilita need viited.

Täpne kihtide ja väljade loend tuleb TileJSON-i vector_layers väljast (vt eespool). Skeemi kirjeldus: openmaptiles.org/schema.

QGIS ja teised töölauakliendid

QGIS (3.14+): Browser → Vector Tiles → New Generic Connection:

VäliVäärtus
URLhttps://api.elemroot.com/tiles/v1/planet_baltics-v1/{z}/{x}/{y}.mvt?key=SINU_VOTI
Min/Max zoom0 / 14
Style URL (valikuline)https://api.elemroot.com/styles/v1/elemroot/style.json?key=SINU_VOTI

Parameetrid

* = kohustuslik; tabelid genereeritakse OpenAPI-YAML-ist. Võti key (query) on kohustuslik kõigil peale fontide ja /health: vt autentimine.

Tile'd: /tiles/v1/{tileset}/{z}/{x}/{y}.mvt

ParamTähendusVõimalikud väärtused / näideVaikimisi
{tileset} *Tilesetplanet_baltics-v1 (põhikaart, z0–14) · globallandcover-v1 (maakate, z0–9); tundmatu → 404—
{z} *Zoom-tase0…14 (planet_baltics-v1), 0…9 (globallandcover-v1); suurem → 404—
{x} *Tile'i veerg (XYZ)0…2^z−1 (suurem mähitakse ümber)—
{y} *Tile'i rida (XYZ)0…2^z−1 (suurem mähitakse ümber)—

Fondid: /fonts/{fontstack}/{range}.pbf

ParamTähendusVõimalikud väärtused / näideVaikimisi
{fontstack} *Fontstack: täpselt üks 15-st saadaolevast (URL-kodeeritud)Noto Sans Regular, Roboto Regular,Noto Sans Regular …; muu kombinatsioon → 404—
{range} *Unicode'i vahemik sammuga 2560-255, 256-511 … 65280-65535; muu jaotus → 404—

Millal mida kasutada

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

ÜlesanneKombinatsioonMiks
Kaart lehele minimaalse vaevagavalmis stiil /styles/v1/elemroot/style.json?key=… MapLibre'istile-, sprite- ja fondi-URL-id ning võti on stiilis kaasas
Oma kujundusTileJSON /tiles/v1/{tileset}.json?key=… stiili source.url-iks + oma kihidkihid ja väljad vector_layers-ist; fondid ainult 15 saadaolevast stack'ist
Tile'd oma serverisse või renderdusse/tiles/v1/{tileset}/{z}/{x}/{y}.mvt?key=…gzip-pakitud protobuf; 204 = tühi koht
QGIS või muu töölauaklientVector Tiles ühendus tile-URL-i malliga + valikuline stiili-URLvt QGIS
Ortofoto, L-EST97 ruudustik või klient ilma WebGL-itarasterkaartvektorkaart on EPSG:3857 ja vajab WebGL-i
Kuus lõksu. (1) Võti käib ainult query-stringis; päis või küpsis ei kehti. (2) Tile'd on alati gzip-pakitud: käsitsi salvestades --compressed. (3) text-font peab olema täpselt üks 15 fontstack'ist, muidu sildid kaovad vaikselt. (4) TileJSON bounds on kogu maailm: anna algvaade ise. (5) x/y väljaspool vahemikku ei anna 404, vaid mähitud tile'i. (6) 204 ei ole viga, vaid tühi koht.

Puhverdamine ja CORS

RessurssCache-Control
Tile'd (.mvt)public, max-age=86400 (24 h)
TileJSON, stiil, sprite'dpublic, max-age=3600 (1 h)
Fondidpublic, max-age=604800 (7 p)

Stiil, fondid ja tile'd tulevad päisega Access-Control-Allow-Origin: *; kaardi saab panna mis tahes veebilehele. Tile'del ja TileJSON-il lisatakse see päis vastuseks brauseri Origin päisele (Vary: Origin); brauseris on see alati olemas; curl-iga ilma Origin-ita päist ei paista ja see pole viga.

Veakäsitlus

KoodTähendus
403Vale või puuduv võti: keha {"error":"invalid_api_key"}. Sama vastus tuleb ka aegunud võtmega, kui võtmel puudub vektorkaardi (tiles) teenuseõigus või kui päritoluga seotud võtit kasutatakse väljaspool lubatud lehte
204Tühi tile (andmeid pole): normaalne
404Tundmatu tileset (Archive not found) või z üle tileset'i maksimumi (Tile not found); keha on tekst; tundmatu tee → JSON {"error":"not_found"}; puuduv stiili- või fondifail → HTML. NB x/y väljaspool vahemikku 404 ei anna (vt tile'de otsekasutus)
429Liiga tihedad päringud (demo-võti on kiiruspiiranguga): Too Many Requests, keha HTML
Kaart on tühi/hall? Kontrolli brauseri konsoolist, kas tile-päringud saavad 403 (võti puudu või vale); ja et stiili-URL sisaldaks ?key=….

Edasi

API viide (Swagger UI) → Kõik endpoint'id ja „proovi järele”. Töötav näide → Lihtne vektorkaart examples.elemroot.com lehel.

Näited galeriis