@osmix/shapefile 0.0.2

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.
@@ -0,0 +1,71 @@
1
+ /// <reference path="./shpjs.d.ts" />
2
+ /**
3
+ * Utility functions for Shapefile data handling.
4
+ * @module
5
+ */
6
+ import shp from "shpjs";
7
+ /**
8
+ * Parse Shapefile data and return GeoJSON FeatureCollection(s).
9
+ *
10
+ * Uses shpjs to parse Shapefiles and automatically project to WGS84.
11
+ *
12
+ * @param data - Shapefile data (URL string, ArrayBuffer/ReadableStream of ZIP).
13
+ * @returns Array of GeoJSON FeatureCollections with optional fileName.
14
+ * @throws If data is null or parsing fails.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * // From ArrayBuffer
19
+ * const collections = await parseShapefile(zipBuffer)
20
+ *
21
+ * // From URL
22
+ * const collections = await parseShapefile('https://example.com/data.zip')
23
+ * ```
24
+ */
25
+ export async function parseShapefile(data) {
26
+ if (data == null)
27
+ throw new Error("Data is null");
28
+ let input;
29
+ // Convert ReadableStream to ArrayBuffer
30
+ if (data instanceof ReadableStream) {
31
+ input = await streamToArrayBuffer(data);
32
+ }
33
+ else if (data instanceof SharedArrayBuffer) {
34
+ // shpjs expects ArrayBuffer, not SharedArrayBuffer
35
+ const copy = new ArrayBuffer(data.byteLength);
36
+ new Uint8Array(copy).set(new Uint8Array(data));
37
+ input = copy;
38
+ }
39
+ else {
40
+ input = data;
41
+ }
42
+ const result = await shp(input);
43
+ // Normalize to array
44
+ if (Array.isArray(result)) {
45
+ return result;
46
+ }
47
+ return [result];
48
+ }
49
+ /**
50
+ * Convert a ReadableStream to an ArrayBuffer.
51
+ */
52
+ async function streamToArrayBuffer(stream) {
53
+ const reader = stream.getReader();
54
+ const chunks = [];
55
+ let totalLength = 0;
56
+ while (true) {
57
+ const { done, value } = await reader.read();
58
+ if (done)
59
+ break;
60
+ chunks.push(value);
61
+ totalLength += value.byteLength;
62
+ }
63
+ const result = new Uint8Array(totalLength);
64
+ let offset = 0;
65
+ for (const chunk of chunks) {
66
+ result.set(chunk, offset);
67
+ offset += chunk.byteLength;
68
+ }
69
+ return result.buffer;
70
+ }
71
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC;;;GAGG;AAGH,OAAO,GAAG,MAAM,OAAO,CAAA;AAGvB;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,IAA4B;IAE5B,IAAI,IAAI,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;IAEjD,IAAI,KAA+B,CAAA;IAEnC,wCAAwC;IACxC,IAAI,IAAI,YAAY,cAAc,EAAE,CAAC;QACpC,KAAK,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC;SAAM,IAAI,IAAI,YAAY,iBAAiB,EAAE,CAAC;QAC9C,mDAAmD;QACnD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,KAAK,GAAG,IAAI,CAAA;IACb,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAgB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAA;IAE5C,qBAAqB;IACrB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAA;IACd,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,CAAA;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CACjC,MAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,WAAW,GAAG,CAAC,CAAA;IAEnB,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QAC3C,IAAI,IAAI;YAAE,MAAK;QACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,WAAW,IAAI,KAAK,CAAC,UAAU,CAAA;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAA;IAC1C,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACzB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAA;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=osm-from-shapefile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osm-from-shapefile.test.d.ts","sourceRoot":"","sources":["../../test/osm-from-shapefile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,460 @@
1
+ import { describe, expect, it, mock } from "bun:test";
2
+ import { Osm } from "@osmix/core";
3
+ import { progressEventMessage } from "@osmix/shared/progress";
4
+ import { startCreateOsmFromShapefile } from "../src/osm-from-shapefile";
5
+ // Mock shpjs module
6
+ mock.module("shpjs", () => ({
7
+ default: async (input) => {
8
+ // Return the mock data passed through
9
+ return input;
10
+ },
11
+ }));
12
+ describe("@osmix/shapefile: startCreateOsmFromShapefile", () => {
13
+ it("should convert Point features to Nodes", () => {
14
+ const osm = new Osm();
15
+ const geojson = {
16
+ type: "FeatureCollection",
17
+ features: [
18
+ {
19
+ type: "Feature",
20
+ geometry: {
21
+ type: "Point",
22
+ coordinates: [-122.4194, 37.7749],
23
+ },
24
+ properties: {
25
+ name: "San Francisco",
26
+ population: 873965,
27
+ },
28
+ },
29
+ {
30
+ type: "Feature",
31
+ geometry: {
32
+ type: "Point",
33
+ coordinates: [-122.4094, 37.7849],
34
+ },
35
+ properties: {
36
+ name: "Another Point",
37
+ },
38
+ },
39
+ ],
40
+ };
41
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
42
+ // Consume generator
43
+ }
44
+ osm.buildIndexes();
45
+ expect(osm.nodes.size).toBe(2);
46
+ expect(osm.ways.size).toBe(0);
47
+ const node1 = osm.nodes.getById(-1);
48
+ expect(node1).toBeDefined();
49
+ expect(node1?.lon).toBe(-122.4194);
50
+ expect(node1?.lat).toBe(37.7749);
51
+ expect(node1?.tags?.["name"]).toBe("San Francisco");
52
+ // OSM tags are stored as strings
53
+ expect(node1?.tags?.["population"]).toBe("873965");
54
+ const node2 = osm.nodes.getById(-2);
55
+ expect(node2).toBeDefined();
56
+ expect(node2?.lon).toBe(-122.4094);
57
+ expect(node2?.lat).toBe(37.7849);
58
+ expect(node2?.tags?.["name"]).toBe("Another Point");
59
+ });
60
+ it("should convert LineString features to Ways with Nodes", () => {
61
+ const osm = new Osm();
62
+ const geojson = {
63
+ type: "FeatureCollection",
64
+ features: [
65
+ {
66
+ type: "Feature",
67
+ geometry: {
68
+ type: "LineString",
69
+ coordinates: [
70
+ [-122.4194, 37.7749],
71
+ [-122.4094, 37.7849],
72
+ [-122.3994, 37.7949],
73
+ ],
74
+ },
75
+ properties: {
76
+ highway: "primary",
77
+ name: "Main Street",
78
+ },
79
+ },
80
+ ],
81
+ };
82
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
83
+ // Consume generator
84
+ }
85
+ osm.buildIndexes();
86
+ expect(osm.nodes.size).toBe(3);
87
+ expect(osm.ways.size).toBe(1);
88
+ const way = osm.ways.getById(-1);
89
+ expect(way).toBeDefined();
90
+ expect(way?.refs).toHaveLength(3);
91
+ expect(way?.tags?.["highway"]).toBe("primary");
92
+ expect(way?.tags?.["name"]).toBe("Main Street");
93
+ // Verify nodes were created
94
+ const node1 = osm.nodes.getById(way.refs[0]);
95
+ const node2 = osm.nodes.getById(way.refs[1]);
96
+ const node3 = osm.nodes.getById(way.refs[2]);
97
+ expect(node1?.lon).toBe(-122.4194);
98
+ expect(node1?.lat).toBe(37.7749);
99
+ expect(node2?.lon).toBe(-122.4094);
100
+ expect(node2?.lat).toBe(37.7849);
101
+ expect(node3?.lon).toBe(-122.3994);
102
+ expect(node3?.lat).toBe(37.7949);
103
+ });
104
+ it("should convert simple Polygon features to Ways with area tags", () => {
105
+ const osm = new Osm();
106
+ const geojson = {
107
+ type: "FeatureCollection",
108
+ features: [
109
+ {
110
+ type: "Feature",
111
+ geometry: {
112
+ type: "Polygon",
113
+ coordinates: [
114
+ [
115
+ [-122.4194, 37.7749],
116
+ [-122.4094, 37.7749],
117
+ [-122.4094, 37.7849],
118
+ [-122.4194, 37.7849],
119
+ [-122.4194, 37.7749], // Closed ring
120
+ ],
121
+ ],
122
+ },
123
+ properties: {
124
+ building: "yes",
125
+ name: "Test Building",
126
+ },
127
+ },
128
+ ],
129
+ };
130
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
131
+ // Consume generator
132
+ }
133
+ osm.buildIndexes();
134
+ expect(osm.ways.size).toBe(1);
135
+ expect(osm.relations.size).toBe(0); // No relation for simple polygon
136
+ const way = osm.ways.getById(-1);
137
+ expect(way).toBeDefined();
138
+ expect(way?.tags?.["building"]).toBe("yes");
139
+ expect(way?.tags?.["name"]).toBe("Test Building");
140
+ expect(way?.tags?.["area"]).toBe("yes");
141
+ });
142
+ it("should convert Polygon with holes to relation with multiple Ways", () => {
143
+ const osm = new Osm();
144
+ const geojson = {
145
+ type: "FeatureCollection",
146
+ features: [
147
+ {
148
+ type: "Feature",
149
+ geometry: {
150
+ type: "Polygon",
151
+ coordinates: [
152
+ // Outer ring
153
+ [
154
+ [-122.4194, 37.7749],
155
+ [-122.4094, 37.7749],
156
+ [-122.4094, 37.7849],
157
+ [-122.4194, 37.7849],
158
+ [-122.4194, 37.7749],
159
+ ],
160
+ // Hole
161
+ [
162
+ [-122.4164, 37.7779],
163
+ [-122.4144, 37.7779],
164
+ [-122.4144, 37.7799],
165
+ [-122.4164, 37.7799],
166
+ [-122.4164, 37.7779],
167
+ ],
168
+ ],
169
+ },
170
+ properties: {
171
+ building: "yes",
172
+ },
173
+ },
174
+ ],
175
+ };
176
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
177
+ // Consume generator
178
+ }
179
+ osm.buildIndexes();
180
+ // Should have outer ring way + hole way + relation
181
+ expect(osm.ways.size).toBe(2);
182
+ expect(osm.relations.size).toBe(1);
183
+ const relation = osm.relations.getById(-1);
184
+ expect(relation).toBeDefined();
185
+ expect(relation?.tags?.["type"]).toBe("multipolygon");
186
+ expect(relation?.tags?.["building"]).toBe("yes");
187
+ expect(relation?.members).toHaveLength(2);
188
+ expect(relation?.members[0]?.role).toBe("outer");
189
+ expect(relation?.members[1]?.role).toBe("inner");
190
+ });
191
+ it("should convert MultiPoint features to multiple Nodes", () => {
192
+ const osm = new Osm();
193
+ const geojson = {
194
+ type: "FeatureCollection",
195
+ features: [
196
+ {
197
+ type: "Feature",
198
+ geometry: {
199
+ type: "MultiPoint",
200
+ coordinates: [
201
+ [-122.4194, 37.7749],
202
+ [-122.4094, 37.7849],
203
+ [-122.3994, 37.7949],
204
+ ],
205
+ },
206
+ properties: {
207
+ type: "stop",
208
+ },
209
+ },
210
+ ],
211
+ };
212
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
213
+ // Consume generator
214
+ }
215
+ osm.buildIndexes();
216
+ expect(osm.nodes.size).toBe(3);
217
+ expect(osm.ways.size).toBe(0);
218
+ // All three nodes should have the same tags
219
+ const node1 = osm.nodes.getById(-1);
220
+ const node2 = osm.nodes.getById(-2);
221
+ const node3 = osm.nodes.getById(-3);
222
+ expect(node1?.tags?.["type"]).toBe("stop");
223
+ expect(node2?.tags?.["type"]).toBe("stop");
224
+ expect(node3?.tags?.["type"]).toBe("stop");
225
+ });
226
+ it("should handle features without properties", () => {
227
+ const osm = new Osm();
228
+ const geojson = {
229
+ type: "FeatureCollection",
230
+ features: [
231
+ {
232
+ type: "Feature",
233
+ geometry: {
234
+ type: "Point",
235
+ coordinates: [-122.4194, 37.7749],
236
+ },
237
+ properties: null,
238
+ },
239
+ ],
240
+ };
241
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
242
+ // Consume generator
243
+ }
244
+ osm.buildIndexes();
245
+ expect(osm.nodes.size).toBe(1);
246
+ const node = osm.nodes.getById(-1);
247
+ expect(node).toBeDefined();
248
+ expect(node?.tags).toBeUndefined();
249
+ });
250
+ it("should reuse nodes when features share coordinates", () => {
251
+ const osm = new Osm();
252
+ const geojson = {
253
+ type: "FeatureCollection",
254
+ features: [
255
+ {
256
+ type: "Feature",
257
+ geometry: {
258
+ type: "LineString",
259
+ coordinates: [
260
+ [-122.4194, 37.7749],
261
+ [-122.4094, 37.7849],
262
+ ],
263
+ },
264
+ properties: {
265
+ highway: "primary",
266
+ },
267
+ },
268
+ {
269
+ type: "Feature",
270
+ geometry: {
271
+ type: "LineString",
272
+ coordinates: [
273
+ [-122.4094, 37.7849], // Shared coordinate
274
+ [-122.3994, 37.7949],
275
+ ],
276
+ },
277
+ properties: {
278
+ highway: "secondary",
279
+ },
280
+ },
281
+ ],
282
+ };
283
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
284
+ // Consume generator
285
+ }
286
+ osm.buildIndexes();
287
+ // Should have 3 nodes (shared coordinate is reused)
288
+ expect(osm.nodes.size).toBe(3);
289
+ expect(osm.ways.size).toBe(2);
290
+ const way1 = osm.ways.getById(-1);
291
+ const way2 = osm.ways.getById(-2);
292
+ // Each way should have 2 nodes
293
+ expect(way1?.refs).toHaveLength(2);
294
+ expect(way2?.refs).toHaveLength(2);
295
+ // Nodes at the same coordinate are reused
296
+ expect(way1?.refs[1]).toBe(way2?.refs[0]);
297
+ });
298
+ it("should use generator for custom progress handling", () => {
299
+ const osm = new Osm();
300
+ const geojson = {
301
+ type: "FeatureCollection",
302
+ features: [
303
+ {
304
+ type: "Feature",
305
+ geometry: {
306
+ type: "Point",
307
+ coordinates: [-122.4194, 37.7749],
308
+ },
309
+ properties: {},
310
+ },
311
+ ],
312
+ };
313
+ const progressMessages = [];
314
+ for (const update of startCreateOsmFromShapefile(osm, geojson, "test")) {
315
+ progressMessages.push(progressEventMessage(update));
316
+ }
317
+ expect(progressMessages.length).toBeGreaterThan(0);
318
+ expect(progressMessages[0]).toContain("Converting");
319
+ expect(progressMessages[progressMessages.length - 1]).toContain("Finished converting");
320
+ });
321
+ it("should use feature IDs when present", () => {
322
+ const osm = new Osm();
323
+ const geojson = {
324
+ type: "FeatureCollection",
325
+ features: [
326
+ {
327
+ type: "Feature",
328
+ id: 100,
329
+ geometry: {
330
+ type: "Point",
331
+ coordinates: [-122.4194, 37.7749],
332
+ },
333
+ properties: {
334
+ name: "Point with ID",
335
+ },
336
+ },
337
+ {
338
+ type: "Feature",
339
+ id: "200",
340
+ geometry: {
341
+ type: "LineString",
342
+ coordinates: [
343
+ [-122.4194, 37.7749],
344
+ [-122.4094, 37.7849],
345
+ ],
346
+ },
347
+ properties: {
348
+ highway: "primary",
349
+ },
350
+ },
351
+ ],
352
+ };
353
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
354
+ // Consume generator
355
+ }
356
+ osm.buildIndexes();
357
+ // Point should use ID 100
358
+ const node = osm.nodes.getById(100);
359
+ expect(node).toBeDefined();
360
+ expect(node?.tags?.["name"]).toBe("Point with ID");
361
+ // Way should use ID 200
362
+ const way = osm.ways.getById(200);
363
+ expect(way).toBeDefined();
364
+ expect(way?.tags?.["highway"]).toBe("primary");
365
+ });
366
+ it("should handle MultiLineString features", () => {
367
+ const osm = new Osm();
368
+ const geojson = {
369
+ type: "FeatureCollection",
370
+ features: [
371
+ {
372
+ type: "Feature",
373
+ geometry: {
374
+ type: "MultiLineString",
375
+ coordinates: [
376
+ [
377
+ [-122.4194, 37.7749],
378
+ [-122.4094, 37.7849],
379
+ ],
380
+ [
381
+ [-122.3994, 37.7949],
382
+ [-122.3894, 37.8049],
383
+ ],
384
+ ],
385
+ },
386
+ properties: {
387
+ highway: "secondary",
388
+ },
389
+ },
390
+ ],
391
+ };
392
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
393
+ // Consume generator
394
+ }
395
+ osm.buildIndexes();
396
+ // Should create 2 ways (one for each line)
397
+ expect(osm.ways.size).toBe(2);
398
+ expect(osm.nodes.size).toBe(4);
399
+ const way1 = osm.ways.getById(-1);
400
+ const way2 = osm.ways.getById(-2);
401
+ expect(way1?.refs).toHaveLength(2);
402
+ expect(way2?.refs).toHaveLength(2);
403
+ expect(way1?.tags?.["highway"]).toBe("secondary");
404
+ expect(way2?.tags?.["highway"]).toBe("secondary");
405
+ });
406
+ it("should handle MultiPolygon features", () => {
407
+ const osm = new Osm();
408
+ const geojson = {
409
+ type: "FeatureCollection",
410
+ features: [
411
+ {
412
+ type: "Feature",
413
+ geometry: {
414
+ type: "MultiPolygon",
415
+ coordinates: [
416
+ // First polygon
417
+ [
418
+ [
419
+ [-122.4194, 37.7749],
420
+ [-122.4094, 37.7749],
421
+ [-122.4094, 37.7849],
422
+ [-122.4194, 37.7849],
423
+ [-122.4194, 37.7749],
424
+ ],
425
+ ],
426
+ // Second polygon
427
+ [
428
+ [
429
+ [-122.3994, 37.7649],
430
+ [-122.3894, 37.7649],
431
+ [-122.3894, 37.7749],
432
+ [-122.3994, 37.7749],
433
+ [-122.3994, 37.7649],
434
+ ],
435
+ ],
436
+ ],
437
+ },
438
+ properties: {
439
+ landuse: "residential",
440
+ },
441
+ },
442
+ ],
443
+ };
444
+ for (const _ of startCreateOsmFromShapefile(osm, geojson, "test")) {
445
+ // Consume generator
446
+ }
447
+ osm.buildIndexes();
448
+ // Should have 2 ways + 1 relation
449
+ expect(osm.ways.size).toBe(2);
450
+ expect(osm.relations.size).toBe(1);
451
+ const relation = osm.relations.getById(-1);
452
+ expect(relation).toBeDefined();
453
+ expect(relation?.tags?.["type"]).toBe("multipolygon");
454
+ expect(relation?.tags?.["landuse"]).toBe("residential");
455
+ expect(relation?.members).toHaveLength(2);
456
+ expect(relation?.members[0]?.role).toBe("outer");
457
+ expect(relation?.members[1]?.role).toBe("outer");
458
+ });
459
+ });
460
+ //# sourceMappingURL=osm-from-shapefile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"osm-from-shapefile.test.js","sourceRoot":"","sources":["../../test/osm-from-shapefile.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package",
3
+ "name": "@osmix/shapefile",
4
+ "description": "Import Shapefiles into Osmix indexes.",
5
+ "version": "0.0.2",
6
+ "type": "module",
7
+ "main": "./src/index.ts",
8
+ "types": "./src/index.ts",
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md",
22
+ "LICENSE"
23
+ ]
24
+ },
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/conveyal/osmix.git"
29
+ },
30
+ "homepage": "https://github.com/conveyal/osmix#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/conveyal/osmix/issues"
33
+ },
34
+ "sideEffects": false,
35
+ "scripts": {
36
+ "build": "tsc --excludeDirectories test",
37
+ "bench": "bun test --bench",
38
+ "prepublishOnly": "tsc",
39
+ "test": "bun test",
40
+ "typecheck": "tsgo --noEmit"
41
+ },
42
+ "devDependencies": {
43
+ "@types/bun": "catalog:",
44
+ "@types/geojson": "catalog:",
45
+ "typescript": "catalog:"
46
+ },
47
+ "dependencies": {
48
+ "@osmix/core": "workspace:*",
49
+ "@osmix/shared": "workspace:*",
50
+ "@placemarkio/geojson-rewind": "catalog:",
51
+ "shpjs": "^6.2.0"
52
+ }
53
+ }
package/src/index.ts ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @osmix/shapefile - Import Shapefiles into Osmix indexes.
3
+ *
4
+ * Provides Shapefile import functionality for Osmix using shpjs:
5
+ * - **Import**: Build an Osm index from Shapefile data (ZIP archive or URL).
6
+ *
7
+ * Shapefiles are first parsed to GeoJSON by shpjs (with automatic projection
8
+ * to WGS84), then converted to OSM entities:
9
+ * - Point/MultiPoint → Node(s)
10
+ * - LineString/MultiLineString → Way(s)
11
+ * - Polygon → Way or Relation (based on ring count)
12
+ * - MultiPolygon → Relation
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // Import Shapefile to Osm index
17
+ * import { fromShapefile } from "@osmix/shapefile"
18
+ *
19
+ * const zipBuffer = await Bun.file('./buildings.zip').arrayBuffer()
20
+ * const osm = await fromShapefile(zipBuffer, { id: "buildings" })
21
+ *
22
+ * // Or from URL
23
+ * const osm = await fromShapefile('https://example.com/data.zip')
24
+ *
25
+ * // Query the imported data
26
+ * const buildings = osm.ways.search("building")
27
+ * ```
28
+ *
29
+ * @module @osmix/shapefile
30
+ */
31
+
32
+ export * from "./osm-from-shapefile"
33
+ export * from "./types"