@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.
- package/CHANGELOG.md +10 -0
- package/dist/src/entities.d.ts +26 -0
- package/dist/src/entities.d.ts.map +1 -0
- package/dist/src/entities.js +69 -0
- package/dist/src/entities.js.map +1 -0
- package/dist/src/ids.d.ts +50 -0
- package/dist/src/ids.d.ts.map +1 -0
- package/dist/src/ids.js +171 -0
- package/dist/src/ids.js.map +1 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/nodes.d.ts +36 -0
- package/dist/src/nodes.d.ts.map +1 -0
- package/dist/src/nodes.js +171 -0
- package/dist/src/nodes.js.map +1 -0
- package/dist/src/osmix.d.ts +88 -0
- package/dist/src/osmix.d.ts.map +1 -0
- package/dist/src/osmix.js +438 -0
- package/dist/src/osmix.js.map +1 -0
- package/dist/src/relations.d.ts +31 -0
- package/dist/src/relations.d.ts.map +1 -0
- package/dist/src/relations.js +161 -0
- package/dist/src/relations.js.map +1 -0
- package/dist/src/stringtable.d.ts +37 -0
- package/dist/src/stringtable.d.ts.map +1 -0
- package/dist/src/stringtable.js +101 -0
- package/dist/src/stringtable.js.map +1 -0
- package/dist/src/tags.d.ts +33 -0
- package/dist/src/tags.d.ts.map +1 -0
- package/dist/src/tags.js +92 -0
- package/dist/src/tags.js.map +1 -0
- package/dist/src/typed-arrays.d.ts +50 -0
- package/dist/src/typed-arrays.d.ts.map +1 -0
- package/dist/src/typed-arrays.js +119 -0
- package/dist/src/typed-arrays.js.map +1 -0
- package/dist/src/utils.d.ts +4 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +28 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/ways.d.ts +42 -0
- package/dist/src/ways.d.ts.map +1 -0
- package/dist/src/ways.js +186 -0
- package/dist/src/ways.js.map +1 -0
- package/dist/test/extract.bench.d.ts +2 -0
- package/dist/test/extract.bench.d.ts.map +1 -0
- package/dist/test/extract.bench.js +23 -0
- package/dist/test/extract.bench.js.map +1 -0
- package/dist/test/extract.test.d.ts +2 -0
- package/dist/test/extract.test.d.ts.map +1 -0
- package/dist/test/extract.test.js +127 -0
- package/dist/test/extract.test.js.map +1 -0
- package/dist/test/mock-osm.d.ts +13 -0
- package/dist/test/mock-osm.d.ts.map +1 -0
- package/dist/test/mock-osm.js +122 -0
- package/dist/test/mock-osm.js.map +1 -0
- package/dist/test/read.test.d.ts +2 -0
- package/dist/test/read.test.d.ts.map +1 -0
- package/dist/test/read.test.js +17 -0
- package/dist/test/read.test.js.map +1 -0
- package/dist/test/typed-arrays.test.d.ts +2 -0
- package/dist/test/typed-arrays.test.d.ts.map +1 -0
- package/dist/test/typed-arrays.test.js +100 -0
- package/dist/test/typed-arrays.test.js.map +1 -0
- package/dist/test/write.test.d.ts +2 -0
- package/dist/test/write.test.d.ts.map +1 -0
- package/dist/test/write.test.js +55 -0
- package/dist/test/write.test.js.map +1 -0
- package/package.json +3 -1
- package/src/osmix.ts +2 -2
- package/test/extract.bench.ts +1 -1
- package/test/extract.test.ts +8 -3
- package/test/write.test.ts +4 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { assertValue } from "@osmix/shared/assert";
|
|
2
|
+
import { Entities } from "./entities";
|
|
3
|
+
import { Ids } from "./ids";
|
|
4
|
+
import { Tags } from "./tags";
|
|
5
|
+
import { IdArrayType, ResizeableTypedArray, } from "./typed-arrays";
|
|
6
|
+
const RELATION_MEMBER_TYPES = ["node", "way", "relation"];
|
|
7
|
+
export class Relations extends Entities {
|
|
8
|
+
memberStart;
|
|
9
|
+
memberCount; // Maximum 65,535 members per relation
|
|
10
|
+
// Store the ID of the member because relations have other relations as members.
|
|
11
|
+
memberRefs;
|
|
12
|
+
memberTypes;
|
|
13
|
+
memberRoles;
|
|
14
|
+
static from(stringTable, rit) {
|
|
15
|
+
const idIndex = Ids.from(rit);
|
|
16
|
+
const tagIndex = Tags.from(stringTable, rit);
|
|
17
|
+
const ri = new Relations(stringTable, idIndex, tagIndex);
|
|
18
|
+
ri.memberStart = ResizeableTypedArray.from(Uint32Array, rit.memberStart);
|
|
19
|
+
ri.memberCount = ResizeableTypedArray.from(Uint16Array, rit.memberCount);
|
|
20
|
+
ri.memberRefs = ResizeableTypedArray.from(IdArrayType, rit.memberRefs);
|
|
21
|
+
ri.memberTypes = ResizeableTypedArray.from(Uint8Array, rit.memberTypes);
|
|
22
|
+
ri.memberRoles = ResizeableTypedArray.from(Uint32Array, rit.memberRoles);
|
|
23
|
+
return ri;
|
|
24
|
+
}
|
|
25
|
+
constructor(stringTable, idIndex, tagIndex) {
|
|
26
|
+
super("relation", stringTable, idIndex, tagIndex);
|
|
27
|
+
this.memberStart = new ResizeableTypedArray(Uint32Array);
|
|
28
|
+
this.memberCount = new ResizeableTypedArray(Uint16Array);
|
|
29
|
+
this.memberRefs = new ResizeableTypedArray(IdArrayType);
|
|
30
|
+
this.memberTypes = new ResizeableTypedArray(Uint8Array);
|
|
31
|
+
this.memberRoles = new ResizeableTypedArray(Uint32Array);
|
|
32
|
+
}
|
|
33
|
+
transferables() {
|
|
34
|
+
return {
|
|
35
|
+
memberStart: this.memberStart.array.buffer,
|
|
36
|
+
memberCount: this.memberCount.array.buffer,
|
|
37
|
+
memberRefs: this.memberRefs.array.buffer,
|
|
38
|
+
memberTypes: this.memberTypes.array.buffer,
|
|
39
|
+
memberRoles: this.memberRoles.array.buffer,
|
|
40
|
+
...this.ids.transferables(),
|
|
41
|
+
...this.tags.transferables(),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
addRelation(relation) {
|
|
45
|
+
this.ids.add(relation.id);
|
|
46
|
+
this.tags.addTags(relation.tags);
|
|
47
|
+
this.memberStart.push(this.memberRefs.length);
|
|
48
|
+
this.memberCount.push(relation.members.length);
|
|
49
|
+
for (const member of relation.members) {
|
|
50
|
+
this.memberRefs.push(member.ref);
|
|
51
|
+
this.memberTypes.push(RELATION_MEMBER_TYPES.indexOf(member.type));
|
|
52
|
+
this.memberRoles.push(this.stringTable.add(member.role ?? ""));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
addRelations(relations, blockStringIndexMap, filter) {
|
|
56
|
+
const blockToStringTable = (k) => {
|
|
57
|
+
const index = blockStringIndexMap.get(k);
|
|
58
|
+
if (index === undefined)
|
|
59
|
+
throw Error("Tag key not found");
|
|
60
|
+
return index;
|
|
61
|
+
};
|
|
62
|
+
let added = 0;
|
|
63
|
+
for (const relation of relations) {
|
|
64
|
+
const members = [];
|
|
65
|
+
const memberRefs = [];
|
|
66
|
+
const memberTypes = [];
|
|
67
|
+
const memberRoles = [];
|
|
68
|
+
let refId = 0;
|
|
69
|
+
for (let i = 0; i < relation.memids.length; i++) {
|
|
70
|
+
const memid = relation.memids[i];
|
|
71
|
+
const roleSid = relation.roles_sid[i];
|
|
72
|
+
const typeIndex = relation.types[i];
|
|
73
|
+
assertValue(memid, "Relation member ID is undefined");
|
|
74
|
+
assertValue(roleSid, "Relation member role SID is undefined");
|
|
75
|
+
assertValue(typeIndex, "Relation member type is undefined");
|
|
76
|
+
refId += memid;
|
|
77
|
+
const roleIndex = blockToStringTable(roleSid);
|
|
78
|
+
const type = RELATION_MEMBER_TYPES[typeIndex];
|
|
79
|
+
assertValue(type, "Relation member type not found");
|
|
80
|
+
if (filter) {
|
|
81
|
+
members.push({
|
|
82
|
+
type,
|
|
83
|
+
ref: refId,
|
|
84
|
+
role: this.stringTable.get(roleIndex),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
memberRefs.push(refId);
|
|
88
|
+
memberTypes.push(typeIndex);
|
|
89
|
+
memberRoles.push(roleIndex);
|
|
90
|
+
}
|
|
91
|
+
const tagKeys = relation.keys.map(blockToStringTable);
|
|
92
|
+
const tagValues = relation.vals.map(blockToStringTable);
|
|
93
|
+
const filteredRelation = filter
|
|
94
|
+
? filter({
|
|
95
|
+
id: relation.id,
|
|
96
|
+
members,
|
|
97
|
+
tags: this.tags.getTagsFromIndices(tagKeys, tagValues),
|
|
98
|
+
})
|
|
99
|
+
: null;
|
|
100
|
+
if (filter && filteredRelation === null)
|
|
101
|
+
continue;
|
|
102
|
+
added++;
|
|
103
|
+
this.ids.add(relation.id);
|
|
104
|
+
this.memberStart.push(this.memberRefs.length);
|
|
105
|
+
this.memberCount.push(filteredRelation?.members.length ?? memberRefs.length);
|
|
106
|
+
this.memberRefs.pushMany(filteredRelation?.members.map((m) => m.ref) ?? memberRefs);
|
|
107
|
+
this.memberTypes.pushMany(filteredRelation?.members.map((m) => RELATION_MEMBER_TYPES.indexOf(m.type)) ?? memberTypes);
|
|
108
|
+
this.memberRoles.pushMany(filteredRelation?.members.map((m) => this.stringTable.add(m.role ?? "")) ?? memberRoles);
|
|
109
|
+
this.tags.addTagKeysAndValues(tagKeys, tagValues);
|
|
110
|
+
}
|
|
111
|
+
return added;
|
|
112
|
+
}
|
|
113
|
+
buildEntityIndex() {
|
|
114
|
+
this.memberStart.compact();
|
|
115
|
+
this.memberCount.compact();
|
|
116
|
+
this.memberRefs.compact();
|
|
117
|
+
this.memberTypes.compact();
|
|
118
|
+
this.memberRoles.compact();
|
|
119
|
+
}
|
|
120
|
+
getFullEntity(index, id, tags) {
|
|
121
|
+
return {
|
|
122
|
+
id,
|
|
123
|
+
members: this.getMembersByIndex(index),
|
|
124
|
+
tags,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
getMembersByIndex(index, relationMemberTypes = RELATION_MEMBER_TYPES) {
|
|
128
|
+
const start = this.memberStart.at(index);
|
|
129
|
+
const count = this.memberCount.at(index);
|
|
130
|
+
const members = [];
|
|
131
|
+
for (let i = start; i < start + count; i++) {
|
|
132
|
+
const ref = this.memberRefs.at(i);
|
|
133
|
+
const type = RELATION_MEMBER_TYPES[this.memberTypes.at(i)];
|
|
134
|
+
if (type === undefined)
|
|
135
|
+
throw Error(`Member type not found: ${i}`);
|
|
136
|
+
if (!relationMemberTypes.includes(type))
|
|
137
|
+
continue;
|
|
138
|
+
const role = this.stringTable.get(this.memberRoles.at(i));
|
|
139
|
+
members.push({ ref, type, role });
|
|
140
|
+
}
|
|
141
|
+
return members;
|
|
142
|
+
}
|
|
143
|
+
includesMember(index, memberRef, memberType, memberRole) {
|
|
144
|
+
const start = this.memberStart.at(index);
|
|
145
|
+
const count = this.memberCount.at(index);
|
|
146
|
+
for (let i = start; i < start + count; i++) {
|
|
147
|
+
const type = RELATION_MEMBER_TYPES[this.memberTypes.at(i)];
|
|
148
|
+
if (type !== memberType)
|
|
149
|
+
continue;
|
|
150
|
+
const ref = this.memberRefs.at(i);
|
|
151
|
+
if (ref !== memberRef)
|
|
152
|
+
continue;
|
|
153
|
+
if (memberRole !== undefined &&
|
|
154
|
+
this.stringTable.get(this.memberRoles.at(i)) !== memberRole)
|
|
155
|
+
continue;
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=relations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/relations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { OsmPbfBlock, OsmPbfStringTable } from "@osmix/pbf";
|
|
2
|
+
import { type BufferType } from "./typed-arrays";
|
|
3
|
+
export interface StringTableTransferables {
|
|
4
|
+
bytes: BufferType;
|
|
5
|
+
start: BufferType;
|
|
6
|
+
count: BufferType;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* StringTable that can be used to store and retrieve strings as bytes.
|
|
10
|
+
*/
|
|
11
|
+
export default class StringTable {
|
|
12
|
+
private enc;
|
|
13
|
+
private dec;
|
|
14
|
+
private bytes;
|
|
15
|
+
private start;
|
|
16
|
+
private count;
|
|
17
|
+
private stringToIndex;
|
|
18
|
+
private indexToString;
|
|
19
|
+
static from({ bytes, start, count }: StringTableTransferables): StringTable;
|
|
20
|
+
constructor();
|
|
21
|
+
transferables(): StringTableTransferables;
|
|
22
|
+
add(str: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* Decode all the strings in a primitive block and add them to the string table.
|
|
25
|
+
* Return a mapping of block index -> string table index
|
|
26
|
+
*/
|
|
27
|
+
createBlockIndexMap(block: OsmPbfBlock): Map<number, number>;
|
|
28
|
+
/**
|
|
29
|
+
* TextDecoder.decode() does not support SharedArrayBuffer, so we need to first copy to a normal ArrayBuffer before decoding.
|
|
30
|
+
*/
|
|
31
|
+
get(index: number): string;
|
|
32
|
+
getBytes(index: number): Uint8Array;
|
|
33
|
+
get length(): number;
|
|
34
|
+
buildIndex(): void;
|
|
35
|
+
toOsmPbfStringTable(): OsmPbfStringTable;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=stringtable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringtable.d.ts","sourceRoot":"","sources":["../../src/stringtable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,gBAAgB,CAAA;AAEtE,MAAM,WAAW,wBAAwB;IACxC,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,UAAU,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,GAAG,CAAoB;IAG/B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,KAAK,CAAmC;IAGhD,OAAO,CAAC,aAAa,CAA4B;IAGjD,OAAO,CAAC,aAAa,CAA4B;IAEjD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,wBAAwB,GAAG,WAAW;;IAc3E,aAAa,IAAI,wBAAwB;IAQzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAYxB;;;OAGG;IACH,mBAAmB,CAAC,KAAK,EAAE,WAAW;IAWtC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAY1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IASnC,IAAI,MAAM,WAET;IAED,UAAU;IAQV,mBAAmB,IAAI,iBAAiB;CAOxC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ResizeableTypedArray } from "./typed-arrays";
|
|
2
|
+
/**
|
|
3
|
+
* StringTable that can be used to store and retrieve strings as bytes.
|
|
4
|
+
*/
|
|
5
|
+
export default class StringTable {
|
|
6
|
+
enc = new TextEncoder();
|
|
7
|
+
dec = new TextDecoder(); // UTF-8
|
|
8
|
+
// Serializable state
|
|
9
|
+
bytes;
|
|
10
|
+
start;
|
|
11
|
+
count;
|
|
12
|
+
// Builder state
|
|
13
|
+
stringToIndex = new Map();
|
|
14
|
+
// Retrieval state
|
|
15
|
+
indexToString = new Map();
|
|
16
|
+
static from({ bytes, start, count }) {
|
|
17
|
+
const builder = new StringTable();
|
|
18
|
+
builder.bytes = ResizeableTypedArray.from(Uint8Array, bytes);
|
|
19
|
+
builder.start = ResizeableTypedArray.from(Uint32Array, start);
|
|
20
|
+
builder.count = ResizeableTypedArray.from(Uint16Array, count);
|
|
21
|
+
return builder;
|
|
22
|
+
}
|
|
23
|
+
constructor() {
|
|
24
|
+
this.bytes = new ResizeableTypedArray(Uint8Array);
|
|
25
|
+
this.start = new ResizeableTypedArray(Uint32Array);
|
|
26
|
+
this.count = new ResizeableTypedArray(Uint16Array);
|
|
27
|
+
}
|
|
28
|
+
transferables() {
|
|
29
|
+
return {
|
|
30
|
+
bytes: this.bytes.array.buffer,
|
|
31
|
+
start: this.start.array.buffer,
|
|
32
|
+
count: this.count.array.buffer,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
add(str) {
|
|
36
|
+
const existingIndex = this.stringToIndex.get(str);
|
|
37
|
+
if (existingIndex !== undefined)
|
|
38
|
+
return existingIndex;
|
|
39
|
+
const startIndex = this.start.length;
|
|
40
|
+
const encoded = this.enc.encode(str);
|
|
41
|
+
this.start.push(this.bytes.length);
|
|
42
|
+
this.bytes.pushMany(encoded);
|
|
43
|
+
this.count.push(encoded.length);
|
|
44
|
+
this.stringToIndex.set(str, startIndex);
|
|
45
|
+
return startIndex;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Decode all the strings in a primitive block and add them to the string table.
|
|
49
|
+
* Return a mapping of block index -> string table index
|
|
50
|
+
*/
|
|
51
|
+
createBlockIndexMap(block) {
|
|
52
|
+
const map = new Map();
|
|
53
|
+
for (let i = 0; i < block.stringtable.length; i++) {
|
|
54
|
+
const bytesString = block.stringtable[i];
|
|
55
|
+
const str = this.dec.decode(bytesString);
|
|
56
|
+
const index = this.add(str);
|
|
57
|
+
map.set(i, index);
|
|
58
|
+
}
|
|
59
|
+
return map;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* TextDecoder.decode() does not support SharedArrayBuffer, so we need to first copy to a normal ArrayBuffer before decoding.
|
|
63
|
+
*/
|
|
64
|
+
get(index) {
|
|
65
|
+
const string = this.indexToString.get(index);
|
|
66
|
+
if (string)
|
|
67
|
+
return string;
|
|
68
|
+
const bytes = this.getBytes(index);
|
|
69
|
+
const tempBuffer = new ArrayBuffer(bytes.byteLength);
|
|
70
|
+
const tempBytes = new Uint8Array(tempBuffer);
|
|
71
|
+
tempBytes.set(bytes);
|
|
72
|
+
const decoded = this.dec.decode(tempBytes);
|
|
73
|
+
this.indexToString.set(index, decoded);
|
|
74
|
+
return decoded;
|
|
75
|
+
}
|
|
76
|
+
getBytes(index) {
|
|
77
|
+
if (index < 0 || index >= this.length)
|
|
78
|
+
throw Error(`String index out of range: ${index}`);
|
|
79
|
+
const start = this.start.at(index);
|
|
80
|
+
const count = this.count.at(index);
|
|
81
|
+
// Important: subarray creates a *view*, not a copy; TextDecoder cannot read from it directly.
|
|
82
|
+
return this.bytes.array.subarray(start, start + count);
|
|
83
|
+
}
|
|
84
|
+
get length() {
|
|
85
|
+
return this.start.length;
|
|
86
|
+
}
|
|
87
|
+
buildIndex() {
|
|
88
|
+
this.bytes.compact();
|
|
89
|
+
this.start.compact();
|
|
90
|
+
this.count.compact();
|
|
91
|
+
this.stringToIndex.clear();
|
|
92
|
+
}
|
|
93
|
+
toOsmPbfStringTable() {
|
|
94
|
+
const stringTable = [];
|
|
95
|
+
for (let i = 0; i < this.length; i++) {
|
|
96
|
+
stringTable.push(this.getBytes(i));
|
|
97
|
+
}
|
|
98
|
+
return stringTable;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=stringtable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringtable.js","sourceRoot":"","sources":["../../src/stringtable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { OsmTags } from "@osmix/json";
|
|
2
|
+
import type StringTable from "./stringtable";
|
|
3
|
+
import { type BufferType } from "./typed-arrays";
|
|
4
|
+
export interface TagsTransferables {
|
|
5
|
+
tagStart: BufferType;
|
|
6
|
+
tagCount: BufferType;
|
|
7
|
+
tagKeys: BufferType;
|
|
8
|
+
tagVals: BufferType;
|
|
9
|
+
}
|
|
10
|
+
export declare class Tags {
|
|
11
|
+
private stringTable;
|
|
12
|
+
private tagStart;
|
|
13
|
+
private tagCount;
|
|
14
|
+
private tagKeys;
|
|
15
|
+
private tagVals;
|
|
16
|
+
private indexBuilt;
|
|
17
|
+
static from(stringTable: StringTable, { tagStart, tagCount, tagKeys, tagVals }: TagsTransferables): Tags;
|
|
18
|
+
constructor(stringTable: StringTable);
|
|
19
|
+
transferables(): {
|
|
20
|
+
tagStart: ArrayBufferLike;
|
|
21
|
+
tagCount: ArrayBufferLike;
|
|
22
|
+
tagKeys: ArrayBufferLike;
|
|
23
|
+
tagVals: ArrayBufferLike;
|
|
24
|
+
};
|
|
25
|
+
addTags(tags?: OsmTags): void;
|
|
26
|
+
addTagKeysAndValues(keys: number[], values: number[]): void;
|
|
27
|
+
buildIndex(): void;
|
|
28
|
+
get isReady(): boolean;
|
|
29
|
+
cardinality(index: number): number;
|
|
30
|
+
getTags(index: number): OsmTags | undefined;
|
|
31
|
+
getTagsFromIndices(keys: number[], values: number[]): OsmTags;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,WAAW,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,gBAAgB,CAAA;AAEtE,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,UAAU,CAAA;IACpB,QAAQ,EAAE,UAAU,CAAA;IACpB,OAAO,EAAE,UAAU,CAAA;IACnB,OAAO,EAAE,UAAU,CAAA;CACnB;AAED,qBAAa,IAAI;IAChB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,OAAO,CAAmC;IAElD,OAAO,CAAC,UAAU,CAAQ;IAE1B,MAAM,CAAC,IAAI,CACV,WAAW,EAAE,WAAW,EACxB,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,iBAAiB;gBAWhD,WAAW,EAAE,WAAW;IAQpC,aAAa;;;;;;IASb,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO;IActB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAOpD,UAAU;IAQV,IAAI,OAAO,YAEV;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIlC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAuB3C,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO;CAW7D"}
|
package/dist/src/tags.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ResizeableTypedArray } from "./typed-arrays";
|
|
2
|
+
export class Tags {
|
|
3
|
+
stringTable;
|
|
4
|
+
tagStart;
|
|
5
|
+
tagCount;
|
|
6
|
+
tagKeys;
|
|
7
|
+
tagVals;
|
|
8
|
+
indexBuilt = false;
|
|
9
|
+
static from(stringTable, { tagStart, tagCount, tagKeys, tagVals }) {
|
|
10
|
+
const tagIndex = new Tags(stringTable);
|
|
11
|
+
tagIndex.tagStart = ResizeableTypedArray.from(Uint32Array, tagStart);
|
|
12
|
+
tagIndex.tagCount = ResizeableTypedArray.from(Uint8Array, tagCount);
|
|
13
|
+
tagIndex.tagKeys = ResizeableTypedArray.from(Uint32Array, tagKeys);
|
|
14
|
+
tagIndex.tagVals = ResizeableTypedArray.from(Uint32Array, tagVals);
|
|
15
|
+
tagIndex.indexBuilt = true;
|
|
16
|
+
return tagIndex;
|
|
17
|
+
}
|
|
18
|
+
constructor(stringTable) {
|
|
19
|
+
this.stringTable = stringTable;
|
|
20
|
+
this.tagStart = new ResizeableTypedArray(Uint32Array);
|
|
21
|
+
this.tagCount = new ResizeableTypedArray(Uint8Array);
|
|
22
|
+
this.tagKeys = new ResizeableTypedArray(Uint32Array);
|
|
23
|
+
this.tagVals = new ResizeableTypedArray(Uint32Array);
|
|
24
|
+
}
|
|
25
|
+
transferables() {
|
|
26
|
+
return {
|
|
27
|
+
tagStart: this.tagStart.array.buffer,
|
|
28
|
+
tagCount: this.tagCount.array.buffer,
|
|
29
|
+
tagKeys: this.tagKeys.array.buffer,
|
|
30
|
+
tagVals: this.tagVals.array.buffer,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
addTags(tags) {
|
|
34
|
+
const tagKeys = [];
|
|
35
|
+
const tagValues = [];
|
|
36
|
+
if (tags) {
|
|
37
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
38
|
+
tagKeys.push(this.stringTable.add(key));
|
|
39
|
+
tagValues.push(this.stringTable.add(String(value)));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this.addTagKeysAndValues(tagKeys, tagValues);
|
|
43
|
+
}
|
|
44
|
+
addTagKeysAndValues(keys, values) {
|
|
45
|
+
this.tagStart.push(this.tagKeys.length);
|
|
46
|
+
this.tagCount.push(keys.length);
|
|
47
|
+
this.tagKeys.pushMany(keys);
|
|
48
|
+
this.tagVals.pushMany(values);
|
|
49
|
+
}
|
|
50
|
+
buildIndex() {
|
|
51
|
+
this.tagStart.compact();
|
|
52
|
+
this.tagCount.compact();
|
|
53
|
+
this.tagKeys.compact();
|
|
54
|
+
this.tagVals.compact();
|
|
55
|
+
this.indexBuilt = true;
|
|
56
|
+
}
|
|
57
|
+
get isReady() {
|
|
58
|
+
return this.indexBuilt;
|
|
59
|
+
}
|
|
60
|
+
cardinality(index) {
|
|
61
|
+
return this.tagCount.at(index) ?? 0;
|
|
62
|
+
}
|
|
63
|
+
getTags(index) {
|
|
64
|
+
const tagCount = this.tagCount.at(index) ?? 0;
|
|
65
|
+
if (tagCount === 0)
|
|
66
|
+
return;
|
|
67
|
+
const tagStart = this.tagStart.at(index) ?? 0;
|
|
68
|
+
const tagKeyIndexes = this.tagKeys.array.slice(tagStart, tagStart + tagCount);
|
|
69
|
+
const tagValIndexes = this.tagVals.array.slice(tagStart, tagStart + tagCount);
|
|
70
|
+
const tags = {};
|
|
71
|
+
for (let i = 0; i < tagCount; i++) {
|
|
72
|
+
const keyIndex = tagKeyIndexes[i];
|
|
73
|
+
const valIndex = tagValIndexes[i];
|
|
74
|
+
if (keyIndex === undefined || valIndex === undefined)
|
|
75
|
+
throw Error("Tag key or value not found");
|
|
76
|
+
tags[this.stringTable.get(keyIndex)] = this.stringTable.get(valIndex);
|
|
77
|
+
}
|
|
78
|
+
return tags;
|
|
79
|
+
}
|
|
80
|
+
getTagsFromIndices(keys, values) {
|
|
81
|
+
const tags = {};
|
|
82
|
+
for (let i = 0; i < keys.length; i++) {
|
|
83
|
+
const keyIndex = keys[i];
|
|
84
|
+
const valIndex = values[i];
|
|
85
|
+
if (keyIndex === undefined || valIndex === undefined)
|
|
86
|
+
throw Error("Tag key or value not found");
|
|
87
|
+
tags[this.stringTable.get(keyIndex)] = this.stringTable.get(valIndex);
|
|
88
|
+
}
|
|
89
|
+
return tags;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use SharedArrayBuffer if the runtime supports it, otherwise fall back to ArrayBuffer.
|
|
3
|
+
*/
|
|
4
|
+
export declare const BufferConstructor: ArrayBufferConstructor | SharedArrayBufferConstructor;
|
|
5
|
+
export type BufferType = InstanceType<typeof BufferConstructor>;
|
|
6
|
+
export type TypedArray<B extends BufferType = BufferType> = Int8Array<B> | Uint8Array<B> | Uint8ClampedArray<B> | Int16Array<B> | Uint16Array<B> | Int32Array<B> | Uint32Array<B> | Float32Array<B> | Float64Array<B>;
|
|
7
|
+
export interface TypedArrayConstructor<T extends TypedArray<BufferType> = TypedArray<BufferType>> {
|
|
8
|
+
new (buffer: BufferType): T;
|
|
9
|
+
readonly BYTES_PER_ELEMENT: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* OSM IDs can be stored as 64-bit floating point numbers.
|
|
13
|
+
*/
|
|
14
|
+
export declare const IdArrayType: Float64ArrayConstructor;
|
|
15
|
+
/**
|
|
16
|
+
* When we are storing coordinates, we need to be able to store 64-bit floating point numbers.
|
|
17
|
+
* However, for benchmarking it is handy to test 32-bit floating point numbers.
|
|
18
|
+
*/
|
|
19
|
+
export declare const CoordinateArrayType: Float64ArrayConstructor;
|
|
20
|
+
/**
|
|
21
|
+
* When we are storing indexes into other arrays, we never need an index to exceed 2^32.
|
|
22
|
+
*/
|
|
23
|
+
export declare const IndexArrayType: Uint32ArrayConstructor;
|
|
24
|
+
/**
|
|
25
|
+
* Default buffer size.
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_BUFFER_SIZE: number;
|
|
28
|
+
export declare class ResizeableTypedArray<TA extends TypedArray> {
|
|
29
|
+
ArrayType: TypedArrayConstructor<TA>;
|
|
30
|
+
array: TA;
|
|
31
|
+
items: number;
|
|
32
|
+
buffer: BufferType;
|
|
33
|
+
bufferSize: number;
|
|
34
|
+
maxByteLength: number;
|
|
35
|
+
BC: SharedArrayBufferConstructor | ArrayBufferConstructor;
|
|
36
|
+
static from<TA extends TypedArray>(ArrayType: TypedArrayConstructor<TA>, buffer: BufferType): ResizeableTypedArray<TA>;
|
|
37
|
+
constructor(ArrayType: TypedArrayConstructor<TA>, BC?: SharedArrayBufferConstructor | ArrayBufferConstructor);
|
|
38
|
+
[Symbol.iterator](): ArrayIterator<number>;
|
|
39
|
+
expandArray(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Handles negative numbers
|
|
42
|
+
*/
|
|
43
|
+
at(index: number): number;
|
|
44
|
+
slice(start: number, end: number): Uint8Array<ArrayBuffer> | Int8Array<ArrayBuffer> | Uint8ClampedArray<ArrayBuffer> | Int16Array<ArrayBuffer> | Uint16Array<ArrayBuffer> | Int32Array<ArrayBuffer> | Uint32Array<ArrayBuffer> | Float32Array<ArrayBuffer> | Float64Array<ArrayBuffer>;
|
|
45
|
+
get length(): number;
|
|
46
|
+
push(value: number): number;
|
|
47
|
+
pushMany(values: number[] | TypedArray): void;
|
|
48
|
+
compact(): TA;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=typed-arrays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-arrays.d.ts","sourceRoot":"","sources":["../../src/typed-arrays.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,iBAAiB,uDAGa,CAAA;AAC3C,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE/D,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,IACrD,SAAS,CAAC,CAAC,CAAC,GACZ,UAAU,CAAC,CAAC,CAAC,GACb,iBAAiB,CAAC,CAAC,CAAC,GACpB,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,UAAU,CAAC,CAAC,CAAC,GACb,WAAW,CAAC,CAAC,CAAC,GACd,YAAY,CAAC,CAAC,CAAC,GACf,YAAY,CAAC,CAAC,CAAC,CAAA;AAElB,MAAM,WAAW,qBAAqB,CACrC,CAAC,SAAS,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC;IAEzD,KAAK,MAAM,EAAE,UAAU,GAAG,CAAC,CAAA;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAClC;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,yBAAe,CAAA;AAEvC;;;GAGG;AACH,eAAO,MAAM,mBAAmB,yBAAe,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,cAAc,wBAAc,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAU,CAAA;AAE1C,qBAAa,oBAAoB,CAAC,EAAE,SAAS,UAAU;IACtD,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAA;IACpC,KAAK,EAAE,EAAE,CAAA;IACT,KAAK,SAAI;IAET,MAAM,EAAE,UAAU,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IAErB,EAAE,EAAE,4BAA4B,GAAG,sBAAsB,CAAA;IAEzD,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,UAAU,EAChC,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EACpC,MAAM,EAAE,UAAU;gBAalB,SAAS,EAAE,qBAAqB,CAAC,EAAE,CAAC,EACpC,EAAE,GACC,4BAA4B,GAC5B,sBAA0C;IAY9C,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;IAI1C,WAAW;IAsBX;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IASzB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAIhC,IAAI,MAAM,WAET;IAED,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU;IAMtC,OAAO;CAcP"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use SharedArrayBuffer if the runtime supports it, otherwise fall back to ArrayBuffer.
|
|
3
|
+
*/
|
|
4
|
+
export const BufferConstructor = typeof SharedArrayBuffer !== "undefined"
|
|
5
|
+
? SharedArrayBuffer
|
|
6
|
+
: ArrayBuffer;
|
|
7
|
+
/**
|
|
8
|
+
* OSM IDs can be stored as 64-bit floating point numbers.
|
|
9
|
+
*/
|
|
10
|
+
export const IdArrayType = Float64Array;
|
|
11
|
+
/**
|
|
12
|
+
* When we are storing coordinates, we need to be able to store 64-bit floating point numbers.
|
|
13
|
+
* However, for benchmarking it is handy to test 32-bit floating point numbers.
|
|
14
|
+
*/
|
|
15
|
+
export const CoordinateArrayType = Float64Array;
|
|
16
|
+
/**
|
|
17
|
+
* When we are storing indexes into other arrays, we never need an index to exceed 2^32.
|
|
18
|
+
*/
|
|
19
|
+
export const IndexArrayType = Uint32Array;
|
|
20
|
+
/**
|
|
21
|
+
* Default buffer size.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_BUFFER_SIZE = 2 ** 20; // 1 MiB
|
|
24
|
+
export class ResizeableTypedArray {
|
|
25
|
+
ArrayType;
|
|
26
|
+
array;
|
|
27
|
+
items = 0;
|
|
28
|
+
buffer;
|
|
29
|
+
bufferSize;
|
|
30
|
+
maxByteLength;
|
|
31
|
+
BC;
|
|
32
|
+
static from(ArrayType, buffer) {
|
|
33
|
+
const rta = new ResizeableTypedArray(ArrayType, buffer instanceof SharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer);
|
|
34
|
+
rta.buffer = buffer;
|
|
35
|
+
rta.array = new ArrayType(buffer);
|
|
36
|
+
rta.items = rta.array.length;
|
|
37
|
+
return rta;
|
|
38
|
+
}
|
|
39
|
+
constructor(ArrayType, BC = BufferConstructor) {
|
|
40
|
+
this.ArrayType = ArrayType;
|
|
41
|
+
this.bufferSize = DEFAULT_BUFFER_SIZE;
|
|
42
|
+
this.maxByteLength = DEFAULT_BUFFER_SIZE * 2;
|
|
43
|
+
this.BC = BC;
|
|
44
|
+
this.buffer = new BC(this.bufferSize, {
|
|
45
|
+
maxByteLength: this.maxByteLength,
|
|
46
|
+
});
|
|
47
|
+
this.array = new this.ArrayType(this.buffer);
|
|
48
|
+
}
|
|
49
|
+
[Symbol.iterator]() {
|
|
50
|
+
return this.array[Symbol.iterator]();
|
|
51
|
+
}
|
|
52
|
+
expandArray() {
|
|
53
|
+
this.bufferSize *= 2;
|
|
54
|
+
if (this.bufferSize > this.buffer.maxByteLength) {
|
|
55
|
+
this.maxByteLength *= 2;
|
|
56
|
+
const newBuffer = new this.BC(this.bufferSize, {
|
|
57
|
+
maxByteLength: this.maxByteLength,
|
|
58
|
+
});
|
|
59
|
+
const newArray = new this.ArrayType(newBuffer);
|
|
60
|
+
newArray.set(this.array);
|
|
61
|
+
this.buffer = newBuffer;
|
|
62
|
+
this.array = newArray;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
if (this.buffer instanceof SharedArrayBuffer && this.buffer.growable) {
|
|
66
|
+
this.buffer.grow(this.bufferSize);
|
|
67
|
+
}
|
|
68
|
+
else if (this.buffer instanceof ArrayBuffer && this.buffer.resizable) {
|
|
69
|
+
this.buffer.resize(this.bufferSize);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw Error("Buffer is not growable or resizable");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handles negative numbers
|
|
78
|
+
*/
|
|
79
|
+
at(index) {
|
|
80
|
+
if (index < -this.length || index >= this.length)
|
|
81
|
+
throw Error(`Index out of bounds: ${index}. Length: ${this.length}`);
|
|
82
|
+
if (index < 0)
|
|
83
|
+
return this.at(this.length + index);
|
|
84
|
+
const result = this.array[index];
|
|
85
|
+
if (result === undefined)
|
|
86
|
+
throw Error(`No value at index: ${index}`);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
slice(start, end) {
|
|
90
|
+
return this.array.slice(start, end);
|
|
91
|
+
}
|
|
92
|
+
get length() {
|
|
93
|
+
return this.items;
|
|
94
|
+
}
|
|
95
|
+
push(value) {
|
|
96
|
+
if (this.length >= this.array.length) {
|
|
97
|
+
this.expandArray();
|
|
98
|
+
}
|
|
99
|
+
this.array[this.items++] = value;
|
|
100
|
+
return this.length - 1;
|
|
101
|
+
}
|
|
102
|
+
pushMany(values) {
|
|
103
|
+
while (this.length + values.length > this.array.length)
|
|
104
|
+
this.expandArray();
|
|
105
|
+
this.array.set(values, this.length);
|
|
106
|
+
this.items += values.length;
|
|
107
|
+
}
|
|
108
|
+
compact() {
|
|
109
|
+
if (this.buffer instanceof SharedArrayBuffer) {
|
|
110
|
+
this.buffer = this.buffer.slice(0, this.length * this.ArrayType.BYTES_PER_ELEMENT);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.buffer = this.buffer.transferToFixedLength(this.length * this.ArrayType.BYTES_PER_ELEMENT);
|
|
114
|
+
}
|
|
115
|
+
this.array = new this.ArrayType(this.buffer);
|
|
116
|
+
return this.array;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=typed-arrays.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-arrays.js","sourceRoot":"","sources":["../../src/typed-arrays.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GeoBbox2D, LonLat } from "@osmix/shared/types";
|
|
2
|
+
export declare function throttle<T extends unknown[]>(func: (...args: T) => void, timeFrame: number): (...args: T) => void;
|
|
3
|
+
export declare function bboxFromLonLats(lonLats: LonLat[]): GeoBbox2D;
|
|
4
|
+
//# sourceMappingURL=utils.d.ts.map
|