@osmix/core 0.0.1 → 0.0.6

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.
Files changed (107) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/README.md +118 -107
  3. package/dist/core/src/entities.d.ts +114 -0
  4. package/dist/core/src/entities.d.ts.map +1 -0
  5. package/dist/core/src/entities.js +152 -0
  6. package/dist/core/src/entities.js.map +1 -0
  7. package/dist/core/src/ids.d.ts +113 -0
  8. package/dist/core/src/ids.d.ts.map +1 -0
  9. package/dist/core/src/ids.js +236 -0
  10. package/dist/core/src/ids.js.map +1 -0
  11. package/dist/core/src/index.d.ts +32 -0
  12. package/dist/core/src/index.d.ts.map +1 -0
  13. package/dist/core/src/index.js +35 -0
  14. package/dist/core/src/index.js.map +1 -0
  15. package/dist/core/src/nodes.d.ts +101 -0
  16. package/dist/core/src/nodes.d.ts.map +1 -0
  17. package/dist/core/src/nodes.js +309 -0
  18. package/dist/core/src/nodes.js.map +1 -0
  19. package/dist/core/src/osm.d.ts +74 -0
  20. package/dist/core/src/osm.d.ts.map +1 -0
  21. package/dist/core/src/osm.js +120 -0
  22. package/dist/core/src/osm.js.map +1 -0
  23. package/dist/core/src/relations.d.ts +118 -0
  24. package/dist/core/src/relations.d.ts.map +1 -0
  25. package/dist/core/src/relations.js +412 -0
  26. package/dist/core/src/relations.js.map +1 -0
  27. package/dist/core/src/stringtable.d.ts +95 -0
  28. package/dist/core/src/stringtable.d.ts.map +1 -0
  29. package/dist/core/src/stringtable.js +170 -0
  30. package/dist/core/src/stringtable.js.map +1 -0
  31. package/dist/core/src/tags.d.ts +126 -0
  32. package/dist/core/src/tags.d.ts.map +1 -0
  33. package/dist/core/src/tags.js +228 -0
  34. package/dist/core/src/tags.js.map +1 -0
  35. package/dist/core/src/typed-arrays.d.ts +124 -0
  36. package/dist/core/src/typed-arrays.d.ts.map +1 -0
  37. package/dist/core/src/typed-arrays.js +198 -0
  38. package/dist/core/src/typed-arrays.js.map +1 -0
  39. package/dist/core/src/utils.d.ts +11 -0
  40. package/dist/core/src/utils.d.ts.map +1 -0
  41. package/dist/core/src/utils.js +26 -0
  42. package/dist/core/src/utils.js.map +1 -0
  43. package/dist/core/src/ways.d.ts +101 -0
  44. package/dist/core/src/ways.d.ts.map +1 -0
  45. package/dist/core/src/ways.js +336 -0
  46. package/dist/core/src/ways.js.map +1 -0
  47. package/dist/core/test/memory.test.d.ts +7 -0
  48. package/dist/core/test/memory.test.d.ts.map +1 -0
  49. package/dist/core/test/memory.test.js +29 -0
  50. package/dist/core/test/memory.test.js.map +1 -0
  51. package/dist/core/test/mock-osm.d.ts +13 -0
  52. package/dist/core/test/mock-osm.d.ts.map +1 -0
  53. package/dist/core/test/mock-osm.js +122 -0
  54. package/dist/core/test/mock-osm.js.map +1 -0
  55. package/dist/core/test/tags-search.test.d.ts +2 -0
  56. package/dist/core/test/tags-search.test.d.ts.map +1 -0
  57. package/dist/core/test/tags-search.test.js +56 -0
  58. package/dist/core/test/tags-search.test.js.map +1 -0
  59. package/dist/core/test/typed-arrays.test.d.ts +2 -0
  60. package/dist/core/test/typed-arrays.test.d.ts.map +1 -0
  61. package/dist/core/test/typed-arrays.test.js +102 -0
  62. package/dist/core/test/typed-arrays.test.js.map +1 -0
  63. package/dist/osmix/src/extract.d.ts +43 -0
  64. package/dist/osmix/src/extract.d.ts.map +1 -0
  65. package/dist/osmix/src/extract.js +156 -0
  66. package/dist/osmix/src/extract.js.map +1 -0
  67. package/dist/osmix/src/pbf.d.ts +55 -0
  68. package/dist/osmix/src/pbf.d.ts.map +1 -0
  69. package/dist/osmix/src/pbf.js +187 -0
  70. package/dist/osmix/src/pbf.js.map +1 -0
  71. package/dist/osmix/src/utils.d.ts +36 -0
  72. package/dist/osmix/src/utils.d.ts.map +1 -0
  73. package/dist/osmix/src/utils.js +108 -0
  74. package/dist/osmix/src/utils.js.map +1 -0
  75. package/dist/osmix/test/extract.bench.d.ts +2 -0
  76. package/dist/osmix/test/extract.bench.d.ts.map +1 -0
  77. package/dist/osmix/test/extract.bench.js +26 -0
  78. package/dist/osmix/test/extract.bench.js.map +1 -0
  79. package/dist/osmix/test/extract.test.d.ts +2 -0
  80. package/dist/osmix/test/extract.test.d.ts.map +1 -0
  81. package/dist/osmix/test/extract.test.js +392 -0
  82. package/dist/osmix/test/extract.test.js.map +1 -0
  83. package/package.json +11 -11
  84. package/src/entities.ts +138 -22
  85. package/src/ids.ts +117 -45
  86. package/src/index.ts +34 -5
  87. package/src/nodes.ts +237 -58
  88. package/src/osm.ts +174 -0
  89. package/src/relations.ts +383 -54
  90. package/src/stringtable.ts +111 -36
  91. package/src/tags.ts +207 -46
  92. package/src/typed-arrays.ts +97 -10
  93. package/src/types/geoflatbush.d.ts +37 -0
  94. package/src/types/geokdbush.d.ts +37 -0
  95. package/src/types/kdbush.d.ts +24 -6
  96. package/src/utils.ts +9 -14
  97. package/src/ways.ts +248 -84
  98. package/test/memory.test.ts +38 -0
  99. package/test/mock-osm.ts +8 -8
  100. package/test/tags-search.test.ts +60 -0
  101. package/test/typed-arrays.test.ts +5 -6
  102. package/tsconfig.json +7 -1
  103. package/src/osmix.ts +0 -556
  104. package/test/extract.bench.ts +0 -29
  105. package/test/extract.test.ts +0 -156
  106. package/test/read.test.ts +0 -22
  107. package/test/write.test.ts +0 -66
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Utility functions for worker communication and data streaming.
3
+ *
4
+ * Provides helpers for collecting transferable buffers, feature detection,
5
+ * and converting Osm indexes to entity streams.
6
+ *
7
+ * @module
8
+ */
9
+ import { transfer as comlinkTransfer } from "comlink";
10
+ /**
11
+ * Recursively collect all transferable values from a nested object.
12
+ * Searches for ArrayBuffers, TypedArray buffers, and ReadableStreams.
13
+ * Used to prepare data for zero-copy transfer to or from workers.
14
+ */
15
+ export function collectTransferables(value) {
16
+ const transferables = [];
17
+ if (value instanceof ArrayBuffer)
18
+ transferables.push(value);
19
+ else if (value instanceof ReadableStream)
20
+ transferables.push(value);
21
+ else if (ArrayBuffer.isView(value))
22
+ transferables.push(value.buffer);
23
+ else if (Array.isArray(value)) {
24
+ for (const item of value) {
25
+ transferables.push(...collectTransferables(item));
26
+ }
27
+ }
28
+ else if (value && typeof value === "object") {
29
+ for (const item of Object.values(value)) {
30
+ transferables.push(...collectTransferables(item));
31
+ }
32
+ }
33
+ return transferables;
34
+ }
35
+ /**
36
+ * Wrap data with Comlink.transfer, automatically collecting transferable buffers.
37
+ * Enables zero-copy message passing for typed arrays and streams.
38
+ */
39
+ export function transfer(data) {
40
+ return comlinkTransfer(data, collectTransferables(data));
41
+ }
42
+ /**
43
+ * Feature-detect whether the browser supports transferable ReadableStreams.
44
+ * Attempts to post a stream through a MessageChannel; throws DataCloneError if unsupported.
45
+ */
46
+ export function supportsReadableStreamTransfer() {
47
+ // Require the basics first
48
+ if (typeof ReadableStream === "undefined" ||
49
+ typeof MessageChannel === "undefined")
50
+ return false;
51
+ const { port1 } = new MessageChannel();
52
+ try {
53
+ const rs = new ReadableStream(); // empty is fine for feature test
54
+ // If transferable streams are unsupported, this line throws a DataCloneError
55
+ port1.postMessage(rs, [rs]);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ finally {
62
+ port1.close();
63
+ }
64
+ }
65
+ /**
66
+ * Create a generator that yields all entities in the `Osm` index, sorted by type and ID.
67
+ * Order: nodes first, then ways, then relations, each sorted by ID.
68
+ */
69
+ function* getAllEntitiesSorted(osm) {
70
+ for (const node of osm.nodes.sorted()) {
71
+ yield node;
72
+ }
73
+ for (const way of osm.ways.sorted()) {
74
+ yield way;
75
+ }
76
+ for (const relation of osm.relations.sorted()) {
77
+ yield relation;
78
+ }
79
+ }
80
+ /**
81
+ * Convert the `Osm` index to a `ReadableStream` of header and entity objects.
82
+ * Header is emitted first, followed by all entities in sorted order.
83
+ * Stream can be piped through transform streams for further processing.
84
+ */
85
+ export function createReadableEntityStreamFromOsm(osm) {
86
+ let headerEnqueued = false;
87
+ const entityGenerator = getAllEntitiesSorted(osm);
88
+ return new ReadableStream({
89
+ pull: async (controller) => {
90
+ if (!headerEnqueued) {
91
+ controller.enqueue({
92
+ ...osm.header,
93
+ writingprogram: "@osmix/core",
94
+ osmosis_replication_timestamp: Date.now(),
95
+ });
96
+ headerEnqueued = true;
97
+ }
98
+ const block = entityGenerator.next();
99
+ if (block.done) {
100
+ controller.close();
101
+ }
102
+ else {
103
+ controller.enqueue(block.value);
104
+ }
105
+ },
106
+ });
107
+ }
108
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../osmix/src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extract.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.bench.d.ts","sourceRoot":"","sources":["../../../../osmix/test/extract.bench.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { beforeAll, describe } from "bun:test";
2
+ import { getFixtureFile } from "@osmix/shared/test/fixtures";
3
+ // @ts-expect-error - bench is available at runtime but not in types
4
+ const { bench } = globalThis;
5
+ import { createExtract } from "../src/extract";
6
+ import { fromPbf } from "../src/pbf";
7
+ const MONACO_BBOX = [7.4053929, 43.7232244, 7.4447259, 43.7543687];
8
+ // const SEATTLE_BBOX: GeoBbox2D = [-122.33, 47.48, -122.29, 47.52]
9
+ const BBOX = MONACO_BBOX;
10
+ const PBF = "monaco.pbf";
11
+ let buffer;
12
+ beforeAll(async () => {
13
+ buffer = await getFixtureFile(PBF);
14
+ });
15
+ describe("simple extract benchmark", () => {
16
+ bench("two-step parse then extract", async () => {
17
+ const data = buffer.slice(0);
18
+ const full = await fromPbf(data);
19
+ createExtract(full, BBOX, "simple");
20
+ });
21
+ bench("streaming extract during parse", async () => {
22
+ const data = buffer.slice(0);
23
+ await fromPbf(data, { extractBbox: BBOX });
24
+ });
25
+ });
26
+ //# sourceMappingURL=extract.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.bench.js","sourceRoot":"","sources":["../../../../osmix/test/extract.bench.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAG5D,oEAAoE;AACpE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAuD,CAAA;AAEzE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,WAAW,GAAc,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAC7E,mEAAmE;AAEnE,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,GAAG,GAAG,YAAY,CAAA;AAExB,IAAI,MAAmC,CAAA;AAEvC,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;AACnC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACzC,KAAK,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAChC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.test.d.ts","sourceRoot":"","sources":["../../../../osmix/test/extract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,392 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Osm } from "@osmix/core";
3
+ import { getFixtureFileReadStream } from "@osmix/shared/test/fixtures";
4
+ import { createExtract } from "../src/extract";
5
+ import { fromPbf, toPbfBuffer, toPbfStream } from "../src/pbf";
6
+ const TEST_BBOX = [-0.1, -0.1, 1, 1];
7
+ const SEATTLE_BBOX = [-122.463226, 47.469878, -122.180328, 47.82883];
8
+ function buildSourceOsm() {
9
+ const osm = new Osm({ id: "source" });
10
+ osm.nodes.addNode({
11
+ id: 1,
12
+ lat: 0,
13
+ lon: 0,
14
+ tags: {
15
+ name: "inside-a",
16
+ },
17
+ });
18
+ osm.nodes.addNode({
19
+ id: 2,
20
+ lat: 0,
21
+ lon: 2,
22
+ tags: {
23
+ name: "outside-a",
24
+ },
25
+ });
26
+ osm.nodes.addNode({
27
+ id: 3,
28
+ lat: 0.5,
29
+ lon: 0.5,
30
+ });
31
+ osm.nodes.addNode({
32
+ id: 4,
33
+ lat: 0.5,
34
+ lon: 1.5,
35
+ });
36
+ osm.ways.addWay({
37
+ id: 10,
38
+ refs: [1, 2],
39
+ tags: {
40
+ highway: "residential",
41
+ },
42
+ });
43
+ osm.ways.addWay({
44
+ id: 11,
45
+ refs: [3, 4],
46
+ tags: {
47
+ highway: "service",
48
+ },
49
+ });
50
+ osm.relations.addRelation({
51
+ id: 20,
52
+ members: [
53
+ {
54
+ type: "way",
55
+ ref: 10,
56
+ role: "outer",
57
+ },
58
+ ],
59
+ tags: {
60
+ type: "multipolygon",
61
+ },
62
+ });
63
+ osm.buildIndexes();
64
+ osm.buildSpatialIndexes();
65
+ return osm;
66
+ }
67
+ describe("extract", () => {
68
+ test("extract a BBOX while reading a PBF", async () => {
69
+ const source = buildSourceOsm();
70
+ const transform = new TransformStream();
71
+ const extractPromise = fromPbf(transform.readable, {
72
+ extractBbox: TEST_BBOX,
73
+ });
74
+ await toPbfStream(source).pipeTo(transform.writable);
75
+ const extract = await extractPromise;
76
+ expect(extract.nodes.size).toBe(2);
77
+ expect(extract.nodes.ids.has(1)).toBe(true);
78
+ expect(extract.nodes.ids.has(3)).toBe(true);
79
+ expect(extract.nodes.ids.has(2)).toBe(false);
80
+ expect(extract.nodes.ids.has(4)).toBe(false);
81
+ const truncatedWay = extract.ways.getById(10);
82
+ expect(truncatedWay).toBeDefined();
83
+ expect(truncatedWay?.refs).toEqual([1]);
84
+ expect(extract.ways.ids.has(11)).toBe(true);
85
+ expect(extract.relations.ids.has(20)).toBe(true);
86
+ });
87
+ test("extract a BBOX after reading a PBF", async () => {
88
+ const source = buildSourceOsm();
89
+ const buffer = await toPbfBuffer(source);
90
+ const streaming = await fromPbf(new Uint8Array(buffer.slice(0)), {
91
+ extractBbox: TEST_BBOX,
92
+ });
93
+ const twoStepOsmix = await fromPbf(new Uint8Array(buffer.slice(0)));
94
+ const twoStep = createExtract(twoStepOsmix, TEST_BBOX, "simple");
95
+ expect(streaming.nodes.size).toBe(twoStep.nodes.size);
96
+ expect(streaming.ways.size).toBe(twoStep.ways.size);
97
+ expect(streaming.relations.size).toBe(twoStep.relations.size);
98
+ expect(Array.from(streaming.nodes.ids.sorted)).toEqual(Array.from(twoStep.nodes.ids.sorted));
99
+ expect(Array.from(streaming.ways.ids.sorted)).toEqual(Array.from(twoStep.ways.ids.sorted));
100
+ expect(Array.from(streaming.relations.ids.sorted)).toEqual(Array.from(twoStep.relations.ids.sorted));
101
+ for (const nodeId of streaming.nodes.ids.sorted) {
102
+ const streamingNode = streaming.nodes.getById(nodeId);
103
+ const twoStepNode = twoStep.nodes.getById(nodeId);
104
+ expect(streamingNode).toEqual(twoStepNode);
105
+ }
106
+ for (const wayId of streaming.ways.ids.sorted) {
107
+ const streamingWay = streaming.ways.getById(wayId);
108
+ const twoStepWay = twoStep.ways.getById(wayId);
109
+ expect(streamingWay).toEqual(twoStepWay);
110
+ }
111
+ for (const relationId of streaming.relations.ids.sorted) {
112
+ const streamingRelation = streaming.relations.getById(relationId);
113
+ const twoStepRelation = twoStep.relations.getById(relationId);
114
+ expect(streamingRelation).toEqual(twoStepRelation);
115
+ }
116
+ });
117
+ test("extract with simple strategy filters way refs", () => {
118
+ const source = buildSourceOsm();
119
+ const extracted = createExtract(source, TEST_BBOX, "simple");
120
+ // Should only have nodes inside bbox
121
+ expect(extracted.nodes.size).toBe(2);
122
+ expect(extracted.nodes.ids.has(1)).toBe(true); // inside
123
+ expect(extracted.nodes.ids.has(3)).toBe(true); // inside
124
+ expect(extracted.nodes.ids.has(2)).toBe(false); // outside
125
+ expect(extracted.nodes.ids.has(4)).toBe(false); // outside
126
+ // Way 10 has nodes [1, 2] - node 1 is inside, node 2 is outside
127
+ // With simple strategy, should only include node 1
128
+ const way10 = extracted.ways.getById(10);
129
+ expect(way10).toBeDefined();
130
+ expect(way10?.refs).toEqual([1]);
131
+ // Way 11 has nodes [3, 4] - node 3 is inside, node 4 is outside
132
+ // With simple strategy, should only include node 3
133
+ const way11 = extracted.ways.getById(11);
134
+ expect(way11).toBeDefined();
135
+ expect(way11?.refs).toEqual([3]);
136
+ // Relation 20 has way 10 as member
137
+ // With simple strategy, relation should be included but way 10 is already filtered
138
+ expect(extracted.relations.ids.has(20)).toBe(true);
139
+ const relation20 = extracted.relations.getById(20);
140
+ expect(relation20).toBeDefined();
141
+ expect(relation20?.members.length).toBe(1);
142
+ expect(relation20?.members[0]).toEqual({
143
+ type: "way",
144
+ ref: 10,
145
+ role: "outer",
146
+ });
147
+ });
148
+ test("extract with complete_ways strategy includes all way nodes", () => {
149
+ const source = buildSourceOsm();
150
+ const extracted = createExtract(source, TEST_BBOX, "complete_ways");
151
+ // Should have nodes inside bbox PLUS all nodes from ways that cross bbox
152
+ // Nodes 1 and 3 are inside bbox
153
+ // Way 10 has nodes [1, 2] - node 2 should be included because way 10 crosses bbox
154
+ // Way 11 has nodes [3, 4] - node 4 should be included because way 11 crosses bbox
155
+ expect(extracted.nodes.size).toBe(4);
156
+ expect(extracted.nodes.ids.has(1)).toBe(true); // inside
157
+ expect(extracted.nodes.ids.has(2)).toBe(true); // outside but part of way 10
158
+ expect(extracted.nodes.ids.has(3)).toBe(true); // inside
159
+ expect(extracted.nodes.ids.has(4)).toBe(true); // outside but part of way 11
160
+ // Way 10 should include all nodes
161
+ const way10 = extracted.ways.getById(10);
162
+ expect(way10).toBeDefined();
163
+ expect(way10?.refs).toEqual([1, 2]);
164
+ // Way 11 should include all nodes
165
+ const way11 = extracted.ways.getById(11);
166
+ expect(way11).toBeDefined();
167
+ expect(way11?.refs).toEqual([3, 4]);
168
+ // Relation 20 should include all members (way 10)
169
+ expect(extracted.relations.ids.has(20)).toBe(true);
170
+ const relation20 = extracted.relations.getById(20);
171
+ expect(relation20).toBeDefined();
172
+ expect(relation20?.members.length).toBe(1);
173
+ expect(relation20?.members[0]).toEqual({
174
+ type: "way",
175
+ ref: 10,
176
+ role: "outer",
177
+ });
178
+ });
179
+ test("extract strategies differ for ways crossing bbox", () => {
180
+ const source = buildSourceOsm();
181
+ const simple = createExtract(source, TEST_BBOX, "simple");
182
+ const complete = createExtract(source, TEST_BBOX, "complete_ways");
183
+ // Simple strategy should have fewer nodes (only those inside bbox)
184
+ expect(simple.nodes.size < complete.nodes.size).toBe(true);
185
+ expect(simple.nodes.size).toBe(2);
186
+ expect(complete.nodes.size).toBe(4);
187
+ // Both should have the same ways
188
+ expect(simple.ways.size).toBe(complete.ways.size);
189
+ expect(simple.ways.size).toBe(2);
190
+ // But way refs should differ
191
+ const simpleWay10 = simple.ways.getById(10);
192
+ const completeWay10 = complete.ways.getById(10);
193
+ expect(simpleWay10).toBeDefined();
194
+ expect(completeWay10).toBeDefined();
195
+ expect(simpleWay10.refs.length < completeWay10.refs.length).toBe(true);
196
+ expect(simpleWay10.refs).toEqual([1]);
197
+ expect(completeWay10.refs).toEqual([1, 2]);
198
+ });
199
+ test("smart strategy keeps relation members reference complete", () => {
200
+ const osm = new Osm({ id: "test" });
201
+ // Create nodes: some inside, some outside bbox
202
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 }); // inside
203
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 2 }); // outside
204
+ osm.nodes.addNode({ id: 3, lat: 0.5, lon: 0.5 }); // inside
205
+ osm.nodes.addNode({ id: 4, lat: 0.5, lon: 1.5 }); // outside
206
+ osm.nodes.addNode({ id: 5, lat: 0.5, lon: 2.5 }); // outside, only used by way 20
207
+ osm.nodes.addNode({ id: 6, lat: 0.6, lon: 2.6 }); // outside, only used by way 20
208
+ // Create way 10 with nodes inside and outside
209
+ osm.ways.addWay({ id: 10, refs: [1, 2] });
210
+ // Create way 20 completely outside bbox (no shared nodes with inside ways)
211
+ osm.ways.addWay({ id: 20, refs: [5, 6] });
212
+ // Create relation with way 10 (crosses bbox) and way 20 (outside bbox)
213
+ osm.relations.addRelation({
214
+ id: 30,
215
+ members: [
216
+ { type: "way", ref: 10, role: "outer" },
217
+ { type: "way", ref: 20, role: "inner" },
218
+ ],
219
+ tags: { type: "multipolygon" },
220
+ });
221
+ osm.buildIndexes();
222
+ osm.buildSpatialIndexes();
223
+ const simple = createExtract(osm, TEST_BBOX, "simple");
224
+ const complete = createExtract(osm, TEST_BBOX, "complete_ways");
225
+ const smart = createExtract(osm, TEST_BBOX, "smart");
226
+ // Simple strategy: relation should only include way 10 (way 20 is outside)
227
+ const simpleRelation = simple.relations.getById(30);
228
+ expect(simpleRelation).toBeDefined();
229
+ expect(simpleRelation.members.length).toBe(1);
230
+ expect(simpleRelation.members[0]?.ref).toBe(10);
231
+ // Complete strategy preserves way integrity but keeps relation members inside bbox
232
+ const completeRelation = complete.relations.getById(30);
233
+ expect(completeRelation).toBeDefined();
234
+ expect(completeRelation.members.length).toBe(1);
235
+ expect(completeRelation.members[0]?.ref).toBe(10);
236
+ // Smart strategy includes all relation members (reference complete)
237
+ const smartRelation = smart.relations.getById(30);
238
+ expect(smartRelation).toBeDefined();
239
+ expect(smartRelation.members.length).toBe(2);
240
+ expect(smartRelation.members.some((m) => m.ref === 10)).toBe(true);
241
+ expect(smartRelation.members.some((m) => m.ref === 20)).toBe(true);
242
+ // Only smart strategy should include outside way 20 and its nodes
243
+ expect(simple.ways.ids.has(20)).toBe(false);
244
+ expect(complete.ways.ids.has(20)).toBe(false);
245
+ expect(smart.ways.ids.has(20)).toBe(true);
246
+ expect(smart.nodes.ids.has(5)).toBe(true);
247
+ expect(smart.nodes.ids.has(6)).toBe(true);
248
+ });
249
+ test("smart strategy retains node members of relations", () => {
250
+ const osm = new Osm({ id: "test" });
251
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 }); // inside
252
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 2 }); // outside
253
+ osm.nodes.addNode({ id: 3, lat: 0.5, lon: 0.5 }); // inside
254
+ osm.ways.addWay({ id: 10, refs: [1, 3] });
255
+ // Create relation with node members (some inside, some outside)
256
+ osm.relations.addRelation({
257
+ id: 20,
258
+ members: [
259
+ { type: "node", ref: 1, role: "label" },
260
+ { type: "node", ref: 2, role: "label" },
261
+ { type: "way", ref: 10, role: "outer" },
262
+ ],
263
+ tags: { type: "multipolygon" },
264
+ });
265
+ osm.buildIndexes();
266
+ osm.buildSpatialIndexes();
267
+ const simple = createExtract(osm, TEST_BBOX, "simple");
268
+ const complete = createExtract(osm, TEST_BBOX, "complete_ways");
269
+ const smart = createExtract(osm, TEST_BBOX, "smart");
270
+ // Simple strategy: relation should only include node 1 and way 10
271
+ const simpleRelation = simple.relations.getById(20);
272
+ expect(simpleRelation).toBeDefined();
273
+ expect(simpleRelation.members.length).toBe(2);
274
+ expect(simpleRelation.members.some((m) => m.type === "node" && m.ref === 1)).toBe(true);
275
+ expect(simpleRelation.members.some((m) => m.type === "way" && m.ref === 10)).toBe(true);
276
+ // Complete strategy behaves like simple for relation members (no outside nodes)
277
+ const completeRelation = complete.relations.getById(20);
278
+ expect(completeRelation).toBeDefined();
279
+ expect(completeRelation.members.length).toBe(2);
280
+ expect(completeRelation.members.some((m) => m.type === "node" && m.ref === 1)).toBe(true);
281
+ expect(completeRelation.members.some((m) => m.type === "way" && m.ref === 10)).toBe(true);
282
+ // Smart strategy keeps relations reference complete (includes node 2)
283
+ const smartRelation = smart.relations.getById(20);
284
+ expect(smartRelation).toBeDefined();
285
+ expect(smartRelation.members.length).toBe(3);
286
+ expect(smartRelation.members.some((m) => m.type === "node" && m.ref === 1)).toBe(true);
287
+ expect(smartRelation.members.some((m) => m.type === "node" && m.ref === 2)).toBe(true);
288
+ expect(smartRelation.members.some((m) => m.type === "way" && m.ref === 10)).toBe(true);
289
+ // Only smart strategy should include node 2
290
+ expect(smart.nodes.ids.has(2)).toBe(true);
291
+ expect(complete.nodes.ids.has(2)).toBe(false);
292
+ expect(simple.nodes.ids.has(2)).toBe(false);
293
+ });
294
+ test("smart strategy resolves multipolygon nested relation members", () => {
295
+ const osm = new Osm({ id: "nested" });
296
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 }); // inside
297
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 2 }); // outside
298
+ osm.nodes.addNode({ id: 3, lat: 0.2, lon: 2.2 }); // outside node member
299
+ osm.nodes.addNode({ id: 4, lat: 0.3, lon: 2.3 }); // outside nested node member
300
+ osm.ways.addWay({ id: 10, refs: [1, 2] });
301
+ osm.relations.addRelation({
302
+ id: 200,
303
+ members: [
304
+ { type: "way", ref: 10, role: "outer" },
305
+ { type: "node", ref: 3, role: "label" },
306
+ ],
307
+ tags: { type: "multipolygon" },
308
+ });
309
+ osm.relations.addRelation({
310
+ id: 300,
311
+ members: [
312
+ { type: "relation", ref: 200, role: "part" },
313
+ { type: "node", ref: 4, role: "label" },
314
+ ],
315
+ tags: { type: "site" },
316
+ });
317
+ osm.buildIndexes();
318
+ osm.buildSpatialIndexes();
319
+ const simple = createExtract(osm, TEST_BBOX, "simple");
320
+ const complete = createExtract(osm, TEST_BBOX, "complete_ways");
321
+ const smart = createExtract(osm, TEST_BBOX, "smart");
322
+ const simpleRelation200 = simple.relations.getById(200);
323
+ const completeRelation200 = complete.relations.getById(200);
324
+ const smartRelation200 = smart.relations.getById(200);
325
+ expect(simpleRelation200).toBeDefined();
326
+ expect(completeRelation200).toBeDefined();
327
+ expect(smartRelation200).toBeDefined();
328
+ expect(simpleRelation200.members.some((m) => m.type === "node" && m.ref === 3)).toBe(false);
329
+ expect(completeRelation200.members.some((m) => m.type === "node" && m.ref === 3)).toBe(false);
330
+ expect(smartRelation200.members.some((m) => m.type === "node" && m.ref === 3)).toBe(true);
331
+ const simpleRelation300 = simple.relations.getById(300);
332
+ const completeRelation300 = complete.relations.getById(300);
333
+ const smartRelation300 = smart.relations.getById(300);
334
+ expect(simpleRelation300).toBeDefined();
335
+ expect(completeRelation300).toBeDefined();
336
+ expect(smartRelation300).toBeDefined();
337
+ expect(simpleRelation300.members.some((m) => m.type === "node" && m.ref === 4)).toBe(false);
338
+ expect(completeRelation300.members.some((m) => m.type === "node" && m.ref === 4)).toBe(false);
339
+ expect(simpleRelation300.members.some((m) => m.type === "relation" && m.ref === 200)).toBe(true);
340
+ expect(completeRelation300.members.some((m) => m.type === "relation" && m.ref === 200)).toBe(true);
341
+ expect(smartRelation300.members.some((m) => m.type === "relation" && m.ref === 200)).toBe(true);
342
+ expect(smartRelation300.members.some((m) => m.type === "node" && m.ref === 4)).toBe(false);
343
+ expect(smart.nodes.ids.has(2)).toBe(true);
344
+ expect(smart.nodes.ids.has(3)).toBe(true);
345
+ expect(smart.nodes.ids.has(4)).toBe(false);
346
+ expect(simple.nodes.ids.has(3)).toBe(false);
347
+ expect(simple.nodes.ids.has(4)).toBe(false);
348
+ expect(complete.nodes.ids.has(3)).toBe(false);
349
+ expect(complete.nodes.ids.has(4)).toBe(false);
350
+ });
351
+ test("smart strategy does not extend non-multipolygon relations", () => {
352
+ const osm = new Osm({ id: "logic" });
353
+ osm.nodes.addNode({ id: 1, lat: 0, lon: 0 }); // inside
354
+ osm.nodes.addNode({ id: 2, lat: 0, lon: 2 }); // outside
355
+ osm.relations.addRelation({
356
+ id: 400,
357
+ members: [
358
+ { type: "node", ref: 1, role: "stop" },
359
+ { type: "node", ref: 2, role: "stop" },
360
+ ],
361
+ tags: { type: "route" },
362
+ });
363
+ osm.buildIndexes();
364
+ osm.buildSpatialIndexes();
365
+ const simple = createExtract(osm, TEST_BBOX, "simple");
366
+ const complete = createExtract(osm, TEST_BBOX, "complete_ways");
367
+ const smart = createExtract(osm, TEST_BBOX, "smart");
368
+ const smartRelation = smart.relations.getById(400);
369
+ const simpleRelation = simple.relations.getById(400);
370
+ const completeRelation = complete.relations.getById(400);
371
+ expect(smartRelation).toBeDefined();
372
+ expect(simpleRelation).toBeDefined();
373
+ expect(completeRelation).toBeDefined();
374
+ expect(smartRelation.members.some((m) => m.type === "node" && m.ref === 2)).toBe(false);
375
+ expect(simpleRelation.members.some((m) => m.type === "node" && m.ref === 2)).toBe(false);
376
+ expect(completeRelation.members.some((m) => m.type === "node" && m.ref === 2)).toBe(false);
377
+ expect(smart.nodes.ids.has(2)).toBe(false);
378
+ expect(simple.nodes.ids.has(2)).toBe(false);
379
+ expect(complete.nodes.ids.has(2)).toBe(false);
380
+ });
381
+ test.skip("extract from a large PBF", async () => {
382
+ const seattle = await fromPbf(getFixtureFileReadStream("usa.pbf"), {
383
+ extractBbox: SEATTLE_BBOX,
384
+ });
385
+ expect({
386
+ nodes: seattle.nodes.size,
387
+ ways: seattle.ways.size,
388
+ relations: seattle.relations.size,
389
+ }).toEqual({ nodes: 802_541, ways: 241_248, relations: 3_622 });
390
+ });
391
+ });
392
+ //# sourceMappingURL=extract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.test.js","sourceRoot":"","sources":["../../../../osmix/test/extract.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@osmix/core",
4
4
  "type": "module",
