@fieldia/map 0.16.0 → 0.18.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/README.md +56 -9
- package/package.json +4 -4
- package/src/index.d.mts +1 -1
- package/src/index.d.ts +1 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs.map +1 -1
- package/src/lib/area.js +2 -1
- package/src/lib/area.js.map +1 -1
- package/src/lib/area.mjs +3 -2
- package/src/lib/area.mjs.map +1 -1
- package/src/lib/card.d.mts +2 -1
- package/src/lib/card.d.ts +2 -1
- package/src/lib/card.js +5 -3
- package/src/lib/card.js.map +1 -1
- package/src/lib/card.mjs +5 -3
- package/src/lib/card.mjs.map +1 -1
- package/src/lib/cluster.d.mts +6 -1
- package/src/lib/cluster.d.ts +6 -1
- package/src/lib/cluster.js +11 -5
- package/src/lib/cluster.js.map +1 -1
- package/src/lib/cluster.mjs +11 -5
- package/src/lib/cluster.mjs.map +1 -1
- package/src/lib/form-map.d.mts +5 -2
- package/src/lib/form-map.d.ts +5 -2
- package/src/lib/form-map.js +222 -22
- package/src/lib/form-map.js.map +1 -1
- package/src/lib/form-map.mjs +224 -24
- package/src/lib/form-map.mjs.map +1 -1
- package/src/lib/heat.d.mts +25 -0
- package/src/lib/heat.d.ts +25 -0
- package/src/lib/heat.js +111 -0
- package/src/lib/heat.js.map +1 -0
- package/src/lib/heat.mjs +108 -0
- package/src/lib/heat.mjs.map +1 -0
- package/src/lib/labels.d.mts +23 -0
- package/src/lib/labels.d.ts +23 -0
- package/src/lib/labels.js +56 -4
- package/src/lib/labels.js.map +1 -1
- package/src/lib/labels.mjs +56 -4
- package/src/lib/labels.mjs.map +1 -1
- package/src/lib/leaflet.js +1 -0
- package/src/lib/leaflet.js.map +1 -1
- package/src/lib/leaflet.mjs +1 -0
- package/src/lib/leaflet.mjs.map +1 -1
- package/src/lib/list-view.js +126 -18
- package/src/lib/list-view.js.map +1 -1
- package/src/lib/list-view.mjs +126 -18
- package/src/lib/list-view.mjs.map +1 -1
- package/src/lib/map-core.d.mts +8 -0
- package/src/lib/map-core.d.ts +8 -0
- package/src/lib/map-core.js +41 -5
- package/src/lib/map-core.js.map +1 -1
- package/src/lib/map-core.mjs +40 -5
- package/src/lib/map-core.mjs.map +1 -1
- package/src/lib/marks.d.mts +11 -0
- package/src/lib/marks.d.ts +11 -0
- package/src/lib/marks.js +26 -1
- package/src/lib/marks.js.map +1 -1
- package/src/lib/marks.mjs +23 -0
- package/src/lib/marks.mjs.map +1 -1
- package/src/lib/measure.d.mts +15 -0
- package/src/lib/measure.d.ts +15 -0
- package/src/lib/measure.js +157 -0
- package/src/lib/measure.js.map +1 -0
- package/src/lib/measure.mjs +153 -0
- package/src/lib/measure.mjs.map +1 -0
- package/src/lib/place.js +3 -1
- package/src/lib/place.js.map +1 -1
- package/src/lib/place.mjs +4 -2
- package/src/lib/place.mjs.map +1 -1
- package/src/lib/providers.d.mts +37 -5
- package/src/lib/providers.d.ts +37 -5
- package/src/lib/providers.js +37 -18
- package/src/lib/providers.js.map +1 -1
- package/src/lib/providers.mjs +37 -18
- package/src/lib/providers.mjs.map +1 -1
- package/src/lib/reach.d.mts +25 -0
- package/src/lib/reach.d.ts +25 -0
- package/src/lib/reach.js +158 -0
- package/src/lib/reach.js.map +1 -0
- package/src/lib/reach.mjs +153 -0
- package/src/lib/reach.mjs.map +1 -0
- package/src/lib/regions.d.mts +137 -0
- package/src/lib/regions.d.ts +137 -0
- package/src/lib/regions.js +456 -0
- package/src/lib/regions.js.map +1 -0
- package/src/lib/regions.mjs +445 -0
- package/src/lib/regions.mjs.map +1 -0
- package/src/lib/routes.d.mts +16 -4
- package/src/lib/routes.d.ts +16 -4
- package/src/lib/routes.js +40 -3
- package/src/lib/routes.js.map +1 -1
- package/src/lib/routes.mjs +38 -3
- package/src/lib/routes.mjs.map +1 -1
- package/src/lib/settings.d.mts +9 -1
- package/src/lib/settings.d.ts +9 -1
- package/src/lib/styles.d.mts +3 -3
- package/src/lib/styles.d.ts +3 -3
- package/src/lib/styles.js +18 -1
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +18 -1
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/tools.d.mts +30 -0
- package/src/lib/tools.d.ts +30 -0
- package/src/lib/tools.js +135 -0
- package/src/lib/tools.js.map +1 -0
- package/src/lib/tools.mjs +132 -0
- package/src/lib/tools.mjs.map +1 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { fill } from './labels.mjs';
|
|
2
|
+
import { warnOnce } from './map-core.mjs';
|
|
3
|
+
const isObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
/** The borders a set holds: Polygon and MultiPolygon features with a key; anything else is passed over. */
|
|
5
|
+
export function readBorders(collection, spec) {
|
|
6
|
+
const features = isObject(collection) && Array.isArray(collection['features']) ? collection['features'] : [];
|
|
7
|
+
return features.flatMap((feature) => {
|
|
8
|
+
if (!isObject(feature) || !isObject(feature['geometry']))
|
|
9
|
+
return [];
|
|
10
|
+
const properties = isObject(feature['properties']) ? feature['properties'] : {};
|
|
11
|
+
const key = properties[spec.key];
|
|
12
|
+
if (typeof key !== 'string' && typeof key !== 'number')
|
|
13
|
+
return [];
|
|
14
|
+
if (key === '')
|
|
15
|
+
return [];
|
|
16
|
+
const geometry = feature['geometry'];
|
|
17
|
+
const coordinates = geometry['coordinates'];
|
|
18
|
+
const polygons = geometry['type'] === 'Polygon' ? [coordinates] : geometry['type'] === 'MultiPolygon' ? coordinates : [];
|
|
19
|
+
if (!polygons.length)
|
|
20
|
+
return [];
|
|
21
|
+
const name = properties[spec.name ?? spec.key];
|
|
22
|
+
return [{ key: String(key), value: key, name: String(name ?? key), properties, polygons }];
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const loaded = new WeakMap();
|
|
26
|
+
/** A set of borders the app's maps give, by name: asked for once for all the maps sharing the settings; undefined when there is no such set. */
|
|
27
|
+
export function loadBorders(sets, name) {
|
|
28
|
+
if (!sets || !(name in sets))
|
|
29
|
+
return Promise.resolve(undefined);
|
|
30
|
+
const mine = loaded.get(sets) ?? new Map();
|
|
31
|
+
loaded.set(sets, mine);
|
|
32
|
+
let found = mine.get(name);
|
|
33
|
+
if (!found) {
|
|
34
|
+
const given = sets[name];
|
|
35
|
+
found = Promise.resolve(typeof given === 'function' ? given() : given);
|
|
36
|
+
// A set that failed to load is asked for again next time.
|
|
37
|
+
found.catch(() => mine.delete(name));
|
|
38
|
+
mine.set(name, found);
|
|
39
|
+
}
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The shades' steps: up to five, each ending on a round number, so the legend
|
|
44
|
+
* reads "11–20, 21–30…" rather than "9.6–19.2". They start from nothing, or
|
|
45
|
+
* from a round number under the least when every number is well above
|
|
46
|
+
* nothing (fees of 15 to 40 start at 10). Whole numbers (counts) step by whole
|
|
47
|
+
* numbers.
|
|
48
|
+
*/
|
|
49
|
+
export function shadeSteps(values) {
|
|
50
|
+
const shown = values.filter((v) => Number.isFinite(v) && v > 0);
|
|
51
|
+
if (!shown.length)
|
|
52
|
+
return { from: 0, ends: [] };
|
|
53
|
+
const most = Math.max(...shown);
|
|
54
|
+
const least = Math.min(...shown);
|
|
55
|
+
const whole = shown.every((v) => Number.isInteger(v));
|
|
56
|
+
if (whole && most <= 5)
|
|
57
|
+
return { from: 0, ends: Array.from({ length: most }, (_, i) => i + 1) };
|
|
58
|
+
const nice = (raw) => {
|
|
59
|
+
const power = 10 ** Math.floor(Math.log10(raw));
|
|
60
|
+
return [1, 2, 2.5, 5, 10].map((m) => m * power).find((m) => m >= raw);
|
|
61
|
+
};
|
|
62
|
+
// Whole numbers' steps read "11–20": the start is under the least, so the least is in the first.
|
|
63
|
+
const unit = nice((most - least) / 5 || most / 5);
|
|
64
|
+
const from = least > most / 5 ? Math.floor((least - (whole ? 1 : 0)) / unit) * unit : 0;
|
|
65
|
+
const step = whole ? Math.max(1, Math.ceil(nice((most - from) / 5))) : nice((most - from) / 5);
|
|
66
|
+
const ends = [];
|
|
67
|
+
for (let end = from + step; ends.length < 5; end += step) {
|
|
68
|
+
ends.push(Number(end.toPrecision(12)));
|
|
69
|
+
if (end >= most)
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
return { from: Number(from.toPrecision(12)), ends };
|
|
73
|
+
}
|
|
74
|
+
/** The shade a number falls in: 0 for the lightest, null for none. */
|
|
75
|
+
export function shadeOf(value, steps) {
|
|
76
|
+
if (value === null || value === undefined || !Number.isFinite(value) || value <= 0 || !steps.length)
|
|
77
|
+
return null;
|
|
78
|
+
const i = steps.findIndex((end) => value <= end);
|
|
79
|
+
return i === -1 ? steps.length - 1 : i;
|
|
80
|
+
}
|
|
81
|
+
/** How much of the accent each shade takes, against the page's surface; spread over five steps however many there are. */
|
|
82
|
+
const MIX = [22, 40, 58, 76, 94];
|
|
83
|
+
const mixOf = (step, count) => MIX[count <= 1 ? 4 : Math.round((step * 4) / (count - 1))];
|
|
84
|
+
export const REGIONS_CSS = `
|
|
85
|
+
path.fd-map-region { stroke: var(--fd-surface); stroke-width: 1.4; stroke-opacity: 0.95; fill: var(--fd-accent); fill-opacity: 0.06; cursor: pointer; transition: fill-opacity 0.12s; }
|
|
86
|
+
path.fd-map-region[data-shade] { fill: var(--fd-region); fill-opacity: 0.5; }
|
|
87
|
+
path.fd-map-region:hover, path.fd-map-region[data-lit] { fill-opacity: 0.8; stroke: var(--fd-text); stroke-width: 2; }
|
|
88
|
+
path.fd-map-region[data-chosen] { stroke: var(--fd-accent); stroke-width: 3.5; stroke-opacity: 1; }
|
|
89
|
+
path.fd-map-region:focus { outline: none; }
|
|
90
|
+
/* While a way is measured or an area drawn, every press is the map's. */
|
|
91
|
+
.fd-map-box[data-measuring] path.fd-map-region, .fd-map-box[data-drawing] path.fd-map-region { pointer-events: none; }
|
|
92
|
+
path.fd-map-region:focus-visible { stroke: var(--fd-focus); stroke-width: 4; stroke-opacity: 1; }
|
|
93
|
+
.fd-map-box[data-plain] path.fd-map-region { cursor: default; }
|
|
94
|
+
.fd-map-legend {
|
|
95
|
+
position: absolute; right: 8px; bottom: 26px; z-index: 1000; display: grid; gap: 3px; max-width: min(240px, 60%); padding: 6px 9px; border-radius: 6px;
|
|
96
|
+
font-size: 12px; line-height: 1.35; background: color-mix(in srgb, var(--fd-surface) 94%, transparent); color: var(--fd-text); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.18);
|
|
97
|
+
}
|
|
98
|
+
.fd-map-legend[hidden] { display: none; }
|
|
99
|
+
.fd-map-legend-title { font-weight: 700; overflow-wrap: anywhere; }
|
|
100
|
+
.fd-map-legend ol { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; }
|
|
101
|
+
.fd-map-legend li { display: flex; align-items: center; gap: 7px; font-variant-numeric: tabular-nums; }
|
|
102
|
+
.fd-map-legend i { width: 18px; height: 11px; flex: none; border-radius: 2px; background: var(--fd-region, transparent); border: 1px solid color-mix(in srgb, var(--fd-text) 35%, transparent); }
|
|
103
|
+
.fd-map-legend i[data-shade] { background: color-mix(in srgb, var(--fd-region) 50%, var(--fd-surface)); }
|
|
104
|
+
.leaflet-tooltip.fd-map-tip {
|
|
105
|
+
padding: 3px 8px; border: 0; border-radius: 6px; font: inherit; font-size: 12.5px; font-weight: 600; white-space: nowrap;
|
|
106
|
+
background: var(--fd-surface); color: var(--fd-text); box-shadow: 0 1px 5px rgba(0, 0, 0, 0.3);
|
|
107
|
+
}
|
|
108
|
+
.leaflet-tooltip.fd-map-tip::before { display: none; }
|
|
109
|
+
`;
|
|
110
|
+
function installRegionStyles(doc) {
|
|
111
|
+
if (doc.getElementById('fieldia-map-region-styles'))
|
|
112
|
+
return;
|
|
113
|
+
const style = doc.createElement('style');
|
|
114
|
+
style.id = 'fieldia-map-region-styles';
|
|
115
|
+
style.textContent = REGIONS_CSS;
|
|
116
|
+
(doc.getElementById('fieldia-map-styles') ?? doc.head.lastElementChild)?.after(style);
|
|
117
|
+
if (!style.isConnected)
|
|
118
|
+
doc.head.append(style);
|
|
119
|
+
}
|
|
120
|
+
export function drawRegions(options) {
|
|
121
|
+
const { box, map, L, document: doc, locale, labels, borders } = options;
|
|
122
|
+
installRegionStyles(doc);
|
|
123
|
+
const number = (n) => new Intl.NumberFormat(locale, { numberingSystem: 'latn', maximumFractionDigits: 2 }).format(n);
|
|
124
|
+
// Their own pane: under a reachable area, routes and pins, over a heat map.
|
|
125
|
+
const pane = map.getPane('fd-regions') ?? map.createPane('fd-regions');
|
|
126
|
+
pane.style.zIndex = '370';
|
|
127
|
+
// Before the pins in the page, so Tab reaches the areas first.
|
|
128
|
+
map.getPane('markerPane')?.before(pane);
|
|
129
|
+
const group = L.featureGroup().addTo(map);
|
|
130
|
+
// Reading order: top to bottom, then from the start of the line.
|
|
131
|
+
const centre = (border) => {
|
|
132
|
+
const ring = border.polygons[0][0];
|
|
133
|
+
return { lat: ring.reduce((s, p) => s + p[1], 0) / ring.length, lng: ring.reduce((s, p) => s + p[0], 0) / ring.length };
|
|
134
|
+
};
|
|
135
|
+
const ordered = [...borders].sort((a, b) => {
|
|
136
|
+
const [x, y] = [centre(a), centre(b)];
|
|
137
|
+
return Math.abs(x.lat - y.lat) > 0.01 ? y.lat - x.lat : x.lng - y.lng;
|
|
138
|
+
});
|
|
139
|
+
let values = null;
|
|
140
|
+
let chosen = null;
|
|
141
|
+
let visible = true;
|
|
142
|
+
const paths = new Map();
|
|
143
|
+
const words = (border) => {
|
|
144
|
+
const value = values?.get(border.key);
|
|
145
|
+
return value === undefined ? border.name : fill(labels.areaValue, { name: border.name, value: number(value) });
|
|
146
|
+
};
|
|
147
|
+
for (const border of ordered) {
|
|
148
|
+
const latLngs = border.polygons.map((rings) => rings.map((ring) => ring.map(([lng, lat]) => [lat, lng])));
|
|
149
|
+
const path = L.polygon(latLngs, { className: 'fd-map-region', pane: 'fd-regions', interactive: true, bubblingMouseEvents: false }).addTo(group);
|
|
150
|
+
path.bindTooltip(() => words(border), { sticky: true, direction: 'top', offset: [0, -8], className: 'fd-map-tip', opacity: 1 });
|
|
151
|
+
if (options.press)
|
|
152
|
+
path.on('click', () => options.press?.(border));
|
|
153
|
+
paths.set(border.key, path);
|
|
154
|
+
}
|
|
155
|
+
if (!options.press)
|
|
156
|
+
box.element.toggleAttribute('data-plain', true);
|
|
157
|
+
// ---- the keyboard: one stop, the arrows from area to area -----------------------------
|
|
158
|
+
const elementOf = (border) => paths.get(border.key)?.getElement();
|
|
159
|
+
let current = 0;
|
|
160
|
+
function roving() {
|
|
161
|
+
ordered.forEach((border, i) => {
|
|
162
|
+
const element = elementOf(border);
|
|
163
|
+
if (!element)
|
|
164
|
+
return;
|
|
165
|
+
element.setAttribute('tabindex', i === current ? '0' : '-1');
|
|
166
|
+
element.setAttribute('role', options.press ? 'button' : 'img');
|
|
167
|
+
element.setAttribute('aria-label', `${words(border)} · ${options.title}`);
|
|
168
|
+
if (chosen !== null)
|
|
169
|
+
element.setAttribute('aria-pressed', String(border.key === chosen));
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
const keyed = (event) => {
|
|
173
|
+
const at = ordered.findIndex((border) => elementOf(border) === event.target);
|
|
174
|
+
if (at === -1)
|
|
175
|
+
return;
|
|
176
|
+
const step = event.key === 'ArrowDown' || event.key === 'ArrowRight' ? 1 : event.key === 'ArrowUp' || event.key === 'ArrowLeft' ? -1 : 0;
|
|
177
|
+
if (step || event.key === 'Home' || event.key === 'End') {
|
|
178
|
+
// The page does not scroll; the map pans by its arrows only while it has the keys itself.
|
|
179
|
+
event.preventDefault();
|
|
180
|
+
current = event.key === 'Home' ? 0 : event.key === 'End' ? ordered.length - 1 : (at + step + ordered.length) % ordered.length;
|
|
181
|
+
roving();
|
|
182
|
+
const element = elementOf(ordered[current]);
|
|
183
|
+
const path = paths.get(ordered[current].key);
|
|
184
|
+
if (path && !map.getBounds().contains(path.getBounds()))
|
|
185
|
+
map.panInside(path.getCenter(), { padding: [40, 40] });
|
|
186
|
+
element?.focus({ preventScroll: true });
|
|
187
|
+
}
|
|
188
|
+
else if ((event.key === 'Enter' || event.key === ' ') && options.press) {
|
|
189
|
+
event.preventDefault();
|
|
190
|
+
event.stopPropagation();
|
|
191
|
+
options.press(ordered[at]);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const focused = (event) => {
|
|
195
|
+
const border = ordered.find((b) => elementOf(b) === event.target);
|
|
196
|
+
if (!border)
|
|
197
|
+
return;
|
|
198
|
+
paths.get(border.key)?.getElement()?.toggleAttribute('data-lit', event.type === 'focusin');
|
|
199
|
+
if (event.type === 'focusin')
|
|
200
|
+
paths.get(border.key)?.openTooltip(paths.get(border.key)?.getCenter());
|
|
201
|
+
else
|
|
202
|
+
paths.get(border.key)?.closeTooltip();
|
|
203
|
+
};
|
|
204
|
+
box.element.addEventListener('keydown', keyed, true);
|
|
205
|
+
box.element.addEventListener('focusin', focused);
|
|
206
|
+
box.element.addEventListener('focusout', focused);
|
|
207
|
+
// ---- the legend --------------------------------------------------------------------
|
|
208
|
+
const legend = doc.createElement('div');
|
|
209
|
+
legend.className = 'fd-map-legend';
|
|
210
|
+
legend.hidden = true;
|
|
211
|
+
box.element.append(legend);
|
|
212
|
+
box.follow(legend);
|
|
213
|
+
function drawLegend({ from: start, ends: steps }, none) {
|
|
214
|
+
legend.replaceChildren();
|
|
215
|
+
if (!options.legend || !steps.length) {
|
|
216
|
+
legend.hidden = true;
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const title = doc.createElement('div');
|
|
220
|
+
title.className = 'fd-map-legend-title';
|
|
221
|
+
title.textContent = options.title;
|
|
222
|
+
const list = doc.createElement('ol');
|
|
223
|
+
const whole = steps.every((end) => Number.isInteger(end));
|
|
224
|
+
// Areas with nothing to shade them, when there are some.
|
|
225
|
+
if (none) {
|
|
226
|
+
const empty = doc.createElement('li');
|
|
227
|
+
empty.append(doc.createElement('i'), labels.areasNone);
|
|
228
|
+
list.append(empty);
|
|
229
|
+
}
|
|
230
|
+
steps.forEach((end, i) => {
|
|
231
|
+
const item = doc.createElement('li');
|
|
232
|
+
const swatch = doc.createElement('i');
|
|
233
|
+
swatch.setAttribute('data-shade', String(i));
|
|
234
|
+
swatch.style.setProperty('--fd-region', `color-mix(in srgb, var(--fd-accent) ${mixOf(i, steps.length)}%, var(--fd-surface))`);
|
|
235
|
+
const below = i === 0 ? start : steps[i - 1];
|
|
236
|
+
const from = whole ? below + 1 : below;
|
|
237
|
+
// A range reads from its least, in a right-to-left page too: its numbers kept left to right.
|
|
238
|
+
const range = doc.createElement('bdi');
|
|
239
|
+
range.dir = 'ltr';
|
|
240
|
+
range.textContent = from >= end ? number(end) : `${number(from)}–${number(end)}`;
|
|
241
|
+
item.append(swatch, range);
|
|
242
|
+
list.append(item);
|
|
243
|
+
});
|
|
244
|
+
legend.append(title, list);
|
|
245
|
+
legend.hidden = !visible;
|
|
246
|
+
}
|
|
247
|
+
const layer = {
|
|
248
|
+
shade(next, nowChosen) {
|
|
249
|
+
values = next;
|
|
250
|
+
chosen = nowChosen;
|
|
251
|
+
const steps = values ? shadeSteps([...values.values()]) : { from: 0, ends: [] };
|
|
252
|
+
let none = false;
|
|
253
|
+
for (const border of ordered) {
|
|
254
|
+
const element = elementOf(border);
|
|
255
|
+
if (!element)
|
|
256
|
+
continue;
|
|
257
|
+
const shade = values ? shadeOf(values.get(border.key), steps.ends) : null;
|
|
258
|
+
none ||= shade === null;
|
|
259
|
+
if (shade === null) {
|
|
260
|
+
element.removeAttribute('data-shade');
|
|
261
|
+
element.style.removeProperty('--fd-region');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
element.setAttribute('data-shade', String(shade));
|
|
265
|
+
element.style.setProperty('--fd-region', `color-mix(in srgb, var(--fd-accent) ${mixOf(shade, steps.ends.length)}%, var(--fd-surface))`);
|
|
266
|
+
}
|
|
267
|
+
element.toggleAttribute('data-chosen', border.key === chosen);
|
|
268
|
+
}
|
|
269
|
+
const at = ordered.findIndex((border) => border.key === chosen);
|
|
270
|
+
if (at !== -1 && !box.element.contains(doc.activeElement))
|
|
271
|
+
current = at;
|
|
272
|
+
roving();
|
|
273
|
+
// Under every pin and route by their pane; never moved in the page, which would take the keys from a focused area.
|
|
274
|
+
drawLegend(steps, none);
|
|
275
|
+
},
|
|
276
|
+
at(lat, lng) {
|
|
277
|
+
return borders.find((border) => border.polygons.some((rings) => insideRings(lng, lat, rings))) ?? null;
|
|
278
|
+
},
|
|
279
|
+
show(on) {
|
|
280
|
+
if (on === map.hasLayer(group))
|
|
281
|
+
return;
|
|
282
|
+
if (on)
|
|
283
|
+
group.addTo(map);
|
|
284
|
+
else
|
|
285
|
+
group.remove();
|
|
286
|
+
visible = on;
|
|
287
|
+
legend.hidden = !on || !legend.childElementCount;
|
|
288
|
+
},
|
|
289
|
+
destroy() {
|
|
290
|
+
box.element.removeEventListener('keydown', keyed, true);
|
|
291
|
+
box.element.removeEventListener('focusin', focused);
|
|
292
|
+
box.element.removeEventListener('focusout', focused);
|
|
293
|
+
group.remove();
|
|
294
|
+
legend.remove();
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
layer.shade(null, null);
|
|
298
|
+
return layer;
|
|
299
|
+
}
|
|
300
|
+
/** Inside a polygon: inside its outer ring and none of its holes. */
|
|
301
|
+
export function insideRings(x, y, rings) {
|
|
302
|
+
const inside = (ring) => {
|
|
303
|
+
let odd = false;
|
|
304
|
+
for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {
|
|
305
|
+
const [xi, yi] = ring[i];
|
|
306
|
+
const [xj, yj] = ring[j];
|
|
307
|
+
if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi)
|
|
308
|
+
odd = !odd;
|
|
309
|
+
}
|
|
310
|
+
return odd;
|
|
311
|
+
};
|
|
312
|
+
return rings.length > 0 && inside(rings[0]) && !rings.slice(1).some(inside);
|
|
313
|
+
}
|
|
314
|
+
/** A set of borders, loaded and read; null (said once to the developer) when the app gives none by that name, or it failed. */
|
|
315
|
+
async function bordersOf(sets, spec) {
|
|
316
|
+
let set;
|
|
317
|
+
try {
|
|
318
|
+
set = await loadBorders(sets, spec.from);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
warnOnce(`The borders "${spec.from}" did not load: ${String(error)}`);
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
if (set === undefined) {
|
|
325
|
+
warnOnce(`No borders "${spec.from}" in the maps' regions: give them as regions: { ${JSON.stringify(spec.from)}: () => fetch(…).then((r) => r.json()) }.`);
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
return readBorders(set, spec);
|
|
329
|
+
}
|
|
330
|
+
/** Each border's number among its properties, by its key: what a layer's `shade` names. */
|
|
331
|
+
function ownNumbers(borders, property) {
|
|
332
|
+
const values = new Map();
|
|
333
|
+
for (const border of borders) {
|
|
334
|
+
const value = Number(border.properties[property]);
|
|
335
|
+
if (Number.isFinite(value))
|
|
336
|
+
values.set(border.key, value);
|
|
337
|
+
}
|
|
338
|
+
return values;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* A list's areas shaded by its records: drawn once their borders load, their
|
|
342
|
+
* numbers asked for again with each search — each area's records under the
|
|
343
|
+
* search but for an area searched itself, so the others keep their shades —
|
|
344
|
+
* or a number of their own. A press searches for an area's records.
|
|
345
|
+
*/
|
|
346
|
+
export function listRegions(options) {
|
|
347
|
+
const { spec } = options;
|
|
348
|
+
let gone = false;
|
|
349
|
+
const drawn = bordersOf(options.sets, spec).then((borders) => !borders || gone
|
|
350
|
+
? null
|
|
351
|
+
: {
|
|
352
|
+
borders,
|
|
353
|
+
layer: drawRegions({
|
|
354
|
+
...options,
|
|
355
|
+
borders,
|
|
356
|
+
legend: spec.legend !== false,
|
|
357
|
+
press: (border) => options.addSearch({ label: fill(options.labels.inRegion, { name: border.name }), filter: [{ field: spec.field, op: '=', value: border.value }] }),
|
|
358
|
+
}),
|
|
359
|
+
});
|
|
360
|
+
const isArea = (item) => 'field' in item && item.field === spec.field && item.op === '=';
|
|
361
|
+
return {
|
|
362
|
+
async shade(filter, current) {
|
|
363
|
+
const made = await drawn;
|
|
364
|
+
if (!made || !current())
|
|
365
|
+
return;
|
|
366
|
+
const picked = filter.find(isArea);
|
|
367
|
+
const chosen = picked && 'value' in picked ? String(picked.value) : null;
|
|
368
|
+
const shade = spec.shade ?? 'count';
|
|
369
|
+
let values = new Map();
|
|
370
|
+
if (shade !== 'count')
|
|
371
|
+
values = ownNumbers(made.borders, shade);
|
|
372
|
+
else if (options.dataSource?.groups) {
|
|
373
|
+
try {
|
|
374
|
+
const groups = await options.dataSource.groups({ model: options.model, field: spec.field, filter: filter.filter((item) => !isArea(item)) });
|
|
375
|
+
for (const group of groups)
|
|
376
|
+
if (group.value !== null)
|
|
377
|
+
values.set(String(group.value), group.count);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
// Without a way to count, the records the map has.
|
|
385
|
+
for (const record of options.records()) {
|
|
386
|
+
const raw = record.values[spec.field];
|
|
387
|
+
const key = raw !== null && typeof raw === 'object' && 'id' in raw ? raw.id : raw;
|
|
388
|
+
if (key !== null && key !== undefined && key !== false)
|
|
389
|
+
values.set(String(key), (values.get(String(key)) ?? 0) + 1);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
if (current())
|
|
393
|
+
made.layer.shade(values, chosen);
|
|
394
|
+
},
|
|
395
|
+
destroy() {
|
|
396
|
+
gone = true;
|
|
397
|
+
void drawn.then((made) => made?.layer.destroy());
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* A form's areas by colour, a layer each: shaded by a number of their own,
|
|
403
|
+
* the one the record's field holds drawn strong, a press choosing one into
|
|
404
|
+
* that field where the person may change it; on the map or off it as each
|
|
405
|
+
* layer's `invisible` says.
|
|
406
|
+
*/
|
|
407
|
+
export function formRegions(options) {
|
|
408
|
+
let gone = false;
|
|
409
|
+
const made = options.layers.map((layer) => {
|
|
410
|
+
const spec = layer.regions;
|
|
411
|
+
const choose = spec.choose;
|
|
412
|
+
return bordersOf(options.sets, spec).then((borders) => !borders || gone
|
|
413
|
+
? null
|
|
414
|
+
: {
|
|
415
|
+
layer,
|
|
416
|
+
spec,
|
|
417
|
+
borders,
|
|
418
|
+
regions: drawRegions({
|
|
419
|
+
...options,
|
|
420
|
+
borders,
|
|
421
|
+
title: layer.label ?? spec.from,
|
|
422
|
+
legend: spec.legend !== false && spec.shade !== undefined,
|
|
423
|
+
...(choose && options.writable(choose) ? { press: (border) => options.choose(choose, border.value) } : {}),
|
|
424
|
+
}),
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
return {
|
|
428
|
+
update(values, hidden) {
|
|
429
|
+
for (const one of made)
|
|
430
|
+
void one.then((drawn) => {
|
|
431
|
+
if (!drawn || gone)
|
|
432
|
+
return;
|
|
433
|
+
const chosen = drawn.spec.choose ? values[drawn.spec.choose] : null;
|
|
434
|
+
drawn.regions.shade(drawn.spec.shade ? ownNumbers(drawn.borders, drawn.spec.shade) : null, chosen === null || chosen === undefined || chosen === false ? null : String(chosen));
|
|
435
|
+
drawn.regions.show(!hidden(drawn.layer.id));
|
|
436
|
+
});
|
|
437
|
+
},
|
|
438
|
+
destroy() {
|
|
439
|
+
gone = true;
|
|
440
|
+
for (const one of made)
|
|
441
|
+
void one.then((drawn) => drawn?.regions.destroy());
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=regions.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regions.mjs","sourceRoot":"","sources":["../../../../../libs/map/src/lib/regions.ts"],"names":[],"mappings":"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"}
|
package/src/lib/routes.d.mts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { LatLng } from './geo.mjs';
|
|
2
2
|
import { type Fetch } from './answers.mjs';
|
|
3
|
-
import type { RouteFound, RouteRequest } from './providers.mjs';
|
|
3
|
+
import type { ReachFound, ReachRequest, RouteFound, RouteRequest } from './providers.mjs';
|
|
4
4
|
/**
|
|
5
|
-
* The providers' routes along the roads, loaded the
|
|
6
|
-
* for one: a form with only a place or an area never
|
|
7
|
-
* reads its provider's answer into one line, its metres
|
|
5
|
+
* The providers' routes along the roads and reachable areas, loaded the
|
|
6
|
+
* first time a map asks for one: a form with only a place or an area never
|
|
7
|
+
* carries them. Each reads its provider's answer into one line, its metres
|
|
8
|
+
* and its seconds; or an area's rings.
|
|
8
9
|
*/
|
|
9
10
|
/** Google's encoded polyline, as its Routes API sends a line: five decimals, each number a run of five-bit groups. */
|
|
10
11
|
export declare function decodePolyline(encoded: string): LatLng[];
|
|
@@ -26,3 +27,14 @@ export declare function mapboxRoute(ask: {
|
|
|
26
27
|
fetchWith: Fetch;
|
|
27
28
|
token: string;
|
|
28
29
|
}, { points, mode, signal }: RouteRequest): Promise<RouteFound>;
|
|
30
|
+
/** Azure Maps' Route Range of 2025: the area within a time from a point, by car (or truck) alone. */
|
|
31
|
+
export declare function azureReach(ask: {
|
|
32
|
+
fetchWith: Fetch;
|
|
33
|
+
auth: string;
|
|
34
|
+
headers: () => Promise<Record<string, string>>;
|
|
35
|
+
}, { at, minutes, mode, signal }: ReachRequest): Promise<ReachFound>;
|
|
36
|
+
/** Mapbox Isochrone: the area within some minutes, by its profile, as polygons. */
|
|
37
|
+
export declare function mapboxReach(ask: {
|
|
38
|
+
fetchWith: Fetch;
|
|
39
|
+
token: string;
|
|
40
|
+
}, { at, minutes, mode, signal }: ReachRequest): Promise<ReachFound>;
|
package/src/lib/routes.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { LatLng } from './geo';
|
|
2
2
|
import { type Fetch } from './answers';
|
|
3
|
-
import type { RouteFound, RouteRequest } from './providers';
|
|
3
|
+
import type { ReachFound, ReachRequest, RouteFound, RouteRequest } from './providers';
|
|
4
4
|
/**
|
|
5
|
-
* The providers' routes along the roads, loaded the
|
|
6
|
-
* for one: a form with only a place or an area never
|
|
7
|
-
* reads its provider's answer into one line, its metres
|
|
5
|
+
* The providers' routes along the roads and reachable areas, loaded the
|
|
6
|
+
* first time a map asks for one: a form with only a place or an area never
|
|
7
|
+
* carries them. Each reads its provider's answer into one line, its metres
|
|
8
|
+
* and its seconds; or an area's rings.
|
|
8
9
|
*/
|
|
9
10
|
/** Google's encoded polyline, as its Routes API sends a line: five decimals, each number a run of five-bit groups. */
|
|
10
11
|
export declare function decodePolyline(encoded: string): LatLng[];
|
|
@@ -26,3 +27,14 @@ export declare function mapboxRoute(ask: {
|
|
|
26
27
|
fetchWith: Fetch;
|
|
27
28
|
token: string;
|
|
28
29
|
}, { points, mode, signal }: RouteRequest): Promise<RouteFound>;
|
|
30
|
+
/** Azure Maps' Route Range of 2025: the area within a time from a point, by car (or truck) alone. */
|
|
31
|
+
export declare function azureReach(ask: {
|
|
32
|
+
fetchWith: Fetch;
|
|
33
|
+
auth: string;
|
|
34
|
+
headers: () => Promise<Record<string, string>>;
|
|
35
|
+
}, { at, minutes, mode, signal }: ReachRequest): Promise<ReachFound>;
|
|
36
|
+
/** Mapbox Isochrone: the area within some minutes, by its profile, as polygons. */
|
|
37
|
+
export declare function mapboxReach(ask: {
|
|
38
|
+
fetchWith: Fetch;
|
|
39
|
+
token: string;
|
|
40
|
+
}, { at, minutes, mode, signal }: ReachRequest): Promise<ReachFound>;
|
package/src/lib/routes.js
CHANGED
|
@@ -5,11 +5,14 @@ exports.osrmRoute = osrmRoute;
|
|
|
5
5
|
exports.azureRoute = azureRoute;
|
|
6
6
|
exports.googleRoute = googleRoute;
|
|
7
7
|
exports.mapboxRoute = mapboxRoute;
|
|
8
|
+
exports.azureReach = azureReach;
|
|
9
|
+
exports.mapboxReach = mapboxReach;
|
|
8
10
|
const answers_1 = require("./answers");
|
|
9
11
|
/**
|
|
10
|
-
* The providers' routes along the roads, loaded the
|
|
11
|
-
* for one: a form with only a place or an area never
|
|
12
|
-
* reads its provider's answer into one line, its metres
|
|
12
|
+
* The providers' routes along the roads and reachable areas, loaded the
|
|
13
|
+
* first time a map asks for one: a form with only a place or an area never
|
|
14
|
+
* carries them. Each reads its provider's answer into one line, its metres
|
|
15
|
+
* and its seconds; or an area's rings.
|
|
13
16
|
*/
|
|
14
17
|
/** Google's encoded polyline, as its Routes API sends a line: five decimals, each number a run of five-bit groups. */
|
|
15
18
|
function decodePolyline(encoded) {
|
|
@@ -109,4 +112,38 @@ async function mapboxRoute(ask, { points, mode, signal }) {
|
|
|
109
112
|
const route = (0, answers_1.pathOf)(found, 'routes')?.[0];
|
|
110
113
|
return routed({ line: lineOf((0, answers_1.pathOf)(route, 'geometry', 'coordinates')), metres: Number((0, answers_1.pathOf)(route, 'distance')), seconds: Number((0, answers_1.pathOf)(route, 'duration')) }, 'Mapbox');
|
|
111
114
|
}
|
|
115
|
+
/** The outer rings of a GeoJSON Polygon's or MultiPolygon's, as places. */
|
|
116
|
+
function ringsOf(geometry) {
|
|
117
|
+
const type = (0, answers_1.pathOf)(geometry, 'type');
|
|
118
|
+
const coordinates = (0, answers_1.pathOf)(geometry, 'coordinates');
|
|
119
|
+
const polygons = type === 'Polygon' ? [coordinates] : type === 'MultiPolygon' && Array.isArray(coordinates) ? coordinates : [];
|
|
120
|
+
return polygons.flatMap((polygon) => (Array.isArray(polygon) ? [lineOf(polygon[0])] : [])).filter((ring) => ring.length > 2);
|
|
121
|
+
}
|
|
122
|
+
/** An area that is no area: refused in words a developer can act on. */
|
|
123
|
+
function reached(found, provider) {
|
|
124
|
+
if (!found.rings.length)
|
|
125
|
+
throw new Error(`${provider} found no reachable area`);
|
|
126
|
+
return found;
|
|
127
|
+
}
|
|
128
|
+
/** Azure Maps' Route Range of 2025: the area within a time from a point, by car (or truck) alone. */
|
|
129
|
+
async function azureReach(ask, { at, minutes, mode, signal }) {
|
|
130
|
+
if (mode !== 'car')
|
|
131
|
+
throw new Error('Azure Maps works out reachable areas by car, not by bike or on foot');
|
|
132
|
+
const found = await (0, answers_1.getJson)(ask.fetchWith, `https://atlas.microsoft.com/route/range?api-version=2025-01-01${ask.auth}`, {
|
|
133
|
+
method: 'POST',
|
|
134
|
+
signal,
|
|
135
|
+
headers: { 'Content-Type': 'application/geo+json', ...(await ask.headers()) },
|
|
136
|
+
body: JSON.stringify({ type: 'Feature', geometry: { type: 'Point', coordinates: [at.lng, at.lat] }, properties: { timeBudgetInSec: Math.round(minutes * 60), travelMode: 'driving' } }),
|
|
137
|
+
});
|
|
138
|
+
const features = (0, answers_1.pathOf)(found, 'features');
|
|
139
|
+
const boundary = Array.isArray(features) ? features.find((f) => (0, answers_1.pathOf)(f, 'properties', 'type') === 'boundary') : undefined;
|
|
140
|
+
return reached({ rings: ringsOf((0, answers_1.pathOf)(boundary, 'geometry')) }, 'Azure Maps');
|
|
141
|
+
}
|
|
142
|
+
/** Mapbox Isochrone: the area within some minutes, by its profile, as polygons. */
|
|
143
|
+
async function mapboxReach(ask, { at, minutes, mode, signal }) {
|
|
144
|
+
const profile = mode === 'bike' ? 'cycling' : mode === 'foot' ? 'walking' : 'driving';
|
|
145
|
+
const found = await (0, answers_1.getJson)(ask.fetchWith, `https://api.mapbox.com/isochrone/v1/mapbox/${profile}/${at.lng},${at.lat}?contours_minutes=${Math.round(minutes)}&polygons=true&access_token=${ask.token}`, { signal });
|
|
146
|
+
const features = (0, answers_1.pathOf)(found, 'features');
|
|
147
|
+
return reached({ rings: Array.isArray(features) ? features.flatMap((f) => ringsOf((0, answers_1.pathOf)(f, 'geometry'))) : [] }, 'Mapbox');
|
|
148
|
+
}
|
|
112
149
|
//# sourceMappingURL=routes.js.map
|
package/src/lib/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/routes.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../../../libs/map/src/lib/routes.ts"],"names":[],"mappings":"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"}
|