@osmix/shared 0.0.6 → 0.0.8
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/CHANGELOG.md +12 -0
- package/dist/assert.d.ts +24 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +28 -0
- package/dist/assert.js.map +1 -0
- package/dist/bbox-intersects.d.ts +15 -0
- package/dist/bbox-intersects.d.ts.map +1 -0
- package/dist/bbox-intersects.js +24 -0
- package/dist/bbox-intersects.js.map +1 -0
- package/dist/bytes-to-stream.d.ts +18 -0
- package/dist/bytes-to-stream.d.ts.map +1 -0
- package/dist/bytes-to-stream.js +25 -0
- package/dist/bytes-to-stream.js.map +1 -0
- package/dist/color.d.ts +4 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +33 -0
- package/dist/color.js.map +1 -0
- package/dist/concat-bytes.d.ts +5 -0
- package/dist/concat-bytes.d.ts.map +1 -0
- package/dist/concat-bytes.js +14 -0
- package/dist/concat-bytes.js.map +1 -0
- package/dist/coordinates.d.ts +28 -0
- package/dist/coordinates.d.ts.map +1 -0
- package/dist/coordinates.js +38 -0
- package/dist/coordinates.js.map +1 -0
- package/dist/haversine-distance.d.ts +16 -0
- package/dist/haversine-distance.d.ts.map +1 -0
- package/dist/haversine-distance.js +26 -0
- package/dist/haversine-distance.js.map +1 -0
- package/dist/lineclip.d.ts +2 -0
- package/dist/lineclip.d.ts.map +1 -0
- package/dist/lineclip.js +3 -0
- package/dist/lineclip.js.map +1 -0
- package/dist/progress.d.ts +42 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +53 -0
- package/dist/progress.js.map +1 -0
- package/dist/relation-kind.d.ts +69 -0
- package/dist/relation-kind.d.ts.map +1 -0
- package/dist/relation-kind.js +375 -0
- package/dist/relation-kind.js.map +1 -0
- package/dist/relation-multipolygon.d.ts +43 -0
- package/dist/relation-multipolygon.d.ts.map +1 -0
- package/dist/relation-multipolygon.js +195 -0
- package/dist/relation-multipolygon.js.map +1 -0
- package/dist/src/color.d.ts +4 -0
- package/dist/src/color.d.ts.map +1 -0
- package/dist/src/color.js +33 -0
- package/dist/src/color.js.map +1 -0
- package/dist/src/progress.d.ts +4 -2
- package/dist/src/progress.d.ts.map +1 -1
- package/dist/src/progress.js +17 -4
- package/dist/src/progress.js.map +1 -1
- package/dist/src/test/fixtures.d.ts.map +1 -1
- package/dist/src/test/fixtures.js +3 -0
- package/dist/src/test/fixtures.js.map +1 -1
- package/dist/stream-to-bytes.d.ts +18 -0
- package/dist/stream-to-bytes.d.ts.map +1 -0
- package/dist/stream-to-bytes.js +30 -0
- package/dist/stream-to-bytes.js.map +1 -0
- package/dist/test/fixtures.d.ts +36 -0
- package/dist/test/fixtures.d.ts.map +1 -0
- package/dist/test/fixtures.js +175 -0
- package/dist/test/fixtures.js.map +1 -0
- package/dist/throttle.d.ts +25 -0
- package/dist/throttle.d.ts.map +1 -0
- package/dist/throttle.js +34 -0
- package/dist/throttle.js.map +1 -0
- package/dist/tile.d.ts +34 -0
- package/dist/tile.d.ts.map +1 -0
- package/dist/tile.js +72 -0
- package/dist/tile.js.map +1 -0
- package/dist/transform-bytes.d.ts +24 -0
- package/dist/transform-bytes.d.ts.map +1 -0
- package/dist/transform-bytes.js +28 -0
- package/dist/transform-bytes.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +30 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +70 -0
- package/dist/utils.js.map +1 -0
- package/dist/way-is-area.d.ts +24 -0
- package/dist/way-is-area.d.ts.map +1 -0
- package/dist/way-is-area.js +104 -0
- package/dist/way-is-area.js.map +1 -0
- package/dist/zigzag.d.ts +33 -0
- package/dist/zigzag.d.ts.map +1 -0
- package/dist/zigzag.js +40 -0
- package/dist/zigzag.js.map +1 -0
- package/package.json +8 -7
- package/src/color.ts +37 -0
- package/src/progress.ts +23 -4
- package/src/test/fixtures.ts +3 -0
- package/tsconfig.build.json +5 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relation kind detection and geometry building.
|
|
3
|
+
*
|
|
4
|
+
* Determines the semantic type of OSM relations (area, line, point, logic, super)
|
|
5
|
+
* based on their type tag and member structure. Also provides utilities for
|
|
6
|
+
* building geometries from relation members.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Get the semantic kind of a relation based on its type tag.
|
|
12
|
+
* Based on [OSM relation documentation](https://wiki.openstreetmap.org/wiki/Relation):
|
|
13
|
+
* - Areas: multipolygon, boundary, site
|
|
14
|
+
* - Lines: route, waterway, multilinestring, canal
|
|
15
|
+
* - Points: multipoint
|
|
16
|
+
* - Logic: restriction, route_master, network, collection
|
|
17
|
+
* - [Super: relations that contain other relations](https://wiki.openstreetmap.org/wiki/Super-relation)
|
|
18
|
+
*/
|
|
19
|
+
export function getRelationKind(relation) {
|
|
20
|
+
const typeTag = relation.tags?.["type"];
|
|
21
|
+
if (!typeTag || typeof typeTag !== "string") {
|
|
22
|
+
// If no type tag, check if it has relation members (super-relation)
|
|
23
|
+
if (relation.members.some((m) => m.type === "relation")) {
|
|
24
|
+
return "super";
|
|
25
|
+
}
|
|
26
|
+
// Default to logic for untyped relations
|
|
27
|
+
return "logic";
|
|
28
|
+
}
|
|
29
|
+
const normalizedType = typeTag.toLowerCase();
|
|
30
|
+
// Area relations
|
|
31
|
+
if (normalizedType === "multipolygon" ||
|
|
32
|
+
normalizedType === "boundary" ||
|
|
33
|
+
normalizedType === "site") {
|
|
34
|
+
return "area";
|
|
35
|
+
}
|
|
36
|
+
// Line relations
|
|
37
|
+
if (normalizedType === "route" ||
|
|
38
|
+
normalizedType === "waterway" ||
|
|
39
|
+
normalizedType === "multilinestring" ||
|
|
40
|
+
normalizedType === "canal") {
|
|
41
|
+
return "line";
|
|
42
|
+
}
|
|
43
|
+
// Point relations
|
|
44
|
+
if (normalizedType === "multipoint") {
|
|
45
|
+
return "point";
|
|
46
|
+
}
|
|
47
|
+
// Check for super-relation (has relation members)
|
|
48
|
+
if (relation.members.some((m) => m.type === "relation")) {
|
|
49
|
+
return "super";
|
|
50
|
+
}
|
|
51
|
+
// Default to logic for other types (restriction, route_master, network, collection, etc.)
|
|
52
|
+
return "logic";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get metadata about a relation kind.
|
|
56
|
+
*/
|
|
57
|
+
export function getRelationKindMetadata(relation) {
|
|
58
|
+
const kind = getRelationKind(relation);
|
|
59
|
+
switch (kind) {
|
|
60
|
+
case "area":
|
|
61
|
+
return {
|
|
62
|
+
kind: "area",
|
|
63
|
+
expectedRoles: ["outer", "inner"],
|
|
64
|
+
orderMatters: false,
|
|
65
|
+
description: "Area relation (multipolygon, boundary, site)",
|
|
66
|
+
};
|
|
67
|
+
case "line":
|
|
68
|
+
return {
|
|
69
|
+
kind: "line",
|
|
70
|
+
expectedRoles: undefined, // Routes can have various roles
|
|
71
|
+
orderMatters: true,
|
|
72
|
+
description: "Line relation (route, waterway, multilinestring)",
|
|
73
|
+
};
|
|
74
|
+
case "point":
|
|
75
|
+
return {
|
|
76
|
+
kind: "point",
|
|
77
|
+
expectedRoles: undefined,
|
|
78
|
+
orderMatters: false,
|
|
79
|
+
description: "Point relation (multipoint)",
|
|
80
|
+
};
|
|
81
|
+
case "super":
|
|
82
|
+
return {
|
|
83
|
+
kind: "super",
|
|
84
|
+
expectedRoles: undefined,
|
|
85
|
+
orderMatters: false,
|
|
86
|
+
description: "Super-relation (contains other relations)",
|
|
87
|
+
};
|
|
88
|
+
case "logic":
|
|
89
|
+
return {
|
|
90
|
+
kind: "logic",
|
|
91
|
+
expectedRoles: undefined,
|
|
92
|
+
orderMatters: false,
|
|
93
|
+
description: "Logical relation (restriction, route_master, network, collection, etc.)",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if a relation is an area relation.
|
|
99
|
+
*/
|
|
100
|
+
export function isAreaRelation(relation) {
|
|
101
|
+
return getRelationKind(relation) === "area";
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a relation is a line relation.
|
|
105
|
+
*/
|
|
106
|
+
export function isLineRelation(relation) {
|
|
107
|
+
return getRelationKind(relation) === "line";
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if a relation is a point relation.
|
|
111
|
+
*/
|
|
112
|
+
export function isPointRelation(relation) {
|
|
113
|
+
return getRelationKind(relation) === "point";
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if a relation is a super-relation (contains other relations).
|
|
117
|
+
*/
|
|
118
|
+
export function isSuperRelation(relation) {
|
|
119
|
+
return getRelationKind(relation) === "super";
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a relation is a logical relation (non-geometric).
|
|
123
|
+
*/
|
|
124
|
+
export function isLogicRelation(relation) {
|
|
125
|
+
return getRelationKind(relation) === "logic";
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Build MultiLineString geometry from a line relation by connecting way members.
|
|
129
|
+
* Orders way members using their refs and handles role-based reversal.
|
|
130
|
+
* Returns an array of LineString coordinates (each LineString is an array of LonLat).
|
|
131
|
+
*/
|
|
132
|
+
export function buildRelationLineStrings(relation, getWay, getNodeCoordinates) {
|
|
133
|
+
const lineStrings = [];
|
|
134
|
+
const wayMembers = relation.members.filter((m) => m.type === "way");
|
|
135
|
+
if (wayMembers.length === 0)
|
|
136
|
+
return lineStrings;
|
|
137
|
+
// Group ways by role if roles are used
|
|
138
|
+
const roleGroups = new Map();
|
|
139
|
+
for (const member of wayMembers) {
|
|
140
|
+
const role = member.role?.toLowerCase() ?? "";
|
|
141
|
+
if (!roleGroups.has(role)) {
|
|
142
|
+
roleGroups.set(role, []);
|
|
143
|
+
}
|
|
144
|
+
roleGroups.get(role).push(member);
|
|
145
|
+
}
|
|
146
|
+
// If no roles or single role group, process all ways together
|
|
147
|
+
const groupsToProcess = roleGroups.size === 1 || !relation.members.some((m) => m.role)
|
|
148
|
+
? [wayMembers]
|
|
149
|
+
: Array.from(roleGroups.values());
|
|
150
|
+
for (const group of groupsToProcess) {
|
|
151
|
+
// Try to connect ways into continuous linestrings
|
|
152
|
+
const connected = connectWaysToLineStrings(group, getWay, getNodeCoordinates);
|
|
153
|
+
lineStrings.push(...connected);
|
|
154
|
+
}
|
|
155
|
+
return lineStrings;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Connect ways that share endpoints to form continuous LineStrings.
|
|
159
|
+
* Returns an array of LineStrings (each is an array of LonLat coordinates).
|
|
160
|
+
*/
|
|
161
|
+
function connectWaysToLineStrings(wayMembers, getWay, getNodeCoordinates) {
|
|
162
|
+
if (wayMembers.length === 0)
|
|
163
|
+
return [];
|
|
164
|
+
const lineStrings = [];
|
|
165
|
+
const used = new Set();
|
|
166
|
+
const wayMap = new Map();
|
|
167
|
+
// Build map of way ID to way
|
|
168
|
+
for (const member of wayMembers) {
|
|
169
|
+
const way = getWay(member.ref);
|
|
170
|
+
if (way) {
|
|
171
|
+
wayMap.set(member.ref, way);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Build linestrings by connecting ways
|
|
175
|
+
for (const member of wayMembers) {
|
|
176
|
+
if (used.has(member.ref))
|
|
177
|
+
continue;
|
|
178
|
+
const startWay = wayMap.get(member.ref);
|
|
179
|
+
if (!startWay || startWay.refs.length < 2)
|
|
180
|
+
continue;
|
|
181
|
+
const coords = [];
|
|
182
|
+
const currentWay = startWay;
|
|
183
|
+
used.add(member.ref);
|
|
184
|
+
// Get coordinates for the starting way
|
|
185
|
+
for (const nodeId of currentWay.refs) {
|
|
186
|
+
const coord = getNodeCoordinates(nodeId);
|
|
187
|
+
if (coord)
|
|
188
|
+
coords.push(coord);
|
|
189
|
+
}
|
|
190
|
+
// Try to extend forward
|
|
191
|
+
while (true) {
|
|
192
|
+
let found = false;
|
|
193
|
+
const lastCoord = coords[coords.length - 1];
|
|
194
|
+
if (!lastCoord)
|
|
195
|
+
break;
|
|
196
|
+
for (const nextMember of wayMembers) {
|
|
197
|
+
if (used.has(nextMember.ref))
|
|
198
|
+
continue;
|
|
199
|
+
const nextWay = wayMap.get(nextMember.ref);
|
|
200
|
+
if (!nextWay || nextWay.refs.length < 2)
|
|
201
|
+
continue;
|
|
202
|
+
const nextStart = getNodeCoordinates(nextWay.refs[0]);
|
|
203
|
+
const nextEnd = getNodeCoordinates(nextWay.refs[nextWay.refs.length - 1]);
|
|
204
|
+
if (!nextStart || !nextEnd)
|
|
205
|
+
continue;
|
|
206
|
+
// Check if next way connects to current end
|
|
207
|
+
if (lastCoord[0] === nextStart[0] && lastCoord[1] === nextStart[1]) {
|
|
208
|
+
// Connect normally
|
|
209
|
+
for (let i = 1; i < nextWay.refs.length; i++) {
|
|
210
|
+
const nodeId = nextWay.refs[i];
|
|
211
|
+
if (nodeId === undefined)
|
|
212
|
+
continue;
|
|
213
|
+
const coord = getNodeCoordinates(nodeId);
|
|
214
|
+
if (coord)
|
|
215
|
+
coords.push(coord);
|
|
216
|
+
}
|
|
217
|
+
used.add(nextMember.ref);
|
|
218
|
+
found = true;
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
if (lastCoord[0] === nextEnd[0] && lastCoord[1] === nextEnd[1]) {
|
|
222
|
+
// Need to reverse next way
|
|
223
|
+
for (let i = nextWay.refs.length - 2; i >= 0; i--) {
|
|
224
|
+
const nodeId = nextWay.refs[i];
|
|
225
|
+
if (nodeId === undefined)
|
|
226
|
+
continue;
|
|
227
|
+
const coord = getNodeCoordinates(nodeId);
|
|
228
|
+
if (coord)
|
|
229
|
+
coords.push(coord);
|
|
230
|
+
}
|
|
231
|
+
used.add(nextMember.ref);
|
|
232
|
+
found = true;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (!found)
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
// Try to extend backward
|
|
240
|
+
while (true) {
|
|
241
|
+
let found = false;
|
|
242
|
+
const firstCoord = coords[0];
|
|
243
|
+
if (!firstCoord)
|
|
244
|
+
break;
|
|
245
|
+
for (const prevMember of wayMembers) {
|
|
246
|
+
if (used.has(prevMember.ref))
|
|
247
|
+
continue;
|
|
248
|
+
const prevWay = wayMap.get(prevMember.ref);
|
|
249
|
+
if (!prevWay || prevWay.refs.length < 2)
|
|
250
|
+
continue;
|
|
251
|
+
const prevStart = getNodeCoordinates(prevWay.refs[0]);
|
|
252
|
+
const prevEnd = getNodeCoordinates(prevWay.refs[prevWay.refs.length - 1]);
|
|
253
|
+
if (!prevStart || !prevEnd)
|
|
254
|
+
continue;
|
|
255
|
+
// Check if prev way connects to current start
|
|
256
|
+
if (firstCoord[0] === prevEnd[0] && firstCoord[1] === prevEnd[1]) {
|
|
257
|
+
// Connect normally (prepend)
|
|
258
|
+
const newCoords = [];
|
|
259
|
+
for (let i = 0; i < prevWay.refs.length - 1; i++) {
|
|
260
|
+
const nodeId = prevWay.refs[i];
|
|
261
|
+
if (nodeId === undefined)
|
|
262
|
+
continue;
|
|
263
|
+
const coord = getNodeCoordinates(nodeId);
|
|
264
|
+
if (coord)
|
|
265
|
+
newCoords.push(coord);
|
|
266
|
+
}
|
|
267
|
+
coords.unshift(...newCoords);
|
|
268
|
+
used.add(prevMember.ref);
|
|
269
|
+
found = true;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
if (firstCoord[0] === prevStart[0] && firstCoord[1] === prevStart[1]) {
|
|
273
|
+
// Need to reverse prev way (prepend reversed)
|
|
274
|
+
const newCoords = [];
|
|
275
|
+
for (let i = prevWay.refs.length - 1; i > 0; i--) {
|
|
276
|
+
const nodeId = prevWay.refs[i];
|
|
277
|
+
if (nodeId === undefined)
|
|
278
|
+
continue;
|
|
279
|
+
const coord = getNodeCoordinates(nodeId);
|
|
280
|
+
if (coord)
|
|
281
|
+
newCoords.push(coord);
|
|
282
|
+
}
|
|
283
|
+
coords.unshift(...newCoords);
|
|
284
|
+
used.add(prevMember.ref);
|
|
285
|
+
found = true;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (!found)
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
if (coords.length >= 2) {
|
|
293
|
+
lineStrings.push(coords);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return lineStrings;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Collect point coordinates from a point relation.
|
|
300
|
+
* Returns an array of LonLat coordinates from node members.
|
|
301
|
+
*/
|
|
302
|
+
export function collectRelationPoints(relation, getNodeCoordinates) {
|
|
303
|
+
const points = [];
|
|
304
|
+
for (const member of relation.members) {
|
|
305
|
+
if (member.type === "node") {
|
|
306
|
+
const coord = getNodeCoordinates(member.ref);
|
|
307
|
+
if (coord) {
|
|
308
|
+
points.push(coord);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
return points;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Resolve nested relation members, flattening the hierarchy with cycle detection.
|
|
316
|
+
* Returns all nodes, ways, and relations that are members (directly or indirectly).
|
|
317
|
+
* @param relation - The relation to resolve
|
|
318
|
+
* @param getRelation - Function to get a relation by ID
|
|
319
|
+
* @param maxDepth - Maximum recursion depth (default: 10)
|
|
320
|
+
* @param visited - Set of relation IDs already visited (for cycle detection)
|
|
321
|
+
*/
|
|
322
|
+
export function resolveRelationMembers(relation, getRelation, maxDepth = 10, visited = new Set()) {
|
|
323
|
+
const nodes = new Set();
|
|
324
|
+
const ways = new Set();
|
|
325
|
+
const relations = new Set();
|
|
326
|
+
// Cycle detection or max depth reached
|
|
327
|
+
if (visited.has(relation.id) || maxDepth <= 0) {
|
|
328
|
+
return { nodes: [], ways: [], relations: [] };
|
|
329
|
+
}
|
|
330
|
+
visited.add(relation.id);
|
|
331
|
+
for (const member of relation.members) {
|
|
332
|
+
if (member.type === "node") {
|
|
333
|
+
if (!nodes.has(member.ref)) {
|
|
334
|
+
nodes.add(member.ref);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else if (member.type === "way") {
|
|
338
|
+
if (!ways.has(member.ref)) {
|
|
339
|
+
ways.add(member.ref);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else if (member.type === "relation") {
|
|
343
|
+
if (!relations.has(member.ref)) {
|
|
344
|
+
relations.add(member.ref);
|
|
345
|
+
// Recursively resolve nested relation
|
|
346
|
+
const nestedRelation = getRelation(member.ref);
|
|
347
|
+
if (nestedRelation) {
|
|
348
|
+
const nested = resolveRelationMembers(nestedRelation, getRelation, maxDepth - 1, visited);
|
|
349
|
+
// Merge nested results
|
|
350
|
+
for (const nodeId of nested.nodes) {
|
|
351
|
+
if (!nodes.has(nodeId)) {
|
|
352
|
+
nodes.add(nodeId);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
for (const wayId of nested.ways) {
|
|
356
|
+
if (!ways.has(wayId)) {
|
|
357
|
+
ways.add(wayId);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
for (const relId of nested.relations) {
|
|
361
|
+
if (!relations.has(relId)) {
|
|
362
|
+
relations.add(relId);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return {
|
|
370
|
+
nodes: Array.from(nodes),
|
|
371
|
+
ways: Array.from(ways),
|
|
372
|
+
relations: Array.from(relations),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=relation-kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-kind.js","sourceRoot":"","sources":["../src/relation-kind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multipolygon relation building utilities.
|
|
3
|
+
*
|
|
4
|
+
* Implements the OSM multipolygon relation specification to construct
|
|
5
|
+
* polygon geometries from way members. Handles outer/inner roles,
|
|
6
|
+
* way connection, and ring closure.
|
|
7
|
+
*
|
|
8
|
+
* @see https://wiki.openstreetmap.org/wiki/Relation:multipolygon
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import type { LonLat, OsmRelation, OsmRelationMember, OsmWay } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Get way members from a relation, grouped by role (outer/inner).
|
|
15
|
+
*/
|
|
16
|
+
export declare function getWayMembersByRole(relation: OsmRelation): {
|
|
17
|
+
outer: OsmRelationMember[];
|
|
18
|
+
inner: OsmRelationMember[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Connect ways that share endpoints to form a continuous ring.
|
|
22
|
+
* Returns an array of rings (each ring is an array of way IDs in order).
|
|
23
|
+
*
|
|
24
|
+
* This function handles:
|
|
25
|
+
* - Ways that are reversed (end matches end, or start matches start).
|
|
26
|
+
* - Closed ways (single ways that form a ring).
|
|
27
|
+
* - Disconnected chains (multiple independent rings).
|
|
28
|
+
*/
|
|
29
|
+
export declare function connectWaysToRings(wayMembers: OsmWay[]): OsmWay[][];
|
|
30
|
+
/**
|
|
31
|
+
* Build polygon rings from way members of a relation.
|
|
32
|
+
* Returns an array where each element is an array of coordinate rings (outer + inner).
|
|
33
|
+
*
|
|
34
|
+
* Based on OSM multipolygon relation specification:
|
|
35
|
+
* https://wiki.openstreetmap.org/wiki/Relation:multipolygon
|
|
36
|
+
*
|
|
37
|
+
* This implementation connects way members into closed rings, and then groups them
|
|
38
|
+
* into polygons. Currently, it associates all inner rings with every outer ring
|
|
39
|
+
* found in the relation, which is a simplification. A robust implementation would
|
|
40
|
+
* use point-in-polygon checks to strictly nest holes inside their parent outer ring.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildRelationRings(relation: OsmRelation, getWay: (wayId: number) => OsmWay | null, getNodeCoordinates: (nodeId: number) => LonLat | undefined): LonLat[][][];
|
|
43
|
+
//# sourceMappingURL=relation-multipolygon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-multipolygon.d.ts","sourceRoot":"","sources":["../src/relation-multipolygon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAE7E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG;IAC3D,KAAK,EAAE,iBAAiB,EAAE,CAAA;IAC1B,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAC1B,CAeA;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAwGnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EACxC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GACxD,MAAM,EAAE,EAAE,EAAE,CAwDd"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multipolygon relation building utilities.
|
|
3
|
+
*
|
|
4
|
+
* Implements the OSM multipolygon relation specification to construct
|
|
5
|
+
* polygon geometries from way members. Handles outer/inner roles,
|
|
6
|
+
* way connection, and ring closure.
|
|
7
|
+
*
|
|
8
|
+
* @see https://wiki.openstreetmap.org/wiki/Relation:multipolygon
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Get way members from a relation, grouped by role (outer/inner).
|
|
14
|
+
*/
|
|
15
|
+
export function getWayMembersByRole(relation) {
|
|
16
|
+
const outer = [];
|
|
17
|
+
const inner = [];
|
|
18
|
+
for (const member of relation.members) {
|
|
19
|
+
if (member.type !== "way")
|
|
20
|
+
continue;
|
|
21
|
+
const role = member.role?.toLowerCase() ?? "";
|
|
22
|
+
if (role === "outer") {
|
|
23
|
+
outer.push(member);
|
|
24
|
+
}
|
|
25
|
+
else if (role === "inner") {
|
|
26
|
+
inner.push(member);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return { outer, inner };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Connect ways that share endpoints to form a continuous ring.
|
|
33
|
+
* Returns an array of rings (each ring is an array of way IDs in order).
|
|
34
|
+
*
|
|
35
|
+
* This function handles:
|
|
36
|
+
* - Ways that are reversed (end matches end, or start matches start).
|
|
37
|
+
* - Closed ways (single ways that form a ring).
|
|
38
|
+
* - Disconnected chains (multiple independent rings).
|
|
39
|
+
*/
|
|
40
|
+
export function connectWaysToRings(wayMembers) {
|
|
41
|
+
if (wayMembers.length === 0)
|
|
42
|
+
return [];
|
|
43
|
+
const rings = [];
|
|
44
|
+
const used = new Set();
|
|
45
|
+
const wayMap = new Map();
|
|
46
|
+
// Build map of way ID to member
|
|
47
|
+
for (const member of wayMembers) {
|
|
48
|
+
wayMap.set(member.id, member);
|
|
49
|
+
}
|
|
50
|
+
// Helper to reverse a way's refs
|
|
51
|
+
const reverseWay = (way) => ({
|
|
52
|
+
...way,
|
|
53
|
+
refs: [...way.refs].reverse(),
|
|
54
|
+
});
|
|
55
|
+
// Build rings by connecting ways
|
|
56
|
+
for (const startWay of wayMembers) {
|
|
57
|
+
if (used.has(startWay.id))
|
|
58
|
+
continue;
|
|
59
|
+
if (startWay.refs.length < 2)
|
|
60
|
+
throw Error("Way has less than 2 refs");
|
|
61
|
+
const ring = [startWay];
|
|
62
|
+
used.add(startWay.id);
|
|
63
|
+
let currentStart = startWay.refs[0];
|
|
64
|
+
let currentEnd = startWay.refs[startWay.refs.length - 1];
|
|
65
|
+
// Try to extend the ring forward
|
|
66
|
+
while (true) {
|
|
67
|
+
let found = false;
|
|
68
|
+
for (const nextWay of wayMembers) {
|
|
69
|
+
if (used.has(nextWay.id))
|
|
70
|
+
continue;
|
|
71
|
+
if (nextWay.refs.length < 2)
|
|
72
|
+
throw Error("Way has less than 2 refs");
|
|
73
|
+
const nextStart = nextWay.refs[0];
|
|
74
|
+
const nextEnd = nextWay.refs[nextWay.refs.length - 1];
|
|
75
|
+
// Check if next way connects to current end
|
|
76
|
+
if (currentEnd === nextStart) {
|
|
77
|
+
ring.push(nextWay);
|
|
78
|
+
used.add(nextWay.id);
|
|
79
|
+
currentEnd = nextEnd;
|
|
80
|
+
found = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (currentEnd === nextEnd) {
|
|
84
|
+
// Need to reverse next way
|
|
85
|
+
ring.push(reverseWay(nextWay));
|
|
86
|
+
used.add(nextWay.id);
|
|
87
|
+
currentEnd = nextStart;
|
|
88
|
+
found = true;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!found)
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
// Try to extend the ring backward
|
|
96
|
+
currentStart = startWay.refs[0];
|
|
97
|
+
currentEnd = startWay.refs[startWay.refs.length - 1];
|
|
98
|
+
while (true) {
|
|
99
|
+
let found = false;
|
|
100
|
+
for (const nextWay of wayMembers) {
|
|
101
|
+
if (used.has(nextWay.id))
|
|
102
|
+
continue;
|
|
103
|
+
if (nextWay.refs.length < 2)
|
|
104
|
+
throw Error("Way has less than 2 refs");
|
|
105
|
+
const nextStart = nextWay.refs[0];
|
|
106
|
+
const nextEnd = nextWay.refs[nextWay.refs.length - 1];
|
|
107
|
+
// Check if next way connects to current start
|
|
108
|
+
if (currentStart === nextEnd) {
|
|
109
|
+
ring.unshift(nextWay);
|
|
110
|
+
used.add(nextWay.id);
|
|
111
|
+
currentStart = nextStart;
|
|
112
|
+
found = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (currentStart === nextStart) {
|
|
116
|
+
// Need to reverse next way
|
|
117
|
+
ring.unshift(reverseWay(nextWay));
|
|
118
|
+
used.add(nextWay.id);
|
|
119
|
+
currentStart = nextEnd;
|
|
120
|
+
found = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!found)
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
// Only add ring if it's closed (first and last node are the same)
|
|
128
|
+
if (ring.length > 0) {
|
|
129
|
+
const firstWay = ring[0];
|
|
130
|
+
const lastWay = ring[ring.length - 1];
|
|
131
|
+
if (firstWay?.refs[0] === lastWay?.refs[lastWay.refs.length - 1]) {
|
|
132
|
+
rings.push(ring);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return rings;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Build polygon rings from way members of a relation.
|
|
140
|
+
* Returns an array where each element is an array of coordinate rings (outer + inner).
|
|
141
|
+
*
|
|
142
|
+
* Based on OSM multipolygon relation specification:
|
|
143
|
+
* https://wiki.openstreetmap.org/wiki/Relation:multipolygon
|
|
144
|
+
*
|
|
145
|
+
* This implementation connects way members into closed rings, and then groups them
|
|
146
|
+
* into polygons. Currently, it associates all inner rings with every outer ring
|
|
147
|
+
* found in the relation, which is a simplification. A robust implementation would
|
|
148
|
+
* use point-in-polygon checks to strictly nest holes inside their parent outer ring.
|
|
149
|
+
*/
|
|
150
|
+
export function buildRelationRings(relation, getWay, getNodeCoordinates) {
|
|
151
|
+
const { outer, inner } = getWayMembersByRole(relation);
|
|
152
|
+
// Connect outer ways into rings
|
|
153
|
+
const outerRings = connectWaysToRings(outer.map((m) => getWay(m.ref)).filter((w) => w !== null));
|
|
154
|
+
// Connect inner ways into rings
|
|
155
|
+
const innerRings = connectWaysToRings(inner.map((m) => getWay(m.ref)).filter((w) => w !== null));
|
|
156
|
+
const wayRingToCoords = (ring) => {
|
|
157
|
+
const coords = [];
|
|
158
|
+
for (const way of ring) {
|
|
159
|
+
for (const nodeId of way.refs) {
|
|
160
|
+
const coord = getNodeCoordinates(nodeId);
|
|
161
|
+
if (coord)
|
|
162
|
+
coords.push(coord);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Ensure ring is closed
|
|
166
|
+
if (coords.length > 0) {
|
|
167
|
+
const first = coords[0];
|
|
168
|
+
const last = coords[coords.length - 1];
|
|
169
|
+
if (first && last && (first[0] !== last[0] || first[1] !== last[1])) {
|
|
170
|
+
coords.push([first[0], first[1]]);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return coords;
|
|
174
|
+
};
|
|
175
|
+
// Convert way rings to coordinate rings
|
|
176
|
+
const coordinateRings = [];
|
|
177
|
+
for (const outerRing of outerRings) {
|
|
178
|
+
const outerCoordinates = wayRingToCoords(outerRing);
|
|
179
|
+
if (outerCoordinates.length >= 3) {
|
|
180
|
+
// Find inner rings that belong to this outer ring
|
|
181
|
+
const innerCoordinates = [];
|
|
182
|
+
for (const innerRing of innerRings) {
|
|
183
|
+
const innerCoords = wayRingToCoords(innerRing);
|
|
184
|
+
if (innerCoords.length >= 3) {
|
|
185
|
+
// TODO: do proper point-in-polygon test with https://github.com/rowanwins/point-in-polygon-hao
|
|
186
|
+
innerCoordinates.push(innerCoords);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Create polygon: [outer ring, ...inner rings]
|
|
190
|
+
coordinateRings.push([outerCoordinates, ...innerCoordinates]);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return coordinateRings;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=relation-multipolygon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation-multipolygon.js","sourceRoot":"","sources":["../src/relation-multipolygon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Rgba } from "./types";
|
|
2
|
+
export declare function normalizeHexColor(value: string | number | null | undefined): string | undefined;
|
|
3
|
+
export declare function hexColorToRgba(value: string | number | null | undefined): Rgba | undefined;
|
|
4
|
+
//# sourceMappingURL=color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../src/color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAInC,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAiBpB;AAED,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,IAAI,GAAG,SAAS,CASlB"}
|