@osmix/core 0.0.1 → 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.
Files changed (74) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/src/entities.d.ts +26 -0
  3. package/dist/src/entities.d.ts.map +1 -0
  4. package/dist/src/entities.js +69 -0
  5. package/dist/src/entities.js.map +1 -0
  6. package/dist/src/ids.d.ts +50 -0
  7. package/dist/src/ids.d.ts.map +1 -0
  8. package/dist/src/ids.js +171 -0
  9. package/dist/src/ids.js.map +1 -0
  10. package/dist/src/index.d.ts +6 -0
  11. package/dist/src/index.d.ts.map +1 -0
  12. package/dist/src/index.js +7 -0
  13. package/dist/src/index.js.map +1 -0
  14. package/dist/src/nodes.d.ts +36 -0
  15. package/dist/src/nodes.d.ts.map +1 -0
  16. package/dist/src/nodes.js +171 -0
  17. package/dist/src/nodes.js.map +1 -0
  18. package/dist/src/osmix.d.ts +88 -0
  19. package/dist/src/osmix.d.ts.map +1 -0
  20. package/dist/src/osmix.js +438 -0
  21. package/dist/src/osmix.js.map +1 -0
  22. package/dist/src/relations.d.ts +31 -0
  23. package/dist/src/relations.d.ts.map +1 -0
  24. package/dist/src/relations.js +161 -0
  25. package/dist/src/relations.js.map +1 -0
  26. package/dist/src/stringtable.d.ts +37 -0
  27. package/dist/src/stringtable.d.ts.map +1 -0
  28. package/dist/src/stringtable.js +101 -0
  29. package/dist/src/stringtable.js.map +1 -0
  30. package/dist/src/tags.d.ts +33 -0
  31. package/dist/src/tags.d.ts.map +1 -0
  32. package/dist/src/tags.js +92 -0
  33. package/dist/src/tags.js.map +1 -0
  34. package/dist/src/typed-arrays.d.ts +50 -0
  35. package/dist/src/typed-arrays.d.ts.map +1 -0
  36. package/dist/src/typed-arrays.js +119 -0
  37. package/dist/src/typed-arrays.js.map +1 -0
  38. package/dist/src/utils.d.ts +4 -0
  39. package/dist/src/utils.d.ts.map +1 -0
  40. package/dist/src/utils.js +28 -0
  41. package/dist/src/utils.js.map +1 -0
  42. package/dist/src/ways.d.ts +42 -0
  43. package/dist/src/ways.d.ts.map +1 -0
  44. package/dist/src/ways.js +186 -0
  45. package/dist/src/ways.js.map +1 -0
  46. package/dist/test/extract.bench.d.ts +2 -0
  47. package/dist/test/extract.bench.d.ts.map +1 -0
  48. package/dist/test/extract.bench.js +23 -0
  49. package/dist/test/extract.bench.js.map +1 -0
  50. package/dist/test/extract.test.d.ts +2 -0
  51. package/dist/test/extract.test.d.ts.map +1 -0
  52. package/dist/test/extract.test.js +127 -0
  53. package/dist/test/extract.test.js.map +1 -0
  54. package/dist/test/mock-osm.d.ts +13 -0
  55. package/dist/test/mock-osm.d.ts.map +1 -0
  56. package/dist/test/mock-osm.js +122 -0
  57. package/dist/test/mock-osm.js.map +1 -0
  58. package/dist/test/read.test.d.ts +2 -0
  59. package/dist/test/read.test.d.ts.map +1 -0
  60. package/dist/test/read.test.js +17 -0
  61. package/dist/test/read.test.js.map +1 -0
  62. package/dist/test/typed-arrays.test.d.ts +2 -0
  63. package/dist/test/typed-arrays.test.d.ts.map +1 -0
  64. package/dist/test/typed-arrays.test.js +100 -0
  65. package/dist/test/typed-arrays.test.js.map +1 -0
  66. package/dist/test/write.test.d.ts +2 -0
  67. package/dist/test/write.test.d.ts.map +1 -0
  68. package/dist/test/write.test.js +55 -0
  69. package/dist/test/write.test.js.map +1 -0
  70. package/package.json +3 -1
  71. package/src/osmix.ts +2 -2
  72. package/test/extract.bench.ts +1 -1
  73. package/test/extract.test.ts +8 -3
  74. package/test/write.test.ts +4 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @osmix/core
