@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 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.7",
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.7",
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.2",
50
+ "@osmix/core": "0.1.5",
51
51
  "typescript": "^5.9.0"
52
52
  }
53
53
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/tsconfig",
3
3
  "extends": "./tsconfig.json",
4
- "include": ["src"]
4
+ "include": ["src"],
5
+ "exclude": ["**/*.test.ts"]
5
6
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=encode.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encode.test.d.ts","sourceRoot":"","sources":["../src/encode.test.ts"],"names":[],"mappings":""}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"encode.test.js","sourceRoot":"","sources":["../src/encode.test.ts"],"names":[],"mappings":"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"}