@nika-js/onlymap 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/onlymap.code-snippets +173 -0
- package/LICENSE.md +133 -0
- package/README.md +188 -0
- package/bin/onlymapjs.mjs +182 -0
- package/dist/Arrow.dom-7AXne1TU.js +5233 -0
- package/dist/actions.d.ts +30 -0
- package/dist/attribute-resolution.d.ts +73 -0
- package/dist/basemap-D95W0IIA.js +25203 -0
- package/dist/basemap.d.ts +72 -0
- package/dist/convert-arrow-schema-CvZ3cT5m.js +94 -0
- package/dist/csp-sandbox.d.ts +20 -0
- package/dist/ctx.d.ts +49 -0
- package/dist/d3-bundle.d.ts +218 -0
- package/dist/data-emit.d.ts +10 -0
- package/dist/data-layer.d.ts +150 -0
- package/dist/declarative-filter.d.ts +12 -0
- package/dist/dev-error-panel.d.ts +15 -0
- package/dist/draw-controller.d.ts +51 -0
- package/dist/draw.d.ts +102 -0
- package/dist/effects.d.ts +39 -0
- package/dist/elements/om-behavior.d.ts +13 -0
- package/dist/elements/om-layer.d.ts +11 -0
- package/dist/elements/om-map.d.ts +168 -0
- package/dist/elements/om-overlay.d.ts +82 -0
- package/dist/elements/om-step.d.ts +12 -0
- package/dist/elements/om-story.d.ts +67 -0
- package/dist/elements/om-widget.d.ts +29 -0
- package/dist/env.d.ts +41 -0
- package/dist/expr/cache.d.ts +28 -0
- package/dist/expr/compile.d.ts +27 -0
- package/dist/expr/errors.d.ts +10 -0
- package/dist/expr/full-js-block.d.ts +17 -0
- package/dist/expr/index.d.ts +12 -0
- package/dist/expr/output-type.d.ts +12 -0
- package/dist/expr/scale.d.ts +13 -0
- package/dist/expr/script-block.d.ts +16 -0
- package/dist/expr/whitelist.d.ts +28 -0
- package/dist/field-access.d.ts +24 -0
- package/dist/html-data.d.ts +25 -0
- package/dist/index-2v2NXF_n.js +435 -0
- package/dist/index-BFjXVHly.js +605 -0
- package/dist/index-C9w78NS9.js +4883 -0
- package/dist/index-CU-iOTdr.js +75292 -0
- package/dist/index-D74olQ9w.js +3907 -0
- package/dist/index-Do7hmHwi.js +1457 -0
- package/dist/index.d.ts +76 -0
- package/dist/ir-snapshot.d.ts +54 -0
- package/dist/ir.d.ts +66 -0
- package/dist/layer-registry.d.ts +27 -0
- package/dist/layers/popup-layer.d.ts +65 -0
- package/dist/onlymapjs.css +1 -0
- package/dist/onlymapjs.js +30 -0
- package/dist/onlymapjs.umd.cjs +8618 -0
- package/dist/parse-manifest.d.ts +19 -0
- package/dist/recordbatch-HRu0SMKp.js +4742 -0
- package/dist/runtime-core.d.ts +170 -0
- package/dist/selection.d.ts +31 -0
- package/dist/stats.d.ts +29 -0
- package/dist/table-accessors-DBjWgN0C.js +204 -0
- package/dist/template-interpolation.d.ts +6 -0
- package/dist/testing.d.ts +90 -0
- package/dist/timeline.d.ts +37 -0
- package/dist/validation.d.ts +22 -0
- package/dist/vega-loader.d.ts +22 -0
- package/dist/viewport-filter.d.ts +25 -0
- package/dist/widget-registry.d.ts +23 -0
- package/dist/widget-script.d.ts +1 -0
- package/dist/widgets/built-in.d.ts +1 -0
- package/dist/widgets/dom-utils.d.ts +4 -0
- package/llms.txt +43 -0
- package/onlymapjs.html-data.json +1688 -0
- package/package.json +111 -0
- package/skills/onlymapjs/SKILL.md +61 -0
- package/skills/onlymapjs/agents/openai.yaml +4 -0
- package/skills/onlymapjs/references/patterns.md +213 -0
- package/skills/onlymapjs/references/syntax.md +342 -0
- package/skills/onlymapjs/references/testing.md +126 -0
package/package.json
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nika-js/onlymap",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Interactive WebGL maps from declarative HTML — a custom-element manifest drives deck.gl: rendering, data loading, live updates, picking, widgets, and validation. No build step.",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"author": "NikaGeospatial",
|
|
10
|
+
"homepage": "https://github.com/NikaGeospatial/onlymapjs#readme",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/NikaGeospatial/onlymapjs.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/NikaGeospatial/onlymapjs/issues"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"deck.gl",
|
|
20
|
+
"maps",
|
|
21
|
+
"webgl",
|
|
22
|
+
"geospatial",
|
|
23
|
+
"gis",
|
|
24
|
+
"declarative",
|
|
25
|
+
"custom-elements",
|
|
26
|
+
"web-components",
|
|
27
|
+
"maplibre",
|
|
28
|
+
"dataviz",
|
|
29
|
+
"visualization",
|
|
30
|
+
"llm",
|
|
31
|
+
"agent"
|
|
32
|
+
],
|
|
33
|
+
"type": "module",
|
|
34
|
+
"main": "./dist/onlymapjs.js",
|
|
35
|
+
"module": "./dist/onlymapjs.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"style": "./dist/onlymapjs.css",
|
|
38
|
+
"bin": {
|
|
39
|
+
"onlymapjs": "bin/onlymapjs.mjs"
|
|
40
|
+
},
|
|
41
|
+
"exports": {
|
|
42
|
+
".": {
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"import": "./dist/onlymapjs.js",
|
|
45
|
+
"require": "./dist/onlymapjs.umd.cjs",
|
|
46
|
+
"default": "./dist/onlymapjs.js"
|
|
47
|
+
},
|
|
48
|
+
"./onlymapjs.css": "./dist/onlymapjs.css",
|
|
49
|
+
"./onlymapjs.html-data.json": "./onlymapjs.html-data.json",
|
|
50
|
+
"./onlymap.code-snippets": "./.vscode/onlymap.code-snippets"
|
|
51
|
+
},
|
|
52
|
+
"files": [
|
|
53
|
+
".vscode/onlymap.code-snippets",
|
|
54
|
+
"bin/onlymapjs.mjs",
|
|
55
|
+
"dist",
|
|
56
|
+
"README.md",
|
|
57
|
+
"LICENSE.md",
|
|
58
|
+
"llms.txt",
|
|
59
|
+
"onlymapjs.html-data.json",
|
|
60
|
+
"skills/onlymapjs"
|
|
61
|
+
],
|
|
62
|
+
"scripts": {
|
|
63
|
+
"dev": "vite",
|
|
64
|
+
"build": "npm run typecheck && vite build && npm run build:types",
|
|
65
|
+
"build:types": "tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
66
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.e2e.json --noEmit",
|
|
67
|
+
"test": "vitest run",
|
|
68
|
+
"prepublishOnly": "npm run build",
|
|
69
|
+
"try": "vite-node dev/expr-repl.mjs",
|
|
70
|
+
"test:e2e": "playwright test",
|
|
71
|
+
"gen:html-data": "vite-node dev/generate-html-data.ts",
|
|
72
|
+
"gen:public": "npm run gen:html-data && vite-node dev/build-public.ts",
|
|
73
|
+
"test:public": "npm run gen:public -- --dry-run --strict"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@deck.gl/aggregation-layers": "^9.3.5",
|
|
77
|
+
"@deck.gl/core": "^9.3.5",
|
|
78
|
+
"@deck.gl/extensions": "^9.3.5",
|
|
79
|
+
"@deck.gl/geo-layers": "^9.3.5",
|
|
80
|
+
"@deck.gl/layers": "^9.3.5",
|
|
81
|
+
"@deck.gl/mapbox": "^9.3.5",
|
|
82
|
+
"@deck.gl/mesh-layers": "^9.3.5",
|
|
83
|
+
"@loaders.gl/csv": "^4.4.3",
|
|
84
|
+
"@loaders.gl/kml": "^4.4.3",
|
|
85
|
+
"@loaders.gl/shapefile": "^4.4.3",
|
|
86
|
+
"acorn": "^8.17.0",
|
|
87
|
+
"apache-arrow": "^21.1.0",
|
|
88
|
+
"d3-array": "^3.2.4",
|
|
89
|
+
"d3-color": "^3.1.0",
|
|
90
|
+
"d3-interpolate": "^3.0.1",
|
|
91
|
+
"d3-scale": "^4.0.2",
|
|
92
|
+
"fzstd": "^0.1.1",
|
|
93
|
+
"maplibre-gl": "^5.24.0"
|
|
94
|
+
},
|
|
95
|
+
"devDependencies": {
|
|
96
|
+
"@playwright/test": "^1.61.1",
|
|
97
|
+
"@types/d3-array": "^3.2.2",
|
|
98
|
+
"@types/d3-color": "^3.1.3",
|
|
99
|
+
"@types/d3-interpolate": "^3.0.4",
|
|
100
|
+
"@types/d3-scale": "^4.0.9",
|
|
101
|
+
"@types/estree": "^1.0.9",
|
|
102
|
+
"@types/ws": "^8.18.1",
|
|
103
|
+
"happy-dom": "^20.10.6",
|
|
104
|
+
"playwright": "^1.61.1",
|
|
105
|
+
"typescript": "^5.6.0",
|
|
106
|
+
"vite": "^6.0.0",
|
|
107
|
+
"vite-node": "^6.0.0",
|
|
108
|
+
"vitest": "^4.1.9",
|
|
109
|
+
"ws": "^8.21.0"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: onlymapjs
|
|
3
|
+
description: Build, edit, debug, or review OnlyMapJS declarative HTML maps and dashboards. Use when a user asks for an interactive map, deck.gl-style visualization, geospatial dashboard, live fleet/telemetry map, choropleth, popup/tooltip map, map story/tour, manual drawing/sketch map, 3D map assets, or help with OnlyMapJS syntax, validation, widgets, data formats, testing, or publishing examples.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# OnlyMapJS
|
|
7
|
+
|
|
8
|
+
Use OnlyMapJS as a declarative HTML map library. Write custom elements such as `<om-map>`, `<om-layer>`, `<om-widget>`, `<om-overlay>`, `<om-behavior>`, `<om-story>`, and `<om-step>`. Do not write raw imperative deck.gl setup unless the user explicitly asks to integrate below the OnlyMapJS layer.
|
|
9
|
+
|
|
10
|
+
## Core Workflow
|
|
11
|
+
|
|
12
|
+
1. Start with valid HTML custom elements with explicit closing tags. Never self-close OnlyMapJS elements.
|
|
13
|
+
2. Express deck.gl props as kebab-case attributes. Use `get-*` attributes for data-driven accessors.
|
|
14
|
+
3. Use `$field` expressions for data access. Do not write `d.properties.x`, row-object loops, or column-index access in manifests.
|
|
15
|
+
4. Add `validate` to `<om-map>` while authoring.
|
|
16
|
+
5. Verify with `OmMap.validate(html)`, then `OmMap.snapshotIR(html)`, and use `mountForTest` for interaction behavior when tests are requested.
|
|
17
|
+
6. Prefer public, package-safe imports:
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<script type="module">
|
|
21
|
+
import "@nika-js/onlymap";
|
|
22
|
+
import "onlymapjs/onlymapjs.css";
|
|
23
|
+
</script>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For no-build CDN examples, use a published module URL such as `https://esm.sh/@nika-js/onlymap@0.1.0`.
|
|
27
|
+
|
|
28
|
+
## Required References
|
|
29
|
+
|
|
30
|
+
Load the smallest reference needed for the task:
|
|
31
|
+
|
|
32
|
+
- `references/syntax.md` — element vocabulary, attributes, data formats, accessors, actions, widgets, overlays, drawing, 3D, built-in layer types.
|
|
33
|
+
- `references/patterns.md` — copyable manifest patterns for common map requests.
|
|
34
|
+
- `references/testing.md` — validation, snapshot, headless harness, and browser testing workflow.
|
|
35
|
+
|
|
36
|
+
## Non-Negotiable Syntax Rules
|
|
37
|
+
|
|
38
|
+
- Always use explicit closing tags: `<om-layer ...></om-layer>`, not `<om-layer ... />`.
|
|
39
|
+
- Every `<om-layer>` needs a stable `id`.
|
|
40
|
+
- Attribute names are kebab-case: `get-fill-color`, `radius-units`, `line-width-min-pixels`.
|
|
41
|
+
- Accessor values are expressions: `get-position="[$lon, $lat]"`.
|
|
42
|
+
- `scale()` always needs an explicit `domain=`.
|
|
43
|
+
- Inline handlers such as `onclick` are wrong. Use `data-emit`, `<om-behavior>`, or widget scripts.
|
|
44
|
+
- Full JavaScript accessor blocks require the `js` attribute on `<om-layer>`.
|
|
45
|
+
- Do not put secrets in markup. Use `OmMap.configureData({ headers, credentials, fetch })`.
|
|
46
|
+
|
|
47
|
+
## Authoring Decisions
|
|
48
|
+
|
|
49
|
+
- UI panel, control, chart, legend, stats, filter, or draw toolbar -> `<om-widget>`.
|
|
50
|
+
- Sparse rich HTML at one geographic location -> `<om-overlay>`.
|
|
51
|
+
- Many labels/badges -> `<om-layer type="PopupLayer">`.
|
|
52
|
+
- Guided tour or narrative sequence -> `<om-story>` with `<om-step>` siblings that reference existing layers/overlays by id.
|
|
53
|
+
- Live entity updates -> `wss://` stream with `key` and optional `source` decoder.
|
|
54
|
+
- REST snapshot that changes over time -> `refresh="5s"`.
|
|
55
|
+
- User sketching -> `data="draw:sketch"` layer plus `<om-widget type="draw" target="sketch">`.
|
|
56
|
+
|
|
57
|
+
## Output Expectations
|
|
58
|
+
|
|
59
|
+
When creating a map page, output a complete runnable HTML file unless the user asks for a fragment. Include CSS only as needed for page sizing or custom widgets/overlays. Keep the first screen the usable map, not a landing page.
|
|
60
|
+
|
|
61
|
+
When modifying an existing page, preserve the user's data URLs, layer ids, and styling unless the request requires changing them.
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# OnlyMapJS Patterns
|
|
2
|
+
|
|
3
|
+
Use these patterns as starting points. Replace data URLs, layer ids, fields, centers, and style values with the user's domain.
|
|
4
|
+
|
|
5
|
+
## Minimal Point Map
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<!DOCTYPE html>
|
|
9
|
+
<html>
|
|
10
|
+
<head>
|
|
11
|
+
<meta charset="utf-8" />
|
|
12
|
+
<title>OnlyMapJS map</title>
|
|
13
|
+
<script type="module">
|
|
14
|
+
import "@nika-js/onlymap";
|
|
15
|
+
import "onlymapjs/onlymapjs.css";
|
|
16
|
+
</script>
|
|
17
|
+
<style>
|
|
18
|
+
html, body { margin: 0; height: 100%; }
|
|
19
|
+
om-map { display: block; height: 100vh; }
|
|
20
|
+
</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<om-map center="[-122.42, 37.77]" zoom="11" basemap="maplibre" validate>
|
|
24
|
+
<om-layer id="points" type="ScatterplotLayer"
|
|
25
|
+
data="./points.json"
|
|
26
|
+
label="Points" color="#1f9e89"
|
|
27
|
+
get-position="[$lon, $lat]"
|
|
28
|
+
radius="6" radius-units="pixels"
|
|
29
|
+
pickable></om-layer>
|
|
30
|
+
<om-widget type="legend" position="bottom-right" title="Layers"></om-widget>
|
|
31
|
+
<om-widget type="zoom-controls" position="top-right"></om-widget>
|
|
32
|
+
</om-map>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Click Popup
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<om-layer id="quakes" type="ScatterplotLayer"
|
|
41
|
+
data="./quakes.json"
|
|
42
|
+
get-position="[$lon, $lat]"
|
|
43
|
+
get-fill-color="scale($magnitude, sequential, ['#fee8c8','#b30000'], domain=[0,8])"
|
|
44
|
+
get-radius="$magnitude * 2"
|
|
45
|
+
radius-units="pixels" pickable></om-layer>
|
|
46
|
+
|
|
47
|
+
<om-overlay id="quake-detail" anchor-from="selection" anchor-offset="bottom-center" visible="false">
|
|
48
|
+
<div><b>{{place}}</b><br />M {{magnitude}}</div>
|
|
49
|
+
</om-overlay>
|
|
50
|
+
|
|
51
|
+
<om-behavior on="click" layer="quakes" action="show-overlay" target="quake-detail"></om-behavior>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Hover Tooltip
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<template id="point-tooltip">
|
|
58
|
+
<div><b>{{name}}</b><br />Value: {{value}}</div>
|
|
59
|
+
</template>
|
|
60
|
+
<om-behavior on="hover" layer="points" action="show-tooltip" template="#point-tooltip"></om-behavior>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Choropleth GeoJSON
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<om-layer id="regions" type="GeoJsonLayer"
|
|
67
|
+
data="./regions.geojson"
|
|
68
|
+
label="Regions" color="#3388ff"
|
|
69
|
+
get-fill-color="scale($rate, sequential, ['#eff3ff','#08519c'], domain=[0,100])"
|
|
70
|
+
get-line-color="[40, 40, 40]"
|
|
71
|
+
line-width-min-pixels="1"
|
|
72
|
+
filled stroked pickable></om-layer>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For GeoJSON, `$rate` reads `feature.properties.rate`.
|
|
76
|
+
|
|
77
|
+
## Filtered Dashboard
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<om-layer id="quakes" type="ScatterplotLayer"
|
|
81
|
+
data="./quakes.csv"
|
|
82
|
+
get-position="[$longitude, $latitude]"
|
|
83
|
+
get-fill-color="scale($mag, sequential, ['#ffffcc','#800026'], domain=[0,8])"
|
|
84
|
+
filter-field="mag" filter-range="[0, 8]"
|
|
85
|
+
radius="5" radius-units="pixels" pickable></om-layer>
|
|
86
|
+
|
|
87
|
+
<om-widget type="filter" layer="quakes" field="mag" position="top-left"></om-widget>
|
|
88
|
+
|
|
89
|
+
<om-widget type="vega-lite" layer="quakes" watch="viewport" position="bottom-left" title="Magnitude">
|
|
90
|
+
<script type="application/json">
|
|
91
|
+
{
|
|
92
|
+
"mark": "bar",
|
|
93
|
+
"encoding": {
|
|
94
|
+
"x": { "bin": true, "field": "mag", "type": "quantitative" },
|
|
95
|
+
"y": { "aggregate": "count", "type": "quantitative" }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
</script>
|
|
99
|
+
</om-widget>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Custom Stats Widget
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<om-widget position="top-left">
|
|
106
|
+
<div id="stats"></div>
|
|
107
|
+
<script type="om/widget">
|
|
108
|
+
this.watch = ["data:quakes", "viewport", "selection"];
|
|
109
|
+
this.render = (ctx) => {
|
|
110
|
+
const s = ctx.stats("quakes", "magnitude", { scope: "viewport" });
|
|
111
|
+
const selected = ctx.selection ? ctx.selection.object.place : "none";
|
|
112
|
+
this.$("#stats").textContent = `${s.count} in view; max ${s.max ?? "—"}; selected ${selected}`;
|
|
113
|
+
};
|
|
114
|
+
</script>
|
|
115
|
+
</om-widget>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Dense Labels with PopupLayer
|
|
119
|
+
|
|
120
|
+
```html
|
|
121
|
+
<om-layer id="labels" type="PopupLayer"
|
|
122
|
+
data="./places.json"
|
|
123
|
+
layout="badge"
|
|
124
|
+
min-zoom="10"
|
|
125
|
+
get-position="[$lon, $lat]"
|
|
126
|
+
get-text="$name"
|
|
127
|
+
get-color="$category === 'A' ? [0, 120, 255] : [255, 120, 0]"
|
|
128
|
+
pickable></om-layer>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Use `PopupLayer` instead of many `<om-overlay>` elements for labels/badges at scale.
|
|
132
|
+
|
|
133
|
+
## WebSocket Fleet
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<script type="module">
|
|
137
|
+
import { OmMap } from "@nika-js/onlymap";
|
|
138
|
+
import "onlymapjs/onlymapjs.css";
|
|
139
|
+
|
|
140
|
+
OmMap.registerSource("fleet", {
|
|
141
|
+
decode: (m) => m.type === "position"
|
|
142
|
+
? { id: m.id, lon: m.lon, lat: m.lat, heading: m.heading, speed: m.speed }
|
|
143
|
+
: null
|
|
144
|
+
});
|
|
145
|
+
</script>
|
|
146
|
+
|
|
147
|
+
<om-layer id="vehicles" type="ScatterplotLayer"
|
|
148
|
+
data="wss://example.com/fleet" source="fleet" key="id" flush="250ms"
|
|
149
|
+
get-position="[$lon, $lat]"
|
|
150
|
+
transition="get-position 300ms"
|
|
151
|
+
radius="5" radius-units="pixels" pickable></om-layer>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Polled REST Fleet
|
|
155
|
+
|
|
156
|
+
```html
|
|
157
|
+
<script type="module">
|
|
158
|
+
import { OmMap } from "@nika-js/onlymap";
|
|
159
|
+
OmMap.configureData({ headers: { Authorization: `Bearer ${token}` } });
|
|
160
|
+
</script>
|
|
161
|
+
|
|
162
|
+
<om-layer id="drivers" type="IconLayer"
|
|
163
|
+
data="/api/fleet.json" refresh="5s"
|
|
164
|
+
get-position="[$lon, $lat]"
|
|
165
|
+
get-angle="-$heading"
|
|
166
|
+
pickable></om-layer>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Draw/Sketch Map
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<om-layer id="sketch" type="GeoJsonLayer" data="draw:sketch"
|
|
173
|
+
label="Sketch"
|
|
174
|
+
get-fill-color="[80, 140, 255, 90]"
|
|
175
|
+
get-line-color="[40, 90, 220]"
|
|
176
|
+
point-radius-min-pixels="6"
|
|
177
|
+
line-width-min-pixels="3"
|
|
178
|
+
stroked filled pickable></om-layer>
|
|
179
|
+
|
|
180
|
+
<om-widget type="draw" target="sketch" position="top-left"
|
|
181
|
+
modes="point line polygon" save="both"
|
|
182
|
+
autosave="onlymapjs-sketch"></om-widget>
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Story/Tour
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<om-overlay id="intro" anchor="[-122.42, 37.77]" visible="false">
|
|
189
|
+
<div>Welcome</div>
|
|
190
|
+
</om-overlay>
|
|
191
|
+
|
|
192
|
+
<om-story id="tour" interrupt="pause">
|
|
193
|
+
<om-step duration="2s" action="fly-to" center="[-122.42, 37.77]" zoom="12" curve></om-step>
|
|
194
|
+
<om-step duration="1s" action="show-overlay" target="intro" parallel></om-step>
|
|
195
|
+
<om-step duration="2s" populate layer="points"></om-step>
|
|
196
|
+
</om-story>
|
|
197
|
+
|
|
198
|
+
<om-widget type="player" story="tour" position="bottom-left"></om-widget>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## 3D Models
|
|
202
|
+
|
|
203
|
+
```html
|
|
204
|
+
<om-map center="[-122.399, 37.79]" zoom="15.5" pitch="55" bearing="20" basemap="maplibre">
|
|
205
|
+
<om-layer id="assets" type="ScenegraphLayer"
|
|
206
|
+
scenegraph="./asset.glb"
|
|
207
|
+
data="./assets.json"
|
|
208
|
+
get-position="[$lon, $lat]"
|
|
209
|
+
get-orientation="[0, $heading, 90]"
|
|
210
|
+
get-scale="[$width, $height, $depth]"
|
|
211
|
+
lighting="pbr" pickable></om-layer>
|
|
212
|
+
</om-map>
|
|
213
|
+
```
|