2
2
 
3
+ ## 0.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 33d9c12: Modify types to take Uint8Array<ArrayBufferLike> for compatiblity
8
+ - Updated dependencies [33d9c12]
9
+ - @osmix/shared@0.0.2
10
+ - @osmix/json@0.0.2
11
+ - @osmix/pbf@0.0.2
12
+
3
13
  ## 0.0.1
4
14
 
5
15
  ### Patch Changes
@@ -0,0 +1,26 @@
1
+ import type { OsmEntity, OsmEntityType, OsmTags } from "@osmix/json";
2
+ import { type IdOrIndex, Ids, type IdsTransferables } from "./ids";
3
+ import type StringTable from "./stringtable";
4
+ import { Tags, type TagsTransferables } from "./tags";
5
+ export interface EntitiesTransferables extends IdsTransferables, TagsTransferables {
6
+ }
7
+ export declare abstract class Entities<T extends OsmEntity> {
8
+ indexType: OsmEntityType;
9
+ stringTable: StringTable;
10
+ ids: Ids;
11
+ tags: Tags;
12
+ private indexBuilt;
13
+ constructor(indexType: OsmEntityType, stringTable: StringTable, ids?: Ids, tags?: Tags);
14
+ get isReady(): boolean;
15
+ get size(): number;
16
+ abstract buildEntityIndex(): void;
17
+ buildIndex(): void;
18
+ abstract getFullEntity(index: number, id: number, tags?: OsmTags): T;
19
+ get(idOrIndex: IdOrIndex): T | null;
20
+ getByIndex(index: number): T;
21
+ getEntitiesByIndex(indexes: number[]): T[];
22
+ [Symbol.iterator](): Generator<T>;
23
+ getById(id: number): T | null;
24
+ sorted(): Generator<T>;
25
+ }
26
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/entities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,KAAK,SAAS,EAAE,GAAG,EAAE,KAAK,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAClE,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,KAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,MAAM,WAAW,qBAChB,SAAQ,gBAAgB,EACvB,iBAAiB;CAAG;AAEtB,8BAAsB,QAAQ,CAAC,CAAC,SAAS,SAAS;IACjD,SAAS,EAAE,aAAa,CAAA;IACxB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,GAAG,CAAA;IACR,IAAI,EAAE,IAAI,CAAA;IAEV,OAAO,CAAC,UAAU,CAAQ;gBAGzB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,WAAW,EACxB,GAAG,CAAC,EAAE,GAAG,EACT,IAAI,CAAC,EAAE,IAAI;IAQZ,IAAI,OAAO,YAEV;IAED,IAAI,IAAI,WAEP;IAED,QAAQ,CAAC,gBAAgB,IAAI,IAAI;IAEjC,UAAU;IASV,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC;IAEpE,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,GAAG,IAAI;IAMnC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC;IAQ5B,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE;IAUzC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;IAMlC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAO5B,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC;CAOvB"}
@@ -0,0 +1,69 @@
1
+ import { Ids } from "./ids";
2
+ import { Tags } from "./tags";
3
+ export class Entities {
4
+ indexType;
5
+ stringTable;
6
+ ids;
7
+ tags;
8
+ indexBuilt = false;
9
+ constructor(indexType, stringTable, ids, tags) {
10
+ this.stringTable = stringTable;
11
+ this.indexType = indexType;
12
+ this.ids = ids ?? new Ids();
13
+ this.tags = tags ?? new Tags(stringTable);
14
+ }
15
+ get isReady() {
16
+ return this.ids.isReady && this.tags.isReady && this.indexBuilt;
17
+ }
18
+ get size() {
19
+ return this.ids.size;
20
+ }
21
+ buildIndex() {
22
+ console.time(`${this.indexType}Index.finish`);
23
+ this.ids.buildIndex();
24
+ this.tags.buildIndex();
25
+ this.buildEntityIndex();
26
+ this.indexBuilt = true;
27
+ console.timeEnd(`${this.indexType}Index.finish`);
28
+ }
29
+ get(idOrIndex) {
30
+ const [index, id] = this.ids.idOrIndex(idOrIndex);
31
+ if (index === -1)
32
+ return null;
33
+ return this.getFullEntity(index, id, this.tags.getTags(index));
34
+ }
35
+ getByIndex(index) {
36
+ return this.getFullEntity(index, this.ids.at(index), this.tags.getTags(index));
37
+ }
38
+ getEntitiesByIndex(indexes) {
39
+ const entities = [];
40
+ for (const index of indexes) {
41
+ const entity = this.getByIndex(index);
42
+ if (entity)
43
+ entities.push(entity);
44
+ else
45
+ throw Error(`Entity not found at index ${index}`);
46
+ }
47
+ return entities;
48
+ }
49
+ *[Symbol.iterator]() {
50
+ for (let i = 0; i < this.size; i++) {
51
+ yield this.getFullEntity(i, this.ids.at(i), this.tags.getTags(i));
52
+ }
53
+ }
54
+ getById(id) {
55
+ const index = this.ids.getIndexFromId(id);
56
+ if (index !== -1)
57
+ return this.getFullEntity(index, id, this.tags.getTags(index));
58
+ return null;
59
+ }
60
+ *sorted() {
61
+ for (const id of this.ids.sorted) {
62
+ const index = this.ids.getIndexFromId(id);
63
+ if (index === -1)
64
+ throw Error(`Entity not found at id ${id}`);
65
+ yield this.getFullEntity(index, id, this.tags.getTags(index));
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../src/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type BufferType } from "./typed-arrays";
2
+ export type IdOrIndex = {
3
+ id: number;
4
+ } | {
5
+ index: number;
6
+ };
7
+ export interface IdsTransferables {
8
+ ids: BufferType;
9
+ sortedIds: BufferType;
10
+ sortedIdPositionToIndex: BufferType;
11
+ anchors: BufferType;
12
+ idsAreSorted: boolean;
13
+ }
14
+ /**
15
+ * Efficiently store and lookup IDs.
16
+ *
17
+ * This is used to store IDs in a sorted array and then use binary search to find the index of an ID.
18
+ * Maps max out at 2^32 IDs.
19
+ */
20
+ export declare class Ids {
21
+ private ids;
22
+ private indexBuilt;
23
+ private idsAreSorted;
24
+ private idsSorted;
25
+ private sortedIdPositionToIndex;
26
+ private anchors;
27
+ static from({ ids, sortedIds, sortedIdPositionToIndex, anchors, idsAreSorted, }: IdsTransferables): Ids;
28
+ constructor();
29
+ transferables(): IdsTransferables;
30
+ get size(): number;
31
+ get isReady(): boolean;
32
+ isSorted(): boolean;
33
+ add(id: number): void;
34
+ at(index: number): number;
35
+ has(id: number): boolean;
36
+ /**
37
+ * Build the index of IDs to positions.
38
+ *
39
+ * If the IDs are not sorted, we need to sort them and build a new index.
40
+ * If the IDs are sorted, we can use the existing index.
41
+ */
42
+ buildIndex(): void;
43
+ getIndexFromId(id: number): number;
44
+ /**
45
+ * Pass an ID or an index, get both.
46
+ */
47
+ idOrIndex(i: IdOrIndex): [index: number, id: number];
48
+ get sorted(): Float64Array<ArrayBufferLike>;
49
+ }
50
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/ids.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,UAAU,EAEf,MAAM,gBAAgB,CAAA;AAEvB,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAI1D,MAAM,WAAW,gBAAgB;IAChC,GAAG,EAAE,UAAU,CAAA;IACf,SAAS,EAAE,UAAU,CAAA;IACrB,uBAAuB,EAAE,UAAU,CAAA;IACnC,OAAO,EAAE,UAAU,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACrB;AAED;;;;;GAKG;AACH,qBAAa,GAAG;IACf,OAAO,CAAC,GAAG,CAAoC;IAC/C,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,OAAO,CAAc;IAE7B,MAAM,CAAC,IAAI,CAAC,EACX,GAAG,EACH,SAAS,EACT,uBAAuB,EACvB,OAAO,EACP,YAAY,GACZ,EAAE,gBAAgB;;IAkBnB,aAAa,IAAI,gBAAgB;IAUjC,IAAI,IAAI,WAEP;IAED,IAAI,OAAO,YAEV;IAED,QAAQ;IAIR,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMrB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB;;;;;OAKG;IACH,UAAU;IA8DV,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAqClC;;OAEG;IACH,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC;IAKpD,IAAI,MAAM,kCAET;CACD"}
@@ -0,0 +1,171 @@
1
+ import { assertValue } from "@osmix/shared/assert";
2
+ import { BufferConstructor, ResizeableTypedArray, } from "./typed-arrays";
3
+ const BLOCK_SIZE = 256;
4
+ /**
5
+ * Efficiently store and lookup IDs.
6
+ *
7
+ * This is used to store IDs in a sorted array and then use binary search to find the index of an ID.
8
+ * Maps max out at 2^32 IDs.
9
+ */
10
+ export class Ids {
11
+ ids;
12
+ indexBuilt = false;
13
+ idsAreSorted = true;
14
+ idsSorted;
15
+ sortedIdPositionToIndex;
16
+ anchors;
17
+ static from({ ids, sortedIds, sortedIdPositionToIndex, anchors, idsAreSorted, }) {
18
+ const idIndex = new Ids();
19
+ idIndex.ids = ResizeableTypedArray.from(Float64Array, ids);
20
+ idIndex.idsSorted = new Float64Array(sortedIds);
21
+ idIndex.sortedIdPositionToIndex = new Uint32Array(sortedIdPositionToIndex);
22
+ idIndex.anchors = new Float64Array(anchors);
23
+ idIndex.indexBuilt = true;
24
+ idIndex.idsAreSorted = idsAreSorted;
25
+ return idIndex;
26
+ }
27
+ constructor() {
28
+ this.ids = new ResizeableTypedArray(Float64Array);
29
+ this.idsSorted = new Float64Array(new BufferConstructor(0));
30
+ this.sortedIdPositionToIndex = new Uint32Array(new BufferConstructor(0));
31
+ this.anchors = new Float64Array(new BufferConstructor(0));
32
+ }
33
+ transferables() {
34
+ return {
35
+ ids: this.ids.array.buffer,
36
+ sortedIds: this.idsSorted.buffer,
37
+ sortedIdPositionToIndex: this.sortedIdPositionToIndex.buffer,
38
+ anchors: this.anchors.buffer,
39
+ idsAreSorted: this.idsAreSorted,
40
+ };
41
+ }
42
+ get size() {
43
+ return this.ids.length;
44
+ }
45
+ get isReady() {
46
+ return this.indexBuilt;
47
+ }
48
+ isSorted() {
49
+ return this.idsAreSorted;
50
+ }
51
+ add(id) {
52
+ if (this.indexBuilt)
53
+ throw Error("ID index already built.");
54
+ if (this.ids.length > 0 && id < this.ids.at(-1))
55
+ this.idsAreSorted = false;
56
+ this.ids.push(id);
57
+ }
58
+ at(index) {
59
+ return this.ids.at(index);
60
+ }
61
+ has(id) {
62
+ return this.getIndexFromId(id) !== -1;
63
+ }
64
+ /**
65
+ * Build the index of IDs to positions.
66
+ *
67
+ * If the IDs are not sorted, we need to sort them and build a new index.
68
+ * If the IDs are sorted, we can use the existing index.
69
+ */
70
+ buildIndex() {
71
+ if (this.indexBuilt)
72
+ throw Error("ID index already build.");
73
+ this.ids.compact();
74
+ if (!this.idsAreSorted) {
75
+ console.warn("IDs were not sorted. Sorting now...");
76
+ // Build the sorted index
77
+ const idsBuffer = new BufferConstructor(this.size * Float64Array.BYTES_PER_ELEMENT);
78
+ const posBuffer = new BufferConstructor(this.size * Uint32Array.BYTES_PER_ELEMENT);
79
+ this.idsSorted = new Float64Array(idsBuffer);
80
+ this.sortedIdPositionToIndex = new Uint32Array(posBuffer);
81
+ // Fill and sort with positions.
82
+ for (let i = 0; i < this.size; i++) {
83
+ this.idsSorted[i] = this.ids.at(i);
84
+ this.sortedIdPositionToIndex[i] = i;
85
+ }
86
+ // Sort by id, carrying position; use native sort on chunks or a custom radix/merge for stability.
87
+ // For simplicity:
88
+ const tmp = Array.from({ length: this.size }, (_, i) => ({
89
+ id: this.idsSorted[i],
90
+ pos: this.sortedIdPositionToIndex[i],
91
+ }));
92
+ tmp.sort((a, b) => a.id - b.id);
93
+ tmp.forEach(({ id, pos }, i) => {
94
+ this.idsSorted[i] = id;
95
+ this.sortedIdPositionToIndex[i] = pos;
96
+ });
97
+ }
98
+ else {
99
+ // Point to the same array
100
+ this.idsSorted = this.ids.array;
101
+ // Create the sortedIdPositionToIndex array
102
+ const posBuffer = new BufferConstructor(this.size * Uint32Array.BYTES_PER_ELEMENT);
103
+ this.sortedIdPositionToIndex = new Uint32Array(posBuffer);
104
+ for (let i = 0; i < this.size; i++) {
105
+ this.sortedIdPositionToIndex[i] = i;
106
+ }
107
+ }
108
+ // Build anchors (every blockSize-th key)
109
+ const aLen = Math.ceil(this.size / BLOCK_SIZE);
110
+ const sab = new BufferConstructor(aLen * Float64Array.BYTES_PER_ELEMENT);
111
+ this.anchors = new Float64Array(sab, 0, aLen);
112
+ for (let j = 0; j < aLen; j++) {
113
+ const id = this.idsSorted[Math.min(j * BLOCK_SIZE, this.size - 1)];
114
+ assertValue(id, "ID is undefined");
115
+ this.anchors[j] = id;
116
+ }
117
+ this.indexBuilt = true;
118
+ }
119
+ // Lookup id → index
120
+ getIndexFromId(id) {
121
+ if (!this.indexBuilt)
122
+ throw Error("IdIndex not built.");
123
+ // binary search anchors
124
+ let lo = 0;
125
+ let hi = this.anchors.length - 1;
126
+ while (lo < hi) {
127
+ const mid = (lo + hi + 1) >>> 1;
128
+ const anchor = this.anchors[mid];
129
+ assertValue(anchor, "Anchor is undefined");
130
+ if (anchor <= id)
131
+ lo = mid;
132
+ else
133
+ hi = mid - 1;
134
+ }
135
+ const start = lo * BLOCK_SIZE;
136
+ const end = Math.min(start + BLOCK_SIZE, this.idsSorted.length);
137
+ // binary search within block
138
+ let l = start;
139
+ let r = end - 1;
140
+ while (l <= r) {
141
+ const m = (l + r) >>> 1;
142
+ const v = this.idsSorted[m];
143
+ assertValue(v, "Value is undefined");
144
+ if (v === id) {
145
+ if (this.idsAreSorted)
146
+ return m;
147
+ const index = this.sortedIdPositionToIndex[m];
148
+ assertValue(index, "Position is undefined");
149
+ return index;
150
+ }
151
+ if (v < id)
152
+ l = m + 1;
153
+ else
154
+ r = m - 1;
155
+ }
156
+ // ID not found
157
+ return -1;
158
+ }
159
+ /**
160
+ * Pass an ID or an index, get both.
161
+ */
162
+ idOrIndex(i) {
163
+ if ("id" in i)
164
+ return [this.getIndexFromId(i.id), i.id];
165
+ return [i.index, this.at(i.index)];
166
+ }
167
+ get sorted() {
168
+ return this.idsSorted;
169
+ }
170
+ }
171
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/ids.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { Nodes } from "./nodes";
2
+ export { Osmix } from "./osmix";
3
+ export { Relations } from "./relations";
4
+ export { throttle } from "./utils";
5
+ export { Ways } from "./ways";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,7 @@
1
+ /// <reference path="./types/kdbush.d.ts" />
2
+ export { Nodes } from "./nodes";
3
+ export { Osmix } from "./osmix";
4
+ export { Relations } from "./relations";
5
+ export { throttle } from "./utils";
6
+ export { Ways } from "./ways";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type { OsmNode, OsmTags } from "@osmix/json";
2
+ import type { OsmPbfBlock, OsmPbfDenseNodes } from "@osmix/pbf";
3
+ import type { GeoBbox2D } from "@osmix/shared/types";
4
+ import KDBush from "kdbush";
5
+ import { Entities, type EntitiesTransferables } from "./entities";
6
+ import { type IdOrIndex, Ids } from "./ids";
7
+ import type StringTable from "./stringtable";
8
+ import { Tags } from "./tags";
9
+ import { type BufferType, ResizeableTypedArray } from "./typed-arrays";
10
+ export interface NodesTransferables extends EntitiesTransferables {
11
+ lons: BufferType;
12
+ lats: BufferType;
13
+ bbox: GeoBbox2D;
14
+ spatialIndex: BufferType;
15
+ }
16
+ export interface AddNodeOptions {
17
+ filter?: (node: OsmNode) => boolean;
18
+ }
19
+ export declare class Nodes extends Entities<OsmNode> {
20
+ lons: ResizeableTypedArray<Float64Array>;
21
+ lats: ResizeableTypedArray<Float64Array>;
22
+ bbox: GeoBbox2D;
23
+ spatialIndex: KDBush;
24
+ static from(stringTable: StringTable, nits: NodesTransferables): Nodes;
25
+ constructor(stringTable: StringTable, idIndex?: Ids, tagIndex?: Tags);
26
+ transferables(): NodesTransferables;
27
+ addNode(node: OsmNode): void;
28
+ addDenseNodes(dense: OsmPbfDenseNodes, block: OsmPbfBlock, blockStringIndexMap: Map<number, number>, filter?: (node: OsmNode) => boolean): number;
29
+ buildEntityIndex(): void;
30
+ buildSpatialIndex(): void;
31
+ getNodeLonLat(i: IdOrIndex): [number, number];
32
+ getFullEntity(index: number, id: number, tags?: OsmTags): OsmNode;
33
+ withinBbox(bbox: GeoBbox2D): number[];
34
+ withinRadius(x: number, y: number, radius: number): number[];
35
+ }
36
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,QAAQ,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAAE,KAAK,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAEN,KAAK,UAAU,EAEf,oBAAoB,EACpB,MAAM,gBAAgB,CAAA;AAEvB,MAAM,WAAW,kBAAmB,SAAQ,qBAAqB;IAChE,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,SAAS,CAAA;IACf,YAAY,EAAE,UAAU,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;CACnC;AAED,qBAAa,KAAM,SAAQ,QAAQ,CAAC,OAAO,CAAC;IAC3C,IAAI,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAA;IACxC,IAAI,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAA;IACxC,IAAI,EAAE,SAAS,CAKd;IACD,YAAY,EAAE,MAAM,CAAsD;IAE1E,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB;gBAWlD,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,IAAI;IAMpE,aAAa,IAAI,kBAAkB;IAWnC,OAAO,CAAC,IAAI,EAAE,OAAO;IAarB,aAAa,CACZ,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,WAAW,EAClB,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACxC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GACjC,MAAM;IA+ET,gBAAgB;IAKhB,iBAAiB;IAejB,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAK7C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO;IAkBjE,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE;IAIrC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAG5D"}
@@ -0,0 +1,171 @@
1
+ import { assertValue } from "@osmix/shared/assert";
2
+ import KDBush from "kdbush";
3
+ import { Entities } from "./entities";
4
+ import { Ids } from "./ids";
5
+ import { Tags } from "./tags";
6
+ import { BufferConstructor, CoordinateArrayType, ResizeableTypedArray, } from "./typed-arrays";
7
+ export class Nodes extends Entities {
8
+ lons;
9
+ lats;
10
+ bbox = [
11
+ Number.POSITIVE_INFINITY,
12
+ Number.POSITIVE_INFINITY,
13
+ Number.NEGATIVE_INFINITY,
14
+ Number.NEGATIVE_INFINITY,
15
+ ];
16
+ spatialIndex = new KDBush(0, 128, Float64Array, BufferConstructor);
17
+ static from(stringTable, nits) {
18
+ const idIndex = Ids.from(nits);
19
+ const tagIndex = Tags.from(stringTable, nits);
20
+ const nodeIndex = new Nodes(stringTable, idIndex, tagIndex);
21
+ nodeIndex.lons = ResizeableTypedArray.from(CoordinateArrayType, nits.lons);
22
+ nodeIndex.lats = ResizeableTypedArray.from(CoordinateArrayType, nits.lats);
23
+ nodeIndex.bbox = nits.bbox;
24
+ nodeIndex.spatialIndex = KDBush.from(nits.spatialIndex);
25
+ return nodeIndex;
26
+ }
27
+ constructor(stringTable, idIndex, tagIndex) {
28
+ super("node", stringTable, idIndex, tagIndex);
29
+ this.lons = new ResizeableTypedArray(CoordinateArrayType);
30
+ this.lats = new ResizeableTypedArray(CoordinateArrayType);
31
+ }
32
+ transferables() {
33
+ return {
34
+ lons: this.lons.array.buffer,
35
+ lats: this.lats.array.buffer,
36
+ bbox: this.bbox,
37
+ spatialIndex: this.spatialIndex.data,
38
+ ...this.ids.transferables(),
39
+ ...this.tags.transferables(),
40
+ };
41
+ }
42
+ addNode(node) {
43
+ this.ids.add(node.id);
44
+ this.tags.addTags(node.tags);
45
+ this.lons.push(node.lon);
46
+ this.lats.push(node.lat);
47
+ if (node.lon < this.bbox[0])
48
+ this.bbox[0] = node.lon;
49
+ if (node.lat < this.bbox[1])
50
+ this.bbox[1] = node.lat;
51
+ if (node.lon > this.bbox[2])
52
+ this.bbox[2] = node.lon;
53
+ if (node.lat > this.bbox[3])
54
+ this.bbox[3] = node.lat;
55
+ }
56
+ addDenseNodes(dense, block, blockStringIndexMap, filter) {
57
+ const lon_offset = block.lon_offset ?? 0;
58
+ const lat_offset = block.lat_offset ?? 0;
59
+ const granularity = block.granularity ?? 1e7;
60
+ const delta = {
61
+ id: 0,
62
+ lat: 0,
63
+ lon: 0,
64
+ timestamp: 0,
65
+ changeset: 0,
66
+ uid: 0,
67
+ user_sid: 0,
68
+ };
69
+ const getStringTableIndex = (keyIndex) => {
70
+ const key = dense.keys_vals[keyIndex];
71
+ assertValue(key, "Block string key is undefined");
72
+ const index = blockStringIndexMap.get(key);
73
+ assertValue(index, "Block string not found");
74
+ return index;
75
+ };
76
+ let keysValsIndex = 0;
77
+ let added = 0;
78
+ for (let i = 0; i < dense.id.length; i++) {
79
+ const idSid = dense.id[i];
80
+ const latSid = dense.lat[i];
81
+ const lonSid = dense.lon[i];
82
+ assertValue(idSid, "ID SID is undefined");
83
+ assertValue(latSid, "Latitude SID is undefined");
84
+ assertValue(lonSid, "Longitude SID is undefined");
85
+ delta.id += idSid;
86
+ delta.lat += latSid;
87
+ delta.lon += lonSid;
88
+ const lon = lon_offset + delta.lon / granularity;
89
+ const lat = lat_offset + delta.lat / granularity;
90
+ const tagKeys = [];
91
+ const tagValues = [];
92
+ if (dense.keys_vals.length > 0) {
93
+ while (dense.keys_vals[keysValsIndex] !== 0) {
94
+ const key = getStringTableIndex(keysValsIndex);
95
+ const val = getStringTableIndex(keysValsIndex + 1);
96
+ if (key && val) {
97
+ tagKeys.push(key);
98
+ tagValues.push(val);
99
+ }
100
+ keysValsIndex += 2;
101
+ }
102
+ keysValsIndex++;
103
+ }
104
+ const shouldInclude = filter
105
+ ? filter({
106
+ id: delta.id,
107
+ lon,
108
+ lat,
109
+ tags: this.tags.getTagsFromIndices(tagKeys, tagValues),
110
+ })
111
+ : true;
112
+ if (!shouldInclude)
113
+ continue;
114
+ this.ids.add(delta.id);
115
+ this.lons.push(lon);
116
+ this.lats.push(lat);
117
+ if (lon < this.bbox[0])
118
+ this.bbox[0] = lon;
119
+ if (lat < this.bbox[1])
120
+ this.bbox[1] = lat;
121
+ if (lon > this.bbox[2])
122
+ this.bbox[2] = lon;
123
+ if (lat > this.bbox[3])
124
+ this.bbox[3] = lat;
125
+ this.tags.addTagKeysAndValues(tagKeys, tagValues);
126
+ added++;
127
+ }
128
+ return added;
129
+ }
130
+ buildEntityIndex() {
131
+ this.lons.compact();
132
+ this.lats.compact();
133
+ }
134
+ buildSpatialIndex() {
135
+ console.time("NodeIndex.buildSpatialIndex");
136
+ this.spatialIndex = new KDBush(this.size, 128, Float64Array, BufferConstructor);
137
+ for (let i = 0; i < this.size; i++) {
138
+ this.spatialIndex.add(this.lons.at(i), this.lats.at(i));
139
+ }
140
+ this.spatialIndex.finish();
141
+ console.timeEnd("NodeIndex.buildSpatialIndex");
142
+ }
143
+ getNodeLonLat(i) {
144
+ const index = "index" in i ? i.index : this.ids.idOrIndex(i)[0];
145
+ return [this.lons.at(index), this.lats.at(index)];
146
+ }
147
+ getFullEntity(index, id, tags) {
148
+ const [lon, lat] = this.getNodeLonLat({ index });
149
+ if (tags) {
150
+ return {
151
+ id,
152
+ lat,
153
+ lon,
154
+ tags,
155
+ };
156
+ }
157
+ return {
158
+ id,
159
+ lat,
160
+ lon,
161
+ };
162
+ }
163
+ // Spatial operations
164
+ withinBbox(bbox) {
165
+ return this.spatialIndex.range(bbox[0], bbox[1], bbox[2], bbox[3]);
166
+ }
167
+ withinRadius(x, y, radius) {
168
+ return this.spatialIndex.within(x, y, radius);
169
+ }
170
+ }
171
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/nodes.ts"],"names":[],"mappings":"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"}