JS SDK
@dock/js 0.82.0. dock tile дээрх MapLibre газрын зураг, хайлт, цэгээр хайлт, ойрын газар ангиллаар, барилгын хаалгууд, цэгийн хамгийн ойрын хаалга, барилгын код, газрыг id-гаар, өөрчлөлт, хаалганы мэдэгдэл, жолоочийн баталгаа, хэрэглээ, аялал бичих, флотын байрлал ба замын шууд хурд. Түлхүүрийг нэг client хадгална. Хөтөч болон Node 20+. Өөр сан шаардахгүй; maplibre-gl зөвхөн газрын зурагт хэрэгтэй. Код бичихгүйгээр дуудлага бүрийг туршуур дээр туршина. Mapbox эсвэл Google Maps-аас ирж байгаа бол: ижил дуудлагууд зэрэгцээ. Утасны апп: iOS SDK, Android SDK.
Нэг script tag
npm, bundler хэрэггүй: dock.js-д SDK болон maplibre-gl бий, window.dock дээр; dock.css-д загвар нь. Ямар ч сайт ачаалж болно. dock.createMap(client, options) өөрийн maplibre-gl-ийг хэрэглэнэ.
<link href="https://dock.mn/sdk/v1/dock.css" rel="stylesheet">
<script src="https://dock.mn/sdk/v1/dock.js"></script>
<div id="map" style="height: 480px"></div>
<script>
const client = new dock.Client({ key: 'dk_...' });
const map = dock.createMap(client, { container: 'map' });
client.geocode('Зайсан').then(({ results }) => {
map.flyTo({ center: results[0].point, zoom: 17 });
});
</script>map.dock.mn-ийн удирдлага
Нэг мөр: map.dock.mn-ийн хайлтын хуудас (хайлт, ангилал, газрын карт, хаалга ба код, хаалга хүртэл зам), баруун дээд товчлууд, давхаргын самбар, эргэлтийн мөр таны газрын зураг дээр. Сонголтууд: key эсвэл client, preset (auto, day, dusk, night, winter), code (эхлээд нээх хаалга), q (эхлээд хайх), center, zoom. brand: false dock тэмдгийг нуух (#brand). Буцаах утга нь maplibre-gl Map; map.ui дээр хуудасны дуудлагууд.
Нэг мөр, хайрцаг ч түлхүүр ч дуудлагад бичихгүй: түлхүүрээ script tag дээр тавина. Хуудас хуудасны #map-ыг, тэр байхгүй бол бүх хуудсыг дүүргэнэ.
<link href="https://dock.mn/sdk/v1/dock.css" rel="stylesheet">
<script src="https://dock.mn/sdk/v1/dock.js" data-key="dk_..."></script>
<script>new dock.Map({ ui: 'sheet' });</script>Өөрийн хайрцагт, бэлэн client-тэй:
<div id="map" style="height: 560px"></div>
<script>
const map = new dock.Map({ container: 'map', key: 'dk_...', ui: 'sheet' });
</script>Самбар script ирэхээс өмнө
dock.js-д maplibre-gl багтсан тул ачаалж дуустал самбар зурагдахгүй; харин таны хуудас зурагдана. Урьдчилсан самбарыг (хайлтын хайрцаг, зургаан ангилал, гурван товч, dock тэмдэг) #map-ынхаа дотор тавиад толгойд нь dock.css-ийг холбоно. Энэ нь таны эхний байтуудтай хамт гарч, new dock.Map({ ui: 'sheet' }) нэг алхмаар амьд самбараар солино: хайрцгууд хөдлөхгүй, бичсэн текст үлдэнэ. Тэр болтол урьдчилсан самбарын ангилал, товчууд идэвхгүй. Шөнийн хуудсанд хайрцагт data-theme="night" тавина.
<div id="map" class="dock-ui" style="height: 100%">
<div id="brand" data-pre aria-hidden="true">dock<span>.</span></div>
<div id="sheet" data-pre class="sheet collapsed" role="dialog" aria-label="Хайлт ба газрууд">
<div class="handle-wrap" id="handle"><div class="handle"></div></div>
<div class="sheet-view" id="v-search">
<div class="searchbar">
<svg viewBox="0 0 24 24"><path d="M3 10a7 7 0 1 0 14 0a7 7 0 1 0 -14 0"/><path d="M21 21l-6 -6"/></svg>
<input id="q" type="search" aria-label="Хайх" placeholder="Хаяг, нэр эсвэл 5 тэмдэгт код" autocomplete="off" autocapitalize="off" spellcheck="false">
</div>
<div class="chips" id="chips">
<button type="button" data-cat="food">Хоол</button>
<button type="button" data-cat="shop">Дэлгүүр</button>
<button type="button" data-cat="pharmacy">Эмийн сан</button>
<button type="button" data-cat="bank">Банк</button>
<button type="button" data-cat="fuel">Шатахуун</button>
<button type="button" data-cat="bus">Буудал</button>
</div>
<button id="btn-here" class="here" type="button"><span class="ic"><span class="dot"></span></span><span class="t"><span class="n">Энд байгаа хаяг</span><span class="s">Таны байгаа барилгын код ба хаяг</span></span></button>
</div>
</div>
<div id="tr" class="stack" data-pre style="pointer-events:none" aria-hidden="true">
<button id="btn-layers" class="rb" type="button" aria-label="Давхарга"><svg viewBox="0 0 24 24"><path d="M12 4l-8 4l8 4l8 -4l-8 -4"/><path d="M4 12l8 4l8 -4"/><path d="M4 16l8 4l8 -4"/></svg></button>
<button id="btn-3d" class="rb" type="button" aria-label="3D">3D</button>
<button id="btn-locate" class="rb" type="button" aria-label="Миний байршил"><svg viewBox="0 0 24 24"><path d="M9 12a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"/><path d="M4 12a8 8 0 1 0 16 0a8 8 0 1 0 -16 0"/><path d="M12 2l0 2"/><path d="M12 20l0 2"/><path d="M20 12l2 0"/><path d="M2 12l2 0"/></svg></button>
</div>
</div>Суулгах
npm дээр хараахан гараагүй. Гартал дээрх script tag-ийг ашиглана, эсвэл багцын файлыг холбогч хүнээсээ авна:
npm install maplibre-gl@6 ./dock-js-0.82.0.tgzmaplibre-gl 6.4.1 эсвэл түүнээс хойшхи 6.x. 6.4.0 хүртэлх бүх хувилбарт, 4, 5-ыг оролцуулан, HTML цэвэрлэгчид нь ноцтой XSS эмзэг байдал бий (GHSA-jrc7-96c5-q579), тиймээс SDK тэдгээрийг хүлээж авахаа больсон. maplibre-gl аль хэдийн суулгасан бол npm ls maplibre-gl ажиллуулж, 6.4.1-ээс бага бол шинэчилнэ. Доорх код Vite-д зориулсан; бусдыг Bundler хэсгээс харна.
Газрын зураг
<div id="map" style="height: 480px"></div>import * as maplibregl from 'maplibre-gl';
import workerUrl from 'maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url';
import 'maplibre-gl/dist/maplibre-gl.css';
import { Client, createMap } from '@dock/js';
maplibregl.setWorkerUrl(workerUrl);
const dock = new Client({ key: 'dk_...' });
const map = createMap(maplibregl, dock, { container: 'map' });Газрын зураг Улаанбаатарт, zoom 15-д нээгдэнэ. Барилга zoom 13-аас, хаалга zoom 15-аас харагдана. Хаалгыг итгэлцлээр нь өнгөөр ялгана; итгэлцэл тодорхойгүй бол саарал. Эх сурвалжийн тэмдэглэл tile-аас ирнэ.
| Сонголт | Анхдагч | |
|---|---|---|
container | Элемент эсвэл түүний id. Заавал. | |
center, zoom | UB_CENTER, 15 | [lon, lat]. |
extrude | false | Барилгыг өндрөөр нь (эсвэл давхар x 3 м) өргөнө. |
background | цаасан өнгө | Арын өнгө. |
building, buildingOutline | бор саарал | Барилгын дүүргэлт, хүрээний өнгө. |
styleId | Загвар засварлагч-д хадгалсан загвар (st_ ба 10 тэмдэгт). API-аас таны түлхүүрээр ачаална. style-тэй хамт өгөхгүй. | |
style | dockStyle(...) | Өөрийн style. dockSources, dockLayers-ийг нэмнэ. |
transformRequest | Түлхүүр нэмэгдсэний дараа ажиллана, өөрийн хостуудад. |
Бусад сонголт maplibre-gl Map руу шууд очно.
Bundler
maplibre-gl 6 worker-оо хоёр дахь файлаас, maplibre-gl-worker.mjs-ээс эхлүүлдэг. Тэр файл гурав дахь файлыг, maplibre-gl-shared.mjs-ийг import хийдэг. Bundler үндсэн файлыг нь зөөгөөд эдгээрийг үлдээвэл газрын зураг хоосон гарч, консолд нэг алдаа гарна: "Worker failed to load". Доорх орчин бүр кодын worker-ийн хоёр мөрийг өөрийнхөөрөө солино.
| Орчин | Юу хийх | Туршсан |
|---|---|---|
| Vite | Дээрх код. ?worker&url нь Vite-ээр worker-ийг багцлуулж, URL-ийг нь өгнө. | Vite 8 dev ба build |
| webpack 5 | Worker-ийг хоёр дахь entry болгоно, доор. | production ба development build |
| esbuild | Worker-ийг --splitting-тэй хоёр дахь entry болгоно, доор. Worker газрын зурагтай нэг chunk хуваалцана. | build |
| Bundler-гүй | workerUrl import болон setWorkerUrl мөрийг хасна. Worker үндсэн файлынхаа хажуугаас ачаалагдана. | import map |
| Бусад bundler | node_modules/maplibre-gl/dist/-ээс maplibre-gl-worker.mjs, maplibre-gl-shared.mjs-ийг хуудасныхаа хажууд хуулаад доорх мөрийг нэмнэ. | webpack 5 ба esbuild дээр |
webpack 5, webpack.config.js-д:
entry: { main: './main.js', 'maplibre-gl-worker': 'maplibre-gl/dist/maplibre-gl-worker.mjs' },
output: { filename: '[name].js' },maplibregl.setWorkerUrl(__webpack_public_path__ + 'maplibre-gl-worker.js');webpack "Critical dependency" гэж гурван удаа анхааруулна. Энэ нь worker-ийн plugin-д зориулсан maplibre-ийн import(url) (importScriptInWorkers, ES module RTL text plugin): webpack-аар багцалсан worker-т эдгээр ачаалагдахгүй. dock аль алийг нь ашигладаггүй. Та ашигладаг бол хуулах аргыг хэрэглэнэ.
esbuild:
esbuild main.js node_modules/maplibre-gl/dist/maplibre-gl-worker.mjs --bundle --splitting --format=esm --outdir=dist --entry-names=[name]maplibregl.setWorkerUrl(new URL('./maplibre-gl-worker.js', import.meta.url).href);Бусад bundler, хоёр файлыг хуулсны дараа:
maplibregl.setWorkerUrl(new URL('maplibre-gl-worker.mjs', document.baseURI).href);Орчин бүрийг make bundlers дахин build хийж Chrome-д нээж шалгадаг (maplibre-gl 6.11.2, vite 8.3.2, webpack 5.111.1, esbuild 0.28.2). Worker-ийн мөргүйгээр Vite, webpack, esbuild гурвуулаа хоосон газрын зураг гаргадаг.
Өөрийн суурь зураг дээр
const myStyle = { version: 8, sources: {}, layers: [{ id: 'bg', type: 'background', paint: { 'background-color': '#eee' } }] };
const map = createMap(maplibregl, dock, {
container: 'map',
style: {
...myStyle,
sources: { ...myStyle.sources, ...dockSources(dock.baseUrl) },
layers: [...myStyle.layers, ...dockLayers({ extrude: true })],
},
});Түлхүүр зөвхөн dock API руу явах хүсэлтэд нэмэгдэнэ. Таны суурь зургийн хост, фонтын сервер рүү хэзээ ч явахгүй.
Хайлт, цэгээр хайлт, барилгын код
const { results } = await dock.geocode('Сансар 24', { limit: 5 });
for (const place of results) console.log(place.kind, label(place, 'mn'));
const typing = await dock.geocode('Сан', { proximity: [106.9177, 47.9186] });
console.log(typing.results.length);
const streets = await dock.geocode('Сансар', { types: ['street', 'area'] });
console.log(streets.results.length);
const here = await dock.reverse([106.9301, 47.9201], { radius: 50 });
console.log(here.district_mn, here.khoroo, here.results.length);
const landmarks = await dock.reverse([106.9301, 47.9201], { radius: 300, types: ['landmark'] });
console.log(landmarks.results.length);
const typed = parseDoorCode('7qsvх 17');
if (typed.ok) {
const door = await dock.door(typed.code, { unit: typed.unit ?? undefined });
console.log(label(door, 'mn'), door.entrance.kind, door.point);
} else {
console.log(typed.error);
}
console.log(doorLink('7qsvх', '17'));
const opened = parseDoorLink('https://map.dock.mn/d/7QSVX?u=17');
if (opened?.ok) console.log(opened.code, opened.unit);
console.log(doorQr('7qsvх', '17')?.size);
const qrSvg = doorQrSvg('7qsvх', '17');Цэг нь MapLibre-тэй адил [lon, lat]. Барилгын кодонд кирилл ижил үсэг (К, М, Т, Х, Р, С, В, Н) болно. parseDoorCode(text) бичсэн эсвэл буулгасан кодыг API-тай адил уншина, хүсэлт явуулахгүй: { ok: true, code, unit }, эсвэл { ok: false, error }. error нь 'empty', 'length' (5 тэмдэгт биш) эсвэл 'letters' (эгшиг, I, L, O, U, эсвэл тэмдэг). Хүн бичих зуур талбарыг шалгаж, error бүрт өөрийн үгээ харуул. door() ийм бичвэрийг хүсэлт явуулахаас өмнө мөн адил татгалзана: DockError 400 invalid_code. Хаалга олдохгүй код өдрийн алдааны хязгаараас нэгийг хасна.
doorLink(text, unit?) хаалгыг хуваалцах холбоос үүсгэнэ: https://map.dock.mn/d/7QSVX?u=17. Хуваалцах цонх, мессеж эсвэл QR-д хэрэглэнэ. Бичвэр код болж чадахгүй бол null. Хүсэлт явуулахгүй, тэр кодтой хаалга байгаа эсэхийг шалгахгүй. parseDoorLink(text) бичвэр дэх эхний хаалганы холбоосыг уншина: буулгасан мессеж, эсвэл апп-ыг нээсэн холбоосын URL. Холбоос байхгүй бол null, байвал parseDoorCode-той ижил хариу. Хаягийн талбар буулгасан холбоосыг зөвхөн түүний хаалгаар хайна. map.dock.mn хаалганы хуудсыг одоогоор үзүүлэхгүй; холбоосыг бүх SDK одоо уншина.
doorQrSvg(text, unit?, { px, margin }) хаалганы QR-ыг SVG болгоно: дотор нь doorLink-ийн холбоос, хар цагаан, <img>, хуваалцах цонх эсвэл хэвлэхэд. Утасны камер мессежийн холбоостой ижил холбоосыг нээнэ. Модуль бүр px (анхдагч 4), эргэн тойронд margin цагаан модуль (анхдагч 4, стандартын доод хэмжээ). doorQr(text, unit?) модулиудыг өгнө (modules[y][x] бараан бол true, size, version), canvas дээр өөрөө зурахад. ISO/IEC 18004, алдааны засвар M (15%). Сүлжээгүй, сан шаардахгүй. Бичвэр код болж чадахгүй бол null.
Хүн бичих зуур proximity-д хүн байгаа газар эсвэл газрын зургийн төвийг өг: бичсэн үгээр ижил таарцтай эхэлсэн нэрсээс ойр газар нь эхэнд гарна. Цэг зөвхөн тэр хүсэлттэй явна. Төхөөрөмж дээр хадгалагдахгүй, API бичихгүй, хайлт хуваалцахад явахгүй. Сүлжээгүй үеийн хариу үүнийг уншихгүй.
dock.nearby([lon, lat], ['pharmacy'], { radius, limit }) цэгийн ойрын газрыг ангиллаар нь, ойроос нь өгнө. Хариу бүрт category, distance_m. "Хоол" товч бол ['restaurant', 'cafe']. radius анхдагч 1000 м, 10000 хүртэл; limit анхдагч 10, 20 хүртэл. Ангиллууд NEARBY_CATEGORIES-д. Банк, шатахуун, эмийн сан, хоол, кафе, дэлгүүр зөвхөн улсын бүртгэлтэй таарсан бизнес, таарах хүртэл хоосон. Өөр ангилал эсвэл хоосон жагсаалтыг хүсэлт явуулахаас өмнө DockError 400 invalid_category-оор татгалзана.
doorAt([lon, lat]) бол газрын зураг дээрх товшилт: цэг дээрх хаягийн нэгж, эхлээд хашаа, үгүй бол цэгийг агуулсан хамгийн жижиг барилга. Хариуд id, kind (building эсвэл khashaa), албан ёсны хаяг, official_line, мөн code; нэгжид код байхгүй бол code нь null. Цэг дээр нэгж байхгүй эсвэл хязгаарлагдсан газар бол DockError 404 not_found. door:read шаардана.
dock.entrances(buildingId) барилгын дугаартай хаалгуудыг картад нь өгнө, зөвхөн барилгын эзэн эсвэл СӨХ батласан бол. Үгүй бол entrances_approved нь false, note нь "entrances: not approved for this building" гэнэ; барилгын код, албан ёсны хэлбэр door хариунд бий. Жагсаасан хаалга бүрд letter, kind, point, түвшин нь official_status-д (matched бүртгэлтэй, partial хэсэгчилсэн, none албан бус), code. entrances geocode:read шаардана. Одоо байгаа барилга биш id 404 not_found, нураасан барилга 410 retired.
dock.entrancesNear([lon, lat]) цэгийн хамгийн ойрын барилгын батлагдсан хаалгуудыг өгнө: газрын зураг дээр удаан дарахад. Ойроосоо эхэлж, бүр нь entrances-ийнх шиг, дээр нь building ба distance_m. radius метрээр, өгөөгүй бол 50, дээд тал нь 1000; limit өгөөгүй бол 1, дээд тал нь 20. Ойрхон батлагдсан хаалга байхгүй бол results хоосон. entrancesNear geocode:read шаардана.
dock.venue(id) дотоод зурагтай барилгыг өгнө: нэр, хүрээ, давхрууд (доороос нь). ordinal 0 газар, -1 хонгил. id-г хайлтын мөрийн indoor.venue_id-аас авна. dock.venueLevel(id, 1) нэг давхрыг GeoJSON-оор өгнө: өрөө, нүхнүүд, үйлчилгээ, бүр нь source, confidence-тэй. dock.venueSpot(id, unitId) хэвлэсэн самбар юу гэж хэлэхийг (давхар, нэр эсвэл дугаар, цэг) ба QR-ын link-ийг өгнө. venue, venueLevel, venueSpot door:read шаардана. Үл мэдэгдэх барилга, давхар, өрөө 404 not_found.
dock.venueRoute(id, [lon, lat], unitId, { fromLevel }) дотор нэг өрөө хүртэлх явган замыг давхраар нь өгнө: legs (давхар бүрийн шугам, төгсгөл нь stairs, escalator, elevator эсвэл arrive), давхар бүрийг заасан монгол steps, distance_m, duration_s. dock.venueDirections(id, [lon, lat], unitId, { mode }) зөв гудамжны орц хүртэлх зам, түүнээс цааших явган замыг нэг хариугаар өгнө (road, indoor). venueRoute door:read, venueDirections route:read шаардана. Коридор зурагдаагүй бол 422 no_route (гудамжны орц зурагдаагүй бол no_entrance); юуг ч зохиохгүй.
venuesNear([lon, lat]) цэгийн ойролцоох дотоод зурагтай барилгуудыг, хамгийн ойрыг нь түрүүлж, venue id ба зайтай нь өгнө.
dock.directory(buildingId) барилгад бүртгэлтэй байгууллагуудыг давхраар нь өгнө: оффисын барилга, худалдааны төвийн картын "Энд байгаа байгууллагууд"-д. Зөвхөн албан ёсны бүртгэлтэй таарсан байгууллага орно. Бүр нь name, floor, unit, category, source, source_date; бүртгэл давхар, тоот өгөөгүй бол null. Хариуд барилгын code бий, олгоогүй бол null. directory geocode:read шаардана. Одоо байгаа барилга биш id 404 not_found, нураасан барилга 410 retired.
Газрыг хүнд үргэлж label(place, 'mn' | 'en')-ээр харуулна. Ярианы хэлбэр, дараа нь нэр, дараа нь бүтэн хаягийг сонгоно. Албан ёсны хаягтай таараагүй бүх зүйлийн ард "(албан бус)" гэж нэмнэ, API үүнийг шаарддаг. Дотоод id-г хэзээ ч харуулахгүй.
Хаягийн талбар (checkout)
Захиалга эсвэл суух газрын маягтад нэг талбар. attachSuggest(input, dock, { onPick }) гурав дахь тэмдэгтээс, сүүлийн товчноос 200 ms дараа асууна (SUGGEST_MIN_CHARS, SUGGEST_DELAY_MS). Шинэ товч явж буй хүсэлтийг цуцална, тиймээс хоцорсон хариу жагсаалтыг хэзээ ч солихгүй. Барилгын код шиг уншигдах бичвэрийг (parseDoorCode) эхлээд door-оор хайна; хаалга олдохгүй код geocode руу шилжинэ. Дээш доош сум шилжинэ, Enter эсвэл дарах нь сонгоно, Escape хаана.
<input id="address" placeholder="Сансар 24 эсвэл 7QSVX">
<script type="module">
import { Client, attachSuggest } from '@dock/js';
const dock = new Client({ key: 'dk_...' });
attachSuggest(document.getElementById('address'), dock, {
proximity: () => map.getCenter().toArray(),
onPick: (place) => { order.door_code = place.code; order.point = place.point; },
});
</script>Сонголт бүр label(place, lang)-ээр бичигдэнэ, тиймээс албан ёсны хаягтай таараагүй газар "(албан бус)" гэнэ. Сонгосон geocode хариу pick-д (сүлжээгүй хайлт, хэрэглэгч зөвшөөрсөн бол хайлт хуваалцах), дараа нь onPick-д очно; кодоор олсон хаалга шууд onPick-д очно. Тохиргоо: limit (анхдагч 5), proximity ([lon, lat] эсвэл хүсэлт бүрт асуух функц), types (зөвхөн эдгээр төрөл, geocode-ийнх шиг: гудамж сонгогчид ['street']; код эсвэл хаалганы холбоосыг types-д door байвал л хаалгаар хайна; өөр төрлийг юу ч илгээхээс өмнө 400 invalid_types-ээр татгалзана), lang ('mn' эсвэл 'en'), list (сонголтуудад өөрийн элемент), onError (DockError; анхдагчаар жагсаалт хоосорно). Талбар role="combobox", жагсаалт role="listbox" авна. Загвар өгөхгүй: жагсаалт dock-suggest класстай, олдоогүй мөр dock-suggest-empty, идэвхтэй сонголт aria-selected="true". destroy() сонсогчдыг хасна. Suggester нь DOM-гүй ижил логик, өөрийн жагсаалт эсвэл framework-ийн компонентод: new Suggester(dock, options, show, fail), дараа нь өөрчлөлт бүрт input(text).
Зам
const trip = await dock.route([106.9177, 47.9186], '7QSVX', { mode: 'driving', via: [[106.924, 47.919]] });
console.log(trip.distance_m, trip.duration_s, trip.to.gap_m, label(trip.to.door, 'mn'));
const routeMap = createMap(maplibregl, dock, { container: 'map', zoom: 13 });
routeMap.on('load', () => {
routeMap.addSource(ROUTE_SOURCE, routeSource(trip));
for (const layer of routeLayers()) routeMap.addLayer(layer);
});from, to нь барилгын код эсвэл [lon, lat]. Барилга, хашааны код өгвөл зам дунд нь биш, газрын зурагт хаалга нь байвал хаалганд, байхгүй бол гудамжны талд дуусна: замын шугамын төгсгөлд хамгийн ойр барилга, хашааны хүрээний цэг. to.point нь тэр төгсгөл, to.unit.street_side нь хаалга, эсвэл гудамжны цэгээс 25 м-ийн дотор бол үнэн. Алхах зай 15 м-ээс урт бол сүүлчийн алхам "Машинаа тавиад 17 м алхана уу." гэж хэлнэ, ирэлт "Хаалга зүүн талд байна" гэж хаалга, түүний талыг хэлнэ. mode: driving, walking, cycling. geometry нь GeoJSON шугам, замын сүлжээгээр явж хаалганд хамгийн ойр цэгт дуусна. Тэндээс хаалга хүртэлх шулуун зай to.gap_m метр, явганаар; замаар зурагдахгүй. route:read, код ашиглавал door:read эрх. duration_s нь түгжрэлгүй хугацаа. Машины маршрут measured-тэй (API 0.48.0): нийтэлсэн хөдөлгөөний хурдтай зам бүрийг (traceRoads, measured.month сар) тэр хурдаар тооцсон duration_s, ийм замын метр roads_m; явган, дугуйд null. { departAt } (API 0.50.0, Date эсвэл offset-тэй ISO 8601 текст) өгвөл measured тэр цагийн бүсийн (am_peak, pm_peak, off_peak) хурдыг уншиж, measured.band-д бүсээ хэлнэ; өгөхгүй бол бүх цаг, band нь null. Хамрах хүрээ: Улаанбаатар.
{ via } (API 0.67.0) нь замдаа дайрах ROUTE_VIA_MAX (10) хүртэл төгсгөл, өгсөн дарааллаар, тус бүр код эсвэл [lon, lat], Mapbox-ын эхний ба сүүлчийн хоорондох waypoint шиг. legs нь хэсэг бүрийн distance_m, duration_s, via нь дайрах төгсгөл бүрийг маршрутын төгсгөл хэлбэрээр, шугам дайрсан газар нь snapped. Шугам дайрах цэг дээр буцаж эргэж болно. Хоосон жагсаалт бол байхгүйтэй адил; илүү урт, эсвэл ; агуулсан код бол хүсэлт явуулахаас өмнө API-ийн 400 invalid_via-аар татгалзана. routeSource(trip) нь маршрутыг хариуны source-ыг эх сурвалжаар нь заасан MapLibre GeoJSON эх үүсвэр болгоно: шугам, дараа нь шугам хүрэх газарт төгсгөл бүрт нэг цэг, дайрах дарааллаар, number (from нь 1, дараа нь дайрах цэг бүр, to сүүлд), role (from, via, to), via нь илгээсэн жагсаалт дахь байрлал. routeLayers() шугам, төгсгөл бүрт нэг цагираг өгнө. font (таны загварын glyphs дээрх фонтын багц) өгвөл цагираг бүр дугаараа харуулна; dock загварт glyphs байхгүй тул түүн дээр font-ыг бүү өг. dock давхаргын дараа нэмнэ.
Хайлтын удирдлага
SearchBox (new SearchBox(client, { lang, onPick })) газрын зураг дээрх хайлтын талбар: map.addControl(search, 'top-left'). Бичих зуур dock-ийн хайлт (гурван давхар: үг, утга, дахин эрэмбэ) газрын зургийн төвд ойроос нь санал болгоно; барилгын код хаалгаа олно. Сонговол газрын зураг тийш нисч, SEARCH_SOURCE эх сурвалж дээр тэмдэглэж, карт гаргана: нэр (албан ёсны хаягтай таараагүй бол "албан бус"), албан ёсны хаяг, код. Товч бүр 44 px.
Эргэлт бүрийн заавар, дуу хоолой
client.route хариултын legs[].steps (API 0.74.0) эргэлт бүрийг монгол, англиар өгнө. Navigator (new Navigator(route, { onSay, reroute, onRoute })) маршрутыг байршил бүрээр дагана: navigator.update([lon, lat]) дараагийн эргэлт, түүн хүртэлх метр, үлдсэн метр, секунд, замаас хэдэн метр гарсныг буцаана. Эргэлтийг урьдчилан (aheadPhrase: 1000, 500, 300, 200, 100 м) ба 50 м-т дахин хэлнэ. Замаас NAV_OFF_M (40 м)-ээс хол NAV_OFF_FIXES (3) удаа дараалан гарвал reroute(from)-оор шинэ маршрут асууна; сүлжээгүй бол хуучин маршрутаараа үргэлжилнэ. Замын төгсгөлд NAV_ARRIVE_M (20 м)-т ирэхэд хаалга аль талд байгааг, хол бол алхахыг хэлнэ. VoicePlayer (new VoicePlayer(base)) монгол хэллэгүүдийг (base + phrases.json) дараалан тоглуулна, анхнаасаа асаалттай; enabled = false дуугүй болгоно.
Матриц
const couriers = [[106.9177, 47.9186], [106.9050, 47.9210]];
const times = await dock.matrix(couriers, ['7QSVX', [106.9301, 47.9201]]);
const toFirst = times.durations_s.map((row) => row[0] ?? Infinity);
const nearest = toFirst.indexOf(Math.min(...toFirst));
console.log(nearest, toFirst[nearest], times.distances_m[nearest][0]);matrix(from, to) (API 0.63.0) нь from-ын төгсгөл бүрээс to-ын төгсгөл бүр хүртэлх түгжрэлгүй хугацаа, зайг нэг дуудлагаар өгнө; хамгийн ойр курьерыг сонгох диспетчерт. Жагсаалт бүр 1-ээс MATRIX_MAX (10) төгсгөлтэй, төгсгөл бүр route-ынх шиг барилгын код эсвэл [lon, lat]. durations_s[i][j], distances_m[i][j] нь from[i]-ээс to[j] хүртэл; хооронд нь зам холбохгүй бол null. from, to нь gap_m-тэйгээ маршрутын төгсгөл болж буцна. measured, departAt, шугам байхгүй: сонгосноо route-аар асууна. Зам хаалтыг маршрутынх шиг тойрно. route:read, код ашиглавал door:read эрх. Хоосон эсвэл урт жагсаалт, ; агуулсан кодыг хүсэлт илгээхээс өмнө 400 invalid_from эсвэл invalid_to-оор татгалзана. Хаалга биш код 404 not_found, байрлалаараа (to[1]) нэрлэгдэнэ. Нүдний тооноос үл хамааран нэг дуудлага. Хамрах хүрээ: Улаанбаатар.
Хүрэх бүс
const zone = await dock.isochrone([106.9177, 47.9186], [10, 20, 30]);
for (const f of zone.features) console.log(f.properties.contour, f.geometry.type);
const map = createMap(maplibregl, dock, { container: 'map', zoom: 12 });
map.on('load', () => {
map.addSource(ISOCHRONE_SOURCE, isochroneSource(zone));
for (const layer of isochroneLayers({ opacity: 0.25 })) map.addLayer(layer);
});isochrone(from, contoursMinutes, { mode? }) (API 0.64.0) нь нэг төгсгөлөөс 1-ээс ISOCHRONE_CONTOURS_MAX (4) хугацаа бүрт хүрэх талбайг өгнө; хугацаа нь 1-ээс ISOCHRONE_MINUTES_MAX (60) хүртэлх бүхэл минут, өсөх дарааллаар: дэлгүүр, агуулахын хүргэлтийн бүс. from нь route-ынх шиг барилгын код (хаалгаас нь) эсвэл цэг. Хариу нь GeoJSON: contour бүрт нэг feature, хамгийн томоос нь эхэлнэ, properties.contour минут, geometry нь Polygon, талбай хэсэг хэсэг бол MultiPolygon. isochroneSource(zone) нь үүнийг MapLibre GeoJSON эх үүсвэр болгоно: хамгийн том бүс эхэндээ, хариуны source-ыг эх сурвалжаар нь заана; isochroneLayers() түүнд дүүргэлт, хүрээ өгч тэр дарааллаар зурна, тиймээс ойрын бүс бүр дээр нь илүү бараан харагдана. dock давхаргын дараа нэмнэ. Нэг газрын зураг дээр хоёр бүс: тус бүрд өөр source id өгнө. from нь gap_m-тэйгээ маршрутын төгсгөл болж буцна. Түгжрэлгүй хурдаар, departAt байхгүй; зам хаалтыг маршрутынх шиг тойрно. route:read, код ашиглавал door:read эрх. Өөр хугацааг хүсэлт илгээхээс өмнө 400 invalid_contours-оор татгалзана. Ойр зам байхгүй цэг 422 no_route. Contour-ын тооноос үл хамааран нэг дуудлага. Хамрах хүрээ: Улаанбаатар.
Замд буулгах
const trip = await dock.matching([[106.9177, 47.9186], [106.92, 47.9188], [106.923, 47.919]], {
timestamps: [1790000000, 1790000030, 1790000060],
});
for (const m of trip.matchings) console.log(m.distance_m, m.duration_s);
console.log(trip.tracepoints.map((t) => (t ? t.matchings_index : null)));
const tripMap = createMap(maplibregl, dock, { container: 'map', zoom: 14 });
tripMap.on('load', () => {
tripMap.addSource(MATCHING_SOURCE, matchingSource(trip));
for (const layer of matchingLayers({ width: 5 })) tripMap.addLayer(layer);
});matching(coordinates, { timestamps?, mode? }) (API 0.65.0) нь GPS мөрийг явсан замууд дээр нь буулгана: түүхий цэгүүд тахир муруй байхад шуудан зөөгчийн аяллыг газрын зураг дээр замаар нь зурна. coordinates нь бичигдсэн дарааллаар 2-оос MATCHING_MAX (100) [lon, lat]; timestamps заавал биш, цэг бүрт нэг бүхэл Unix секунд, буцахгүй; түүгээр хэдхэн секундын зайтай хол хоёр цэг хурдан зам биш, тасалдал гэж уншигдана. Хариунд matchings: тасраагүй хэсэг бүрт нэг (distance_m, эргэлтийн зардалгүй чөлөөт урсгалын хурдаар duration_s, GeoJSON LineString), tracepoints: цэг бүрт дарааллаараа нэг (matchings_index, location, gap_m), зам олдоогүй эсвэл хязгаарлалттай газар доторх цэгт null. matchingSource(trip) нь үүнийг хариуны source-ыг эх сурвалжаар нь заасан MapLibre GeoJSON эх үүсвэр болгоно: хэсэг бүрт нэг шугам, дараа нь зам дээр буусан tracepoint бүрт нэг цэг, илгээсэн мөр дэх байрлал нь point; null-ийг алгасна. matchingLayers() шугам, буусан цэг бүрт нэг толбо өгнө. dock давхаргын дараа нэмнэ. Хаалттай замыг тойрохгүй: мөр нь хүний явсан газар. Мөрийг хадгалахгүй, логт бичихгүй; аяллаа газрын зурагт өгөх бол startTrace. route:read эрх. Өөр тоо, хугацааг хүсэлт илгээхээс өмнө 400 invalid_coordinates эсвэл invalid_timestamps-оор татгалзана. Мөрийн ойролцоо зам байхгүй бол 422 no_match; хязгаарлалттай газраас гадна 2-оос цөөн цэг үлдвэл 422 not_accepted. Нэг дуудлага. Хамрах хүрээ: Улаанбаатар.
Зогсоолуудын дараалал
const round = await dock.optimizedTrips([[106.9177, 47.9186], '7QSVX', [106.905, 47.921], [106.925, 47.915]]);
const best = round.trips[0];
// The stops in the order to drive them, each by its place in the list sent.
const order = round.waypoints.map((w, sent) => [w.waypoint_index, sent]).sort((a, b) => a[0] - b[0]).map((p) => p[1]);
console.log(order, best.distance_m, best.duration_s, best.legs.length);
const roundMap = createMap(maplibregl, dock, { container: 'map', zoom: 13 });
roundMap.on('load', () => {
roundMap.addSource(OPTIMIZED_TRIP_SOURCE, optimizedTripSource(round));
for (const layer of optimizedTripLayers()) roundMap.addLayer(layer);
});optimizedTrips(stops, { roundtrip?, mode? }) (API 0.66.0) нь зогсоолуудыг замд хамгийн бага хугацаа зарцуулах дарааллаар тавьж, тэр дарааллаарх аяллыг өгнө: шуудан зөөгчийн өдрийн тойрог нэг дуудлагаар. stops нь 2-оос OPTIMIZED_TRIPS_MAX (12) төгсгөл, тус бүр барилгын код (хаалга хүртэл) эсвэл [lon, lat], route шиг. Аялал эхнийхээс эхэлнэ. roundtrip анхдагчаар true: эхнийх рүүгээ буцна; false бол илгээсэн сүүлийнхээр дуусна. Хариунд trips: нэг аялал (distance_m, чөлөөт урсгалын хурдаар duration_s, GeoJSON LineString, legs нь зогсоол хоорондын хэсэг бүрт нэг), waypoints: илгээсэн дарааллаар зогсоол бүр, маршрутын төгсгөл шиг, waypoint_index нь аялал дахь байрлал. Өнөөдрийн хаалтыг тойрно. Зогсоол дээрх хугацааг тооцохгүй. route:read эрх, код бол door:read. Цөөн эсвэл олон зогсоол, ; агуулсан кодыг хүсэлт илгээхээс өмнө 400 invalid_coordinates-оор татгалзана. Ямар ч зам хүрэхгүй зогсоол 422 no_route; 404 not_found зогсоолыг байрлалаар нь нэрлэнэ (coordinates[1]: ...). Нэг дуудлага. Хамрах хүрээ: Улаанбаатар. optimizedTripSource(round) нь үүнийг хариуны source-ыг эх сурвалжаар нь заасан MapLibre GeoJSON эх үүсвэр болгоно: аяллын шугам, дараа нь аялал хүрэх газарт зогсоол бүрт нэг цэг, явах дарааллаар, number (эхнийх 1), stop нь илгээсэн жагсаалт дахь байрлал. optimizedTripLayers() шугам, зогсоол бүрт нэг цагираг өгнө. font (таны загварын glyphs дээрх фонтын багц) өгвөл цагираг бүр дугаараа харуулна; dock загварт glyphs байхгүй тул түүн дээр font-ыг бүү өг. dock давхаргын дараа нэмнэ.
Цэг дээрх объект
const tapped = await dock.tilequery([106.9177, 47.9186], { radius: 30, limit: 10 });
// Nearest first: the building the point is in, then the entrances within 30 m.
for (const f of tapped.features) console.log(f.properties.tilequery.layer, f.properties.tilequery.distance, f.properties.id);tilequery([lon, lat], { sources?, radius?, limit?, geometry? }) (API 0.68.0) нь цэг дээрх эсвэл ойрхон байгаа байшин, хаалгыг өгнө, Mapbox-ын Tilequery API шиг: газрын зураг дээр дарсан газарт юу байгааг. sources анхдагчаар ['building', 'entrance'], эсвэл аль нэг нь. radius метрээр, 0-ээс TILEQUERY_RADIUS_MAX_M (1000), сантиметр хүртэл илгээнэ; өгөхгүй бол API зөвхөн цэг дотор нь байгаа байшинг олно, хаалганд radius хэрэгтэй. limit 1-ээс TILEQUERY_LIMIT_MAX (50), анхдагч 5. geometry (polygon, linestring, point) нэг төрлийг үлдээнэ. Хариу нь GeoJSON, хамгийн ойроос нь: объект бүр Point, илгээсэн цэгт хамгийн ойрх хэсэг нь, тайлын талбаруудтайгаа (байшингийн name_mn, type, levels; хаалганы kind, letter), tilequery: distance метрээр (дотор нь бол 0), geometry, layer. Тайлтай ижил мөр, барилгын код үгүй: кодыг door авна. Эрх tiles:read; тайлын хязгаарт биш, rate_limit, daily_quota-д тооцно. API-ын татгалзах бүхнийг хүсэлт илгээхээс өмнө түүний алдаагаар татгалзана: эх үүсвэрт 404 not_found, 400 invalid_point, invalid_radius, invalid_limit. Хамрах хүрээ: Улаанбаатар.
Зам хаалт
const closures = await dock.closures();
const avoid = excludePolygons(closures, '2026-10-05');
console.log(closures.ids_sha256, avoid.ids, avoid.rings.length);
console.log(closureAt(avoid, [106.9303, 47.9202]) ?? 'хаалган дээр хаалт алга');Түншүүдийн мэдэгдсэн зам хаалт (үер, угаагдсан зам, гүүр эвдэрсэн, цас, шавар, засвар). Өнөөдөр дуусаагүй бүгд, тус бүр тойрсон хүрээтэй. Түншийн нэр, тэмдэглэл ирэхгүй. Итгэлцүүр 0.5: нэг түншийн үг. Хариуг утсанд хадгална: офлайн багцын closures хэсэгтэй ижил хэлбэртэй. excludePolygons(closures, day) офлайн ажиллана: аяллын өдөр идэвхтэй хаалтыг үлдээж (from <= day, to байвал day <= to; анхдагч нь өнөөдөр, Улаанбаатарын цагаар) тэдгээрийн хүрээг өөрийн Valhalla-ийн exclude_polygons-д өгнө. Нэг хүсэлтэд Valhalla-ийн хязгаараас (10,000 м хүрээ, 100 орой) хэтэрвэл ClosuresOverLimitError шиднэ: замыг татгалз, хаалтыг бүү хая. as_of-оос өмнөх өдөр RangeError шиднэ: дахин татаж ав. Хаалт нэмэгдэх эсвэл цуцлагдахад ids_sha256 өөрчлөгдөнө. closureAt(avoid, point) аяллын эхлэл эсвэл төгсгөлийг агуулсан хаалтын id-г өгнө, үгүй бол null: Valhalla хүрээн доторх бүх замыг хасдаг тул тэнд эхлэх, дуусах зам байхгүй, таны Valhalla "No path could be found for input" гэж хариулна. Хоёр үзүүрийг эхлээд шалга. GET /v1/route өнөөдрийн хаалтыг өөрөө тойрч, closures.avoided-д нэрлэнэ, хаалтын доторх үзүүрийг 422 end_in_closure-ээр татгалзана. route:read эрх.
Зам хаалт мэдэгдэх
const retryKey = crypto.randomUUID();
const report = await dock.reportClosure(
{ geometry: { type: 'Point', coordinates: [106.9303, 47.9202] }, kind: 'flood', to: '2026-10-09', note: 'Гарц 1 м усан дор' },
{ idempotencyKey: retryKey },
);
console.log(report.id, report.properties.from, report.properties.to);
const mine = await dock.closure(report.id);
console.log(mine.properties.note);
const open = await dock.liftClosure(report.id);
console.log(open.properties.lifted);reportClosure(report) нь замын хэсэг эсвэл гарцаар явах боломжгүйг dock-д мэдэгдэнэ. kind нь flood, washout, bridge_out, snow, mud, works, other-ийн нэг; geometry нь замын хэсэг дээрх цэг (уулзвар дээр биш), эсвэл 3000 м-ээс ихгүй LineString. from нь хаалттай эхний өдөр, анхдагч нь өнөөдөр; to нь сүүлийн өдөр, байхгүй эсвэл null бол цуцлах хүртэл. Мэдэгдэл үүрд хадгалагдана, засагдахгүй, устахгүй. dock дээрх зам түүнийг from өдрөөс тойрно, closures() бүх түншид таны нэр, тэмдэглэлгүйгээр өгнө. Итгэлцүүр 0.5: нэг түншийн үг. Мэдэгдэл бүрт өөрийн idempotencyKey өгч, хариу иртэл хадгал: хугацаа хэтэрсний дараа ижил түлхүүр, ижил мэдэгдлээр дахин илгээвэл эхний мэдэгдэл буцаж ирнэ, хоёр удаа хадгалагдахгүй. Ижил түлхүүрээр өөр мэдэгдэл илгээвэл 422 idempotency_key_reused. API-ийн татгалзах түлхүүр (үсэг, тоо, ._:--ээс 1-64 тэмдэгт, IDEMPOTENCY_KEY_RE) хүсэлт явахаас өмнө DockErrorbad_idempotency_key шиднэ. Тэмдэглэлд дараалсан 6 цифр байвал 400 note_has_phone: утасны дугааргүй. Хязгаарлалттай газар дотор 400 restricted. closure(id) нь өөрийн мэдэгдлийг тэмдэглэлтэй нь уншина: таны экспорт. liftClosure(id, { on }) нь замыг on өдрөөс дахин нээнэ, анхдагч нь өнөөдөр, хойших өдөр болохгүй (400 lift_in_future); мэдэгдэл үлдэж, lifted нэг удаа тавигдана. Бусад байгууллагын id 404 not_found. Гурвуулаа closures:write эрх шаардана.
Багцын файл шалгах, офлайн
const enc = (s) => new TextEncoder().encode(s);
const manifest = { files: [
{ name: 'pois.geojson', bytes: 2, sha256: '44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a' },
{ name: 'water.geojson', bytes: 265463, sha256: 'e9973b42c4b0e6827348e501acd798a1fff25206f4b67708b5f06179e3f6c199' },
] };
// In an app: JSON.parse of the pack manifest.json, and the folder the pack was downloaded to
const folder = { 'pois.geojson': enc('{}') };
// In Node: (name) => readFile(join(dir, name)).catch(() => null)
const check = await checkPack(manifest, async (name) => folder[name] ?? null);
for (const f of check.files) console.log(f.name, f.status);
console.log('ok', check.ok, 'bad', check.bad.join(' '));manifest нь багцын manifest.json; зөвхөн files мөрүүдийг уншина: багцын хавтас дахь файл бүрийн нэр, хэмжээ, sha256 (одоогийн багцад tiles.tar, crossings.geojson, pois.geojson, basemap.pmtiles, wetlands.geojson, passes.geojson, sand.geojson, water.geojson). checkPack(manifest, read) нь жагсаасан файл бүрийг manifest-ийн дарааллаар нэрээр нь read-ээс авч, эхлээд хэмжээг, дараа нь sha256-ийг (Web Crypto) тулгана. status нь ok, missing (read null өгсөн), bytes (хэмжээ өөр, жишээ нь таслагдсан татан авалт; hash бодохгүй) эсвэл sha256 (хэмжээ ижил, агуулга өөр). Жагсаасан бүх файл ok үед л ok нь true. bad бусдыг нэрлэнэ: тэдгээрийг дахин тат, ok болтол багцаас нэг ч файл бүү хэрэглэ. manifest-д жагсаагаагүй файлыг уншихгүй. Файлгүй manifest, энгийн файлын нэр биш нэр (хавтас, .., цэгээр эхэлсэн), хоёр удаа жагсаасан нэр, 0-ээс эхэлсэн бүхэл тоо биш bytes, 64 жижиг үсгийн hex биш sha256 нь ямар ч файл уншихаас өмнө RangeError шиднэ: сүлжээнээс ирсэн manifest багцын хавтсаас гадуурх файлыг нэрлэж чадахгүй. read шидсэн алдаа дамжин гарна. read файлыг бүтнээр нь өгөх тул санах ойд нэг удаад нэг файл байна; суурь газрын зураг 113 MB. Хөтөч дээр Cache API эсвэл IndexedDB-ээс унш. Одоогийн багц, 8 файл, 180 MB, M4 Mac mini дээр Node 24-өөр 0.2 секундэд шалгагдана. Сүлжээ, түлхүүр хэрэггүй.
Багц дээрх маршрут, офлайн
const manifest = {
id: 'mongolia-260927-416081b1', bbox: [87.7845, 41.03732, 120.01834, 52.25102],
request: { costing: 'auto', costing_options: { auto: { use_tracks: 0.5 } } }, confidence: 'osm_only',
attribution: '© OpenStreetMap contributors (ODbL 1.0, openstreetmap.org/copyright). Track scores © dock.', note: 'route cost is from track scores, not an ETA',
closures: { method: 'dock_steppe.closures v1', source: 'partner reports', as_of: '2026-10-03', current: 1, ids_sha256: null,
buffer_m: 15, rule: '', active_when: 'from <= route day, and route day <= to when to is set',
valhalla_limits: { perimeter_m: 10000, vertices: 100 },
items: [{ id: 'cl-000002', kind: 'washout', from: '2026-10-04', to: null, confidence: 0.5, perimeter_m: 890, vertices: 5,
ring: [[104.499, 47.499], [104.501, 47.499], [104.501, 47.501], [104.499, 47.501], [104.499, 47.499]] }] },
};
// In an app: JSON.parse of the pack manifest.json
const r = packRoute(manifest, [[106.9176, 47.9187], [102.833, 47.196]], { day: '2026-10-04' });
// In an app: POST r.body to /route on your own Valhalla, the pack tiles.tar as mjolnir.tile_extract
console.log(r.closures.join(' '), r.body.exclude_polygons.length, r.body.costing);
console.log(r.scored ? 'scored' : r.trace_note);
try {
packRoute(manifest, [[106.9176, 47.9187], [104.5, 47.5]], { day: '2026-10-04' });
} catch (e) {
if (e instanceof EndInClosureError) console.log('refused', e.stop, e.closure);
}manifest нь багцын manifest.json. packRoute(manifest, stops, { day, closures }) нь багц дээр stops (2 ба түүнээс олон [lon, lat]) цэгээр дайрах маршрутын хүсэлтийг бэлдэнэ. body-г өөрийн Valhalla-ийн /route руу POST хий, багцын tiles.tar-ыг mjolnir.tile_extract болгоно. Түүнд manifest-ийн request (одоо costing auto, costing_options.auto.use_tracks 0.5), маршрутын өдөр (day, анхдагч нь Улаанбаатарын өнөөдөр) идэвхтэй хаалтуудын цагиргууд exclude_polygons болж, units km орно. Хаалтыг багцын closures хэсгээс, эсвэл илүү шинэ GET /v1/closures хариу болох closures-оос авна. Хариуны closures тойрсон хаалтуудыг нэрлэнэ: маршруттай хамт харуул. Багцын bbox-оос гадуурх цэг RangeError шиднэ. Тойрох цагираг доторх цэг EndInClosureError (stop, closure) шиднэ: тэнд Valhalla-д зам алга; GET /v1/route-ийн адил маршрутаас татгалз. Valhalla-ийн цагирагийн хязгаараас хэтэрвэл ClosuresOverLimitError; хаалтын as_of-оос өмнөх өдөр RangeError шиднэ, excludePolygons-ийн адил. Маршрут бүртэй attribution-г харуул. Багцад аяллын оноо байхгүй үед (confidence osm_only, одоогийн багц) scored нь false: жолоочид trace_note_mn (англиар trace_note)-г хэл. Багцын manifest-д confidence_note, confidence_note_mn хоёулаа байвал (offline v10-аас хойш) багцын өөрийн үг; үгүй бол SDK-ийн PACK_TRACE_NOTE. Хариултын confidence_note (confidence_note_mn) нь ямар ч багцад confidence-ийн утгыг хэлнэ: manifest-ийнх, үгүй бол оноогүй багцад SDK-ийнх, бусад үед null. Одоогийн багц дээр Улаанбаатараас Хархорин хүрэх хүсэлт pyvalhalla 3.9.0-д 359.8 км, багцын өөрийн шалгалттай ижил; тэр маршрутын дунд туршилтын хаалт тавихад ижил дуудлага түүнийг тойрч 690.3 км болно. Эхлээд багцын файлыг шалга (дээр). Сүлжээ, түлхүүр хэрэггүй.
Голын гарам, офлайн
const crossings = {
type: 'FeatureCollection', match_m: 5, note: 'From OSM tags, not field checked.', note_mn: 'OSM-ийн шошгоос, газар дээр шалгаагүй.',
flow: { attribution: 'River flow: GEOGLOWS ECMWF Streamflow Service v2, CC BY 4.0' },
features: [{ type: 'Feature', geometry: { type: 'Point', coordinates: [101.95425, 46.77663] }, properties: {
kind: 'ford', waterway: 'river', name: 'Улаан гол', name_en: 'Ulaan gol', intermittent: false,
flow: { river_id: 320103663, normal_m3s: [0.59, 0.42, 0.63, 0.88, 1.17, 1.37, 2.19, 2.3, 1.57, 1.14, 0.94, 0.8],
high_months: [7, 8], reach: 'agrees', confidence: 0.4 } } }],
};
const line = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const { warnings, flow_attribution } = crossingsOnRoute(crossings, line, 7);
for (const w of warnings) console.log(w.kind, w.name, w.high_water, w.month_m3s, w.along_m);
console.log(flow_attribution);Офлайн хээрийн багц ба өөрийн Valhalla дээрх аялалд. crossings нь багцын crossings.geojson (manifest-ийн files[1]); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. crossingsOnRoute(crossings, line, month?) нь аяллын шугам match_m (5 м) дотор өнгөрөх гарам (kind: 'ford') болон OSM-д гүүр, гарц тэмдэглээгүй огтлолцлыг (kind: 'none') аяллын дарааллаар өгнө. along_m нь аяллын эхнээс хамгийн ойрын цэг хүртэлх метр, off_m нь шугамаас холдох метр. Гол дээр month (1-12, анхдагч нь Улаанбаатарын энэ сар) high_months-д байвал high_water нь true, month_m3s нь тухайн сарын 1991-2020 оны дундаж урсац. doubtful гэж тэмдэглэсэн хэсэгт (загварын хэсэг голынхоосоо 10 дахин бага), мөн confidence 0.1 (LOW_FLOW_CONFIDENCE) буюу түүнээс бага хэсэгт month_m3s нь null: тоог биш, сарыг харуул. Шалтгааныг snap хэлнэ: none_fits бол тэнд голыг дагасан загварын хэсэг алга; main_stem бол суваг зөвхөн жижиг хэсгийг дагадаг тул голын гол урсгалыг авсан. Хээрийн самбар ч ингэдэг. Горхи, сувагт урсац байхгүй: high_water нь null. Гол нууранд цутгахдаа салаалдаг, салаа бүр хэдий хэр ус авдгийг загварын аль ч хэсэг хэлэхгүй бэлчирийн салаан дээр урсац null, delta нь lake, lake_osm, river-ийг өгнө: "бэлчирийн салаа, урсац тодорхойгүй" гэж харуул. Бусад газар болон дүрмээс өмнөх багцад delta нь null. lake нэг бичигт оруулсан бол lake_name_osm нь нуурын OSM бичвэр, эс бөгөөс null; lake-ийг харуул. Одоогийн багцад бэлчирийн 3 гарцаас 0 нь засагдсан. national crossings v11-ээс өмнөх багцад байхгүй: null. Хоёр үзүүр нь нэг нэртэй гол дээр байгаа нэргүй гол, горхи бол тэр голын салаа: channel_of нь name, name_en, river_way_id-г өгнө, "Улаан гол, нэргүй салаа" гэж харуул. OSM-ийн зургаас, газар дээр шалгаагүй. Бусад газар болон дүрмээс өмнөх багцад channel_of нь null. Ус нь урсгалаараа (OSM шугамыг урсгалын чигээр зурдаг) нэг нэртэй голд хүрдэг бусад нэргүй гол, горхи flows_into-тай: name, name_en, river_way_id, ways нь тэр гол хүртэлх нэргүй шугамын хамгийн цөөн тоо. "Орхон гол, нэргүй цутгал" гэж харуул. OSM-ийн зургаас, газар дээр шалгаагүй; эсрэг чигээр зурсан шугам буруу гол өгөх эсвэл юу ч өгөхгүй. Хоёулаа байвал channel_of давамгайлна. Бусад газар болон дүрмээс өмнөх багцад flows_into нь null. road нь аяллын замын OSM-ийн highway, surface шошго, paved-ийг өгнө: аль нэг нь хатуу хучилттай бол true, бүгд хучилтгүй бол false, surface шошгогүй зам байвал null. Зөвхөн шинэ зам дээр болон дүрмээс өмнөх багцад road нь null. Хатуу хучилттай зам дээрх none гарц нь OSM-д тэмдэглээгүй гүүр, хоолой байж болно; "хатуу хучилттай зам, OSM-д гүүр тэмдэглээгүй" гэж харуул. Багцын on_paved хатуу хучилттай гарцыг тоолно, road_rule, road_rule_mn дүрмийг өгнө. Багцын near_bridge нь усны хажууд зурсан гүүрээр гатлах тул багцад ороогүй none гарцыг тоолно, bridge_rule, bridge_rule_mn дүрмийг өгнө. Багцын one_point нь усны шугам зам дээр хоёр хэсэг болж тасарсан тул хажуу гарцтайгаа нэг болсон гарцыг тоолно, split_rule, split_rule_mn дүрмийг өгнө. Багцын from_seasonal нь OSM-ийн intermittent шошгогүй, зөвхөн seasonal шошгоор түр урсгалтай гэж тэмдэглэсэн гарцыг тоолно, intermittent_rule, intermittent_rule_mn дүрмийг өгнө. ford_node_id-тай гарам нь зөвхөн OSM-ийн гарамын зангилаанаас: тэнд OSM-д усны шугам зураагүй тул waterway нь unknown, нэр, урсацгүй; "OSM-ийн гарам, ус зураагүй" гэж харуул. Бусад гарц болон дүрмээс өмнөх багцад ford_node_id нь null. Багцын ford_nodes тэднийг тоолно, ford_node_rule, ford_node_rule_mn дүрмийг өгнө. Анхааруулгатай хамт note_mn-ийг харуул: OSM-ийн шошгоос, газар дээр шалгаагүй. flow_attribution null биш бол харуул. 2-оос цөөн цэгтэй шугам эсвэл буруу сар RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
Шатахуун, гэр бааз, офлайн
const pois = {"type":"FeatureCollection","registry_checked":true,
"counts":{"fuel":{"registered":1,"unregistered":1268},"ger_camp":{"registered":0,"unregistered":175}},
"written":1,"rule":"every registered fuel station and ger camp, all Mongolia","rule_mn":"бүртгэлтэй бүх ШТС, гэр бааз",
"source":"OpenStreetMap","note":"From OSM, not field checked. Unregistered places are counted, not shown.",
"note_mn":"OSM-ээс, газар дээр шалгаагүй. Бүртгэлгүй газрыг тоолсон, харуулаагүй.",
"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[101.9601,46.7801]},"properties":{
"kind":"fuel","osm":"N1","name":"Жишээ ШТС","name_en":"Example fuel station","reg_number":"0000000"}}]};
// In an app: JSON.parse of the pack's pois.geojson
const route = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const near = poisOnRoute(pois, route);
for (const p of near.pois) console.log(p.kind, p.name, p.reg_number, p.along_m, p.off_m);
console.log(near.registry_checked, near.unlisted.fuel, near.unlisted.ger_camp);pois нь багцын pois.geojson (manifest files[2], index.json-д pois_sha256); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. poisOnRoute(pois, line, nearM?) нь аяллын шугамаас nearM дотор орших шатахуун түгээх станц (kind: 'fuel'), гэр баазыг (kind: 'ger_camp') аяллын дарааллаар өгнө. Анхдагч нь 2000 м (POI_NEAR_M), хээрийн маршрутын хуудастай адил. along_m нь аяллын эхнээс хамгийн ойр цэг хүртэлх метр, off_m нь шугамаас холдох метр, хоёулаа бүхэл метр. Файлд зөвхөн улсын бүртгэлтэй тулгасан газар бүртгэлийн нэр, reg_number-тайгаа орно. Бусдыг Монгол даяар төрлөөр нь тоолсон, нэр, байршилгүй: unlisted. unlisted.fuel 0-ээс их байхад хоосон жагсаалт нь "энэ замд шатахуун байхгүй" гэсэн үг биш. registry_checked нь false бол багц хийх үед бүртгэлийг уншиж чадаагүй: "байхгүй" биш, "шалгаагүй" гэж хэл. Газруудтай хамт note_mn-ийг харуул. 2026-10-03-аас өмнөх багцад pois.geojson байхгүй. Одоогийн багцад 0 газар: 1,268 шатахуун түгээх станц, 175 гэр баазыг тоолсон, бүртгэлтэй тулгасан нь хараахан алга. 2-оос цөөн цэгтэй шугам эсвэл 0-ээс ихгүй nearM RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
Намгархаг газар, офлайн
const wetlands = {"type":"FeatureCollection","written":1,"km":0.4,"areas":1,"counts":{"marsh":{"stretches":1,"km":0.4}},
"match_m":5,"rule":"the part of one OSM car way inside an OSM natural=wetland area",
"rule_mn":"OSM-ийн natural=wetland талбай доторх нэг машин замын хэсэг","source":"OpenStreetMap",
"note":"From OSM tags, not field checked. Soft ground in spring and after rain.",
"note_mn":"OSM-ийн шошгоос, газар дээр шалгаагүй. Хавар, бороо орсны дараа зөөлөн газар.",
"features":[{"type":"Feature","geometry":{"type":"LineString","coordinates":[[101.94285,46.775326],[101.94855,46.775978]]},
"properties":{"wetland":"marsh","area":"way/1","name":null,"km":0.441,"way_id":2,"new_track":false,
"road":{"highway":["track"],"surface":["ground"],"paved":false}}}]};
// In an app: JSON.parse of the pack's wetlands.geojson
const route = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const wet = wetlandsOnRoute(wetlands, route);
for (const s of wet.stretches) console.log(s.wetland, s.along_m, s.on_m, s.km);
console.log('wet', wet.on_m);wetlands нь багцын wetlands.geojson (manifest-ийн files мөр ба wetlands хэсэг, index.json-д wetlands_sha256); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. Хэсэг бүр нь OSM-ийн natural=wetland талбай доторх нэг машин замын хэсэг, талбайн хилээр тасалсан: хавар, бороо орсны дараа зөөлөн газар. wetlandsOnRoute(wetlands, line) нь аяллын явах хэсгүүдийг аяллын дарааллаар өгнө. Хэсгийг match_m (5 м)-ээс ихгүй жижиг хэсгүүдэд хуваана; жижиг хэсгийн хоёр үзүүр шугамаас match_m дотор байвал аялал түүгээр явна. Ийм хэсгүүд нийлээд 20 м (WETLAND_MIN_ON_M) буюу түүнээс их, эсвэл хэсэг бүхэлдээ бол аялал тэр хэсгээр явна: зөвхөн хөндлөн гарах аялал түүгээр явахгүй. along_m нь аяллын эхнээс хэсэгтэй нийлэх цэг хүртэлх метр, on_m нь аяллын явах метр, хоёулаа бүхэл метр; km нь багц дахь хэсгийн бүтэн урт. wetland нь OSM-ийн төрөл (marsh, bog, wet_meadow, fen, ...), талбай wetland шошгогүй бол unknown; area нь OSM талбай, жишээ нь relation/8128712. Зөвхөн шинэ зам дээр way_id, road нь null. "OSM-ийн намаг 1.2 км, хавар зөөлөн" гэж харуул. Хэсгүүдтэй хамт note_mn-ийг харуул: OSM-ийн шошгоос, газар дээр шалгаагүй; хуучин намаг одоо хуурай байж болно, OSM-д зураагүй намаг энд байхгүй. Хоосон жагсаалт нь "зам бүхэлдээ хуурай" гэсэн үг биш. Одоогийн багцад 356 хэсэг, 86 OSM талбайд 247.3 км, үүний 208.4 км нь намаг. 2026-10-03-аас өмнөх багцад wetlands.geojson байхгүй. 2-оос цөөн цэгтэй шугам RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
Уулын даваа, офлайн
const passes = {"type":"FeatureCollection","written":1,"counts":{"mountain_pass":1},"named":1,"with_ele":1,"with_dem":1,"match_m":5,
"rule":"an OSM node tagged mountain_pass=yes or natural=saddle that is a node of a car way",
"rule_mn":"машин замын зангилаа болох, mountain_pass=yes эсвэл natural=saddle шошготой OSM зангилаа","source":"OpenStreetMap",
"note":"From OSM tags, not field checked. A climb, and snow and ice outside summer.",
"note_mn":"OSM-ийн шошгоос, газар дээр шалгаагүй. Өгсүүр зам, зуны бус улиралд цас мөс.",
"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[101.957125,46.778315]},
"properties":{"kind":"mountain_pass","name":"Улаан даваа","name_en":null,"ele_m":2391,"ele_osm":"2391","node_id":3,"dem_m":2388,
"route_way_ids":[2],"new_track":false,"road":{"highway":["track"],"surface":["ground"],"paved":false}}}],
"dem":{"source":"copernicus-dem-glo30","attribution":"Copernicus DEM GLO-30","tiles":1,"missing":[],
"rule":"the height of the GLO-30 cell the node falls in","rule_mn":"зангилаа байрлах GLO-30 нүдний өндөр",
"note":"A surface model, not field checked.","note_mn":"Гадаргын загвар, газар дээр шалгаагүй."}};
// In an app: JSON.parse of the pack's passes.geojson
const route = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const over = passesOnRoute(passes, route);
for (const p of over.passes) console.log(p.name ?? p.kind, p.along_m, p.off_m, p.ele_m ?? 'no height in OSM');
console.log('top', over.top_m);
console.log('top DEM', over.top_dem_m, over.dem?.attribution ?? '');passes нь багцын passes.geojson (manifest-ийн files мөр ба passes хэсэг, index.json-д passes_sha256); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. Даваа бүр нь машин замын зангилаа болох, mountain_pass=yes эсвэл natural=saddle шошготой OSM зангилаа: өгсүүр зам, зуны бус улиралд цас мөс. passesOnRoute(passes, line) нь аяллын гарах даваануудыг аяллын дарааллаар өгнө: зангилаа нь шугамаас match_m (5 м) дотор байгаа даваа, хээрийн маршрутын хуудасны дүрэм. along_m нь аяллын эхнээс даваанд хамгийн ойр цэг хүртэлх бүхэл метр; off_m нь шугамаас хэдэн метр, 0.1 м-ээр. kind нь mountain_pass, OSM-д зөвхөн natural=saddle байвал saddle. ele_m нь OSM-ийн ele шошгыг метрээр уншсан утга, шошгогүй эсвэл өөр бичвэртэй ("7000 ft" гэх мэт) бол null; ele_osm нь шошго бичсэнээрээ. top_m нь аялал дээрх даваануудын хамгийн их ele_m, аль нь ч өндөргүй бол null: тэгш гэсэн үг биш, OSM-д тоо алга. dem_m нь хоёр дахь өндөр, Copernicus GLO-30 DEM-ээс: зангилаа байрлах 30 м нүдний өндөр, бүхэл метрээр; багцад тэнд байхгүй бол null. ele_m-тэй хэзээ ч хольдоггүй. top_dem_m нь аялал дээрх хамгийн их dem_m, аль нь ч байхгүй бол null. "120 дахь км-т даваа, 2,391 м (OSM)", OSM-д тоо байхгүй бол "ойролцоогоор 1,911 м (DEM)" гэж харуул; DEM өндөр харуулах газар бүрт dem.attribution-ийг харуул. passes v1 багцад dem нь null, dem_m бүр null. Зөвхөн шинэ зам дээр road нь null. Даваануудтай хамт note_mn-ийг харуул: OSM-ийн шошгоос, газар дээр шалгаагүй; OSM-д зураагүй даваа энд байхгүй. Хоосон жагсаалт нь "зам бүхэлдээ тэгш" гэсэн үг биш. Одоогийн багцад машин зам дээр 74 даваа (68 mountain_pass, 6 saddle), 41 нь нэртэй, 40 нь OSM өндөртэй, 1,210-3,104 м, 74 нь DEM өндөртэй, 1,214-3,202 м. 2026-10-03-аас өмнөх багцад passes.geojson байхгүй. 2-оос цөөн цэгтэй шугам RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
heights_differ нь багцын тэмдэг: ele_m, dem_m хоёулаа байгаа бөгөөд dem.differ_m (50 м)-ээс илүү зөрвөл true, дотор нь бол false, аль нэг нь байхгүй бол null. true нь хоёрын нэг нь буруу гэсэн үг, алийг нь хэлэхгүй: хоёр өндрийг хоёуланг нь, "2,241 м (OSM); ойролцоогоор 2,349 м (DEM)", dem.differ_rule_mn-тэй хамт харуул. differ нь аялал дээрх true даваануудын тоо, багцад тэмдэг байхгүй бол null: шалгаагүй, 0 биш. passes v2 багцад тэмдэг байхгүй. Одоогийн багцад 74-өөс 1 нь true, 39 нь false, 34 нь null.
Элс, офлайн
const sand = {"type":"FeatureCollection","written":1,"km":0.346,"areas":1,"named":1,"on_paved":0,"match_m":5,
"rule":"the part of one OSM car way inside an OSM natural=sand area; an area also tagged golf is left out",
"rule_mn":"OSM-ийн natural=sand талбай доторх нэг машин замын хэсэг; golf шошготой талбайг тооцохгүй","source":"OpenStreetMap",
"note":"From OSM tags, not field checked. A car can dig in and stop.",
"note_mn":"OSM-ийн шошгоос, газар дээр шалгаагүй. Машин суух аюултай.",
"features":[{"type":"Feature","geometry":{"type":"LineString","coordinates":[[101.9554,46.777304],[101.95885,46.779326]]},
"properties":{"area":"way/1","name":"Бага элс","km":0.346,"way_id":2,"new_track":false,
"road":{"highway":["track"],"surface":["sand"],"paved":false}}}]};
// In an app: JSON.parse of the pack's sand.geojson
const route = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const onSand = sandOnRoute(sand, route);
for (const s of onSand.stretches) console.log(s.name ?? s.area, s.along_m, s.on_m, s.km);
console.log('sand', onSand.on_m);sand нь багцын sand.geojson (manifest-ийн files мөр ба sand хэсэг, index.json-д sand_sha256); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. Хэсэг бүр нь OSM-ийн natural=sand талбай доторх нэг машин замын хэсэг, талбайн хилээр тасалсан; golf шошготой талбай нь гольфын элсэн нүх тул тооцохгүй. Машин суух аюултай. sandOnRoute(sand, line) нь аяллын явах хэсгүүдийг аяллын дарааллаар өгнө, wetlandsOnRoute-ийн дүрмээр: хэсгийг match_m (5 м)-ээс ихгүй жижиг хэсгүүдэд хуваана; жижиг хэсгийн хоёр үзүүр шугамаас match_m дотор байвал аялал түүгээр явна. Ийм хэсгүүд нийлээд 20 м (SAND_MIN_ON_M) буюу түүнээс их, эсвэл хэсэг бүхэлдээ бол аялал тэр хэсгээр явна: зөвхөн хөндлөн гарах аялал түүгээр явахгүй. along_m нь аяллын эхнээс хэсэгтэй нийлэх цэг хүртэлх метр, on_m нь аяллын явах метр, хоёулаа бүхэл метр; km нь багц дахь хэсгийн бүтэн урт. area нь OSM талбай, жишээ нь relation/5149547, name нь түүний OSM нэр эсвэл null. Зөвхөн шинэ зам дээр way_id, road нь null. Зарим хотын гудамж элсэн талбай дотор зурагдсан: 25 хэсэг хатуу хучилттай зам дээр, үүний 24 нь Замын-Үүдэд; road.paved тэдгээрийг ялгана. "40 дэх км-т элс, 1.2 км" гэж харуул. Хэсгүүдтэй хамт note_mn-ийг харуул: OSM-ийн шошгоос, газар дээр шалгаагүй; манхан нүүдэг, OSM-д зураагүй элс энд байхгүй. Хоосон жагсаалт нь "замд элс байхгүй" гэсэн үг биш. Одоогийн багцад 686 хэсэг, 66 OSM талбайд 669.6 км, үүний 153 хэсэг нь нэртэй талбайд; хамгийн их нь Бор хар элс, 70.3 км. 2026-10-03-аас өмнөх багцад sand.geojson байхгүй. 2-оос цөөн цэгтэй шугам RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
Усны цэг, офлайн
const water = {"type":"FeatureCollection","written":1,"counts":{"water_well":1},"named":1,"drinkable":{"yes":0,"no":0,"unknown":1},"near_m":2000,
"rule":"an OSM node or way tagged amenity=drinking_water or water_point, man_made=water_well or water_tap, or natural=spring",
"rule_mn":"amenity=drinking_water эсвэл water_point, man_made=water_well эсвэл water_tap, эсвэл natural=spring шошготой OSM зангилаа эсвэл зам",
"near_rule":"within 2000 m of the route line","near_rule_mn":"маршрутын шугамаас 2000 м дотор","source":"OpenStreetMap",
"note":"From OSM tags, not field checked. A well may be dry, broken or locked.",
"note_mn":"OSM-ийн шошгоос, газар дээр шалгаагүй. Худаг ширгэсэн, эвдэрсэн эсвэл цоожтой байж болно.",
"features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[101.951,46.7805]},
"properties":{"kind":"water_well","name":"Хар худаг","name_en":null,"drinkable":null,"drinking_water":null,"pump":null,"osm":"node/4"}}]};
// In an app: JSON.parse of the pack's water.geojson
const route = [[101.94, 46.775], [101.95425, 46.77663], [101.96, 46.78]];
const near = waterOnRoute(water, route);
for (const w of near.water) console.log(w.name ?? w.kind, w.along_m, w.off_m, w.drinkable ?? 'not known');
console.log('drinkable', near.drinkable.yes, 'of', near.water.length);water нь багцын water.geojson (manifest-ийн files мөр ба water хэсэг, index.json-д water_sha256); хэрэглэхийн өмнө sha256-ийг нь manifest-тэй тулга, хавтангийн адил. Цэг бүр нь amenity=drinking_water эсвэл water_point, man_made=water_well эсвэл water_tap, эсвэл natural=spring шошготой OSM зангилаа эсвэл зам; замыг гадаргуу дээрх нэг цэгээр авна. waterOnRoute(water, line) нь аяллын шугамаас near_m дотор байгаа цэгүүдийг аяллын дарааллаар өгнө, шатахуун түгээх газар, жуулчны баазын адил: өөрөө өгөхгүй бол багцын near_m (2000 м). along_m нь аяллын эхнээс усанд хамгийн ойр цэг хүртэлх метр, off_m нь шугамаас хэдэн метр, хоёулаа бүхэл метр. kind нь drinking_water, water_point, water_tap, water_well, spring дарааллаар эхэлж таарсан нь. drinkable нь зөвхөн OSM-ийн бичсэн зүйл: drinking_water=yes эсвэл тэр шошгогүй ундны усны цэг бол true, drinking_water=no бол false, OSM юу ч бичээгүй бол null; төрлөөс нь таамаглахгүй, тиймээс null нь "мэдэгдэхгүй", "уух боломжгүй" гэсэн үг биш. drinking_water, pump нь OSM шошго бичсэнээрээ. Хариуны drinkable нь олдсон цэгүүдийн дундах yes, no, unknown тоо. "40 дэх км-ээс 1.2 км-т худаг" гэж харуул. Цэгүүдтэй хамт note_mn-ийг харуул: OSM-ийн шошгоос, газар дээр шалгаагүй; худаг ширгэсэн, эвдэрсэн эсвэл цоожтой байж болно, OSM-д зураагүй усны цэг энд байхгүй. Хоосон жагсаалт нь "замд ус байхгүй" гэсэн үг биш. Одоогийн багцад 1,064 цэг (691 худаг, 211 булаг, 68 ундны ус, 48 усны цэг, 46 цорго), 200 нь нэртэй; OSM 97-д нь ундны, 5-д нь ундны биш гэж бичсэн, 962-т юу ч бичээгүй; 205 нь 46 N-ээс урагш. 2026-10-03-аас өмнөх багцад water.geojson байхгүй. 2-оос цөөн цэгтэй шугам эсвэл 0-ээс ихгүй near_m RangeError шиднэ. Сүлжээ, түлхүүр шаардахгүй.
wetlands.geojson, passes.geojson, sand.geojson, water.geojson, crossings.geojson дахь нэр: OSM заримдаа кирилл үгийн дотор латин үсэг бичдэг, жишээ нь латин o-той "Хонгoрын Элс". Бусад үсэг бүр ижил харагдах ихэртэй бол багц ийм үгийг нэг бичигт оруулна. name нь засагдсан нэр, name_osm нь OSM-ийн бичвэр, name нь OSM-ийн бичвэр бол null. name-ийг харуул. Хариу бүр name_osm, багцын дүрэм name_rule, name_rule_mn-ийг агуулна, багцад дүрэм байхгүй бол null. Одоогийн багцад элсний 686 хэсгээс 17 нь засагдсан, бүгд "Хонгорын Элс"; намаг, даваа, ус, гарцад 0. offline v11 (элс), v12 (намаг, даваа, ус), v13 (гарц)-аас өмнөх багцад аль аль нь байхгүй: null.
Суурь зураг, офлайн
const basemap = {"method":"dock_steppe.basemap v1","file":"basemap.pmtiles","format":"pmtiles","schema":"openmaptiles",
"schema_version":"3.16.0","tile_type":"mvt","tiles":305104,"minzoom":0,"maxzoom":14,
"bounds":[87.70255,41.50035,120.02014,52.19582],"layers":["boundary","building","landcover","landuse","park","place",
"transportation","transportation_name","water","water_name","waterway"],"excluded_layers":["poi","housenumber"],
"languages":["mn","en"],"osm_time":"2026-09-27T20:23:36Z",
"attribution":"© OpenMapTiles (openmaptiles.org) © OpenStreetMap contributors","rule":"no poi, no housenumber",
"rule_mn":"poi, housenumber давхаргагүй"};
// In an app: JSON.parse of manifest.json in the pack, its basemap block
const style = basemapStyle(basemap, 'https://example.com/packs/mongolia/basemap.pmtiles', { lang: 'mn' });
console.log(style.layers.length, style.sources['dock-basemap'].attribution);
// maplibregl.addProtocol('pmtiles', new Protocol().tile); new maplibregl.Map({ container: 'map', style });basemap нь багцын manifest.json-ийн basemap хэсэг; basemap.pmtiles түүний хажууд байна (manifest files[3], index.json-д basemap_sha256; хавтангийн адил sha256-ийг нь тулга). basemapStyle(basemap, url, options?) түүнд зориулсан MapLibre-ийн бүтэн загвар өгнө: газрын бүрхэвч, ус, гол, хээрийн шороон зам (бор, тасархай; файлд 14-р томруулалтаас эхэлж бий), зам, төмөр зам, улс, аймгийн хил, барилга. Ганц эх сурвалж нь url-ийг pmtiles://-ээр уншиж, хэсгийн attribution-ийг авч явна, тиймээс газрын зураг "© OpenStreetMap contributors" гэж харуулна; харуулсаар байлга. MapLibre GL JS нь pmtiles багцын протоколыг нэмсний дараа pmtiles:// уншина (maplibregl.addProtocol('pmtiles', new Protocol().tile)). Багцад фонт байхгүй, тиймээс нэр харуулахад glyphs (өөрийн фонтын URL, {fontstack}, {range}), fonts (фонтын багц, анхдагч ['Noto Sans Regular']) хэрэгтэй; тэгвэл газар, ус, замын нэрийг lang-аар ('mn' анхдагч, эсвэл 'en') бичнэ, байхгүй бол OSM-ийн нэрээр. background нь дэвсгэрийн өнгө. Файлд аж ахуйн газрын нэр, байрны дугаар байхгүй: дэлгүүрийн нэрийг зөвхөн бүртгэлтэй бол харуулна (poisOnRoute), хаяг нь төрийн албан ёсны хаяг. poi эсвэл housenumber давхаргатай, эсвэл OpenMapTiles вектор PMTiles биш хэсэг, хэсэгт байхгүй lang, хоосон url RangeError шиднэ; хэсэг байхгүй (null, 2026-10-03-аас өмнөх багц) бол TypeError. Одоогийн багц: 112.6 MB, 305,104 хавтан, 0-14 томруулалт, 2026-09-27-ны OSM. Сүлжээ, түлхүүр шаардахгүй.
Буруу хаалга мэдэгдэх
const receipt = await dock.reportDoor({ kind: 'wrong_location', code: '7QSVX', point: [106.9303, 47.9202] });
console.log(receipt.status, receipt.next);Мэдэгдэл бүрийг хүн хянана; түүнээс өмнө хаалганы мэдээлэл өөрчлөгдөхгүй. note-д нэр, утасны дугаар бичихгүй.
Газрыг id-гаар дахин авах
const { results } = await dock.geocode('Сансар');
const p = await dock.place(results[0].id);
console.log(label(p, 'mn'), p.parents?.building);geocode, reverse эсвэл changes-ийн өгсөн id, хүнд хэзээ ч харуулахгүй. parents дотор хаалга байрлах барилга эсвэл хашаа, хороолол, гудамж, хороо, дүүргийн id; бусад төрөлд null. Хаагдсан id бол DockError 410 retired, дахин ашиглагдахгүй. geocode:read.
Тухайн цагаас хойшхи өөрчлөлт
const copy = new Map();
let page = await dock.changes('1970-01-01T00:00:00Z', { limit: 1000 });
for (;;) {
for (const c of page.changes) {
if (c.state === 'current') copy.set(c.id, await dock.place(c.id));
else copy.delete(c.id);
}
if (page.next === null) break;
page = await dock.changes(null, { limit: 1000, cursor: page.next });
}
console.log(copy.size, page.until);Хуулбараа шинэчилнэ. Нэг дуудлага нэг хуудас, хуучнаас нь эхэлнэ; дараа нь since = page.until-ээр дахин асуу. cursor өгвөл since илгээхгүй: cursor цонхоо хадгална. limit дамжихгүй; дуудлага бүрт өг (анхдагч 100). Date-г UTC-ээр илгээнэ; текст бол бүстэй байна. current: place(id)-ээр дахин ав. retired, hidden: устга. Түншийн түлхүүр (changes:read).
Жолоочийн баталгаа
const r = await dock.confirm({
result: 'confirmed', code: '7QSVX', tap: [106.93012, 47.92011], device: [106.9302, 47.9203], driver: 'drv-7f3a',
});
console.log(r.status, r.next);result нь confirmed, wrong_location эсвэл missing. Хаалгыг code-оор, код хараахан байхгүй бол entrance-аар (хаалганы тайлын id). tap бол жолооч газрын зураг дээр хаалгыг дарсан цэг, missing-ээс бусдад заавал; device бол газар дээрх утасны GPS, зөвхөн шалгалт, tap-аас 40 м дотор. driver бол таны өөрийн жолоочийн дугаар, зөвхөн хэш хадгалагдана: утасны дугаар, имэйл, нэр хэзээ ч биш. Офлайн дараалсан баталгаанд observed_at (Date эсвэл бүстэй текст, 7 хоног хүртэл). tap-гүй confirmed, эсвэл code, entrance хоёулаа бол TypeScript татгалзана. Газрын зураг шууд өөрчлөгдөхгүй. Түншийн түлхүүр (confirm:write).
Хаалганы зураг: confirm хариулсны дараа dock.sendConfirmPhoto(r.id, jpeg), нэг JPEG (Uint8Array, ArrayBuffer эсвэл Blob), 2 MB хүртэл, тал бүр 320-8000 px. API мета өгөгдлийг нь устгана. Нэг баталгаад нэг зураг: ижлийг дахин илгээвэл unchanged, өөр зураг 409 photo_exists. Хаалганд хаалга үүссэний дараа хүн хянана; нийтийн хуудсанд хэзээ ч харагдахгүй.
Сарын баталгаа
const own = await dock.ownConfirmations('2026-10');
console.log(own.closed, own.totals.confirmed, own.drivers, own.flagged.length);ownConfirmations нь жолоочийн баталгааны таны самбар: танай байгууллагын баталгаажуулалт ба хаалганы мэдэгдлийг сараар (YYYY-MM, Улаанбаатар) өгнө, өөр байгууллагын юуг ч уншихгүй. totals ба days-ийн өдөр бүр үр дүнгээр тоолно: confirmed, wrong_location, missing, хаалганы мэдэгдлээс duplicate, unmapped. Мөр бүр жолооч газар дээр байсан Улаанбаатарын өдөрт тоологдоно (observed_at, эс бөгөөс хүлээн авсан цаг). drivers нь таны driver id-аар өөр өөр жолоочийн тоо, id-г өөрийг нь хэзээ ч өгөхгүй. flagged нь алдаатай цэгүүд: таны жолооч буруу байрлалтай, байхгүй эсвэл давхардсан гэсэн 100 хүртэл хаалга, олноос нь; хаалгыг нэрлэсэн бол code нь null. Хязгаарлалттай газрын хаалга хэзээ ч гарахгүй. Одоогийн сарыг ч өгнө; сар дууссанаас хойш 8 хоногийн дараа, дараалсан баталгаа нэмэгдэх боломжгүй болоход closed нь true. confirm:read хэрэгтэй, самбарын түлхүүрт зориулсан зөвхөн унших эрх: confirm:write үүнийг уншихгүй, confirm:read баталгаажуулж чадахгүй. Буруу сар бол 400 bad_month.
Хаалганы нэр
const mine = await dock.registerDoorName('Сансар бэйкери', '7QSVX');
const named = await dock.doorByName('сансар-бэйкери');
console.log(mine.status, mine.expires_at, named.door.code, label(named.door, 'mn'));Бизнес хаалгандаа нэг удаа нэр өгнө, түлхүүртэй хэн ч тэр нэрээр хаалгыг олно (API 0.52.0). Бүх дуудлагад door_names боломж хэрэгтэй: dock таны байгууллагад нээх хүртэл 403 feature_off хариулна (usage-ийн features-ийг үзнэ үү). registerDoorName(name, code) names:write эрх шаардана. Нэрийг нэг жил хадгална, одоогоор төлбөргүй. Өөрийн нэрийг өөр кодтой илгээвэл тэр хаалга руу шилжинэ (status нь moved). 409 name_taken, 410 retired_code, 50 нэрээс хэтэрвэл 422 too_many. doorByName(name) door:read эрхээр хаалгыг door шиг, албан хаягийг эхэнд нь хариулна. Том жижиг үсэг, зай, цэг таслал, кирилл үсэгтэй адилхан латин үсгээр бичсэн ч олно. Олдоогүй нэр хаалганы алдааны хязгаарт тоологдоно. doorNames() таны нэрсийг A-Z дарааллаар жагсаана. Нэрийг өөр байгууллагад шилжүүлэх (API 0.53.0): doorNameTransferCode(name) dnt_ код өгнө, нэг л удаа харагдана, 7 хоног хүчинтэй. Нөгөө байгууллага claimDoorName(name, transferCode) дуудна; хаалга, дуусах хугацаа хэвээр. cancelDoorNameTransfer(name) кодыг цуцална. Үсэггүй, утасны дугаар эсвэл и-мэйлтэй нэрийг хүсэлт илгээхгүйгээр API-ийн 400-аар татгалзана: нэр URL-д ордог.
Хаалганы тэмдэглэл
const sent = await dock.writeDoorNotes('Сансар бэйкери', {
instructions_mn: 'Зүүн талын хаалга',
instructions_en: 'East side, 2nd entrance',
});
const mine = await dock.doorNotes('Сансар бэйкери');
const state = mine.notes[0]?.state ?? 'none';
console.log(sent.status, state);Хаалганы нэр эзэмшдэг зочид буудал, байр, ресторан зочид хаалгаа хэрхэн олохыг writeDoorNotes(name, notes)-ээр бичнэ (API 0.58.0): instructions_mn, instructions_en эсвэл хоёулаа, тус бүр 500 хүртэл тэмдэгт. names:write эрх, hotel.notes боломж хэрэгтэй, эс бөгөөс 403 feature_off. Тэмдэглэлийг хүн хянана; түүнээс өмнө door газрын зурагт байгаа тэмдэглэлийг өгсөөр байна. status нь queued, дахин бичвэл updated эсвэл unchanged. Тэмдэглэлд утасны дугаар эсвэл и-мэйл байвал 400 personal_data. doorNotes(name) (API 0.59.0) тэр хаалганд бичсэн өөрийн тэмдэглэлүүдийг waiting, accepted эсвэл refused, reviewed_at-тай жагсаана; өөр байгууллагынхыг хэзээ ч үгүй. Танай эзэмшдэггүй нэр 404 not_found. Нэрийг хаалганы нэртэй адил шалгаж, хүсэлт илгээхээс өмнө татгалзана.
Хаалганы зураг
// A File from <input type="file" accept="image/jpeg"> goes the same way.
const gate = await (await fetch('/gate.jpg')).blob();
const sent = await dock.sendDoorPhoto('Сансар бэйкери', gate);
const shown = await dock.doorPhoto('Сансар бэйкери');
const again = await dock.doorPhoto('Сансар бэйкери', { sha256: shown.sha256 });
console.log(sent.status, shown.jpeg.length, again.jpeg);Хаалганы нэр эзэмшдэг байр хаалганыхаа зургийг, зочин ирэхдээ харах хаалгыг, sendDoorPhoto(name, jpeg)-ээр илгээнэ (API 0.60.0): нэг JPEG, Blob, Uint8Array эсвэл ArrayBuffer, 2 MB хүртэл, тал бүр 320-оос 8000 px. API хадгалахаасаа өмнө мета өгөгдлийг нь устгана: GPS, утас, цаг. Эргүүлэлт (orientation) хэвээр үлдэнэ. Зургийг хүн хянаж, хүний нүүр, машины дугаар эсвэл утасны дугаар харагдвал татгалзана. status нь queued, дахин илгээвэл updated эсвэл unchanged. sha256 нь таны файлынх биш, хадгалсан зургийнх. doorPhoto(name) (API 0.61.0) хүний зөвшөөрсөн хамгийн сүүлийн зургийг jpeg байт, sha256-тай нь буцаана; хүлээгдэж буй эсвэл татгалзсан зургийг, өөр байгууллагынхыг хэзээ ч үгүй. Зөвхөн өөрийн апп дотор харуулна, нийтийн хуудсанд хэзээ ч үгүй. Байгаа { sha256 }-аа өгвөл өөрчлөгдөөгүй зураг jpeg null, байтгүй ирнэ. names:write эрх, hotel.notes боломж хэрэгтэй, эс бөгөөс 403 feature_off. Танай эзэмшдэггүй нэр, хаагдсан хаалга, хязгаарлалттай газар эсвэл зөвшөөрсөн зураггүй бол 404 not_found. Нэрийг хаалганы нэртэй адил шалгаж, хүсэлт илгээхээс өмнө татгалзана.
Хэрэглээ
const usage = await dock.usage({ days: 7 });
console.log(usage.caps.daily_quota, usage.days[0]?.calls);Ямар ч түлхүүрээр үнэгүй. Өдрийн хязгаар дууссан ч хариулна. features (API 0.51.0) нь байгууллагад нээлттэй боломжуудыг A-Z дарааллаар жагсаана, жишээ нь cargo.eta. Бусад боломжийн зам 403 feature_off хариулна. Хуучин API-аас undefined. endpoints (API 0.62.0) нь мөн өдрүүдийн хүсэлт, олдоогүй хаалгыг зам бүрээр, их нь эхэндээ өгнө, жишээ нь GET /v1/door/:code. Хуучин API-аас undefined.
Хайлтын мэдээлэл хуваалцах
dock.setTelemetry(true);
const { results } = await dock.geocode('Сансар 24');
dock.pick(results[0]);
const sent = await dock.flushTelemetry();
console.log(sent?.stored, sent?.dropped);Анхдагчаар унтраалттай. Хэрэглэгч зөвшөөрсний дараа л асаана, жишээ нь чагтаар; чагтаа арилгавал унтраана. Унтраахад илгээгээгүй бүх хайлт устана. Асаалттай үед SDK geocode хайлт бүрээс эцсийн бичсэн текст ("Сан", "Сансар" гэж бичих явцын дуудлагууд нэг тоологдоно), үр дүнгийн тоо, pick-д өгсөн үр дүн ба түүний байрыг хадгална. 50 хүрэхэд, хуудас нуугдахад, flushTelemetry() дуудахад POST /v1/telemetry/search руу илгээнэ. Цаг, цэг, төхөөрөмж, session илгээхгүй. API хадгалахаасаа өмнө утасны дугаар, и-мэйл хаягийг арилгана. Хайлтаар газрын нэр, өөр нэрийг долоо хоног бүр засна; dock-оос гадна харуулах бүх зүйл бүлэглэгдэнэ, бүлэг бүрт дор хаяж 5 хайлт. Сонголт бичих явцын саналын дарааллыг ч тогтооно: жилд 5 ба түүнээс олон удаа, 2 ба түүнээс олон түншийн аппын хэрэглэгч сонгосон газар ижил таарцтай газраас өмнө гарна (API 0.35.1). Амжилтгүй илгээлтийг дахин оролдохгүй, хөтөчид хадгалахгүй. Client-ийн telemetry: true нь setTelemetry(true)-тэй адил. geocode:read хэрэгтэй; нэг илгээлт нэг дуудлага.
Сүлжээгүй хайлт
const dock = new Client({ key: 'dk_...', placeCache: { store: localStorage } });
const { results } = await dock.geocode('Сансар 24');
dock.pick(results[0]);
const answer = await dock.geocode('Сансар');
console.log(answer.offline === true, answer.results.length);
console.log(dock.places().length);
dock.forgetPlaces();Сүлжээтэй үед answer.offline байхгүй, API хариулна. pick-д өгсөн газар бүр төхөөрөмж дээр хадгалагдана, анхдагчаар асаалттай, хуваалцах асаалттай эсэхээс үл хамаарна. geocode хариу авахгүй бол (DockError код network) эдгээр газраас offline: true-тэй хариулна: бичсэн үг бүр нэр, урт хэлбэр эсвэл кодын нэг үгийн эхлэл байх ёстой, том жижиг үсэг хамаарахгүй. Хамгийн их сонгосон нь эхэнд, score нь сонгосон тоо, layer 1, near null, талбарууд API-ийн сүүлд өгснөөр; дараагийн сүлжээтэй хариу тэдгээрийг шинэчилнэ. Таарах газаргүй бол network алдаа өмнөх шигээ шидэгдэнэ. Цуцалсан дуудлага, API-ийн татгалзал (429, 401) хэзээ ч төхөөрөмжөөс хариулахгүй.
Хадгалах: зөвхөн газрын талбарууд. Хадгалахгүй: бичсэн текст, цаг, цэг, оноо. Анхдагчаар 100 газар (max 1-1000); хамгийн бага сонгосон нь эхэлж гарна. store өгөхгүй бол санах ойд л (localStorage эсвэл getItem, setItem, removeItem-тэй аль ч зүйл); татгалзсан эсвэл эвдэрсэн утгатай store-г үл тооно. Эндээс dock руу юу ч илгээхгүй. placeCache: false унтраана.
Аялал бичих
dock.startTrace({ consent: 'opt_in' });
const trips = await dock.stopTrace();
const id = trips[0].id;
const stored = await dock.trace(id);
console.log(stored.geometry?.coordinates.length, stored.properties.purge_after);
await dock.deleteTrace(id);startTrace дуудах хүртэл унтраалттай. Хэрэглэгч энэ аяллаа хуваалцахыг зөвшөөрсний дараа л дуудна; consent: 'opt_in' заавал. SDK navigator.geolocation-ийг (эсвэл native гүүрт source) ажиглаж [lon, lat, t] хадгална: 6 оронтой бутархай, UTC бүхэл секунд, секундэд нэгээс ихгүй цэг. Орхих: maxAccuracyM-ээс (анхдагч 50 м) муу нарийвчлалтай, Монголоос гадуурх, цаг нь ухарсан цэг. Нарийвчлал, хурд, төхөөрөмж, хэрэглэгчийг хэзээ ч илгээхгүй. Цэгүүд санах ойд л байна, хөтөчид хадгалахгүй. stopTrace() аяллыг POST /v1/traces руу 20,000 цэг тутамд хувааж илгээгээд хэсэг бүрийн баримтыг буцаана. id бүрийг хадгална уу: deleteTrace(id) цэгүүдийг одоо устгана, trace(id) нь таны экспорт. 2-оос цөөн цэг бол юу ч илгээхгүй. Амжилтгүй илгээлт алдаа өгч цэгүүдийг санах ойд үлдээнэ: дахин оролдохдоо stopTrace(), хаяхдаа cancelTrace() дуудна. Хориотой газрын доторх цэгийг хадгалахгүй. Түүхий цэгийг 90 хоногийн дараа устгана. trace:write хэрэгтэй: бичигчид хөтчийн газрын зургийн түлхүүр биш, тусдаа түлхүүр өгнө.
Аяллын нүд
const own = await dock.ownTraceCells('2026-10', [106.7, 47.8, 107.2, 48.0]);
console.log(own.closed, own.features.length, own.features[0]?.properties.trips);
const all = await dock.traceCells('2026-09', [106.7, 47.8, 107.2, 48.0]);
console.log(all.month, all.features.length);
const speeds = await dock.traceSpeeds('2026-09', [106.7, 47.8, 107.2, 48.0]);
console.log(speeds.month, speeds.features.length, speeds.features[0]?.properties.km_h);
const roads = await dock.traceRoads('2026-09', [106.7, 47.8, 107.2, 48.0]);
console.log(roads.month, roads.features.length, roads.features[0]?.properties.km_h, roads.features[0]?.geometry.type);
const peak = await dock.traceRoads('2026-09', [106.7, 47.8, 107.2, 48.0], { band: 'am_peak' });
console.log(peak.rule.hours, peak.features.length);ownTraceCells нь таны самбар: танай байгууллагын аяллыг 500 м нүд, сараар, таны нэг ч аялал орсон нүд бүрийг өгнө, өөр байгууллагын өгөгдлийг уншихгүй. Одоогийн сарыг ч хариулна, аялал ирэх тусам өснө; сар дууссанаас хойш 14 хоногийн дараа тоо эцэслэгдэж closed нь true болно. trace:read хэрэгтэй, самбарын түлхүүрт зориулсан зөвхөн унших эрх: аялал илгээж, экспортлож, устгаж чадахгүй, trace:write нүдийг уншихгүй. traceCells нь бүх түнш хамтдаа, ижил тор: 3 ба түүнээс олон байгууллагын аялалтай, хамгийн том байгууллагыг хассаны дараа 5 ба түүнээс олон аялал үлдсэн нүд л гарна. Нүд байхгүй нь тэг биш, цөөн гэсэн үг. Туршилтын болон дотоод байгууллага тоологдохгүй. Зөвхөн бүтэн сар, сар дууссанаас хойш 14 хоногийн дараанаас (өмнө нь 400 month_open). insights:read хэрэгтэй. Хоёулаа month-ийг YYYY-MM (Улаанбаатар), bbox-ийг Монгол доторх [west, south, east, north], тал бүр 1 градусаас ихгүй (400 bad_bbox) авна. id, цаг, шугам байхгүй.
traceSpeeds нь бүх түншийн аяллын хөдөлгөөний хурдыг нүдээр өгнө, ижил тор, сар, хүрээ, ижил дүрэм. Аяллыг хадгалсан цэгүүдийн хооронд хэсэг болгон хуваана. Хоёр цэг нь 1-60 секундын зайтай, хурд нь 3-130 км/ц, дунд цэг нь аяллын эхний болон сүүлийн цэгээс 200 м-ээс хол хэсэг л тоологдоно: зогсоол, хаалга хүртэл алхсан нь орохгүй. km_h нь нүдэнд тоологдсон метрийг тоологдсон секундэд хуваасан, 0.1 хүртэл, тиймээс олон аялалтай нүд илүү жинтэй. Нүдээр: зам бүрийн хурдыг доорх traceRoads өгнө. Нүд байхгүй нь удаан зам биш, аялал цөөн гэсэн үг. Аяллын тоо байхгүй. insights:read хэрэгтэй.
traceRoads нь ижил хурдыг замаар өгнө. Аяллыг хадгалах үед Valhalla map matching-аар OSM замд тааруулна; хэсгийн хоёр цэг хоёулаа тэр замд таарсан бол traceSpeeds-ийн дүрмээр тэр замд тоологдоно. Зам бүр нэг feature: id нь OSM замын дугаар текстээр, шугам нь dock-ийн тэр дугаартай одоогийн зам, properties нь km_h (замд тоологдсон метрийг секундэд хуваасан, 0.1 хүртэл), name_mn, name_en, highway, мэдэхгүй бол null. Шугам нь LineString, зам хэсэгчилсэн бол MultiLineString. Зам ижил дүрмээр л гарна; зам байхгүй нь удаан биш, аялал цөөн гэсэн үг. Хязгаарлалттай газрыг дайрсан зам гарахгүй. dock-ийн замын шугам ачаалагдах хүртэл хоосон. Аяллын тоо байхгүй. insights:read хэрэгтэй.
band (API 0.49.0) нь нэг цагийн бүсийн аяллыг л өгнө, аяллын эхний хадгалсан цэгийн Улаанбаатарын цагаар: 'am_peak' Даваа-Баасан 07:00-09:59, 'pm_peak' Даваа-Баасан 17:00-19:59, 'off_peak' бусад цаг, Бямба, Ням бүтэн. Бүс бүр ижил дүрмийг өөрийн аяллаар давна: бүх цагт гарсан зам бүсэд гарахгүй байж болно. Өгөхгүй бол бүх цаг. rule.hours аль нь болохыг хэлнэ.
Хаалганд хүрэх минут
const arrivals = await dock.ownArrivals('2026-10');
console.log(arrivals.closed, arrivals.trips, arrivals.slow, arrivals.median, arrivals.features[0]?.properties.slow);ownArrivals нь таны аялал сүүлийн 200 м-т хэдэн минут зарцуулсныг өгнө: аялал бүрд, төгсгөлөөсөө 200 м-ээс сүүлчийн удаа холдсоны дараах эхний цэгээс төгсгөл хүртэлх бүтэн минут; 60 нь 60 ба түүнээс дээш. 200 м дотор эргэлдсэн нь тоологдоно; төгсгөлөөсөө 200 м-ээс хэзээ ч холдоогүй аялал тоологдохгүй. Минутад зогсоол, хаалга хүртэл алхах нь орно: сар, газрыг хооронд нь харьцуулахад хэрэглэнэ. trips, slow (5 ба түүнээс олон минут), median, p75, p90 (ойрын эрэмбэ, аялалгүй бол null) нь сарын нийт; histogram нь минут бүрийн аялал, аялалгүй минутыг орхино. features нь аялал дууссан 100 хүртэл нүд, аяллын нүдний тор дээр, удаан аяллаар, дараа нь аяллаар; cells нь бүгдийг нь тоолно. Зөвхөн танай байгууллага, өөр байгууллагын юуг ч уншихгүй. Одоогийн сарыг ч өгнө; сар дууссанаас хойш 14 хоногийн дараа closed нь true. Аяллыг устгавал тооноос гарна; түүхий цэгийг 90 хоногт арилгахад үлдэнэ. trace:read хэрэгтэй. Буруу сар бол 400 bad_month.
Аяллын цаг
const hours = await dock.ownHours('2026-10');
console.log(hours.closed, hours.trips, hours.by_weekday[0], hours.by_hour[9], hours.slots.length);
const all = await dock.allHours('2026-09');
console.log(all.month, all.slots.length, all.slots[0]?.trips);
const khoroos = await dock.traceKhoroos('2026-09');
console.log(khoroos.month, khoroos.features.length, khoroos.features[0]?.properties.khoroo);
const myKhoroos = await dock.ownKhoroos('2026-10');
console.log(myKhoroos.closed, myKhoroos.trips, myKhoroos.no_khoroo, myKhoroos.features.length, myKhoroos.features[0]?.properties.trips);
const myKinds = await dock.ownKinds('2026-10');
console.log(myKinds.closed, myKinds.trips, myKinds.kinds.length, myKinds.kinds[0]?.kind, myKinds.kinds[0]?.trips);ownHours нь таны аялал хэзээ эхэлдгийг өгнө: аялал бүр нэг удаа, эхний хадгалсан цэгийнхээ Улаанбаатарын гараг (1 Даваа, 7 Ням) ба цагт (0-ээс 23) тоологдоно. trips нь сарын нийт; by_weekday нь 7 тоо, Даваагаас эхэлнэ; by_hour нь 24 тоо, 0 цагаас эхэлнэ; slots нь аялалтай гараг, цаг бүр, гараг дараа нь цагаар; аялалгүйг орхино. Аялал эхэлсэн сартаа тоологдоно, ownTraceCells-тэй адил. Зөвхөн танай байгууллага, өөр байгууллагын юуг ч уншихгүй. Одоогийн сарыг ч өгнө; сар дууссанаас хойш 14 хоногийн дараа closed нь true. Аяллыг устгавал тооноос гарна; түүхий цэгийг 90 хоногт арилгахад үлдэнэ. trace:read хэрэгтэй. Буруу сар бол 400 bad_month.
allHours нь бүх түнш хамтдаа, аяллын нүдний дүрмээр: 3 ба түүнээс олон байгууллагын аялалтай, хамгийн том байгууллагыг хассаны дараа 5 ба түүнээс олон аялал үлдсэн гараг, цаг л гарна. Цаг байхгүй нь тэг биш, цөөн гэсэн үг. Нийт тоо, гараг эсвэл цагийн нийлбэр байхгүй тул орхисон цагийг тооцоолж гаргахгүй. Туршилтын болон дотоод байгууллага тоологдохгүй. Зөвхөн бүтэн сар, сар дууссанаас хойш 14 хоногийн дараанаас (өмнө нь 400 month_open). insights:read хэрэгтэй.
traceKhoroos нь бүх түншийн аялал хаана, хэдэн цагт дуусдагийг ижил дүрмээр өгнө: аялал бүр сүүлийн хадгалсан цэгийнхээ Улаанбаатарын цаг (0-23), төгсгөлийн нүдний төвийг агуулсан хороонд нэг удаа тоологдоно. Хороо бүр нэг feature: полигон, district_mn, district_en, хорооны дугаар, дүрмийг давсан цаг бүр hours. Цаг байхгүй нь тэг биш, цөөн гэсэн үг. Хорооны нийт тоо байхгүй. Зөвхөн одоогийн хорооны полигон; полигонгүй хороо гарахгүй. Зөвхөн бүтэн сар, сар дууссанаас хойш 14 хоногийн дараанаас (өмнө нь 400 month_open). insights:read хэрэгтэй.
ownKhoroos нь таны аялал хаана, хэдэн цагт дуусдагийг хороо, ирсэн цагаар өгнө, traceKhoroos-тэй адил уншина, гэхдээ бүлгийн дүрэмгүй: аялал таных. trips нь сарын нийт, no_khoroo нь одоогийн хорооны полигонд ороогүй аялал, feature бүрт хорооны trips, аялалтай цаг бүр. trips нь no_khoroo ба бүх хорооны аяллын нийлбэр. Хорооны полигон ачаалагдах хүртэл бүх аялал no_khoroo-д. Зөвхөн танай байгууллага. Одоогийн сарыг ч өгнө; сар дууссанаас хойш 14 хоногийн дараа closed нь true. trace:read хэрэгтэй. Буруу сар бол 400 bad_month.
ownKinds нь таны аялал ямар барилгад дуусдагийг өгнө: аялал бүр нэг удаа, сүүлийн хадгалсан цэгийг агуулсан барилга, эсвэл 30 м доторх хамгийн ойр барилга, аялал хадгалагдах үеийн тэр барилгын төрлөөр (apartment, ger_house, commercial, public, industrial, garage, other). unknown нь төрөлгүй барилга, none нь 30 м дотор барилга байхгүй. Хязгаарлалттай газрын барилгыг уншихгүй. trips нь сарын нийт, бүх төрлийн trips-ийн нийлбэр; kinds нь аялалтай төрлүүд, ихээс нь. Зөвхөн танай байгууллага, бүлгийн дүрэмгүй. Одоогийн сарыг ч өгнө; сар дууссанаас хойш 14 хоногийн дараа closed нь true. trace:read хэрэгтэй. Буруу сар бол 400 bad_month.
Алдаа
try {
await dock.door('7QSVX');
} catch (e) {
if (!(e instanceof DockError)) throw e;
if (e.code === 'not_found') console.log('ийм кодтой хаалга алга');
else if (e.retryAfter !== null) console.log(`${e.retryAfter} секунд хүлээ`);
else console.log(e.status, e.code, e.message);
}status нь HTTP статус, code нь API-ийн error (invalid_code, not_found, retired_code, rate_limited, quota_exceeded, miss_cap, ...), хариу ирээгүй бол network. retryAfter нь 429, 503 үед секундээр, бусад үед null. SDK өөрөө дахин оролдохгүй.
Хуучирсан зам
Хариу нь замаа хуучирсан гэж хэлбэл (Deprecation, Sunset, Link толгой, Төлөв хуудсыг үз) SDK onDeprecation-ийг client бүрт зам тус бүр нэг удаа { route, deprecated, sunset, link }-ээр дуудна. route нь загвар (GET /v1/door/:code), хэзээ ч URL биш. Өдрүүд Улаанбаатарын цагаар. Анхдагч нь зам тус бүрт нэг console.warn. Өөрийн лог руу илгээх бол функцээ өгнө. Хаагдах өдрөөс эхлэн зам status 410, code sunset бүхий DockError шиднэ. Өнөөдөр хуучирсан зам алга.
Жишээ апп
Долоон апп, тус бүр нэг HTML файл, 200 мөрөөс бага, MIT. SDK хавтасны examples/ дотор. npm run build хийгээд хавтсыг http-ээр өгч /examples/<файл>#key=dk_... нээнэ. Түлхүүр hash-д үлдэнэ, хөтөч үүнийг сервер рүү илгээдэггүй. Үнэгүй түлхүүрт хэрэгтэй эрхүүд бүгд бий.
| Файл | Юу хийдэг | Дуудлага |
|---|---|---|
dispatch.html | Хүргэлтийн диспетчер. Захиалгыг мөр бүрт нэгээр, код эсвэл хаягаар оруулна. Агуулахаас өгсөн дарааллаар нь зам гаргана. Олдоогүй мөр жагсаалтад "олдсонгүй" гэж үлдэнэ. | door, geocode, route |
sameday.html | Өдөрт нь хүргэх, нэг жолооч. Хотын өнцөг булан бүрээс 11 хүртэл захиалга оруулна. dock тэдгээрийг замд хамгийн бага цаг зарцуулах дараалалд оруулж, агуулахаас гараад буцаж ирнэ. Цэг бүрт дүүрэг, гарах цаг ба цэг бүрт зарцуулах минутаас тооцсон ирэх цаг гарна. Хэсэг бүрийг өөрийн цагаар тооцно: тухайн цагийн жолооч нарын хэмжсэн хурд байвал түүгээр, үгүй бол түгжрэлгүй OSM-ийн замын хурдаар, аль нь болохыг хуудас хэлнэ. | door, geocode, reverse, optimizedTrips, route |
taxi.html | Такси дуудах. Суух газраа дарж, очих газраа бичээд санал болгосноос сонгоно. Зам, хугацаа, хаалга хүртэл алхах зай харагдана. Зам тойрсон хаалттай замуудаа нэрлэнэ. Суух эсвэл буух газар хаалттай замын дотор байвал хаалтын дугаартай нь татгалзана. | reverse, geocode, door, route, closures, excludePolygons, closureAt |
checkout.html | Онлайн дэлгүүрийн захиалга. Худалдан авагч хаягаа ярьдгаараа эсвэл кодоор нэг attachSuggest талбарт бичиж, пинээ шалгаад тоотоо нэмнэ. Захиалгад код, албан ёсны хаяг, цэг хадгалагдана. | attachSuggest, door, setTelemetry, flushTelemetry |
hotel.html | Зочид буудлын зочны хуудас. Хаалга газрын зураг дээр монгол, англи, япон, солонгос, хятад, орос хэлээр; буудлын заавар (зочны хэлээр бичээгүй бол англиар, тэгж бичсэнээ хэлнэ), таксины жолоочид үзүүлэх карт, алхах зам, хаалганы QR. Код эсвэл хаалганы холбоосоор нээгдэнэ. | door, doorByName эсвэл geocode, route, doorQrSvg |
emergency.html | Яаралтай дуудлагын диспетчер. Дуудлага өгсөн хүний хэлснийг бичнэ эсвэл ярина (хөтөч дуу таньдаг бол микрофон гарна). Гурав хүртэл газар ирнэ, аль нь ч автоматаар сонгогдохгүй: диспетчер дуудлага өгсөн хүнээр шалгуулсан газраа дарна. Дараа нь итгэл том үсгээр (бага эсвэл тодорхойгүй бол улаан), хаалга, баазаас очих зам. Дуудлагын карт зөвхөн "Илгээх" дарахад гарна. Хаалгагүй код "олдсонгүй" хэвээр үлдэнэ. | door, geocode, route |
outlet.html | Салбарын газрын зураг. Сүлжээний нэрийг бичнэ (банк, эмийн сан); демо дүүрэг доторх тэр нэртэй газрууд жагсаалт, газрын зураг дээр гарна. Барилгын кодтой салбар кодтойгоо ногоон, кодгүй нь саарал зүүгээр, үг бичихгүй. Салбарууд dock-ийн мэдэх нэрээс олдсон, сүлжээний өөрийн жагсаалт биш, хуудас үүнийгээ хэлнэ. Салбаруудын JSON. | geocode |
driver.html | Жолоочийн аялал. Жолооч зөвшөөрлийн чагтыг тэмдэглэх хүртэл эхлэх товч идэвхгүй. Дуусгахад аялал илгээгдэж, dock-д хадгалсныг газрын зураг дээр зурна, жолооч устгаж болно. trace:write эрхтэй тусдаа түлхүүрээр нээнэ: &trace_key=dk_.... | startTrace, stopTrace, cancelTrace, trace, deleteTrace, reverse |
Газар бүрийг label()-ээр харуулдаг тул албан ёсны хаягтай тулгагдаагүй бүхэнд "албан бус" гэж бичигдэнэ. make samples апп бүрийг headless Chrome-д API-тай нээж ажиллуулна. Арван ажиллуулалт бүгд одоогийн SDK хувилбар дээр давах хүртэл SDK-ийн тест унана. Бодит өгөгдөлд ийм тохиолдол одоогоор алга тул хоёр нь хариуг сольдог, мөрөнд нь энэ тухай бичигдэнэ. Нэг нь таксины хуудсыг нэг туршилтын хаалттай ажиллуулна: хөтөч дотор API-ийн хаалтын жагсаалт, замын хариуг сольдог. Нөгөө нь зочид буудлын хуудсыг хаалганы нэрээр (#name=) нээнэ: одоогоор нэр эзэмшсэн идэвхтэй хаалга алга тул API-ийн олоогүй нэрэнд "албан бус" гэж тэмдэглэсэн туршилтын хаалга өгнө.
Хөдөөгийн замын жишээ нь тусдаа хуудас: коридорын самбар dock.mn/steppe, зургаан коридор, нэг файл, сүлжээгүй нээгдэнэ. Баримтууд PDF-ээр: монголоор, англиар. Тоо бүр загварын тооцоо, итгэлийн түвшинтэй. Газар дээр шалгасан мөр одоогоор алга (0 км).
Түлхүүр
JSON дуудлага түлхүүрийг Authorization толгойд илгээнэ. Газрын зургийн хүсэлт Mapbox-той адил ?access_token=-оор явна: tile бүрт нэг хүсэлт, CORS preflight байхгүй. API query string-ийг лог-д бичдэггүй. Түлхүүр client-ийн console.log, JSON.stringify-д харагдахгүй.
Вэб хуудсан дахь түлхүүрийг хэрэглэгч нь харж чадна. Хөтөчид зөвхөн tiles:read, geocode:read, door:read эрхтэй түлхүүр өгнө.
Лавлах
| Экспорт | |
|---|---|
Client | new Client({ key, baseUrl?, fetch?, onDeprecation?, telemetry?, placeCache? }). Түлхүүрийг хадгална. baseUrl анхдагч нь DEFAULT_BASE_URL. |
geocode(q, { limit?, proximity?, types? }) | Нэр эсвэл хаягаас газар, хамгийн сайн нь эхэндээ. proximity [lon, lat]: ижил таарцтай нэрсээс ойр нь эхэнд. types нь зөвхөн тэр төрлүүдийг үлдээнэ, limit-ээс өмнө сонгоно. Сүлжээгүй үед таарах сонгосон газрууд, offline: true. geocode:read. |
reverse([lon, lat], { radius?, limit?, types? }) | Цэг дээрх ба ойрын газрууд, ойр нь эхэндээ, дүүрэг, хороотой. types нь зөвхөн door, business, building, landmark-ийг үлдээнэ, limit-ээс өмнө сонгоно. geocode:read. |
door(code, { unit? }) | Кодоор хаалга. door:read. |
route(from, to, { mode?, departAt?, via? }) | Хоёр цэг эсвэл кодын хоорондох зам, код бол хаалга хүртэл, via-г дарааллаар дайрна. Цэгийг 7 оронтой бутархай болгож тоймлоно. route:read, код бол door:read. |
isochrone(from, contoursMinutes, { mode? }) | Нэг төгсгөлөөс 60 хүртэл минутын 1-4 хугацаанд хүрэх талбай, GeoJSON-оор. route:read, код бол door:read. |
matching(coordinates, { timestamps?, mode? }) | GPS мөрийг явсан замууд дээр нь, тасраагүй хэсэг бүрт нэг шугам, цэг бүрт нэг байрлал. 2-оос MATCHING_MAX (100) цэг. route:read. |
optimizedTrips(stops, { roundtrip?, mode? }) | Зогсоолуудыг замд хамгийн бага хугацаа зарцуулах дарааллаар, тэр дарааллаарх аялал. 2-оос OPTIMIZED_TRIPS_MAX (12) зогсоол. route:read, код бол door:read. |
tilequery([lon, lat], { sources?, radius?, limit?, geometry? }) | Цэг дээрх эсвэл ойрхон байгаа байшин, хаалга, хамгийн ойроос нь, GeoJSON. Radius TILEQUERY_RADIUS_MAX_M (1000) м хүртэл, TILEQUERY_LIMIT_MAX (50) объект хүртэл. tiles:read. |
matrix(from, to, { mode? }) | from бүрээс to бүр хүртэлх хугацаа, зай нэг дуудлагаар, тал бүр MATRIX_MAX (10) хүртэл. route:read, код бол door:read. |
place(id) | Газрыг id-гаар дахин авна, parents-тай. geocode:read. |
changes(since, { limit?, cursor? }) | [since, until) дотор өөрчлөгдсөн id-ийн нэг хуудас. changes:read. |
confirm(confirmation) | Газар дээрх жолооч хаалгыг баталгаажуулна, эсвэл өөр газар, алга гэнэ. confirm:write. |
sendConfirmPhoto(id, jpeg) | Баталгааны хамт хаалганы зураг, хянуулахаар. confirm:write. |
ownConfirmations(month) | Таны жолоочийн баталгаа, хаалганы мэдэгдэл сараар, үр дүн ба өдрөөр, алдаатай цэгтэй; эцэслэгдсэн бол closed. confirm:read. |
closures() | Өнөөдөр дуусаагүй зам хаалт, тус бүр хүрээтэй. route:read. |
reportClosure(report, options?) | Явах боломжгүй зам, гарцыг мэдэгдэнэ; idempotencyKey дахин илгээхийг аюулгүй болгоно. closures:write. |
closure(id) | Өөрийн нэг хаалтын мэдэгдэл, тэмдэглэлтэй. closures:write. |
liftClosure(id, options?) | Зам on өдрөөс дахин нээгдсэн, анхдагч нь өнөөдөр. closures:write. |
reportDoor(report) | Буруу, байхгүй, давхардсан, кодгүй хаалга мэдэгдэнэ. door:read. |
usage({ days? }) | Байгууллагын хязгаар, сүүлийн 1-90 өдөр. |
setTelemetry(on) | Хайлт хуваалцах, зөвхөн хэрэглэгч зөвшөөрсний дараа. Унтраахад илгээгээгүй нь устана. |
pick(result) | Хэрэглэгч geocode-ийн энэ үр дүнг сонгосон. Сүлжээгүй хайлтад төхөөрөмж дээр хадгална; хуваалцах асаалттай үед л илгээнэ. |
places() | Энэ төхөөрөмж дээр сонгосон газрууд, хамгийн их сонгосноос эхэлнэ. |
forgetPlaces() | Тэдгээрийг санах ой болон store-оос мартана. |
flushTelemetry() | Хүлээж буй хайлтыг одоо илгээнэ. { stored, dropped }, унтраалттай эсвэл хоосон бол null. |
startTrace({ consent, source?, maxAccuracyM? }) | Хэрэглэгчийн аяллыг бичнэ, зөвхөн зөвшөөрсний дараа. consent: 'opt_in'. |
stopTrace() | Зогсоож аяллыг илгээнэ. 20,000 цэг тутамд нэг { id, points, restricted, duplicate, purge_after }. trace:write. |
cancelTrace() | Зогсоож аяллыг илгээлгүй хаяна. |
tracing | Аялал бичиж байх үед true. |
trace(id) | Таны аялал хадгалсан хэлбэрээр, GeoJSON [lon, lat, t]. trace:write. |
deleteTrace(id) | Аяллын цэгийг одоо устгана. id үлдэнэ, дахин ашиглахгүй. trace:write. |
startProbes({ source?, maxAccuracyM?, intervalS?, onError? }) | Флотын машины байрлалыг 30 секунд тутам замын хөдөлгөөнд илгээнэ, флотын гэрээгээр (traffic.probes). 15 минут тутам шинэ санамсаргүй машины токен, жолоочгүй. trace:write. |
stopProbes() | Зогсоож үлдсэнийг илгээнэ. { points, restricted, roads, late }, эсвэл null. |
probing | Илгээж байх үед true. |
traffic(bbox) | Замын шууд хурд, дууссан сүүлийн 15 минут, 5 ба түүнээс олон машин явсан зам. insights:read. |
trafficTypical(bbox) | Замын ердийн хурд, одоогийн цагийн бүсийн (am_peak, pm_peak, off_peak, Улаанбаатарын цагаар). Шууд биш: typical.label "ердийн". Хурдгүй зам гарахгүй, хоосон байж болно. Зөвхөн tiles:read (газрын зургийн түлхүүр), тайл шиг тоологдоно. |
createEvent({ name, bbox, startsAt, endsAt }) | Арга хэмжээ нээнэ: нэр, талбай, цаг; шууд хуудас ба дулааны зурагт. Зохион байгуулагчийн гэрээгээр (events.live). Дууссанаас 15 минутын дараа бүх цэг устана. trace:write. |
event(id) | Таны арга хэмжээ: { id, name, bbox, starts_at, ends_at, closes_at, closed }. trace:read. |
startEventPositions(id, { consent, source?, maxAccuracyM?, intervalS?, onError? }) | Оролцогчийн байрлалыг 10 секунд тутам илгээнэ, зөвхөн зөвшөөрсний дараа. consent: 'opt_in'. Санамсаргүй оролцогчийн токен, нэр, дугааргүй. event_closed дээр зогсоно. trace:write. |
stopEventPositions() | Зогсоож үлдсэнийг илгээнэ. { points, kept, outside, restricted }, эсвэл null. |
sendingPositions | Байрлал илгээж байх үед true. |
eventLive(id) | Шууд цэгүүд: оролцогч бүрийн сүүлийн 2 минутын сүүлийн цэг, 4 оронтой, хүний тухай юу ч үгүй; 5-аас цөөн бол хоосон. trace:read. |
eventHeat(id, { window? }) | 100 м нүд тутмын оролцогч, 5 ба түүнээс олонтой нүд, бүх арга хэмжээ эсвэл нэг 15 минут. trace:read. |
ownTraceCells(month, bbox) | Өөрийн аяллыг 500 м нүд, сараар, нэг ч аялалтай нүд бүр; эцэслэгдсэн бол closed. trace:read. |
ownArrivals(month) | Таны аяллын сүүлийн 200 м-ийн минут сараар: median, p75, p90, минут ба төгсгөлийн нүдээр; эцэслэгдсэн бол closed. trace:read. |
ownHours(month) | Таны аялал сараар, гараг ба цагаар, эхний цэгийн Улаанбаатарын цагаар; эцэслэгдсэн бол closed. trace:read. |
allHours(month) | Бүх түншийн аяллыг гараг ба цагаар, нийтэлсэн сар, 3 ба түүнээс олон байгууллагатай цаг л. insights:read. |
traceCells(month, bbox) | Бүх түншийн аяллыг нүдээр, нийтэлсэн сар, 3 ба түүнээс олон байгууллагатай нүд л. insights:read. |
traceSpeeds(month, bbox) | Бүх түншийн хөдөлгөөний хурдыг нүдээр, нийтэлсэн сар, 3 ба түүнээс олон байгууллагатай нүд л. insights:read. |
traceRoads(month, bbox, { band }) | Бүх түншийн хөдөлгөөний хурдыг замаар, нийтэлсэн сар, 3 ба түүнээс олон байгууллагатай зам л; band нэг цагийн бүс. insights:read. |
traceKhoroos(month) | Бүх түншийн аяллыг хороо ба ирсэн цагаар, нийтэлсэн сар, 3 ба түүнээс олон байгууллагатай цаг л. insights:read. |
ownKhoroos(month) | Таны аялал сараар, хороо ба ирсэн цагаар, хороонд ороогүйг тусад нь; эцэслэгдсэн бол closed. trace:read. |
ownKinds(month) | Таны аялал сараар, дууссан барилгын төрлөөр, ихээс нь; эцэслэгдсэн бол closed. trace:read. |
tileJsonUrl(source) | building эсвэл entrance-ийн TileJSON URL, түлхүүргүй. |
transformRequest | Зөвхөн dock API руу явах хүсэлтэд түлхүүр нэмэх MapLibre transformRequest. |
DockError | Бүх алдаа: status, code, message, retryAfter. |
createMap(maplibregl, client, options) | dock tile дээрх maplibre-gl Map. |
dockStyle(baseUrl, { extrude?, background?, building?, buildingOutline? }) | createMap-ийн хэрэглэдэг бүтэн style. |
dockSources(baseUrl) | dock-building, dock-entrance эх үүсвэр. |
dockLayers({ extrude?, building?, buildingOutline? }) | Барилгын дүүргэлт эсвэл өргөлт, хаалганы цэг. Хаалганы өнгө итгэлцлийг заах тул өөрчлөгдөхгүй. |
isochroneSource(zone) | isochrone-ийн хариунаас GeoJSON эх үүсвэр, хамгийн том contour эхэндээ, хариуны source эх сурвалжаар. |
isochroneLayers({ source?, color?, opacity? }) | Тэр эх үүсвэрийн дүүргэлт, хүрээ, id нь <source>-fill, <source>-line. opacity 0-ээс 1, анхдагч 0.2. |
matchingSource(trip) | matching-ийн хариунаас GeoJSON эх үүсвэр: хэсэг бүрт шугам, зам дээр буусан tracepoint бүрт цэг, хариуны source эх сурвалжаар. |
matchingLayers({ source?, color?, width? }) | Тэр эх үүсвэрийн шугам, буусан цэг бүрийн толбо, id нь <source>-line, <source>-point. width 0-ээс их, анхдагч 4. |
optimizedTripSource(round) | optimizedTrips-ийн хариунаас GeoJSON эх үүсвэр: аяллын шугам, дараа нь явах дарааллаар зогсоол бүрт цэг, number 1-ээс, хариуны source эх сурвалжаар. |
optimizedTripLayers({ source?, color?, width?, font? }) | Тэр эх үүсвэрийн шугам, зогсоол бүрийн цагираг, id нь <source>-line, <source>-stop, font өгвөл <source>-number. width 0-ээс их, анхдагч 4. |
routeSource(trip) | route-ийн хариунаас GeoJSON эх үүсвэр: шугам, дараа нь төгсгөл бүрт цэг, from, дайрах цэг бүр, to, number 1-ээс, хариуны source эх сурвалжаар. |
routeLayers({ source?, color?, width?, font? }) | Тэр эх үүсвэрийн шугам, төгсгөл бүрийн цагираг, id нь <source>-line, <source>-end, font өгвөл <source>-number. width 0-ээс их, анхдагч 4. |
label(place, lang) | Хүнд харуулах текст, таараагүй бол "(албан бус)". |
attachSuggest(input, client, { onPick, limit?, proximity?, types?, lang?, list?, onError? }) | Гурав дахь тэмдэгтээс санал болгох хаягийн талбар. { list, clear(), destroy() }. |
Suggester | DOM-гүй ижил логик: new Suggester(client, options, show, fail), input(text), cancel(). |
SUGGEST_MIN_CHARS | 3. |
SUGGEST_DELAY_MS | 200, сүүлийн товчноос хүлээх хугацаа. |
excludePolygons(closures, day?) | Офлайн: аяллын өдөр идэвхтэй хаалтын хүрээ, Valhalla-ийн exclude_polygons-д. |
closureAt(avoid, point) | Офлайн: point-ийг хүрээндээ агуулсан avoid доторх хаалтын id, үгүй бол null. |
crossingsOnRoute(crossings, line, month?) | Офлайн: хээрийн багцын crossings.geojson-оос аяллын шугамын өнгөрөх гарам, гүүргүй огтлолцол, тухайн сарын их ус. |
LOW_FLOW_CONFIDENCE | 0.1. Урсацын confidence үүнээс ихгүй бол month_m3s нь null. |
poisOnRoute(pois, line, nearM?) | Офлайн: хээрийн багцын pois.geojson-оос аяллын шугамаас nearM дотор орших бүртгэлтэй шатахуун түгээх станц, гэр бааз, бүртгэлгүйн тоо. |
POI_NEAR_M | 2000, poisOnRoute-ийн анхдагч nearM, м. |
wetlandsOnRoute(wetlands, line) | Офлайн: хээрийн багцын wetlands.geojson-оос аяллын явах OSM-ийн намгархаг газрын хэсгүүд, эхнээс болон хэсэг дээрх метр. |
WETLAND_MIN_ON_M | 20, м: хэсгийн үүнээс бага хэсгээр явах аялал зөвхөн хөндлөн гарна, хэсэг бүхэлдээ биш бол. |
passesOnRoute(passes, line) | Офлайн: хээрийн багцын passes.geojson-оос аяллын гарах OSM-ийн уулын даваанууд, эхнээс болон шугамаас хэдэн метр, OSM ба DEM өндөр, тус бүрийн хамгийн их нь, хоёр нь зөрөх газар. |
sandOnRoute(sand, line) | Офлайн: хээрийн багцын sand.geojson-оос аяллын явах OSM-ийн элсэн газрын хэсгүүд, эхнээс болон хэсэг дээрх метр. |
SAND_MIN_ON_M | 20, м: хэсгийн үүнээс бага хэсгээр явах аялал зөвхөн хөндлөн гарна, хэсэг бүхэлдээ биш бол. |
waterOnRoute(water, line, nearM?) | Офлайн: хээрийн багцын water.geojson-оос аяллын шугамаас near_m (өгөхгүй бол багцынх, 2000 м) дотор OSM-ийн худаг, булаг, цорго, ундны ус, эхнээс болон шугамаас хэдэн метр, уух эсэхийг OSM юу гэж бичсэн. |
checkPack(manifest, read) | Офлайн: хээрийн багцын manifest-д жагсаасан файл бүрийг хэмжээ, sha256-аар, { ok, files, bad }; файл бүрийн төлөв: ok, missing, bytes, sha256. Async. |
packRoute(manifest, stops, options?) | Офлайн: хээрийн багц дээрх маршрутын Valhalla хүсэлт: manifest-ийн costing, аяллын өдрийн хаалт exclude_polygons-д, км; тойрсон хаалт, attribution, confidence_note, багцад аяллын оноо байхгүй үед trace_note; manifest-д үг байвал багцын үгээр. |
PACK_TRACE_NOTE, PACK_TRACE_NOTE_MN | Багцад аяллын оноо байхгүй үед (confidence osm_only) хэлэх үг. |
basemapStyle(basemap, url, { lang?, glyphs?, fonts?, background? }) | Офлайн: хээрийн багцын basemap.pmtiles-д зориулсан MapLibre-ийн бүтэн загвар, manifest-ийн basemap хэсгээс. |
BASEMAP_EXCLUDED | ['poi', 'housenumber'], суурь зурагт байж болохгүй давхаргууд. |
parseDoorCode(text) | Офлайн: бичсэн эсвэл буулгасан барилгын кодыг API-тай адил уншина, { ok, code, unit } эсвэл { ok: false, error, reason }. |
DOOR_CODE_ALPHABET | '0123456789BCDFGHJKMNPQRSTVWXYZ', кодод орох 30 тэмдэгт. |
DOOR_CODE_LENGTH | 5. |
doorLink(text, unit?) | Офлайн: хаалгыг хуваалцах холбоос, https://map.dock.mn/d/7QSVX?u=17, бичвэр код болж чадахгүй бол null. |
parseDoorLink(text) | Офлайн: бичвэр дэх эхний хаалганы холбоос, кодыг болон дугаарыг parseDoorCode шиг уншина, холбоосгүй бол null. |
DOOR_LINK_BASE | 'https://map.dock.mn/d/'. |
doorQr(text, unit?) | Офлайн: хаалганы холбоосын QR, { link, version, size, modules }, бичвэр код болж чадахгүй бол null. |
doorQrSvg(text, unit?, options?) | Офлайн: тэр QR SVG болж, px модуль бүрд (4), margin цагаан модуль (4), эсвэл null. |
isActive(item, day) | from <= day, to байвал day <= to. |
ubToday() | Улаанбаатарын өнөөдөр, YYYY-MM-DD. |
ClosuresOverLimitError | Тухайн өдрийн хаалт Valhalla-ийн хязгаараас хэтэрсэн: day, perimeter_m, vertices. Замыг татгалз. |
EndInClosureError | packRoute-ийн цэг тойрох хаалтын цагираг дотор: stop, closure. Замыг татгалз. |
UB_CENTER | [106.9177, 47.9186], Сүхбаатарын талбай. |
DEFAULT_BASE_URL | https://geo.dock.mn. |
KEY_RE | Түлхүүрийн хэлбэр: dk_ ба 32 тэмдэгт. |
IDEMPOTENCY_KEY_RE | Idempotency-Key-ийн хэлбэр: үсэг, тоо, ._:--ээс 1-64 тэмдэгт. |
STYLE_ID_RE | Загварын дугаарын хэлбэр: st_ ба 10 тэмдэгт. |
TRACE_FORMAT | 'dock.trace.v1', илгээх хэлбэр. |
TRACE_MAX_POINTS | 20000, нэг илгээлтийн цэг. |
PROBE_FORMAT | 'dock.probe.v1', флотын байрлалын формат. |
PROBE_MAX_POINTS | 900, нэг илгээлтийн цэг. |
PROBE_SEND_S | 30, илгээх хоорондын секунд. |
PROBE_WINDOW_S | 900, замын хөдөлгөөний цонх; цонх бүрт машины токен шинэ. |
ProbeBuffer | Илгээлт хоорондын нэг машины цэгүүд, startProbes-ийн ашигладаг. |
probeToken() | Санамсаргүй машины токен, 24 тэмдэгт. Улсын дугаар, утас, төхөөрөмжийн id хэзээ ч биш. |
EVENT_POSITION_FORMAT | 'dock.position.v1', арга хэмжээний байрлалын формат. |
EVENT_MAX_POINTS | 900, нэг илгээлтийн цэг. |
EVENT_SEND_S | 10, илгээх хоорондын секунд. |
EventBuffer | Илгээлт хоорондын нэг оролцогчийн цэгүүд ба санамсаргүй токен, startEventPositions-ийн ашигладаг. |
PLACES_KEY | 'dock.places.v1', placeCache store дахь түлхүүр. |
PLACES_MAX | 100, анхдагчаар хадгалах газар. |
MATRIX_MAX | 10, нэг matrix дуудлагын нэг талын төгсгөл. |
ISOCHRONE_CONTOURS_MAX | 4, нэг isochrone дуудлагын contour. |
ISOCHRONE_MINUTES_MAX | 60, хамгийн урт contour, минутаар. |
MATCHING_MAX | 100, нэг matching дуудлагын цэг. |
OPTIMIZED_TRIPS_MAX | 12, нэг optimizedTrips дуудлагын зогсоол. |
ROUTE_VIA_MAX | 10, нэг route дуудлагын дайрах төгсгөл. |
TILEQUERY_RADIUS_MAX_M | 1000, tilequery-ийн хамгийн өргөн radius, метрээр. |
TILEQUERY_LIMIT_MAX | 50, нэг tilequery хариуны объект. |
GEOCODE_TYPES | door, business, building, district, khoroo, area, street, landmark: geocode-ийн types-ээр үлдээх төрлүүд. |
REVERSE_TYPES | door, business, building, landmark: reverse-ийн types-ээр үлдээх төрлүүд. |
NEARBY_CATEGORIES | nearby-ийн авах 25 ангилал: bank, cafe, hospital, pharmacy, school, stop г.м. |
ISOCHRONE_SOURCE | 'dock-isochrone', isochroneLayers-ийн анхдагчаар зурах эх үүсвэрийн id. |
MATCHING_SOURCE | 'dock-matching', matchingLayers-ийн анхдагчаар зурах эх үүсвэрийн id. |
OPTIMIZED_TRIP_SOURCE | 'dock-optimized-trip', optimizedTripLayers-ийн анхдагчаар зурах эх үүсвэрийн id. |
ROUTE_SOURCE | 'dock-route', routeLayers-ийн анхдагчаар зурах эх үүсвэрийн id. |
VERSION | '0.68.0'. |
API-ийн бүх төрөл (Door, Place, GeocodeResponse, ReverseResponse, UsageResponse, ...) TypeScript-д экспортлогдсон бөгөөд API лавлах-тай талбар бүрээр шалгагдсан. Төрөл, гарын үсэг бүр тайлбартайгаа, кодоос бичигдсэн: JS SDK лавлах.