5
- "version": "0.0.1",
5
+ "version": "0.0.6",
6
6
  "description": "An OSM PBF reader, writer, and merge tool written in TypeScript",
7
7
  "main": "./src/index.ts",
8
8
  "publishConfig": {
@@ -33,21 +33,21 @@
33
33
  "sideEffects": false,
34
34
  "scripts": {
35
35
  "build": "tsc",
36
- "bench": "vitest bench",
37
- "test": "vitest",
38
- "typecheck": "tsc --noEmit"
36
+ "bench": "bun test --bench",
37
+ "prepublishOnly": "tsc",
38
+ "test": "bun test",
39
+ "typecheck": "tsgo --noEmit"
39
40
  },
40
41
  "devDependencies": {
41
- "@types/geojson": "catalog:",
42
- "typescript": "catalog:",
43
- "vitest": "catalog:"
42
+ "@osmix/pbf": "workspace:*",
43
+ "@types/bun": "catalog:",
44
+ "typescript": "catalog:"
44
45
  },
45
46
  "dependencies": {
46
- "@osmix/json": "workspace:*",
47
- "@osmix/pbf": "workspace:*",
48
47
  "@osmix/shared": "workspace:*",
49
48
  "flatbush": "^4.4.1",
50
- "kdbush": "mourner/kdbush#16416cd",
51
- "sweepline-intersections": "^1.5.0"
49
+ "geoflatbush": "^2.0.0",
50
+ "geokdbush": "^2.0.1",
51
+ "kdbush": "mourner/kdbush#16416cd"
52
52
  }
53
53
  }