@osmix/vt 0.0.7 → 0.0.10
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 +23 -0
- package/package.json +3 -3
- package/tsconfig.build.json +2 -1
- package/dist/encode.test.d.ts +0 -2
- package/dist/encode.test.d.ts.map +0 -1
- package/dist/encode.test.js +0 -431
- package/dist/encode.test.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
1
|
# @osmix/vt
|
|
2
2
|
|
|
3
|
+
## 0.0.10
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [12728ed]
|
|
8
|
+
- @osmix/shared@0.0.10
|
|
9
|
+
|
|
10
|
+
## 0.0.9
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- f32e4ee: General cleanup
|
|
15
|
+
- Updated dependencies [f32e4ee]
|
|
16
|
+
- @osmix/shared@0.0.9
|
|
17
|
+
|
|
18
|
+
## 0.0.8
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- f468db5: Fix publishing (2)
|
|
23
|
+
- Updated dependencies [f468db5]
|
|
24
|
+
- @osmix/shared@0.0.8
|
|
25
|
+
|
|
3
26
|
## 0.0.7
|
|
4
27
|
|
|
5
28
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@osmix/vt",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.10",
|
|
6
6
|
"description": "Encode Osmix binary overlay tiles directly into Mapbox Vector Tiles",
|
|
7
7
|
"main": "./src/index.ts",
|
|
8
8
|
"publishConfig": {
|
|
@@ -41,13 +41,13 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@types/bun": "^1.3.3",
|
|
44
|
-
"@osmix/shared": "0.0.
|
|
44
|
+
"@osmix/shared": "0.0.10",
|
|
45
45
|
"pbf": "^4.0.1"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@mapbox/tilebelt": "^2.0.3",
|
|
49
49
|
"@mapbox/vector-tile": "^2.0.4",
|
|
50
|
-
"@osmix/core": "0.1.
|
|
50
|
+
"@osmix/core": "0.1.5",
|
|
51
51
|
"typescript": "^5.9.0"
|
|
52
52
|
}
|
|
53
53
|
}
|
package/tsconfig.build.json
CHANGED
package/dist/encode.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encode.test.d.ts","sourceRoot":"","sources":["../src/encode.test.ts"],"names":[],"mappings":""}
|
package/dist/encode.test.js
DELETED
|
@@ -1,431 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { pointToTile } from "@mapbox/tilebelt";
|
|
3
|
-
import { VectorTile } from "@mapbox/vector-tile";
|
|
4
|
-
import { Osm } from "@osmix/core";
|
|
5
|
-
import { llToTilePx } from "@osmix/shared/tile";
|
|
6
|
-
import { decodeZigzag } from "@osmix/shared/zigzag";
|
|
7
|
-
import Protobuf from "pbf";
|
|
8
|
-
import { OsmixVtEncoder } from "./encode";
|
|
9
|
-
const osm = new Osm();
|
|
10
|
-
osm.nodes.addNode({
|
|
11
|
-
id: 1,
|
|
12
|
-
lat: 40,
|
|
13
|
-
lon: -74,
|
|
14
|
-
tags: {
|
|
15
|
-
name: "Test Node",
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
// Add nodes for way
|
|
19
|
-
osm.nodes.addNode({
|
|
20
|
-
id: 2,
|
|
21
|
-
lat: 40.72,
|
|
22
|
-
lon: -74.01,
|
|
23
|
-
});
|
|
24
|
-
osm.nodes.addNode({
|
|
25
|
-
id: 3,
|
|
26
|
-
lat: 40.715,
|
|
27
|
-
lon: -74.005,
|
|
28
|
-
});
|
|
29
|
-
osm.nodes.addNode({
|
|
30
|
-
id: 4,
|
|
31
|
-
lat: 40.7122,
|
|
32
|
-
lon: -74.001,
|
|
33
|
-
});
|
|
34
|
-
osm.ways.addWay({
|
|
35
|
-
id: 5,
|
|
36
|
-
refs: [1, 2],
|
|
37
|
-
tags: { highway: "primary", color: "ff0000" },
|
|
38
|
-
});
|
|
39
|
-
osm.buildIndexes();
|
|
40
|
-
osm.buildSpatialIndexes();
|
|
41
|
-
const WAY_LAYER_ID = `@osmix:${osm.id}:ways`;
|
|
42
|
-
const NODE_LAYER_ID = `@osmix:${osm.id}:nodes`;
|
|
43
|
-
function decodeTile(data) {
|
|
44
|
-
const tile = new VectorTile(new Protobuf(data));
|
|
45
|
-
return tile.layers;
|
|
46
|
-
}
|
|
47
|
-
const extent = 4096;
|
|
48
|
-
function bboxToTile(bbox, z = 8) {
|
|
49
|
-
const [minX, minY, maxX, maxY] = bbox;
|
|
50
|
-
const centerLon = (minX + maxX) / 2;
|
|
51
|
-
const centerLat = (minY + maxY) / 2;
|
|
52
|
-
return pointToTile(centerLon, centerLat, z);
|
|
53
|
-
}
|
|
54
|
-
describe("OsmixVtEncoder", () => {
|
|
55
|
-
it("encodes nodes and ways with expected metadata", () => {
|
|
56
|
-
const bbox = osm.bbox();
|
|
57
|
-
const tile = bboxToTile(bbox);
|
|
58
|
-
const encoder = new OsmixVtEncoder(osm);
|
|
59
|
-
const result = encoder.getTile(tile);
|
|
60
|
-
expect(result.byteLength).toBeGreaterThan(0);
|
|
61
|
-
const layers = decodeTile(result);
|
|
62
|
-
expect(layers[NODE_LAYER_ID]).toBeDefined();
|
|
63
|
-
expect(layers[NODE_LAYER_ID]?.length).toBe(1);
|
|
64
|
-
expect(layers[WAY_LAYER_ID]).toBeDefined();
|
|
65
|
-
expect(layers[WAY_LAYER_ID]?.length).toBe(1);
|
|
66
|
-
const nodeLayer = layers[NODE_LAYER_ID];
|
|
67
|
-
const wayLayer = layers[WAY_LAYER_ID];
|
|
68
|
-
if (!nodeLayer || !wayLayer)
|
|
69
|
-
throw new Error("Layers not found");
|
|
70
|
-
const features = [nodeLayer.feature(0), wayLayer.feature(0)];
|
|
71
|
-
const node = features.find((feature) => feature.properties["type"] === "node");
|
|
72
|
-
// IDs are zigzag-encoded, so decode them
|
|
73
|
-
if (node?.id !== undefined) {
|
|
74
|
-
const decodedId = decodeZigzag(node.id);
|
|
75
|
-
expect(decodedId).toBe(1);
|
|
76
|
-
}
|
|
77
|
-
expect(node?.type).toBe(1);
|
|
78
|
-
const nodeGeom = node?.loadGeometry();
|
|
79
|
-
expect(nodeGeom?.[0]?.[0]?.x).toBeTypeOf("number");
|
|
80
|
-
expect(nodeGeom?.[0]?.[0]?.y).toBeTypeOf("number");
|
|
81
|
-
const way = features.find((feature) => feature.properties["type"] === "way");
|
|
82
|
-
// IDs are zigzag-encoded, so decode them
|
|
83
|
-
if (way?.id !== undefined) {
|
|
84
|
-
const decodedId = decodeZigzag(way.id);
|
|
85
|
-
expect(decodedId).toBe(5);
|
|
86
|
-
}
|
|
87
|
-
expect(way?.type).toBe(2);
|
|
88
|
-
expect(way?.properties["color"]).toBe("#FF0000");
|
|
89
|
-
const wayGeom = way?.loadGeometry();
|
|
90
|
-
expect(wayGeom?.[0]?.length).toBeGreaterThanOrEqual(2);
|
|
91
|
-
});
|
|
92
|
-
it("encodes area ways as polygons with proper winding order", () => {
|
|
93
|
-
const testOsm = new Osm();
|
|
94
|
-
// Create a closed way that should be treated as an area
|
|
95
|
-
testOsm.nodes.addNode({ id: 10, lat: 40.7, lon: -74.0 });
|
|
96
|
-
testOsm.nodes.addNode({ id: 11, lat: 40.71, lon: -74.0 });
|
|
97
|
-
testOsm.nodes.addNode({ id: 12, lat: 40.71, lon: -74.01 });
|
|
98
|
-
testOsm.nodes.addNode({ id: 13, lat: 40.7, lon: -74.01 });
|
|
99
|
-
testOsm.ways.addWay({
|
|
100
|
-
id: 20,
|
|
101
|
-
refs: [10, 11, 12, 13, 10], // Closed ring
|
|
102
|
-
tags: { building: "yes", area: "yes" },
|
|
103
|
-
});
|
|
104
|
-
testOsm.buildIndexes();
|
|
105
|
-
testOsm.buildSpatialIndexes();
|
|
106
|
-
const bbox = testOsm.bbox();
|
|
107
|
-
const tile = bboxToTile(bbox);
|
|
108
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
109
|
-
const result = encoder.getTile(tile);
|
|
110
|
-
const layers = decodeTile(result);
|
|
111
|
-
const wayLayer = layers[`@osmix:${testOsm.id}:ways`];
|
|
112
|
-
expect(wayLayer?.length).toBe(1);
|
|
113
|
-
const feature = wayLayer?.feature(0);
|
|
114
|
-
if (!feature)
|
|
115
|
-
throw new Error("Feature not found");
|
|
116
|
-
expect(feature.type).toBe(3); // POLYGON type
|
|
117
|
-
expect(feature.properties["type"]).toBe("way");
|
|
118
|
-
expect(feature.properties["building"]).toBe("yes");
|
|
119
|
-
const geometry = feature.loadGeometry();
|
|
120
|
-
expect(geometry.length).toBeGreaterThan(0);
|
|
121
|
-
// Should have at least one ring (outer ring)
|
|
122
|
-
expect(geometry[0]?.length).toBeGreaterThanOrEqual(4); // At least 4 points for a polygon
|
|
123
|
-
});
|
|
124
|
-
it("handles multiple rings for polygons (infrastructure for holes)", () => {
|
|
125
|
-
const testOsm = new Osm();
|
|
126
|
-
// Create an area way
|
|
127
|
-
testOsm.nodes.addNode({ id: 20, lat: 40.7, lon: -74.0 });
|
|
128
|
-
testOsm.nodes.addNode({ id: 21, lat: 40.71, lon: -74.0 });
|
|
129
|
-
testOsm.nodes.addNode({ id: 22, lat: 40.71, lon: -74.01 });
|
|
130
|
-
testOsm.nodes.addNode({ id: 23, lat: 40.7, lon: -74.01 });
|
|
131
|
-
testOsm.ways.addWay({
|
|
132
|
-
id: 30,
|
|
133
|
-
refs: [20, 21, 22, 23, 20],
|
|
134
|
-
tags: { building: "yes", area: "yes" },
|
|
135
|
-
});
|
|
136
|
-
testOsm.buildIndexes();
|
|
137
|
-
testOsm.buildSpatialIndexes();
|
|
138
|
-
const bbox = testOsm.bbox();
|
|
139
|
-
const tile = bboxToTile(bbox);
|
|
140
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
141
|
-
// Test that clipProjectedPolygon returns array of rings
|
|
142
|
-
const way = testOsm.ways.getById(30);
|
|
143
|
-
expect(way).toBeDefined();
|
|
144
|
-
const points = way.refs.map((ref) => {
|
|
145
|
-
const node = testOsm.nodes.getById(ref);
|
|
146
|
-
return llToTilePx([node.lon, node.lat], tile, extent);
|
|
147
|
-
});
|
|
148
|
-
const clippedRings = encoder["clipProjectedPolygon"](points);
|
|
149
|
-
expect(Array.isArray(clippedRings)).toBe(true);
|
|
150
|
-
expect(clippedRings.length).toBeGreaterThan(0);
|
|
151
|
-
expect(Array.isArray(clippedRings[0])).toBe(true);
|
|
152
|
-
});
|
|
153
|
-
it("processes polygon rings with correct winding order (outer clockwise, inner counterclockwise)", () => {
|
|
154
|
-
const testOsm = new Osm();
|
|
155
|
-
testOsm.nodes.addNode({ id: 30, lat: 40.7, lon: -74.0 });
|
|
156
|
-
testOsm.nodes.addNode({ id: 31, lat: 40.71, lon: -74.0 });
|
|
157
|
-
testOsm.nodes.addNode({ id: 32, lat: 40.71, lon: -74.01 });
|
|
158
|
-
testOsm.nodes.addNode({ id: 33, lat: 40.7, lon: -74.01 });
|
|
159
|
-
testOsm.ways.addWay({
|
|
160
|
-
id: 40,
|
|
161
|
-
refs: [30, 31, 32, 33, 30],
|
|
162
|
-
tags: { building: "yes", area: "yes" },
|
|
163
|
-
});
|
|
164
|
-
testOsm.buildIndexes();
|
|
165
|
-
testOsm.buildSpatialIndexes();
|
|
166
|
-
const bbox = testOsm.bbox();
|
|
167
|
-
const tile = bboxToTile(bbox);
|
|
168
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
169
|
-
const way = testOsm.ways.getById(40);
|
|
170
|
-
const points = way.refs.map((ref) => {
|
|
171
|
-
const node = testOsm.nodes.getById(ref);
|
|
172
|
-
return llToTilePx([node.lon, node.lat], tile, extent);
|
|
173
|
-
});
|
|
174
|
-
const clippedRings = encoder["clipProjectedPolygon"](points);
|
|
175
|
-
const outerRing = clippedRings[0];
|
|
176
|
-
expect(outerRing).toBeDefined();
|
|
177
|
-
// Process as outer ring (should be clockwise)
|
|
178
|
-
const processedOuter = encoder["processClippedPolygonRing"](outerRing, true);
|
|
179
|
-
expect(processedOuter.length).toBeGreaterThan(0);
|
|
180
|
-
// Process as inner ring (should be counterclockwise)
|
|
181
|
-
const processedInner = encoder["processClippedPolygonRing"](outerRing, false);
|
|
182
|
-
expect(processedInner.length).toBeGreaterThan(0);
|
|
183
|
-
// Verify they have opposite winding (area should have opposite signs)
|
|
184
|
-
const outerArea = processedOuter.reduce((sum, p, i) => {
|
|
185
|
-
const next = processedOuter[(i + 1) % processedOuter.length];
|
|
186
|
-
if (!next)
|
|
187
|
-
return sum;
|
|
188
|
-
return sum + (p[0] * next[1] - next[0] * p[1]);
|
|
189
|
-
}, 0);
|
|
190
|
-
const innerArea = processedInner.reduce((sum, p, i) => {
|
|
191
|
-
const next = processedInner[(i + 1) % processedInner.length];
|
|
192
|
-
if (!next)
|
|
193
|
-
return sum;
|
|
194
|
-
return sum + (p[0] * next[1] - next[0] * p[1]);
|
|
195
|
-
}, 0);
|
|
196
|
-
// Outer should be clockwise (negative area), inner should be counterclockwise (positive area)
|
|
197
|
-
expect(outerArea).toBeLessThan(0);
|
|
198
|
-
expect(innerArea).toBeGreaterThan(0);
|
|
199
|
-
});
|
|
200
|
-
it("encodes multipolygon relation with correct winding order", () => {
|
|
201
|
-
const testOsm = new Osm();
|
|
202
|
-
// Create nodes for outer square
|
|
203
|
-
testOsm.nodes.addNode({ id: 1, lat: -1.0, lon: -1.0 });
|
|
204
|
-
testOsm.nodes.addNode({ id: 2, lat: -1.0, lon: 1.0 });
|
|
205
|
-
testOsm.nodes.addNode({ id: 3, lat: 1.0, lon: 1.0 });
|
|
206
|
-
testOsm.nodes.addNode({ id: 4, lat: 1.0, lon: -1.0 });
|
|
207
|
-
// Create nodes for inner triangle
|
|
208
|
-
testOsm.nodes.addNode({ id: 5, lat: -0.5, lon: 0.0 });
|
|
209
|
-
testOsm.nodes.addNode({ id: 6, lat: 0.5, lon: 0.0 });
|
|
210
|
-
testOsm.nodes.addNode({ id: 7, lat: 0.0, lon: 0.5 });
|
|
211
|
-
// Create outer way
|
|
212
|
-
testOsm.ways.addWay({
|
|
213
|
-
id: 10,
|
|
214
|
-
refs: [1, 2, 3, 4, 1],
|
|
215
|
-
tags: {},
|
|
216
|
-
});
|
|
217
|
-
// Create inner way
|
|
218
|
-
testOsm.ways.addWay({
|
|
219
|
-
id: 11,
|
|
220
|
-
refs: [5, 6, 7, 5],
|
|
221
|
-
tags: {},
|
|
222
|
-
});
|
|
223
|
-
// Create multipolygon relation
|
|
224
|
-
testOsm.relations.addRelation({
|
|
225
|
-
id: 20,
|
|
226
|
-
tags: { type: "multipolygon", name: "test" },
|
|
227
|
-
members: [
|
|
228
|
-
{ type: "way", ref: 10, role: "outer" },
|
|
229
|
-
{ type: "way", ref: 11, role: "inner" },
|
|
230
|
-
],
|
|
231
|
-
});
|
|
232
|
-
testOsm.buildIndexes();
|
|
233
|
-
testOsm.buildSpatialIndexes();
|
|
234
|
-
const bbox = [-2, -2, 2, 2];
|
|
235
|
-
const tile = bboxToTile(bbox);
|
|
236
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
237
|
-
const features = Array.from(encoder.relationFeatures(bbox, (ll) => llToTilePx(ll, tile, extent)));
|
|
238
|
-
expect(features.length).toBeGreaterThan(0);
|
|
239
|
-
const relationFeature = features[0];
|
|
240
|
-
expect(relationFeature).toBeDefined();
|
|
241
|
-
expect(relationFeature?.type).toBe(3); // POLYGON
|
|
242
|
-
const geometry = relationFeature?.geometry;
|
|
243
|
-
expect(geometry).toBeDefined();
|
|
244
|
-
expect(Array.isArray(geometry)).toBe(true);
|
|
245
|
-
if (geometry && Array.isArray(geometry) && geometry.length > 0) {
|
|
246
|
-
const outerRing = geometry[0];
|
|
247
|
-
expect(outerRing).toBeDefined();
|
|
248
|
-
if (outerRing && Array.isArray(outerRing) && outerRing.length > 0) {
|
|
249
|
-
// Verify outer ring is clockwise (negative signed area)
|
|
250
|
-
const outerArea = outerRing.reduce((sum, p, i) => {
|
|
251
|
-
const next = outerRing[(i + 1) % outerRing.length];
|
|
252
|
-
if (!next)
|
|
253
|
-
return sum;
|
|
254
|
-
return sum + (p[0] * next[1] - next[0] * p[1]);
|
|
255
|
-
}, 0);
|
|
256
|
-
expect(outerArea).toBeLessThan(0); // Clockwise
|
|
257
|
-
// If there's an inner ring, verify it's counterclockwise
|
|
258
|
-
if (geometry.length > 1) {
|
|
259
|
-
const innerRing = geometry[1];
|
|
260
|
-
if (innerRing && Array.isArray(innerRing) && innerRing.length > 0) {
|
|
261
|
-
const innerArea = innerRing.reduce((sum, p, i) => {
|
|
262
|
-
const next = innerRing[(i + 1) % innerRing.length];
|
|
263
|
-
if (!next)
|
|
264
|
-
return sum;
|
|
265
|
-
return sum + (p[0] * next[1] - next[0] * p[1]);
|
|
266
|
-
}, 0);
|
|
267
|
-
expect(innerArea).toBeGreaterThan(0); // Counterclockwise
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
it("encodes area way as polygon with correct winding order", () => {
|
|
274
|
-
const testOsm = new Osm();
|
|
275
|
-
// Create a square polygon
|
|
276
|
-
testOsm.nodes.addNode({ id: 1, lat: 40.7, lon: -74.0 });
|
|
277
|
-
testOsm.nodes.addNode({ id: 2, lat: 40.71, lon: -74.0 });
|
|
278
|
-
testOsm.nodes.addNode({ id: 3, lat: 40.71, lon: -74.01 });
|
|
279
|
-
testOsm.nodes.addNode({ id: 4, lat: 40.7, lon: -74.01 });
|
|
280
|
-
testOsm.ways.addWay({
|
|
281
|
-
id: 10,
|
|
282
|
-
refs: [1, 2, 3, 4, 1],
|
|
283
|
-
tags: { area: "yes", building: "yes" },
|
|
284
|
-
});
|
|
285
|
-
testOsm.buildIndexes();
|
|
286
|
-
testOsm.buildSpatialIndexes();
|
|
287
|
-
const bbox = testOsm.bbox();
|
|
288
|
-
const tile = bboxToTile(bbox);
|
|
289
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
290
|
-
const features = Array.from(encoder.wayFeatures(bbox, (ll) => llToTilePx(ll, tile, extent)));
|
|
291
|
-
const polygonFeature = features.find((f) => f.type === 3); // POLYGON
|
|
292
|
-
expect(polygonFeature).toBeDefined();
|
|
293
|
-
if (polygonFeature?.geometry) {
|
|
294
|
-
const geometry = polygonFeature.geometry;
|
|
295
|
-
if (Array.isArray(geometry) && geometry.length > 0) {
|
|
296
|
-
const ring = geometry[0];
|
|
297
|
-
if (ring && Array.isArray(ring) && ring.length > 0) {
|
|
298
|
-
// Verify clockwise winding (negative area)
|
|
299
|
-
const area = ring.reduce((sum, p, i) => {
|
|
300
|
-
const next = ring[(i + 1) % ring.length];
|
|
301
|
-
if (!next)
|
|
302
|
-
return sum;
|
|
303
|
-
return sum + (p[0] * next[1] - next[0] * p[1]);
|
|
304
|
-
}, 0);
|
|
305
|
-
expect(area).toBeLessThan(0); // Should be clockwise for MVT
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
it("encodes negative IDs correctly", () => {
|
|
311
|
-
const testOsm = new Osm();
|
|
312
|
-
// Create nodes with negative IDs (like from GeoJSON import)
|
|
313
|
-
testOsm.nodes.addNode({
|
|
314
|
-
id: -1,
|
|
315
|
-
lat: 40.7,
|
|
316
|
-
lon: -74.0,
|
|
317
|
-
tags: { name: "Negative Node" },
|
|
318
|
-
});
|
|
319
|
-
testOsm.nodes.addNode({
|
|
320
|
-
id: -2,
|
|
321
|
-
lat: 40.71,
|
|
322
|
-
lon: -74.01,
|
|
323
|
-
tags: { name: "Another Negative Node" },
|
|
324
|
-
});
|
|
325
|
-
testOsm.ways.addWay({
|
|
326
|
-
id: -10,
|
|
327
|
-
refs: [-1, -2],
|
|
328
|
-
tags: { highway: "primary" },
|
|
329
|
-
});
|
|
330
|
-
testOsm.buildIndexes();
|
|
331
|
-
testOsm.buildSpatialIndexes();
|
|
332
|
-
const bbox = testOsm.bbox();
|
|
333
|
-
const tile = bboxToTile(bbox);
|
|
334
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
335
|
-
const result = encoder.getTile(tile);
|
|
336
|
-
expect(result.byteLength).toBeGreaterThan(0);
|
|
337
|
-
const layers = decodeTile(result);
|
|
338
|
-
const nodeLayer = layers[NODE_LAYER_ID];
|
|
339
|
-
const wayLayer = layers[WAY_LAYER_ID];
|
|
340
|
-
expect(nodeLayer).toBeDefined();
|
|
341
|
-
expect(wayLayer).toBeDefined();
|
|
342
|
-
// Check that negative IDs are zigzag-encoded and can be decoded back
|
|
343
|
-
if (nodeLayer && nodeLayer.length > 0) {
|
|
344
|
-
const nodeFeature = nodeLayer.feature(0);
|
|
345
|
-
// IDs are zigzag-encoded, so decode them
|
|
346
|
-
if (nodeFeature.id !== undefined) {
|
|
347
|
-
const decodedId = decodeZigzag(nodeFeature.id);
|
|
348
|
-
expect(decodedId).toBe(-1);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
if (wayLayer && wayLayer.length > 0) {
|
|
352
|
-
const wayFeature = wayLayer.feature(0);
|
|
353
|
-
// IDs are zigzag-encoded, so decode them
|
|
354
|
-
if (wayFeature.id !== undefined) {
|
|
355
|
-
const decodedId = decodeZigzag(wayFeature.id);
|
|
356
|
-
expect(decodedId).toBe(-10);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
it("accepts IDs at the boundaries of safe integer range", () => {
|
|
361
|
-
const testOsm = new Osm();
|
|
362
|
-
// Add nodes for ways to reference
|
|
363
|
-
testOsm.nodes.addNode({ id: 1, lat: 40.7, lon: -74.0 });
|
|
364
|
-
testOsm.nodes.addNode({ id: 2, lat: 40.71, lon: -74.01 });
|
|
365
|
-
// Test minimum valid ID (way)
|
|
366
|
-
testOsm.ways.addWay({
|
|
367
|
-
id: -Number.MAX_SAFE_INTEGER,
|
|
368
|
-
refs: [1, 2],
|
|
369
|
-
tags: { highway: "primary" },
|
|
370
|
-
});
|
|
371
|
-
// Test maximum valid ID (node with tags)
|
|
372
|
-
testOsm.nodes.addNode({
|
|
373
|
-
id: Number.MAX_SAFE_INTEGER,
|
|
374
|
-
lat: 40.72,
|
|
375
|
-
lon: -74.02,
|
|
376
|
-
tags: { name: "Max ID" },
|
|
377
|
-
});
|
|
378
|
-
testOsm.buildIndexes();
|
|
379
|
-
testOsm.buildSpatialIndexes();
|
|
380
|
-
const bbox = testOsm.bbox();
|
|
381
|
-
const tile = bboxToTile(bbox);
|
|
382
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
383
|
-
// Should not throw - this verifies the IDs are within the valid range
|
|
384
|
-
const result = encoder.getTile(tile);
|
|
385
|
-
expect(result.byteLength).toBeGreaterThan(0);
|
|
386
|
-
});
|
|
387
|
-
it("encodes and decodes large negative IDs correctly", () => {
|
|
388
|
-
const testOsm = new Osm();
|
|
389
|
-
// Test with a large negative ID (much larger than 32-bit range)
|
|
390
|
-
const largeNegativeId = -1000000000; // -1 billion
|
|
391
|
-
// Add a node for the way to reference
|
|
392
|
-
testOsm.nodes.addNode({ id: 1, lat: 40.71, lon: -74.01 });
|
|
393
|
-
testOsm.nodes.addNode({
|
|
394
|
-
id: largeNegativeId,
|
|
395
|
-
lat: 40.7,
|
|
396
|
-
lon: -74.0,
|
|
397
|
-
tags: { name: "Large Negative ID" },
|
|
398
|
-
});
|
|
399
|
-
// Add a dummy way so way spatial index can be built
|
|
400
|
-
testOsm.ways.addWay({
|
|
401
|
-
id: 100,
|
|
402
|
-
refs: [1],
|
|
403
|
-
tags: {},
|
|
404
|
-
});
|
|
405
|
-
testOsm.buildIndexes();
|
|
406
|
-
testOsm.buildSpatialIndexes();
|
|
407
|
-
const bbox = testOsm.bbox();
|
|
408
|
-
const tile = bboxToTile(bbox);
|
|
409
|
-
const encoder = new OsmixVtEncoder(testOsm);
|
|
410
|
-
const result = encoder.getTile(tile);
|
|
411
|
-
const layers = decodeTile(result);
|
|
412
|
-
const nodeLayer = layers[NODE_LAYER_ID];
|
|
413
|
-
expect(nodeLayer).toBeDefined();
|
|
414
|
-
if (nodeLayer && nodeLayer.length > 0) {
|
|
415
|
-
// Find the node with the large negative ID
|
|
416
|
-
let found = false;
|
|
417
|
-
for (let i = 0; i < nodeLayer.length; i++) {
|
|
418
|
-
const nodeFeature = nodeLayer.feature(i);
|
|
419
|
-
if (nodeFeature.id !== undefined) {
|
|
420
|
-
const decodedId = decodeZigzag(nodeFeature.id);
|
|
421
|
-
if (decodedId === largeNegativeId) {
|
|
422
|
-
found = true;
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
expect(found).toBe(true);
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
});
|
|
431
|
-
//# sourceMappingURL=encode.test.js.map
|
package/dist/encode.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encode.test.js","sourceRoot":"","sources":["../src/encode.test.ts"],"names":[],"mappings":"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"}
|