@loaders.gl/wkt 4.0.0-alpha.24 → 4.0.0-alpha.25
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/README.md +4 -1
- package/dist/dist.min.js +1447 -406
- package/dist/es5/hex-wkb-loader.js +64 -0
- package/dist/es5/hex-wkb-loader.js.map +1 -0
- package/dist/es5/index.js +76 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/encode-twkb.js +269 -0
- package/dist/es5/lib/encode-twkb.js.map +1 -0
- package/dist/es5/lib/encode-wkb.js +12 -10
- package/dist/es5/lib/encode-wkb.js.map +1 -1
- package/dist/es5/lib/encode-wkt-crs.js +32 -0
- package/dist/es5/lib/encode-wkt-crs.js.map +1 -0
- package/dist/es5/lib/encode-wkt.js +1 -1
- package/dist/es5/lib/encode-wkt.js.map +1 -1
- package/dist/es5/lib/parse-hex-wkb.js +2 -0
- package/dist/es5/lib/parse-hex-wkb.js.map +1 -0
- package/dist/es5/lib/parse-twkb.js +259 -0
- package/dist/es5/lib/parse-twkb.js.map +1 -0
- package/dist/es5/lib/parse-wkb-header.js +114 -0
- package/dist/es5/lib/parse-wkb-header.js.map +1 -0
- package/dist/es5/lib/parse-wkb.js +59 -52
- package/dist/es5/lib/parse-wkb.js.map +1 -1
- package/dist/es5/lib/parse-wkt-crs.js +106 -0
- package/dist/es5/lib/parse-wkt-crs.js.map +1 -0
- package/dist/es5/lib/parse-wkt.js +210 -153
- package/dist/es5/lib/parse-wkt.js.map +1 -1
- package/dist/es5/lib/utils/base64-encoder.js +26 -0
- package/dist/es5/lib/utils/base64-encoder.js.map +1 -0
- package/dist/es5/lib/utils/binary-reader.js +98 -0
- package/dist/es5/lib/utils/binary-reader.js.map +1 -0
- package/dist/es5/lib/utils/binary-writer.js +2 -2
- package/dist/es5/lib/utils/binary-writer.js.map +1 -1
- package/dist/es5/lib/utils/hex-encoder.js +63 -0
- package/dist/es5/lib/utils/hex-encoder.js.map +1 -0
- package/dist/es5/lib/utils/hex-transcoder.js +41 -0
- package/dist/es5/lib/utils/hex-transcoder.js.map +1 -0
- package/dist/es5/lib/utils/version.js +1 -1
- package/dist/es5/twkb-loader.js +53 -0
- package/dist/es5/twkb-loader.js.map +1 -0
- package/dist/es5/twkb-writer.js +40 -0
- package/dist/es5/twkb-writer.js.map +1 -0
- package/dist/es5/wkb-loader.js +8 -4
- package/dist/es5/wkb-loader.js.map +1 -1
- package/dist/es5/wkb-writer.js +2 -3
- package/dist/es5/wkb-writer.js.map +1 -1
- package/dist/es5/wkt-crs-loader.js +47 -0
- package/dist/es5/wkt-crs-loader.js.map +1 -0
- package/dist/es5/wkt-crs-writer.js +49 -0
- package/dist/es5/wkt-crs-writer.js.map +1 -0
- package/dist/es5/wkt-loader.js +10 -6
- package/dist/es5/wkt-loader.js.map +1 -1
- package/dist/es5/wkt-writer.js +2 -3
- package/dist/es5/wkt-writer.js.map +1 -1
- package/dist/es5/workers/wkb-worker.js.map +1 -1
- package/dist/es5/workers/wkt-worker.js.map +1 -1
- package/dist/esm/hex-wkb-loader.js +37 -0
- package/dist/esm/hex-wkb-loader.js.map +1 -0
- package/dist/esm/index.js +10 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/encode-twkb.js +180 -0
- package/dist/esm/lib/encode-twkb.js.map +1 -0
- package/dist/esm/lib/encode-wkb.js +4 -4
- package/dist/esm/lib/encode-wkb.js.map +1 -1
- package/dist/esm/lib/encode-wkt-crs.js +21 -0
- package/dist/esm/lib/encode-wkt-crs.js.map +1 -0
- package/dist/esm/lib/encode-wkt.js +1 -1
- package/dist/esm/lib/encode-wkt.js.map +1 -1
- package/dist/esm/lib/parse-hex-wkb.js +2 -0
- package/dist/esm/lib/parse-hex-wkb.js.map +1 -0
- package/dist/esm/lib/parse-twkb.js +252 -0
- package/dist/esm/lib/parse-twkb.js.map +1 -0
- package/dist/esm/lib/parse-wkb-header.js +105 -0
- package/dist/esm/lib/parse-wkb-header.js.map +1 -0
- package/dist/esm/lib/parse-wkb.js +59 -51
- package/dist/esm/lib/parse-wkb.js.map +1 -1
- package/dist/esm/lib/parse-wkt-crs.js +96 -0
- package/dist/esm/lib/parse-wkt-crs.js.map +1 -0
- package/dist/esm/lib/parse-wkt.js +204 -152
- package/dist/esm/lib/parse-wkt.js.map +1 -1
- package/dist/esm/lib/utils/base64-encoder.js +7 -0
- package/dist/esm/lib/utils/base64-encoder.js.map +1 -0
- package/dist/esm/lib/utils/binary-reader.js +67 -0
- package/dist/esm/lib/utils/binary-reader.js.map +1 -0
- package/dist/esm/lib/utils/binary-writer.js +1 -1
- package/dist/esm/lib/utils/binary-writer.js.map +1 -1
- package/dist/esm/lib/utils/hex-encoder.js +40 -0
- package/dist/esm/lib/utils/hex-encoder.js.map +1 -0
- package/dist/esm/lib/utils/hex-transcoder.js +34 -0
- package/dist/esm/lib/utils/hex-transcoder.js.map +1 -0
- package/dist/esm/lib/utils/version.js +1 -1
- package/dist/esm/twkb-loader.js +24 -0
- package/dist/esm/twkb-loader.js.map +1 -0
- package/dist/esm/twkb-writer.js +14 -0
- package/dist/esm/twkb-writer.js.map +1 -0
- package/dist/esm/wkb-loader.js +6 -2
- package/dist/esm/wkb-loader.js.map +1 -1
- package/dist/esm/wkb-writer.js +1 -1
- package/dist/esm/wkb-writer.js.map +1 -1
- package/dist/esm/wkt-crs-loader.js +19 -0
- package/dist/esm/wkt-crs-loader.js.map +1 -0
- package/dist/esm/wkt-crs-writer.js +19 -0
- package/dist/esm/wkt-crs-writer.js.map +1 -0
- package/dist/esm/wkt-loader.js +8 -3
- package/dist/esm/wkt-loader.js.map +1 -1
- package/dist/esm/wkt-writer.js +2 -2
- package/dist/esm/wkt-writer.js.map +1 -1
- package/dist/esm/workers/wkb-worker.js.map +1 -1
- package/dist/esm/workers/wkt-worker.js.map +1 -1
- package/dist/src/bundle.d.ts.map +1 -0
- package/dist/src/hex-wkb-loader.d.ts +17 -0
- package/dist/src/hex-wkb-loader.d.ts.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/lib/encode-twkb.d.ts +6 -0
- package/dist/src/lib/encode-twkb.d.ts.map +1 -0
- package/dist/{lib → src/lib}/encode-wkb.d.ts +16 -3
- package/dist/src/lib/encode-wkb.d.ts.map +1 -0
- package/dist/src/lib/encode-wkt-crs.d.ts +10 -0
- package/dist/src/lib/encode-wkt-crs.d.ts.map +1 -0
- package/dist/{lib → src/lib}/encode-wkt.d.ts +1 -1
- package/dist/src/lib/encode-wkt.d.ts.map +1 -0
- package/dist/src/lib/parse-hex-wkb.d.ts +1 -0
- package/dist/src/lib/parse-hex-wkb.d.ts.map +1 -0
- package/dist/src/lib/parse-twkb.d.ts +9 -0
- package/dist/src/lib/parse-twkb.d.ts.map +1 -0
- package/dist/src/lib/parse-wkb-header.d.ts +39 -0
- package/dist/src/lib/parse-wkb-header.d.ts.map +1 -0
- package/dist/src/lib/parse-wkb.d.ts +5 -0
- package/dist/src/lib/parse-wkb.d.ts.map +1 -0
- package/dist/src/lib/parse-wkt-crs.d.ts +15 -0
- package/dist/src/lib/parse-wkt-crs.d.ts.map +1 -0
- package/dist/src/lib/parse-wkt.d.ts +30 -0
- package/dist/src/lib/parse-wkt.d.ts.map +1 -0
- package/dist/src/lib/utils/base64-encoder.d.ts +5 -0
- package/dist/src/lib/utils/base64-encoder.d.ts.map +1 -0
- package/dist/src/lib/utils/binary-reader.d.ts +18 -0
- package/dist/src/lib/utils/binary-reader.d.ts.map +1 -0
- package/dist/{lib → src/lib}/utils/binary-writer.d.ts +1 -1
- package/dist/src/lib/utils/binary-writer.d.ts.map +1 -0
- package/dist/src/lib/utils/hex-encoder.d.ts +15 -0
- package/dist/src/lib/utils/hex-encoder.d.ts.map +1 -0
- package/dist/src/lib/utils/hex-transcoder.d.ts +15 -0
- package/dist/src/lib/utils/hex-transcoder.d.ts.map +1 -0
- package/dist/src/lib/utils/version.d.ts.map +1 -0
- package/dist/src/twkb-loader.d.ts +16 -0
- package/dist/src/twkb-loader.d.ts.map +1 -0
- package/dist/src/twkb-writer.d.ts +7 -0
- package/dist/src/twkb-writer.d.ts.map +1 -0
- package/dist/src/wkb-loader.d.ts +16 -0
- package/dist/src/wkb-loader.d.ts.map +1 -0
- package/dist/src/wkb-writer.d.ts +7 -0
- package/dist/src/wkb-writer.d.ts.map +1 -0
- package/dist/src/wkt-crs-loader.d.ts +12 -0
- package/dist/src/wkt-crs-loader.d.ts.map +1 -0
- package/dist/src/wkt-crs-writer.d.ts +13 -0
- package/dist/src/wkt-crs-writer.d.ts.map +1 -0
- package/dist/src/wkt-loader.d.ts +18 -0
- package/dist/src/wkt-loader.d.ts.map +1 -0
- package/dist/src/wkt-writer.d.ts +10 -0
- package/dist/src/wkt-writer.d.ts.map +1 -0
- package/dist/{workers → src/workers}/wkb-worker.d.ts.map +1 -1
- package/dist/{workers → src/workers}/wkt-worker.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/wkt-worker.js +222 -183
- package/package.json +4 -4
- package/src/hex-wkb-loader.ts +61 -0
- package/src/index.ts +22 -1
- package/src/lib/encode-twkb.ts +304 -0
- package/src/lib/encode-wkb.ts +5 -5
- package/src/lib/encode-wkt-crs.ts +39 -0
- package/src/lib/encode-wkt.ts +3 -2
- package/src/lib/parse-hex-wkb.ts +0 -0
- package/src/lib/parse-twkb.ts +351 -0
- package/src/lib/parse-wkb-header.ts +172 -0
- package/src/lib/parse-wkb.ts +69 -58
- package/src/lib/parse-wkt-crs.ts +147 -0
- package/src/lib/parse-wkt.ts +275 -174
- package/src/lib/utils/base64-encoder.ts +153 -0
- package/src/lib/utils/binary-reader.ts +72 -0
- package/src/lib/utils/binary-writer.ts +1 -1
- package/src/lib/utils/hex-encoder.ts +58 -0
- package/src/lib/utils/hex-transcoder.ts +50 -0
- package/src/twkb-loader.ts +42 -0
- package/src/twkb-writer.ts +25 -0
- package/src/wkb-loader.ts +17 -5
- package/src/wkb-writer.ts +6 -4
- package/src/wkt-crs-loader.ts +33 -0
- package/src/wkt-crs-writer.ts +37 -0
- package/src/wkt-loader.ts +20 -6
- package/src/wkt-writer.ts +12 -5
- package/src/workers/wkb-worker.ts +2 -0
- package/src/workers/wkt-worker.ts +2 -0
- package/dist/bundle.d.ts.map +0 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/encode-wkb.d.ts.map +0 -1
- package/dist/lib/encode-wkt.d.ts.map +0 -1
- package/dist/lib/parse-wkb.d.ts +0 -3
- package/dist/lib/parse-wkb.d.ts.map +0 -1
- package/dist/lib/parse-wkt.d.ts +0 -8
- package/dist/lib/parse-wkt.d.ts.map +0 -1
- package/dist/lib/utils/binary-writer.d.ts.map +0 -1
- package/dist/lib/utils/version.d.ts.map +0 -1
- package/dist/wkb-loader.d.ts +0 -11
- package/dist/wkb-loader.d.ts.map +0 -1
- package/dist/wkb-writer.d.ts +0 -6
- package/dist/wkb-writer.d.ts.map +0 -1
- package/dist/wkt-loader.d.ts +0 -11
- package/dist/wkt-loader.d.ts.map +0 -1
- package/dist/wkt-writer.d.ts +0 -6
- package/dist/wkt-writer.d.ts.map +0 -1
- /package/dist/{bundle.d.ts → src/bundle.d.ts} +0 -0
- /package/dist/{lib → src/lib}/utils/version.d.ts +0 -0
- /package/dist/{workers → src/workers}/wkb-worker.d.ts +0 -0
- /package/dist/{workers → src/workers}/wkt-worker.d.ts +0 -0
package/dist/dist.min.js
CHANGED
|
@@ -21,47 +21,767 @@
|
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
|
|
24
|
+
// src/lib/parse-wkt-crs.ts
|
|
25
|
+
function parseWKTCRS(wkt, options) {
|
|
26
|
+
if (options?.debug) {
|
|
27
|
+
console.log("[wktcrs] parse starting with\n", wkt);
|
|
28
|
+
}
|
|
29
|
+
wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, (match) => `["${match.substr(0, match.length - 1)}",`);
|
|
30
|
+
wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, (match, p1) => {
|
|
31
|
+
const varname = p1.substr(0, p1.length - 1);
|
|
32
|
+
return `,"${options?.raw ? "raw:" : ""}${varname}"${p1[p1.length - 1]}`;
|
|
33
|
+
});
|
|
34
|
+
if (options?.raw) {
|
|
35
|
+
wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function(match, p1) {
|
|
36
|
+
return `,"${options?.raw ? "raw:" : ""}${p1}"`;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (options?.debug) {
|
|
40
|
+
console.log(`[wktcrs] json'd wkt: '${wkt}'`);
|
|
41
|
+
}
|
|
42
|
+
let data;
|
|
43
|
+
try {
|
|
44
|
+
data = JSON.parse(wkt);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.error(`[wktcrs] failed to parse '${wkt}'`);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
if (options?.debug) {
|
|
50
|
+
console.log(`[wktcrs] json parsed: '${wkt}'`);
|
|
51
|
+
}
|
|
52
|
+
function process(data2, parent) {
|
|
53
|
+
const kw = data2[0];
|
|
54
|
+
data2.forEach(function(it) {
|
|
55
|
+
if (Array.isArray(it)) {
|
|
56
|
+
process(it, data2);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const kwarr = `MULTIPLE_${kw}`;
|
|
60
|
+
if (kwarr in parent) {
|
|
61
|
+
parent[kwarr].push(data2);
|
|
62
|
+
} else if (kw in parent) {
|
|
63
|
+
parent[kwarr] = [parent[kw], data2];
|
|
64
|
+
delete parent[kw];
|
|
65
|
+
} else {
|
|
66
|
+
parent[kw] = data2;
|
|
67
|
+
}
|
|
68
|
+
return parent;
|
|
69
|
+
}
|
|
70
|
+
const result = process(data, [data]);
|
|
71
|
+
if (options?.debug) {
|
|
72
|
+
console.log("[wktcrs] parse returning", result);
|
|
73
|
+
}
|
|
74
|
+
if (options?.sort) {
|
|
75
|
+
sort(result, options);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
function sort(data, options) {
|
|
80
|
+
const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
|
|
81
|
+
const keywords = options?.keywords || [];
|
|
82
|
+
if (!options?.keywords) {
|
|
83
|
+
const counts = {};
|
|
84
|
+
if (Array.isArray(data)) {
|
|
85
|
+
data.forEach((it) => {
|
|
86
|
+
if (Array.isArray(it) && it.length >= 2 && typeof it[1] === "string") {
|
|
87
|
+
const k = it[0];
|
|
88
|
+
if (!counts[k])
|
|
89
|
+
counts[k] = 0;
|
|
90
|
+
counts[k]++;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
for (const k in counts) {
|
|
94
|
+
if (counts[k] > 0)
|
|
95
|
+
keywords.push(k);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
keys.forEach((key) => {
|
|
100
|
+
data[key] = sort(data[key]);
|
|
101
|
+
});
|
|
102
|
+
keywords.forEach((key) => {
|
|
103
|
+
const indices = [];
|
|
104
|
+
const params = [];
|
|
105
|
+
data.forEach((item, i) => {
|
|
106
|
+
if (Array.isArray(item) && item[0] === key) {
|
|
107
|
+
indices.push(i);
|
|
108
|
+
params.push(item);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
params.sort((a, b) => {
|
|
112
|
+
a = a[1].toString();
|
|
113
|
+
b = b[1].toString();
|
|
114
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
115
|
+
});
|
|
116
|
+
params.forEach((param, i) => {
|
|
117
|
+
data[indices[i]] = param;
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
return data;
|
|
121
|
+
}
|
|
122
|
+
var init_parse_wkt_crs = __esm({
|
|
123
|
+
"src/lib/parse-wkt-crs.ts"() {
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// src/wkt-crs-loader.ts
|
|
128
|
+
var WKTCRSLoader;
|
|
129
|
+
var init_wkt_crs_loader = __esm({
|
|
130
|
+
"src/wkt-crs-loader.ts"() {
|
|
131
|
+
init_version();
|
|
132
|
+
init_parse_wkt_crs();
|
|
133
|
+
WKTCRSLoader = {
|
|
134
|
+
name: "WKT CRS (Well-Known Text Coordinate Reference System)",
|
|
135
|
+
id: "wkt-crs",
|
|
136
|
+
module: "wkt-crs",
|
|
137
|
+
version: VERSION,
|
|
138
|
+
worker: true,
|
|
139
|
+
extensions: [],
|
|
140
|
+
mimeTypes: ["text/plain"],
|
|
141
|
+
category: "json",
|
|
142
|
+
text: true,
|
|
143
|
+
options: {
|
|
144
|
+
"wkt-crs": {}
|
|
145
|
+
},
|
|
146
|
+
parse: async (arrayBuffer, options) => parseWKTCRS(new TextDecoder().decode(arrayBuffer), options?.["wkt-crs"]),
|
|
147
|
+
parseTextSync: (string, options) => parseWKTCRS(string, options?.["wkt-crs"])
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// src/lib/encode-wkt-crs.ts
|
|
153
|
+
function encodeWKTCRS(wkt, options) {
|
|
154
|
+
if (Array.isArray(wkt) && wkt.length === 1 && Array.isArray(wkt[0])) {
|
|
155
|
+
wkt = wkt[0];
|
|
156
|
+
}
|
|
157
|
+
const [kw, ...attrs] = wkt;
|
|
158
|
+
const str = `${kw}[${attrs.map((attr) => {
|
|
159
|
+
if (Array.isArray(attr)) {
|
|
160
|
+
return encodeWKTCRS(attr, options);
|
|
161
|
+
} else if (typeof attr === "number") {
|
|
162
|
+
return attr.toString();
|
|
163
|
+
} else if (typeof attr === "string") {
|
|
164
|
+
if (attr.startsWith("raw:")) {
|
|
165
|
+
return attr.replace("raw:", "");
|
|
166
|
+
}
|
|
167
|
+
return `"${attr}"`;
|
|
168
|
+
}
|
|
169
|
+
throw new Error(`[wktcrs] unexpected attribute "${attr}"`);
|
|
170
|
+
}).join(",")}]`;
|
|
171
|
+
return str;
|
|
172
|
+
}
|
|
173
|
+
var init_encode_wkt_crs = __esm({
|
|
174
|
+
"src/lib/encode-wkt-crs.ts"() {
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// src/wkt-crs-writer.ts
|
|
179
|
+
var WKTCRSWriter;
|
|
180
|
+
var init_wkt_crs_writer = __esm({
|
|
181
|
+
"src/wkt-crs-writer.ts"() {
|
|
182
|
+
init_version();
|
|
183
|
+
init_encode_wkt_crs();
|
|
184
|
+
WKTCRSWriter = {
|
|
185
|
+
name: "WKT CRS (Well-Known Text Coordinate Reference System)",
|
|
186
|
+
id: "wkt-crs",
|
|
187
|
+
module: "wkt-crs",
|
|
188
|
+
version: VERSION,
|
|
189
|
+
worker: true,
|
|
190
|
+
extensions: [],
|
|
191
|
+
mimeTypes: ["text/plain"],
|
|
192
|
+
text: true,
|
|
193
|
+
options: {
|
|
194
|
+
"wkt-crs": {}
|
|
195
|
+
},
|
|
196
|
+
encode: async (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options?.["wkt-crs"])),
|
|
197
|
+
encodeSync: (wktcrs, options) => new TextEncoder().encode(encodeWKTCRS(wktcrs, options?.["wkt-crs"])),
|
|
198
|
+
encodeTextSync: (wktcrs, options) => encodeWKTCRS(wktcrs, options?.["wkt-crs"])
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// src/lib/parse-wkt.ts
|
|
204
|
+
function isWKT(input) {
|
|
205
|
+
return WKT_MAGIC_STRINGS.some((magicString) => input.startsWith(magicString));
|
|
206
|
+
}
|
|
207
|
+
function parseWKT(input, options) {
|
|
208
|
+
return parseWKTToGeometry(input, options);
|
|
209
|
+
}
|
|
210
|
+
function parseWKTToGeometry(input, options) {
|
|
211
|
+
const parts = input.split(";");
|
|
212
|
+
let _ = parts.pop();
|
|
213
|
+
const srid = (parts.shift() || "").split("=").pop();
|
|
214
|
+
const state = { parts, _, i: 0 };
|
|
215
|
+
const geometry = parseGeometry(state);
|
|
216
|
+
return options?.wkt?.crs ? addCRS(geometry, srid) : geometry;
|
|
217
|
+
}
|
|
218
|
+
function parseGeometry(state) {
|
|
219
|
+
return parsePoint(state) || parseLineString(state) || parsePolygon(state) || parseMultiPoint(state) || parseMultiLineString(state) || parseMultiPolygon(state) || parseGeometryCollection(state);
|
|
220
|
+
}
|
|
221
|
+
function addCRS(obj, srid) {
|
|
222
|
+
if (obj && srid?.match(/\d+/)) {
|
|
223
|
+
const crs = {
|
|
224
|
+
type: "name",
|
|
225
|
+
properties: {
|
|
226
|
+
name: "urn:ogc:def:crs:EPSG::" + srid
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
obj.crs = crs;
|
|
230
|
+
}
|
|
231
|
+
return obj;
|
|
232
|
+
}
|
|
233
|
+
function parsePoint(state) {
|
|
234
|
+
if (!$(/^(POINT(\sz)?)/i, state)) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
white(state);
|
|
238
|
+
if (!$(/^(\()/, state)) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const c = coords(state);
|
|
242
|
+
if (!c) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
white(state);
|
|
246
|
+
if (!$(/^(\))/, state)) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
type: "Point",
|
|
251
|
+
coordinates: c[0]
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function parseMultiPoint(state) {
|
|
255
|
+
if (!$(/^(MULTIPOINT)/i, state)) {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
white(state);
|
|
259
|
+
const newCoordsFormat = state._?.substring(state._?.indexOf("(") + 1, state._.length - 1).replace(/\(/g, "").replace(/\)/g, "");
|
|
260
|
+
state._ = "MULTIPOINT (" + newCoordsFormat + ")";
|
|
261
|
+
const c = multicoords(state);
|
|
262
|
+
if (!c) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
white(state);
|
|
266
|
+
return {
|
|
267
|
+
type: "MultiPoint",
|
|
268
|
+
coordinates: c
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
function parseLineString(state) {
|
|
272
|
+
if (!$(/^(LINESTRING(\sz)?)/i, state)) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
white(state);
|
|
276
|
+
if (!$(/^(\()/, state)) {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
const c = coords(state);
|
|
280
|
+
if (!c) {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
if (!$(/^(\))/, state)) {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
type: "LineString",
|
|
288
|
+
coordinates: c
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function parseMultiLineString(state) {
|
|
292
|
+
if (!$(/^(MULTILINESTRING)/i, state))
|
|
293
|
+
return null;
|
|
294
|
+
white(state);
|
|
295
|
+
const c = multicoords(state);
|
|
296
|
+
if (!c) {
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
white(state);
|
|
300
|
+
return {
|
|
301
|
+
type: "MultiLineString",
|
|
302
|
+
coordinates: c
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function parsePolygon(state) {
|
|
306
|
+
if (!$(/^(POLYGON(\sz)?)/i, state)) {
|
|
307
|
+
return null;
|
|
308
|
+
}
|
|
309
|
+
white(state);
|
|
310
|
+
const c = multicoords(state);
|
|
311
|
+
if (!c) {
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
type: "Polygon",
|
|
316
|
+
coordinates: c
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
function parseMultiPolygon(state) {
|
|
320
|
+
if (!$(/^(MULTIPOLYGON)/i, state)) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
white(state);
|
|
324
|
+
const c = multicoords(state);
|
|
325
|
+
if (!c) {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
type: "MultiPolygon",
|
|
330
|
+
coordinates: c
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function parseGeometryCollection(state) {
|
|
334
|
+
const geometries = [];
|
|
335
|
+
let geometry;
|
|
336
|
+
if (!$(/^(GEOMETRYCOLLECTION)/i, state)) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
white(state);
|
|
340
|
+
if (!$(/^(\()/, state)) {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
while (geometry = parseGeometry(state)) {
|
|
344
|
+
geometries.push(geometry);
|
|
345
|
+
white(state);
|
|
346
|
+
$(/^(,)/, state);
|
|
347
|
+
white(state);
|
|
348
|
+
}
|
|
349
|
+
if (!$(/^(\))/, state)) {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
type: "GeometryCollection",
|
|
354
|
+
geometries
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function multicoords(state) {
|
|
358
|
+
white(state);
|
|
359
|
+
let depth = 0;
|
|
360
|
+
const rings = [];
|
|
361
|
+
const stack = [rings];
|
|
362
|
+
let pointer = rings;
|
|
363
|
+
let elem;
|
|
364
|
+
while (elem = $(/^(\()/, state) || $(/^(\))/, state) || $(/^(,)/, state) || $(tuples, state)) {
|
|
365
|
+
if (elem === "(") {
|
|
366
|
+
stack.push(pointer);
|
|
367
|
+
pointer = [];
|
|
368
|
+
stack[stack.length - 1].push(pointer);
|
|
369
|
+
depth++;
|
|
370
|
+
} else if (elem === ")") {
|
|
371
|
+
if (pointer.length === 0)
|
|
372
|
+
return null;
|
|
373
|
+
pointer = stack.pop();
|
|
374
|
+
if (!pointer)
|
|
375
|
+
return null;
|
|
376
|
+
depth--;
|
|
377
|
+
if (depth === 0)
|
|
378
|
+
break;
|
|
379
|
+
} else if (elem === ",") {
|
|
380
|
+
pointer = [];
|
|
381
|
+
stack[stack.length - 1].push(pointer);
|
|
382
|
+
} else if (!elem.split(/\s/g).some(isNaN)) {
|
|
383
|
+
Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
|
|
384
|
+
} else {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
white(state);
|
|
388
|
+
}
|
|
389
|
+
if (depth !== 0)
|
|
390
|
+
return null;
|
|
391
|
+
return rings;
|
|
392
|
+
}
|
|
393
|
+
function coords(state) {
|
|
394
|
+
const list = [];
|
|
395
|
+
let item;
|
|
396
|
+
let pt;
|
|
397
|
+
while (pt = $(tuples, state) || $(/^(,)/, state)) {
|
|
398
|
+
if (pt === ",") {
|
|
399
|
+
list.push(item);
|
|
400
|
+
item = [];
|
|
401
|
+
} else if (!pt.split(/\s/g).some(isNaN)) {
|
|
402
|
+
if (!item)
|
|
403
|
+
item = [];
|
|
404
|
+
Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
|
|
405
|
+
}
|
|
406
|
+
white(state);
|
|
407
|
+
}
|
|
408
|
+
if (item)
|
|
409
|
+
list.push(item);
|
|
410
|
+
else
|
|
411
|
+
return null;
|
|
412
|
+
return list.length ? list : null;
|
|
413
|
+
}
|
|
414
|
+
function $(regexp, state) {
|
|
415
|
+
const match = state._?.substring(state.i).match(regexp);
|
|
416
|
+
if (!match)
|
|
417
|
+
return null;
|
|
418
|
+
else {
|
|
419
|
+
state.i += match[0].length;
|
|
420
|
+
return match[0];
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
function white(state) {
|
|
424
|
+
$(/^\s*/, state);
|
|
425
|
+
}
|
|
426
|
+
var numberRegexp, tuples, WKT_MAGIC_STRINGS;
|
|
427
|
+
var init_parse_wkt = __esm({
|
|
428
|
+
"src/lib/parse-wkt.ts"() {
|
|
429
|
+
numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
|
|
430
|
+
tuples = new RegExp("^" + numberRegexp.source + "(\\s" + numberRegexp.source + "){1,}");
|
|
431
|
+
WKT_MAGIC_STRINGS = [
|
|
432
|
+
"POINT(",
|
|
433
|
+
"LINESTRING(",
|
|
434
|
+
"POLYGON(",
|
|
435
|
+
"MULTIPOINT(",
|
|
436
|
+
"MULTILINESTRING(",
|
|
437
|
+
"MULTIPOLYGON(",
|
|
438
|
+
"GEOMETRYCOLLECTION("
|
|
439
|
+
];
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
// src/wkt-loader.ts
|
|
444
|
+
var WKTWorkerLoader, WKTLoader;
|
|
445
|
+
var init_wkt_loader = __esm({
|
|
446
|
+
"src/wkt-loader.ts"() {
|
|
447
|
+
init_version();
|
|
448
|
+
init_parse_wkt();
|
|
449
|
+
init_parse_wkt();
|
|
450
|
+
WKTWorkerLoader = {
|
|
451
|
+
name: "WKT (Well-Known Text)",
|
|
452
|
+
id: "wkt",
|
|
453
|
+
module: "wkt",
|
|
454
|
+
version: VERSION,
|
|
455
|
+
worker: true,
|
|
456
|
+
extensions: ["wkt"],
|
|
457
|
+
mimeTypes: ["text/plain"],
|
|
458
|
+
category: "geometry",
|
|
459
|
+
text: true,
|
|
460
|
+
tests: WKT_MAGIC_STRINGS,
|
|
461
|
+
testText: isWKT,
|
|
462
|
+
options: {
|
|
463
|
+
wkt: {
|
|
464
|
+
crs: true
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
WKTLoader = {
|
|
469
|
+
...WKTWorkerLoader,
|
|
470
|
+
parse: async (arrayBuffer, options) => parseWKT(new TextDecoder().decode(arrayBuffer), options),
|
|
471
|
+
parseTextSync: parseWKT
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
// src/lib/encode-wkt.ts
|
|
477
|
+
function encodeWKT(geometry) {
|
|
478
|
+
if (geometry.type === "Feature") {
|
|
479
|
+
geometry = geometry.geometry;
|
|
480
|
+
}
|
|
481
|
+
switch (geometry.type) {
|
|
482
|
+
case "Point":
|
|
483
|
+
return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
|
|
484
|
+
case "LineString":
|
|
485
|
+
return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
486
|
+
case "Polygon":
|
|
487
|
+
return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
488
|
+
case "MultiPoint":
|
|
489
|
+
return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
490
|
+
case "MultiPolygon":
|
|
491
|
+
return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
|
|
492
|
+
case "MultiLineString":
|
|
493
|
+
return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
494
|
+
case "GeometryCollection":
|
|
495
|
+
return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(", "))}`;
|
|
496
|
+
default:
|
|
497
|
+
throw new Error("stringify requires a valid GeoJSON Feature or geometry object as input");
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function pairWKT(c) {
|
|
501
|
+
return c.join(" ");
|
|
502
|
+
}
|
|
503
|
+
function ringWKT(r) {
|
|
504
|
+
return r.map(pairWKT).join(", ");
|
|
505
|
+
}
|
|
506
|
+
function ringsWKT(r) {
|
|
507
|
+
return r.map(ringWKT).map(wrapParens).join(", ");
|
|
508
|
+
}
|
|
509
|
+
function multiRingsWKT(r) {
|
|
510
|
+
return r.map(ringsWKT).map(wrapParens).join(", ");
|
|
511
|
+
}
|
|
512
|
+
function wrapParens(s) {
|
|
513
|
+
return `(${s})`;
|
|
514
|
+
}
|
|
515
|
+
var init_encode_wkt = __esm({
|
|
516
|
+
"src/lib/encode-wkt.ts"() {
|
|
517
|
+
}
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
// src/wkt-writer.ts
|
|
521
|
+
var WKTWriter;
|
|
522
|
+
var init_wkt_writer = __esm({
|
|
523
|
+
"src/wkt-writer.ts"() {
|
|
524
|
+
init_version();
|
|
525
|
+
init_encode_wkt();
|
|
526
|
+
WKTWriter = {
|
|
527
|
+
name: "WKT (Well Known Text)",
|
|
528
|
+
id: "wkt",
|
|
529
|
+
module: "wkt",
|
|
530
|
+
version: VERSION,
|
|
531
|
+
extensions: ["wkt"],
|
|
532
|
+
encodeSync: encodeWKT,
|
|
533
|
+
options: {
|
|
534
|
+
wkt: {}
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
// ../gis/src/lib/binary-to-geojson.ts
|
|
541
|
+
function binaryToGeometry(data, startIndex, endIndex) {
|
|
542
|
+
switch (data.type) {
|
|
543
|
+
case "Point":
|
|
544
|
+
return pointToGeoJson(data, startIndex, endIndex);
|
|
545
|
+
case "LineString":
|
|
546
|
+
return lineStringToGeoJson(data, startIndex, endIndex);
|
|
547
|
+
case "Polygon":
|
|
548
|
+
return polygonToGeoJson(data, startIndex, endIndex);
|
|
549
|
+
default:
|
|
550
|
+
const unexpectedInput = data;
|
|
551
|
+
throw new Error(`Unsupported geometry type: ${unexpectedInput?.type}`);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
function polygonToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
|
|
555
|
+
const { positions } = data;
|
|
556
|
+
const polygonIndices = data.polygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
|
|
557
|
+
const primitivePolygonIndices = data.primitivePolygonIndices.value.filter((x) => x >= startIndex && x <= endIndex);
|
|
558
|
+
const multi = polygonIndices.length > 2;
|
|
559
|
+
if (!multi) {
|
|
560
|
+
const coordinates2 = [];
|
|
561
|
+
for (let i = 0; i < primitivePolygonIndices.length - 1; i++) {
|
|
562
|
+
const startRingIndex = primitivePolygonIndices[i];
|
|
563
|
+
const endRingIndex = primitivePolygonIndices[i + 1];
|
|
564
|
+
const ringCoordinates = ringToGeoJson(positions, startRingIndex, endRingIndex);
|
|
565
|
+
coordinates2.push(ringCoordinates);
|
|
566
|
+
}
|
|
567
|
+
return { type: "Polygon", coordinates: coordinates2 };
|
|
568
|
+
}
|
|
569
|
+
const coordinates = [];
|
|
570
|
+
for (let i = 0; i < polygonIndices.length - 1; i++) {
|
|
571
|
+
const startPolygonIndex = polygonIndices[i];
|
|
572
|
+
const endPolygonIndex = polygonIndices[i + 1];
|
|
573
|
+
const polygonCoordinates = polygonToGeoJson(data, startPolygonIndex, endPolygonIndex).coordinates;
|
|
574
|
+
coordinates.push(polygonCoordinates);
|
|
575
|
+
}
|
|
576
|
+
return { type: "MultiPolygon", coordinates };
|
|
577
|
+
}
|
|
578
|
+
function lineStringToGeoJson(data, startIndex = -Infinity, endIndex = Infinity) {
|
|
579
|
+
const { positions } = data;
|
|
580
|
+
const pathIndices = data.pathIndices.value.filter((x) => x >= startIndex && x <= endIndex);
|
|
581
|
+
const multi = pathIndices.length > 2;
|
|
582
|
+
if (!multi) {
|
|
583
|
+
const coordinates2 = ringToGeoJson(positions, pathIndices[0], pathIndices[1]);
|
|
584
|
+
return { type: "LineString", coordinates: coordinates2 };
|
|
585
|
+
}
|
|
586
|
+
const coordinates = [];
|
|
587
|
+
for (let i = 0; i < pathIndices.length - 1; i++) {
|
|
588
|
+
const ringCoordinates = ringToGeoJson(positions, pathIndices[i], pathIndices[i + 1]);
|
|
589
|
+
coordinates.push(ringCoordinates);
|
|
590
|
+
}
|
|
591
|
+
return { type: "MultiLineString", coordinates };
|
|
592
|
+
}
|
|
593
|
+
function pointToGeoJson(data, startIndex, endIndex) {
|
|
594
|
+
const { positions } = data;
|
|
595
|
+
const coordinates = ringToGeoJson(positions, startIndex, endIndex);
|
|
596
|
+
const multi = coordinates.length > 1;
|
|
597
|
+
if (multi) {
|
|
598
|
+
return { type: "MultiPoint", coordinates };
|
|
599
|
+
}
|
|
600
|
+
return { type: "Point", coordinates: coordinates[0] };
|
|
601
|
+
}
|
|
602
|
+
function ringToGeoJson(positions, startIndex, endIndex) {
|
|
603
|
+
startIndex = startIndex || 0;
|
|
604
|
+
endIndex = endIndex || positions.value.length / positions.size;
|
|
605
|
+
const ringCoordinates = [];
|
|
606
|
+
for (let j = startIndex; j < endIndex; j++) {
|
|
607
|
+
const coord = Array();
|
|
608
|
+
for (let k = j * positions.size; k < (j + 1) * positions.size; k++) {
|
|
609
|
+
coord.push(Number(positions.value[k]));
|
|
610
|
+
}
|
|
611
|
+
ringCoordinates.push(coord);
|
|
612
|
+
}
|
|
613
|
+
return ringCoordinates;
|
|
614
|
+
}
|
|
615
|
+
var init_binary_to_geojson = __esm({
|
|
616
|
+
"../gis/src/lib/binary-to-geojson.ts"() {
|
|
617
|
+
}
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
// ../gis/src/index.ts
|
|
621
|
+
var init_src = __esm({
|
|
622
|
+
"../gis/src/index.ts"() {
|
|
623
|
+
init_binary_to_geojson();
|
|
624
|
+
}
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
// src/lib/parse-wkb-header.ts
|
|
628
|
+
function isWKB(arrayBuffer) {
|
|
629
|
+
const dataView = new DataView(arrayBuffer);
|
|
630
|
+
let byteOffset = 0;
|
|
631
|
+
const endianness = dataView.getUint8(byteOffset);
|
|
632
|
+
byteOffset += 1;
|
|
633
|
+
if (endianness > 1) {
|
|
634
|
+
return false;
|
|
635
|
+
}
|
|
636
|
+
const littleEndian = endianness === 1;
|
|
637
|
+
const geometry = dataView.getUint32(byteOffset, littleEndian);
|
|
638
|
+
byteOffset += 4;
|
|
639
|
+
const geometryType = geometry & 7;
|
|
640
|
+
if (geometryType === 0 || geometryType > 7) {
|
|
641
|
+
return false;
|
|
642
|
+
}
|
|
643
|
+
const geometryFlags = geometry - geometryType;
|
|
644
|
+
if (geometryFlags === 0 || geometryFlags === 1e3 || geometryFlags === 2e3 || geometryFlags === 3e3) {
|
|
645
|
+
return true;
|
|
646
|
+
}
|
|
647
|
+
if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
if (geometryFlags & EWKB_FLAG_SRID) {
|
|
651
|
+
const srid = dataView.getUint32(byteOffset, littleEndian);
|
|
652
|
+
byteOffset += 4;
|
|
653
|
+
if (srid > MAX_SRID) {
|
|
654
|
+
return false;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
return true;
|
|
658
|
+
}
|
|
659
|
+
function parseWKBHeader(dataView, target) {
|
|
660
|
+
const wkbHeader = Object.assign(target || {}, {
|
|
661
|
+
type: "wkb",
|
|
662
|
+
geometryType: 1,
|
|
663
|
+
dimensions: 2,
|
|
664
|
+
coordinates: "xy",
|
|
665
|
+
littleEndian: true,
|
|
666
|
+
byteOffset: 0
|
|
667
|
+
});
|
|
668
|
+
wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
|
|
669
|
+
wkbHeader.byteOffset++;
|
|
670
|
+
const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
671
|
+
wkbHeader.byteOffset += 4;
|
|
672
|
+
wkbHeader.geometryType = geometryCode & 7;
|
|
673
|
+
const isoType = (geometryCode - wkbHeader.geometryType) / 1e3;
|
|
674
|
+
switch (isoType) {
|
|
675
|
+
case 0:
|
|
676
|
+
break;
|
|
677
|
+
case 1:
|
|
678
|
+
wkbHeader.type = "iso-wkb";
|
|
679
|
+
wkbHeader.dimensions = 3;
|
|
680
|
+
wkbHeader.coordinates = "xyz";
|
|
681
|
+
break;
|
|
682
|
+
case 2:
|
|
683
|
+
wkbHeader.type = "iso-wkb";
|
|
684
|
+
wkbHeader.dimensions = 3;
|
|
685
|
+
wkbHeader.coordinates = "xym";
|
|
686
|
+
break;
|
|
687
|
+
case 3:
|
|
688
|
+
wkbHeader.type = "iso-wkb";
|
|
689
|
+
wkbHeader.dimensions = 4;
|
|
690
|
+
wkbHeader.coordinates = "xyzm";
|
|
691
|
+
break;
|
|
692
|
+
default:
|
|
693
|
+
throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);
|
|
694
|
+
}
|
|
695
|
+
const ewkbZ = geometryCode & EWKB_FLAG_Z;
|
|
696
|
+
const ewkbM = geometryCode & EWKB_FLAG_M;
|
|
697
|
+
const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
|
|
698
|
+
if (ewkbZ && ewkbM) {
|
|
699
|
+
wkbHeader.type = "ewkb";
|
|
700
|
+
wkbHeader.dimensions = 4;
|
|
701
|
+
wkbHeader.coordinates = "xyzm";
|
|
702
|
+
} else if (ewkbZ) {
|
|
703
|
+
wkbHeader.type = "ewkb";
|
|
704
|
+
wkbHeader.dimensions = 3;
|
|
705
|
+
wkbHeader.coordinates = "xyz";
|
|
706
|
+
} else if (ewkbM) {
|
|
707
|
+
wkbHeader.type = "ewkb";
|
|
708
|
+
wkbHeader.dimensions = 3;
|
|
709
|
+
wkbHeader.coordinates = "xym";
|
|
710
|
+
}
|
|
711
|
+
if (ewkbSRID) {
|
|
712
|
+
wkbHeader.type = "ewkb";
|
|
713
|
+
wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
714
|
+
wkbHeader.byteOffset += 4;
|
|
715
|
+
}
|
|
716
|
+
return wkbHeader;
|
|
717
|
+
}
|
|
718
|
+
var EWKB_FLAG_Z, EWKB_FLAG_M, EWKB_FLAG_SRID, MAX_SRID, WKBGeometryType;
|
|
719
|
+
var init_parse_wkb_header = __esm({
|
|
720
|
+
"src/lib/parse-wkb-header.ts"() {
|
|
721
|
+
EWKB_FLAG_Z = 2147483648;
|
|
722
|
+
EWKB_FLAG_M = 1073741824;
|
|
723
|
+
EWKB_FLAG_SRID = 536870912;
|
|
724
|
+
MAX_SRID = 1e4;
|
|
725
|
+
(function(WKBGeometryType2) {
|
|
726
|
+
WKBGeometryType2[WKBGeometryType2["Point"] = 1] = "Point";
|
|
727
|
+
WKBGeometryType2[WKBGeometryType2["LineString"] = 2] = "LineString";
|
|
728
|
+
WKBGeometryType2[WKBGeometryType2["Polygon"] = 3] = "Polygon";
|
|
729
|
+
WKBGeometryType2[WKBGeometryType2["MultiPoint"] = 4] = "MultiPoint";
|
|
730
|
+
WKBGeometryType2[WKBGeometryType2["MultiLineString"] = 5] = "MultiLineString";
|
|
731
|
+
WKBGeometryType2[WKBGeometryType2["MultiPolygon"] = 6] = "MultiPolygon";
|
|
732
|
+
WKBGeometryType2[WKBGeometryType2["GeometryCollection"] = 7] = "GeometryCollection";
|
|
733
|
+
})(WKBGeometryType || (WKBGeometryType = {}));
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
|
|
24
737
|
// src/lib/parse-wkb.ts
|
|
25
|
-
function parseWKB(arrayBuffer) {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
738
|
+
function parseWKB(arrayBuffer, options) {
|
|
739
|
+
const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
|
|
740
|
+
const shape = options?.wkb?.shape || "binary-geometry";
|
|
741
|
+
switch (shape) {
|
|
742
|
+
case "binary-geometry":
|
|
743
|
+
return binaryGeometry;
|
|
744
|
+
case "geometry":
|
|
745
|
+
return binaryToGeometry(binaryGeometry);
|
|
746
|
+
default:
|
|
747
|
+
throw new Error(shape);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
function parseWKBToBinary(arrayBuffer, options) {
|
|
751
|
+
const dataView = new DataView(arrayBuffer);
|
|
752
|
+
const wkbHeader = parseWKBHeader(dataView);
|
|
753
|
+
const { geometryType, dimensions, littleEndian } = wkbHeader;
|
|
754
|
+
const offset = wkbHeader.byteOffset;
|
|
35
755
|
switch (geometryType) {
|
|
36
|
-
case
|
|
37
|
-
const point =
|
|
756
|
+
case WKBGeometryType.Point:
|
|
757
|
+
const point = parsePoint2(dataView, offset, dimensions, littleEndian);
|
|
38
758
|
return point.geometry;
|
|
39
|
-
case
|
|
40
|
-
const line =
|
|
759
|
+
case WKBGeometryType.LineString:
|
|
760
|
+
const line = parseLineString2(dataView, offset, dimensions, littleEndian);
|
|
41
761
|
return line.geometry;
|
|
42
|
-
case
|
|
43
|
-
const polygon =
|
|
762
|
+
case WKBGeometryType.Polygon:
|
|
763
|
+
const polygon = parsePolygon2(dataView, offset, dimensions, littleEndian);
|
|
44
764
|
return polygon.geometry;
|
|
45
|
-
case
|
|
46
|
-
const multiPoint =
|
|
765
|
+
case WKBGeometryType.MultiPoint:
|
|
766
|
+
const multiPoint = parseMultiPoint2(dataView, offset, dimensions, littleEndian);
|
|
47
767
|
multiPoint.type = "Point";
|
|
48
768
|
return multiPoint;
|
|
49
|
-
case
|
|
50
|
-
const multiLine =
|
|
769
|
+
case WKBGeometryType.MultiLineString:
|
|
770
|
+
const multiLine = parseMultiLineString2(dataView, offset, dimensions, littleEndian);
|
|
51
771
|
multiLine.type = "LineString";
|
|
52
772
|
return multiLine;
|
|
53
|
-
case
|
|
54
|
-
const multiPolygon =
|
|
773
|
+
case WKBGeometryType.MultiPolygon:
|
|
774
|
+
const multiPolygon = parseMultiPolygon2(dataView, offset, dimensions, littleEndian);
|
|
55
775
|
multiPolygon.type = "Polygon";
|
|
56
776
|
return multiPolygon;
|
|
57
777
|
default:
|
|
58
778
|
throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
|
|
59
779
|
}
|
|
60
780
|
}
|
|
61
|
-
function
|
|
781
|
+
function parsePoint2(dataView, offset, dimension, littleEndian) {
|
|
62
782
|
const positions = new Float64Array(dimension);
|
|
63
783
|
for (let i = 0; i < dimension; i++) {
|
|
64
|
-
positions[i] =
|
|
784
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
65
785
|
offset += 8;
|
|
66
786
|
}
|
|
67
787
|
return {
|
|
@@ -69,12 +789,12 @@
|
|
|
69
789
|
offset
|
|
70
790
|
};
|
|
71
791
|
}
|
|
72
|
-
function
|
|
73
|
-
const nPoints =
|
|
792
|
+
function parseLineString2(dataView, offset, dimension, littleEndian) {
|
|
793
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
74
794
|
offset += 4;
|
|
75
795
|
const positions = new Float64Array(nPoints * dimension);
|
|
76
796
|
for (let i = 0; i < nPoints * dimension; i++) {
|
|
77
|
-
positions[i] =
|
|
797
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
78
798
|
offset += 8;
|
|
79
799
|
}
|
|
80
800
|
const pathIndices = [0];
|
|
@@ -90,12 +810,12 @@
|
|
|
90
810
|
offset
|
|
91
811
|
};
|
|
92
812
|
}
|
|
93
|
-
function
|
|
94
|
-
const nRings =
|
|
813
|
+
function parsePolygon2(dataView, offset, dimension, littleEndian) {
|
|
814
|
+
const nRings = dataView.getUint32(offset, littleEndian);
|
|
95
815
|
offset += 4;
|
|
96
816
|
const rings = [];
|
|
97
817
|
for (let i = 0; i < nRings; i++) {
|
|
98
|
-
const parsed =
|
|
818
|
+
const parsed = parseLineString2(dataView, offset, dimension, littleEndian);
|
|
99
819
|
const { positions } = parsed.geometry;
|
|
100
820
|
offset = parsed.offset;
|
|
101
821
|
rings.push(positions.value);
|
|
@@ -120,52 +840,52 @@
|
|
|
120
840
|
offset
|
|
121
841
|
};
|
|
122
842
|
}
|
|
123
|
-
function
|
|
124
|
-
const nPoints =
|
|
843
|
+
function parseMultiPoint2(dataView, offset, dimension, littleEndian) {
|
|
844
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
125
845
|
offset += 4;
|
|
126
846
|
const binaryPointGeometries = [];
|
|
127
847
|
for (let i = 0; i < nPoints; i++) {
|
|
128
|
-
const littleEndianPoint =
|
|
848
|
+
const littleEndianPoint = dataView.getUint8(offset) === 1;
|
|
129
849
|
offset++;
|
|
130
|
-
if (
|
|
850
|
+
if (dataView.getUint32(offset, littleEndianPoint) % 1e3 !== 1) {
|
|
131
851
|
throw new Error("WKB: Inner geometries of MultiPoint not of type Point");
|
|
132
852
|
}
|
|
133
853
|
offset += 4;
|
|
134
|
-
const parsed =
|
|
854
|
+
const parsed = parsePoint2(dataView, offset, dimension, littleEndianPoint);
|
|
135
855
|
offset = parsed.offset;
|
|
136
856
|
binaryPointGeometries.push(parsed.geometry);
|
|
137
857
|
}
|
|
138
858
|
return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
|
|
139
859
|
}
|
|
140
|
-
function
|
|
141
|
-
const nLines =
|
|
860
|
+
function parseMultiLineString2(dataView, offset, dimension, littleEndian) {
|
|
861
|
+
const nLines = dataView.getUint32(offset, littleEndian);
|
|
142
862
|
offset += 4;
|
|
143
863
|
const binaryLineGeometries = [];
|
|
144
864
|
for (let i = 0; i < nLines; i++) {
|
|
145
|
-
const littleEndianLine =
|
|
865
|
+
const littleEndianLine = dataView.getUint8(offset) === 1;
|
|
146
866
|
offset++;
|
|
147
|
-
if (
|
|
867
|
+
if (dataView.getUint32(offset, littleEndianLine) % 1e3 !== 2) {
|
|
148
868
|
throw new Error("WKB: Inner geometries of MultiLineString not of type LineString");
|
|
149
869
|
}
|
|
150
870
|
offset += 4;
|
|
151
|
-
const parsed =
|
|
871
|
+
const parsed = parseLineString2(dataView, offset, dimension, littleEndianLine);
|
|
152
872
|
offset = parsed.offset;
|
|
153
873
|
binaryLineGeometries.push(parsed.geometry);
|
|
154
874
|
}
|
|
155
875
|
return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
|
|
156
876
|
}
|
|
157
|
-
function
|
|
158
|
-
const nPolygons =
|
|
877
|
+
function parseMultiPolygon2(dataView, offset, dimension, littleEndian) {
|
|
878
|
+
const nPolygons = dataView.getUint32(offset, littleEndian);
|
|
159
879
|
offset += 4;
|
|
160
880
|
const binaryPolygonGeometries = [];
|
|
161
881
|
for (let i = 0; i < nPolygons; i++) {
|
|
162
|
-
const littleEndianPolygon =
|
|
882
|
+
const littleEndianPolygon = dataView.getUint8(offset) === 1;
|
|
163
883
|
offset++;
|
|
164
|
-
if (
|
|
884
|
+
if (dataView.getUint32(offset, littleEndianPolygon) % 1e3 !== 3) {
|
|
165
885
|
throw new Error("WKB: Inner geometries of MultiPolygon not of type Polygon");
|
|
166
886
|
}
|
|
167
887
|
offset += 4;
|
|
168
|
-
const parsed =
|
|
888
|
+
const parsed = parsePolygon2(dataView, offset, dimension, littleEndianPolygon);
|
|
169
889
|
offset = parsed.offset;
|
|
170
890
|
binaryPolygonGeometries.push(parsed.geometry);
|
|
171
891
|
}
|
|
@@ -194,374 +914,77 @@
|
|
|
194
914
|
const polygons = [];
|
|
195
915
|
const primitivePolygons = [];
|
|
196
916
|
for (const binaryPolygon of binaryPolygonGeometries) {
|
|
197
|
-
const { positions, primitivePolygonIndices: primitivePolygonIndices2 } = binaryPolygon;
|
|
198
|
-
polygons.push(positions.value);
|
|
199
|
-
primitivePolygons.push(primitivePolygonIndices2.value);
|
|
200
|
-
}
|
|
201
|
-
const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
|
|
202
|
-
const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
|
|
203
|
-
polygonIndices.unshift(0);
|
|
204
|
-
const primitivePolygonIndices = [0];
|
|
205
|
-
for (const primitivePolygon of primitivePolygons) {
|
|
206
|
-
primitivePolygonIndices.push(...primitivePolygon.filter((x) => x > 0).map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
|
|
207
|
-
}
|
|
208
|
-
return {
|
|
209
|
-
type: "Polygon",
|
|
210
|
-
positions: { value: concatenatedPositions, size: dimension },
|
|
211
|
-
polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
|
|
212
|
-
primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
function concatTypedArrays(arrays) {
|
|
216
|
-
let byteLength = 0;
|
|
217
|
-
for (let i = 0; i < arrays.length; ++i) {
|
|
218
|
-
byteLength += arrays[i].byteLength;
|
|
219
|
-
}
|
|
220
|
-
const buffer = new Uint8Array(byteLength);
|
|
221
|
-
let byteOffset = 0;
|
|
222
|
-
for (let i = 0; i < arrays.length; ++i) {
|
|
223
|
-
const data = new Uint8Array(arrays[i].buffer);
|
|
224
|
-
byteLength = data.length;
|
|
225
|
-
for (let j = 0; j < byteLength; ++j) {
|
|
226
|
-
buffer[byteOffset++] = data[j];
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return buffer;
|
|
230
|
-
}
|
|
231
|
-
var NUM_DIMENSIONS, cumulativeSum;
|
|
232
|
-
var init_parse_wkb = __esm({
|
|
233
|
-
"src/lib/parse-wkb.ts"() {
|
|
234
|
-
NUM_DIMENSIONS = {
|
|
235
|
-
0: 2,
|
|
236
|
-
1: 3,
|
|
237
|
-
2: 3,
|
|
238
|
-
3: 4
|
|
239
|
-
};
|
|
240
|
-
cumulativeSum = (sum) => (value) => sum += value;
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// src/wkb-loader.ts
|
|
245
|
-
var WKBWorkerLoader, WKBLoader;
|
|
246
|
-
var init_wkb_loader = __esm({
|
|
247
|
-
"src/wkb-loader.ts"() {
|
|
248
|
-
init_version();
|
|
249
|
-
init_parse_wkb();
|
|
250
|
-
WKBWorkerLoader = {
|
|
251
|
-
name: "WKB",
|
|
252
|
-
id: "wkb",
|
|
253
|
-
module: "wkt",
|
|
254
|
-
version: VERSION,
|
|
255
|
-
worker: true,
|
|
256
|
-
category: "geometry",
|
|
257
|
-
extensions: ["wkb"],
|
|
258
|
-
mimeTypes: [],
|
|
259
|
-
options: {
|
|
260
|
-
wkb: {}
|
|
261
|
-
}
|
|
262
|
-
};
|
|
263
|
-
WKBLoader = {
|
|
264
|
-
...WKBWorkerLoader,
|
|
265
|
-
parse: async (arrayBuffer) => parseWKB(arrayBuffer),
|
|
266
|
-
parseSync: parseWKB
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
// src/lib/parse-wkt.ts
|
|
272
|
-
function parseWKT(input) {
|
|
273
|
-
const parts = input.split(";");
|
|
274
|
-
let _ = parts.pop();
|
|
275
|
-
const srid = (parts.shift() || "").split("=").pop();
|
|
276
|
-
let i = 0;
|
|
277
|
-
function $(re) {
|
|
278
|
-
const match = _.substring(i).match(re);
|
|
279
|
-
if (!match)
|
|
280
|
-
return null;
|
|
281
|
-
else {
|
|
282
|
-
i += match[0].length;
|
|
283
|
-
return match[0];
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
function crs(obj) {
|
|
287
|
-
if (obj && srid.match(/\d+/)) {
|
|
288
|
-
obj.crs = {
|
|
289
|
-
type: "name",
|
|
290
|
-
properties: {
|
|
291
|
-
name: "urn:ogc:def:crs:EPSG::" + srid
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
return obj;
|
|
296
|
-
}
|
|
297
|
-
function white() {
|
|
298
|
-
$(/^\s*/);
|
|
299
|
-
}
|
|
300
|
-
function multicoords() {
|
|
301
|
-
white();
|
|
302
|
-
let depth = 0;
|
|
303
|
-
const rings = [];
|
|
304
|
-
const stack = [rings];
|
|
305
|
-
let pointer = rings;
|
|
306
|
-
let elem;
|
|
307
|
-
while (elem = $(/^(\()/) || $(/^(\))/) || $(/^(,)/) || $(tuples)) {
|
|
308
|
-
if (elem === "(") {
|
|
309
|
-
stack.push(pointer);
|
|
310
|
-
pointer = [];
|
|
311
|
-
stack[stack.length - 1].push(pointer);
|
|
312
|
-
depth++;
|
|
313
|
-
} else if (elem === ")") {
|
|
314
|
-
if (pointer.length === 0)
|
|
315
|
-
return null;
|
|
316
|
-
pointer = stack.pop();
|
|
317
|
-
if (!pointer)
|
|
318
|
-
return null;
|
|
319
|
-
depth--;
|
|
320
|
-
if (depth === 0)
|
|
321
|
-
break;
|
|
322
|
-
} else if (elem === ",") {
|
|
323
|
-
pointer = [];
|
|
324
|
-
stack[stack.length - 1].push(pointer);
|
|
325
|
-
} else if (!elem.split(/\s/g).some(isNaN)) {
|
|
326
|
-
Array.prototype.push.apply(pointer, elem.split(/\s/g).map(parseFloat));
|
|
327
|
-
} else {
|
|
328
|
-
return null;
|
|
329
|
-
}
|
|
330
|
-
white();
|
|
331
|
-
}
|
|
332
|
-
if (depth !== 0)
|
|
333
|
-
return null;
|
|
334
|
-
return rings;
|
|
335
|
-
}
|
|
336
|
-
function coords() {
|
|
337
|
-
const list = [];
|
|
338
|
-
let item;
|
|
339
|
-
let pt;
|
|
340
|
-
while (pt = $(tuples) || $(/^(,)/)) {
|
|
341
|
-
if (pt === ",") {
|
|
342
|
-
list.push(item);
|
|
343
|
-
item = [];
|
|
344
|
-
} else if (!pt.split(/\s/g).some(isNaN)) {
|
|
345
|
-
if (!item)
|
|
346
|
-
item = [];
|
|
347
|
-
Array.prototype.push.apply(item, pt.split(/\s/g).map(parseFloat));
|
|
348
|
-
}
|
|
349
|
-
white();
|
|
350
|
-
}
|
|
351
|
-
if (item)
|
|
352
|
-
list.push(item);
|
|
353
|
-
else
|
|
354
|
-
return null;
|
|
355
|
-
return list.length ? list : null;
|
|
356
|
-
}
|
|
357
|
-
function point() {
|
|
358
|
-
if (!$(/^(point(\sz)?)/i))
|
|
359
|
-
return null;
|
|
360
|
-
white();
|
|
361
|
-
if (!$(/^(\()/))
|
|
362
|
-
return null;
|
|
363
|
-
const c = coords();
|
|
364
|
-
if (!c)
|
|
365
|
-
return null;
|
|
366
|
-
white();
|
|
367
|
-
if (!$(/^(\))/))
|
|
368
|
-
return null;
|
|
369
|
-
return {
|
|
370
|
-
type: "Point",
|
|
371
|
-
coordinates: c[0]
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
function multipoint() {
|
|
375
|
-
if (!$(/^(multipoint)/i))
|
|
376
|
-
return null;
|
|
377
|
-
white();
|
|
378
|
-
const newCoordsFormat = _.substring(_.indexOf("(") + 1, _.length - 1).replace(/\(/g, "").replace(/\)/g, "");
|
|
379
|
-
_ = "MULTIPOINT (" + newCoordsFormat + ")";
|
|
380
|
-
const c = multicoords();
|
|
381
|
-
if (!c)
|
|
382
|
-
return null;
|
|
383
|
-
white();
|
|
384
|
-
return {
|
|
385
|
-
type: "MultiPoint",
|
|
386
|
-
coordinates: c
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
function multilinestring() {
|
|
390
|
-
if (!$(/^(multilinestring)/i))
|
|
391
|
-
return null;
|
|
392
|
-
white();
|
|
393
|
-
const c = multicoords();
|
|
394
|
-
if (!c)
|
|
395
|
-
return null;
|
|
396
|
-
white();
|
|
397
|
-
return {
|
|
398
|
-
type: "MultiLineString",
|
|
399
|
-
coordinates: c
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
function linestring() {
|
|
403
|
-
if (!$(/^(linestring(\sz)?)/i))
|
|
404
|
-
return null;
|
|
405
|
-
white();
|
|
406
|
-
if (!$(/^(\()/))
|
|
407
|
-
return null;
|
|
408
|
-
const c = coords();
|
|
409
|
-
if (!c)
|
|
410
|
-
return null;
|
|
411
|
-
if (!$(/^(\))/))
|
|
412
|
-
return null;
|
|
413
|
-
return {
|
|
414
|
-
type: "LineString",
|
|
415
|
-
coordinates: c
|
|
416
|
-
};
|
|
417
|
-
}
|
|
418
|
-
function polygon() {
|
|
419
|
-
if (!$(/^(polygon(\sz)?)/i))
|
|
420
|
-
return null;
|
|
421
|
-
white();
|
|
422
|
-
const c = multicoords();
|
|
423
|
-
if (!c)
|
|
424
|
-
return null;
|
|
425
|
-
return {
|
|
426
|
-
type: "Polygon",
|
|
427
|
-
coordinates: c
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
function multipolygon() {
|
|
431
|
-
if (!$(/^(multipolygon)/i))
|
|
432
|
-
return null;
|
|
433
|
-
white();
|
|
434
|
-
const c = multicoords();
|
|
435
|
-
if (!c)
|
|
436
|
-
return null;
|
|
437
|
-
return {
|
|
438
|
-
type: "MultiPolygon",
|
|
439
|
-
coordinates: c
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
function geometrycollection() {
|
|
443
|
-
const geometries = [];
|
|
444
|
-
let geometry;
|
|
445
|
-
if (!$(/^(geometrycollection)/i))
|
|
446
|
-
return null;
|
|
447
|
-
white();
|
|
448
|
-
if (!$(/^(\()/))
|
|
449
|
-
return null;
|
|
450
|
-
while (geometry = root()) {
|
|
451
|
-
geometries.push(geometry);
|
|
452
|
-
white();
|
|
453
|
-
$(/^(,)/);
|
|
454
|
-
white();
|
|
455
|
-
}
|
|
456
|
-
if (!$(/^(\))/))
|
|
457
|
-
return null;
|
|
458
|
-
return {
|
|
459
|
-
type: "GeometryCollection",
|
|
460
|
-
geometries
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
function root() {
|
|
464
|
-
return point() || linestring() || polygon() || multipoint() || multilinestring() || multipolygon() || geometrycollection();
|
|
465
|
-
}
|
|
466
|
-
return crs(root());
|
|
467
|
-
}
|
|
468
|
-
var numberRegexp, tuples;
|
|
469
|
-
var init_parse_wkt = __esm({
|
|
470
|
-
"src/lib/parse-wkt.ts"() {
|
|
471
|
-
numberRegexp = /[-+]?([0-9]*\.[0-9]+|[0-9]+)([eE][-+]?[0-9]+)?/;
|
|
472
|
-
tuples = new RegExp("^" + numberRegexp.source + "(\\s" + numberRegexp.source + "){1,}");
|
|
473
|
-
}
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
// src/wkt-loader.ts
|
|
477
|
-
var WKTWorkerLoader, WKTLoader;
|
|
478
|
-
var init_wkt_loader = __esm({
|
|
479
|
-
"src/wkt-loader.ts"() {
|
|
480
|
-
init_version();
|
|
481
|
-
init_parse_wkt();
|
|
482
|
-
WKTWorkerLoader = {
|
|
483
|
-
name: "WKT (Well-Known Text)",
|
|
484
|
-
id: "wkt",
|
|
485
|
-
module: "wkt",
|
|
486
|
-
version: VERSION,
|
|
487
|
-
worker: true,
|
|
488
|
-
extensions: ["wkt"],
|
|
489
|
-
mimeTypes: ["text/plain"],
|
|
490
|
-
category: "geometry",
|
|
491
|
-
text: true,
|
|
492
|
-
options: {
|
|
493
|
-
wkt: {}
|
|
494
|
-
}
|
|
495
|
-
};
|
|
496
|
-
WKTLoader = {
|
|
497
|
-
...WKTWorkerLoader,
|
|
498
|
-
parse: async (arrayBuffer) => parseWKT(new TextDecoder().decode(arrayBuffer)),
|
|
499
|
-
parseTextSync: parseWKT
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
// src/lib/encode-wkt.ts
|
|
505
|
-
function encodeWKT(geometry) {
|
|
506
|
-
if (geometry.type === "Feature") {
|
|
507
|
-
geometry = geometry.geometry;
|
|
508
|
-
}
|
|
509
|
-
switch (geometry.type) {
|
|
510
|
-
case "Point":
|
|
511
|
-
return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
|
|
512
|
-
case "LineString":
|
|
513
|
-
return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
514
|
-
case "Polygon":
|
|
515
|
-
return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
516
|
-
case "MultiPoint":
|
|
517
|
-
return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
518
|
-
case "MultiPolygon":
|
|
519
|
-
return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
|
|
520
|
-
case "MultiLineString":
|
|
521
|
-
return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
522
|
-
case "GeometryCollection":
|
|
523
|
-
return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(", "))}`;
|
|
524
|
-
default:
|
|
525
|
-
throw new Error("stringify requires a valid GeoJSON Feature or geometry object as input");
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
function pairWKT(c) {
|
|
529
|
-
return c.join(" ");
|
|
530
|
-
}
|
|
531
|
-
function ringWKT(r) {
|
|
532
|
-
return r.map(pairWKT).join(", ");
|
|
533
|
-
}
|
|
534
|
-
function ringsWKT(r) {
|
|
535
|
-
return r.map(ringWKT).map(wrapParens).join(", ");
|
|
536
|
-
}
|
|
537
|
-
function multiRingsWKT(r) {
|
|
538
|
-
return r.map(ringsWKT).map(wrapParens).join(", ");
|
|
917
|
+
const { positions, primitivePolygonIndices: primitivePolygonIndices2 } = binaryPolygon;
|
|
918
|
+
polygons.push(positions.value);
|
|
919
|
+
primitivePolygons.push(primitivePolygonIndices2.value);
|
|
920
|
+
}
|
|
921
|
+
const concatenatedPositions = new Float64Array(concatTypedArrays(polygons).buffer);
|
|
922
|
+
const polygonIndices = polygons.map((p) => p.length / dimension).map(cumulativeSum(0));
|
|
923
|
+
polygonIndices.unshift(0);
|
|
924
|
+
const primitivePolygonIndices = [0];
|
|
925
|
+
for (const primitivePolygon of primitivePolygons) {
|
|
926
|
+
primitivePolygonIndices.push(...primitivePolygon.filter((x) => x > 0).map((x) => x + primitivePolygonIndices[primitivePolygonIndices.length - 1]));
|
|
927
|
+
}
|
|
928
|
+
return {
|
|
929
|
+
type: "Polygon",
|
|
930
|
+
positions: { value: concatenatedPositions, size: dimension },
|
|
931
|
+
polygonIndices: { value: new Uint16Array(polygonIndices), size: 1 },
|
|
932
|
+
primitivePolygonIndices: { value: new Uint16Array(primitivePolygonIndices), size: 1 }
|
|
933
|
+
};
|
|
539
934
|
}
|
|
540
|
-
function
|
|
541
|
-
|
|
935
|
+
function concatTypedArrays(arrays) {
|
|
936
|
+
let byteLength = 0;
|
|
937
|
+
for (let i = 0; i < arrays.length; ++i) {
|
|
938
|
+
byteLength += arrays[i].byteLength;
|
|
939
|
+
}
|
|
940
|
+
const buffer = new Uint8Array(byteLength);
|
|
941
|
+
let byteOffset = 0;
|
|
942
|
+
for (let i = 0; i < arrays.length; ++i) {
|
|
943
|
+
const data = new Uint8Array(arrays[i].buffer);
|
|
944
|
+
byteLength = data.length;
|
|
945
|
+
for (let j = 0; j < byteLength; ++j) {
|
|
946
|
+
buffer[byteOffset++] = data[j];
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
return buffer;
|
|
542
950
|
}
|
|
543
|
-
var
|
|
544
|
-
|
|
951
|
+
var cumulativeSum;
|
|
952
|
+
var init_parse_wkb = __esm({
|
|
953
|
+
"src/lib/parse-wkb.ts"() {
|
|
954
|
+
init_src();
|
|
955
|
+
init_parse_wkb_header();
|
|
956
|
+
cumulativeSum = (sum) => (value) => sum += value;
|
|
545
957
|
}
|
|
546
958
|
});
|
|
547
959
|
|
|
548
|
-
// src/
|
|
549
|
-
var
|
|
550
|
-
var
|
|
551
|
-
"src/
|
|
960
|
+
// src/wkb-loader.ts
|
|
961
|
+
var WKBWorkerLoader, WKBLoader;
|
|
962
|
+
var init_wkb_loader = __esm({
|
|
963
|
+
"src/wkb-loader.ts"() {
|
|
552
964
|
init_version();
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
965
|
+
init_parse_wkb();
|
|
966
|
+
init_parse_wkb_header();
|
|
967
|
+
WKBWorkerLoader = {
|
|
968
|
+
name: "WKB",
|
|
969
|
+
id: "wkb",
|
|
557
970
|
module: "wkt",
|
|
558
971
|
version: VERSION,
|
|
559
|
-
|
|
560
|
-
|
|
972
|
+
worker: true,
|
|
973
|
+
category: "geometry",
|
|
974
|
+
extensions: ["wkb"],
|
|
975
|
+
mimeTypes: [],
|
|
976
|
+
tests: [isWKB],
|
|
561
977
|
options: {
|
|
562
|
-
|
|
978
|
+
wkb: {
|
|
979
|
+
shape: "binary-geometry"
|
|
980
|
+
}
|
|
563
981
|
}
|
|
564
982
|
};
|
|
983
|
+
WKBLoader = {
|
|
984
|
+
...WKBWorkerLoader,
|
|
985
|
+
parse: async (arrayBuffer) => parseWKB(arrayBuffer),
|
|
986
|
+
parseSync: parseWKB
|
|
987
|
+
};
|
|
565
988
|
}
|
|
566
989
|
});
|
|
567
990
|
|
|
@@ -958,29 +1381,647 @@
|
|
|
958
1381
|
}
|
|
959
1382
|
});
|
|
960
1383
|
|
|
1384
|
+
// src/lib/utils/hex-transcoder.ts
|
|
1385
|
+
function encodeHex(array) {
|
|
1386
|
+
const length = array.length;
|
|
1387
|
+
let string = "";
|
|
1388
|
+
let i = 0;
|
|
1389
|
+
while (i < length) {
|
|
1390
|
+
string += encodeLookup[array[i++]];
|
|
1391
|
+
}
|
|
1392
|
+
return string;
|
|
1393
|
+
}
|
|
1394
|
+
function decodeHex(string) {
|
|
1395
|
+
const sizeof = string.length >> 1;
|
|
1396
|
+
const length = sizeof << 1;
|
|
1397
|
+
const array = new Uint8Array(sizeof);
|
|
1398
|
+
let n = 0;
|
|
1399
|
+
let i = 0;
|
|
1400
|
+
while (i < length) {
|
|
1401
|
+
array[n++] = decodeLookup[string.charCodeAt(i++)] << 4 | decodeLookup[string.charCodeAt(i++)];
|
|
1402
|
+
}
|
|
1403
|
+
return array;
|
|
1404
|
+
}
|
|
1405
|
+
var alphabet, encodeLookup, decodeLookup;
|
|
1406
|
+
var init_hex_transcoder = __esm({
|
|
1407
|
+
"src/lib/utils/hex-transcoder.ts"() {
|
|
1408
|
+
alphabet = "0123456789abcdef";
|
|
1409
|
+
encodeLookup = [];
|
|
1410
|
+
decodeLookup = [];
|
|
1411
|
+
for (let i = 0; i < 256; i++) {
|
|
1412
|
+
encodeLookup[i] = alphabet[i >> 4 & 15] + alphabet[i & 15];
|
|
1413
|
+
if (i < 16) {
|
|
1414
|
+
if (i < 10) {
|
|
1415
|
+
decodeLookup[48 + i] = i;
|
|
1416
|
+
} else {
|
|
1417
|
+
decodeLookup[97 - 10 + i] = i;
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
});
|
|
1423
|
+
|
|
1424
|
+
// src/hex-wkb-loader.ts
|
|
1425
|
+
function parseHexWKB(text, options) {
|
|
1426
|
+
const uint8Array = decodeHex(text);
|
|
1427
|
+
const binaryGeometry = WKBLoader.parseSync?.(uint8Array.buffer, options);
|
|
1428
|
+
return binaryGeometry;
|
|
1429
|
+
}
|
|
1430
|
+
function isHexWKB(string) {
|
|
1431
|
+
if (!string) {
|
|
1432
|
+
return false;
|
|
1433
|
+
}
|
|
1434
|
+
if (string.length < 10 || string.length % 2 !== 0) {
|
|
1435
|
+
return false;
|
|
1436
|
+
}
|
|
1437
|
+
if (!string.startsWith("00") && !string.startsWith("01")) {
|
|
1438
|
+
return false;
|
|
1439
|
+
}
|
|
1440
|
+
return /^[0-9a-fA-F]+$/.test(string.slice(2));
|
|
1441
|
+
}
|
|
1442
|
+
var HexWKBLoader;
|
|
1443
|
+
var init_hex_wkb_loader = __esm({
|
|
1444
|
+
"src/hex-wkb-loader.ts"() {
|
|
1445
|
+
init_wkb_loader();
|
|
1446
|
+
init_version();
|
|
1447
|
+
init_hex_transcoder();
|
|
1448
|
+
HexWKBLoader = {
|
|
1449
|
+
name: "Hexadecimal WKB",
|
|
1450
|
+
id: "wkb",
|
|
1451
|
+
module: "wkt",
|
|
1452
|
+
version: VERSION,
|
|
1453
|
+
worker: true,
|
|
1454
|
+
category: "geometry",
|
|
1455
|
+
extensions: ["wkb"],
|
|
1456
|
+
mimeTypes: [],
|
|
1457
|
+
options: WKBLoader.options,
|
|
1458
|
+
text: true,
|
|
1459
|
+
testText: isHexWKB,
|
|
1460
|
+
parse: async (arrayBuffer) => parseHexWKB(new TextDecoder().decode(arrayBuffer)),
|
|
1461
|
+
parseTextSync: parseHexWKB
|
|
1462
|
+
};
|
|
1463
|
+
}
|
|
1464
|
+
});
|
|
1465
|
+
|
|
1466
|
+
// src/lib/utils/binary-reader.ts
|
|
1467
|
+
var BinaryReader;
|
|
1468
|
+
var init_binary_reader = __esm({
|
|
1469
|
+
"src/lib/utils/binary-reader.ts"() {
|
|
1470
|
+
BinaryReader = class {
|
|
1471
|
+
constructor(arrayBuffer, isBigEndian = false) {
|
|
1472
|
+
this.arrayBuffer = arrayBuffer;
|
|
1473
|
+
this.dataView = new DataView(arrayBuffer);
|
|
1474
|
+
this.byteOffset = 0;
|
|
1475
|
+
this.littleEndian = !isBigEndian;
|
|
1476
|
+
}
|
|
1477
|
+
readUInt8() {
|
|
1478
|
+
const value = this.dataView.getUint8(this.byteOffset);
|
|
1479
|
+
this.byteOffset += 1;
|
|
1480
|
+
return value;
|
|
1481
|
+
}
|
|
1482
|
+
readUInt16() {
|
|
1483
|
+
const value = this.dataView.getUint16(this.byteOffset, this.littleEndian);
|
|
1484
|
+
this.byteOffset += 2;
|
|
1485
|
+
return value;
|
|
1486
|
+
}
|
|
1487
|
+
readUInt32() {
|
|
1488
|
+
const value = this.dataView.getUint32(this.byteOffset, this.littleEndian);
|
|
1489
|
+
this.byteOffset += 4;
|
|
1490
|
+
return value;
|
|
1491
|
+
}
|
|
1492
|
+
readInt8() {
|
|
1493
|
+
const value = this.dataView.getInt8(this.byteOffset);
|
|
1494
|
+
this.byteOffset += 1;
|
|
1495
|
+
return value;
|
|
1496
|
+
}
|
|
1497
|
+
readInt16() {
|
|
1498
|
+
const value = this.dataView.getInt16(this.byteOffset, this.littleEndian);
|
|
1499
|
+
this.byteOffset += 2;
|
|
1500
|
+
return value;
|
|
1501
|
+
}
|
|
1502
|
+
readInt32() {
|
|
1503
|
+
const value = this.dataView.getInt32(this.byteOffset, this.littleEndian);
|
|
1504
|
+
this.byteOffset += 4;
|
|
1505
|
+
return value;
|
|
1506
|
+
}
|
|
1507
|
+
readFloat() {
|
|
1508
|
+
const value = this.dataView.getFloat32(this.byteOffset, this.littleEndian);
|
|
1509
|
+
this.byteOffset += 4;
|
|
1510
|
+
return value;
|
|
1511
|
+
}
|
|
1512
|
+
readDouble() {
|
|
1513
|
+
const value = this.dataView.getFloat64(this.byteOffset, this.littleEndian);
|
|
1514
|
+
this.byteOffset += 8;
|
|
1515
|
+
return value;
|
|
1516
|
+
}
|
|
1517
|
+
readVarInt() {
|
|
1518
|
+
let result = 0;
|
|
1519
|
+
let bytesRead = 0;
|
|
1520
|
+
let nextByte;
|
|
1521
|
+
do {
|
|
1522
|
+
nextByte = this.dataView.getUint8(this.byteOffset + bytesRead);
|
|
1523
|
+
result += (nextByte & 127) << 7 * bytesRead;
|
|
1524
|
+
bytesRead++;
|
|
1525
|
+
} while (nextByte >= 128);
|
|
1526
|
+
this.byteOffset += bytesRead;
|
|
1527
|
+
return result;
|
|
1528
|
+
}
|
|
1529
|
+
};
|
|
1530
|
+
}
|
|
1531
|
+
});
|
|
1532
|
+
|
|
1533
|
+
// src/lib/parse-twkb.ts
|
|
1534
|
+
function isTWKB(arrayBuffer) {
|
|
1535
|
+
const binaryReader = new BinaryReader(arrayBuffer);
|
|
1536
|
+
const type = binaryReader.readUInt8();
|
|
1537
|
+
const geometryType = type & 15;
|
|
1538
|
+
if (geometryType < 1 || geometryType > 7) {
|
|
1539
|
+
return false;
|
|
1540
|
+
}
|
|
1541
|
+
return true;
|
|
1542
|
+
}
|
|
1543
|
+
function parseTWKBGeometry(arrayBuffer) {
|
|
1544
|
+
const binaryReader = new BinaryReader(arrayBuffer);
|
|
1545
|
+
const type = binaryReader.readUInt8();
|
|
1546
|
+
const metadataHeader = binaryReader.readUInt8();
|
|
1547
|
+
const geometryType = type & 15;
|
|
1548
|
+
const precision = zigZagDecode(type >> 4);
|
|
1549
|
+
const hasExtendedPrecision = Boolean(metadataHeader >> 3 & 1);
|
|
1550
|
+
let hasZ = false;
|
|
1551
|
+
let hasM = false;
|
|
1552
|
+
let zPrecision = 0;
|
|
1553
|
+
let zPrecisionFactor = 1;
|
|
1554
|
+
let mPrecision = 0;
|
|
1555
|
+
let mPrecisionFactor = 1;
|
|
1556
|
+
if (hasExtendedPrecision) {
|
|
1557
|
+
const extendedPrecision = binaryReader.readUInt8();
|
|
1558
|
+
hasZ = (extendedPrecision & 1) === 1;
|
|
1559
|
+
hasM = (extendedPrecision & 2) === 2;
|
|
1560
|
+
zPrecision = zigZagDecode((extendedPrecision & 28) >> 2);
|
|
1561
|
+
zPrecisionFactor = Math.pow(10, zPrecision);
|
|
1562
|
+
mPrecision = zigZagDecode((extendedPrecision & 224) >> 5);
|
|
1563
|
+
mPrecisionFactor = Math.pow(10, mPrecision);
|
|
1564
|
+
}
|
|
1565
|
+
const context = {
|
|
1566
|
+
precision,
|
|
1567
|
+
precisionFactor: Math.pow(10, precision),
|
|
1568
|
+
hasBoundingBox: Boolean(metadataHeader >> 0 & 1),
|
|
1569
|
+
hasSizeAttribute: Boolean(metadataHeader >> 1 & 1),
|
|
1570
|
+
hasIdList: Boolean(metadataHeader >> 2 & 1),
|
|
1571
|
+
hasExtendedPrecision,
|
|
1572
|
+
isEmpty: Boolean(metadataHeader >> 4 & 1),
|
|
1573
|
+
hasZ,
|
|
1574
|
+
hasM,
|
|
1575
|
+
zPrecision,
|
|
1576
|
+
zPrecisionFactor,
|
|
1577
|
+
mPrecision,
|
|
1578
|
+
mPrecisionFactor
|
|
1579
|
+
};
|
|
1580
|
+
if (context.hasSizeAttribute) {
|
|
1581
|
+
binaryReader.readVarInt();
|
|
1582
|
+
}
|
|
1583
|
+
if (context.hasBoundingBox) {
|
|
1584
|
+
let dimensions = 2;
|
|
1585
|
+
if (context.hasZ) {
|
|
1586
|
+
dimensions++;
|
|
1587
|
+
}
|
|
1588
|
+
if (context.hasM) {
|
|
1589
|
+
dimensions++;
|
|
1590
|
+
}
|
|
1591
|
+
for (let i = 0; i < dimensions; i++) {
|
|
1592
|
+
binaryReader.readVarInt();
|
|
1593
|
+
binaryReader.readVarInt();
|
|
1594
|
+
}
|
|
1595
|
+
}
|
|
1596
|
+
return parseGeometry2(binaryReader, context, geometryType);
|
|
1597
|
+
}
|
|
1598
|
+
function parseGeometry2(binaryReader, context, geometryType) {
|
|
1599
|
+
switch (geometryType) {
|
|
1600
|
+
case WKBGeometryType.Point:
|
|
1601
|
+
return parsePoint3(binaryReader, context);
|
|
1602
|
+
case WKBGeometryType.LineString:
|
|
1603
|
+
return parseLineString3(binaryReader, context);
|
|
1604
|
+
case WKBGeometryType.Polygon:
|
|
1605
|
+
return parsePolygon3(binaryReader, context);
|
|
1606
|
+
case WKBGeometryType.MultiPoint:
|
|
1607
|
+
return parseMultiPoint3(binaryReader, context);
|
|
1608
|
+
case WKBGeometryType.MultiLineString:
|
|
1609
|
+
return parseMultiLineString3(binaryReader, context);
|
|
1610
|
+
case WKBGeometryType.MultiPolygon:
|
|
1611
|
+
return parseMultiPolygon3(binaryReader, context);
|
|
1612
|
+
case WKBGeometryType.GeometryCollection:
|
|
1613
|
+
return parseGeometryCollection2(binaryReader, context);
|
|
1614
|
+
default:
|
|
1615
|
+
throw new Error(`GeometryType ${geometryType} not supported`);
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
function parsePoint3(reader, context) {
|
|
1619
|
+
if (context.isEmpty) {
|
|
1620
|
+
return { type: "Point", coordinates: [] };
|
|
1621
|
+
}
|
|
1622
|
+
return { type: "Point", coordinates: readFirstPoint(reader, context) };
|
|
1623
|
+
}
|
|
1624
|
+
function parseLineString3(reader, context) {
|
|
1625
|
+
if (context.isEmpty) {
|
|
1626
|
+
return { type: "LineString", coordinates: [] };
|
|
1627
|
+
}
|
|
1628
|
+
const pointCount = reader.readVarInt();
|
|
1629
|
+
const previousPoint = makePreviousPoint(context);
|
|
1630
|
+
const points = [];
|
|
1631
|
+
for (let i = 0; i < pointCount; i++) {
|
|
1632
|
+
points.push(parseNextPoint(reader, context, previousPoint));
|
|
1633
|
+
}
|
|
1634
|
+
return { type: "LineString", coordinates: points };
|
|
1635
|
+
}
|
|
1636
|
+
function parsePolygon3(reader, context) {
|
|
1637
|
+
if (context.isEmpty) {
|
|
1638
|
+
return { type: "Polygon", coordinates: [] };
|
|
1639
|
+
}
|
|
1640
|
+
const ringCount = reader.readVarInt();
|
|
1641
|
+
const previousPoint = makePreviousPoint(context);
|
|
1642
|
+
const exteriorRingLength = reader.readVarInt();
|
|
1643
|
+
const exteriorRing = [];
|
|
1644
|
+
for (let i = 0; i < exteriorRingLength; i++) {
|
|
1645
|
+
exteriorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
1646
|
+
}
|
|
1647
|
+
const polygon = [exteriorRing];
|
|
1648
|
+
for (let i = 1; i < ringCount; i++) {
|
|
1649
|
+
const interiorRingCount = reader.readVarInt();
|
|
1650
|
+
const interiorRing = [];
|
|
1651
|
+
for (let j = 0; j < interiorRingCount; j++) {
|
|
1652
|
+
interiorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
1653
|
+
}
|
|
1654
|
+
polygon.push(interiorRing);
|
|
1655
|
+
}
|
|
1656
|
+
return { type: "Polygon", coordinates: polygon };
|
|
1657
|
+
}
|
|
1658
|
+
function parseMultiPoint3(reader, context) {
|
|
1659
|
+
if (context.isEmpty) {
|
|
1660
|
+
return { type: "MultiPoint", coordinates: [] };
|
|
1661
|
+
}
|
|
1662
|
+
const previousPoint = makePreviousPoint(context);
|
|
1663
|
+
const pointCount = reader.readVarInt();
|
|
1664
|
+
const coordinates = [];
|
|
1665
|
+
for (let i = 0; i < pointCount; i++) {
|
|
1666
|
+
coordinates.push(parseNextPoint(reader, context, previousPoint));
|
|
1667
|
+
}
|
|
1668
|
+
return { type: "MultiPoint", coordinates };
|
|
1669
|
+
}
|
|
1670
|
+
function parseMultiLineString3(reader, context) {
|
|
1671
|
+
if (context.isEmpty) {
|
|
1672
|
+
return { type: "MultiLineString", coordinates: [] };
|
|
1673
|
+
}
|
|
1674
|
+
const previousPoint = makePreviousPoint(context);
|
|
1675
|
+
const lineStringCount = reader.readVarInt();
|
|
1676
|
+
const coordinates = [];
|
|
1677
|
+
for (let i = 0; i < lineStringCount; i++) {
|
|
1678
|
+
const pointCount = reader.readVarInt();
|
|
1679
|
+
const lineString = [];
|
|
1680
|
+
for (let j = 0; j < pointCount; j++) {
|
|
1681
|
+
lineString.push(parseNextPoint(reader, context, previousPoint));
|
|
1682
|
+
}
|
|
1683
|
+
coordinates.push(lineString);
|
|
1684
|
+
}
|
|
1685
|
+
return { type: "MultiLineString", coordinates };
|
|
1686
|
+
}
|
|
1687
|
+
function parseMultiPolygon3(reader, context) {
|
|
1688
|
+
if (context.isEmpty) {
|
|
1689
|
+
return { type: "MultiPolygon", coordinates: [] };
|
|
1690
|
+
}
|
|
1691
|
+
const previousPoint = makePreviousPoint(context);
|
|
1692
|
+
const polygonCount = reader.readVarInt();
|
|
1693
|
+
const polygons = [];
|
|
1694
|
+
for (let i = 0; i < polygonCount; i++) {
|
|
1695
|
+
const ringCount = reader.readVarInt();
|
|
1696
|
+
const exteriorPointCount = reader.readVarInt();
|
|
1697
|
+
const exteriorRing = [];
|
|
1698
|
+
for (let j = 0; j < exteriorPointCount; j++) {
|
|
1699
|
+
exteriorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
1700
|
+
}
|
|
1701
|
+
const polygon = exteriorRing ? [exteriorRing] : [];
|
|
1702
|
+
for (let j = 1; j < ringCount; j++) {
|
|
1703
|
+
const interiorRing = [];
|
|
1704
|
+
const interiorRingLength = reader.readVarInt();
|
|
1705
|
+
for (let k = 0; k < interiorRingLength; k++) {
|
|
1706
|
+
interiorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
1707
|
+
}
|
|
1708
|
+
polygon.push(interiorRing);
|
|
1709
|
+
}
|
|
1710
|
+
polygons.push(polygon);
|
|
1711
|
+
}
|
|
1712
|
+
return { type: "MultiPolygon", coordinates: polygons };
|
|
1713
|
+
}
|
|
1714
|
+
function parseGeometryCollection2(reader, context) {
|
|
1715
|
+
return { type: "GeometryCollection", geometries: [] };
|
|
1716
|
+
}
|
|
1717
|
+
function zigZagDecode(value) {
|
|
1718
|
+
return value >> 1 ^ -(value & 1);
|
|
1719
|
+
}
|
|
1720
|
+
function makePointCoordinates(x, y, z, m) {
|
|
1721
|
+
return z !== void 0 ? m !== void 0 ? [x, y, z, m] : [x, y, z] : [x, y];
|
|
1722
|
+
}
|
|
1723
|
+
function makePreviousPoint(context) {
|
|
1724
|
+
return makePointCoordinates(0, 0, context.hasZ ? 0 : void 0, context.hasM ? 0 : void 0);
|
|
1725
|
+
}
|
|
1726
|
+
function readFirstPoint(reader, context) {
|
|
1727
|
+
const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
1728
|
+
const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
1729
|
+
const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : void 0;
|
|
1730
|
+
const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : void 0;
|
|
1731
|
+
return makePointCoordinates(x, y, z, m);
|
|
1732
|
+
}
|
|
1733
|
+
function parseNextPoint(reader, context, previousPoint) {
|
|
1734
|
+
previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
1735
|
+
previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
1736
|
+
if (context.hasZ) {
|
|
1737
|
+
previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;
|
|
1738
|
+
}
|
|
1739
|
+
if (context.hasM) {
|
|
1740
|
+
previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;
|
|
1741
|
+
}
|
|
1742
|
+
return previousPoint.slice();
|
|
1743
|
+
}
|
|
1744
|
+
var init_parse_twkb = __esm({
|
|
1745
|
+
"src/lib/parse-twkb.ts"() {
|
|
1746
|
+
init_binary_reader();
|
|
1747
|
+
init_parse_wkb_header();
|
|
1748
|
+
}
|
|
1749
|
+
});
|
|
1750
|
+
|
|
1751
|
+
// src/twkb-loader.ts
|
|
1752
|
+
var TWKBWorkerLoader, TWKBLoader;
|
|
1753
|
+
var init_twkb_loader = __esm({
|
|
1754
|
+
"src/twkb-loader.ts"() {
|
|
1755
|
+
init_version();
|
|
1756
|
+
init_parse_twkb();
|
|
1757
|
+
TWKBWorkerLoader = {
|
|
1758
|
+
name: "TWKB (Tiny Well-Known Binary)",
|
|
1759
|
+
id: "twkb",
|
|
1760
|
+
module: "wkt",
|
|
1761
|
+
version: VERSION,
|
|
1762
|
+
worker: true,
|
|
1763
|
+
category: "geometry",
|
|
1764
|
+
extensions: ["twkb"],
|
|
1765
|
+
mimeTypes: [],
|
|
1766
|
+
tests: [isTWKB],
|
|
1767
|
+
options: {
|
|
1768
|
+
wkb: {
|
|
1769
|
+
shape: "binary-geometry"
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
};
|
|
1773
|
+
TWKBLoader = {
|
|
1774
|
+
...TWKBWorkerLoader,
|
|
1775
|
+
parse: async (arrayBuffer) => parseTWKBGeometry(arrayBuffer),
|
|
1776
|
+
parseSync: parseTWKBGeometry
|
|
1777
|
+
};
|
|
1778
|
+
}
|
|
1779
|
+
});
|
|
1780
|
+
|
|
1781
|
+
// src/lib/encode-twkb.ts
|
|
1782
|
+
function encodeTWKB(geometry, options) {
|
|
1783
|
+
const writer = new BinaryWriter(0, true);
|
|
1784
|
+
const context = {
|
|
1785
|
+
...getTwkbPrecision(5, 0, 0),
|
|
1786
|
+
hasZ: options?.hasZ,
|
|
1787
|
+
hasM: options?.hasM
|
|
1788
|
+
};
|
|
1789
|
+
encodeGeometry(writer, geometry, context);
|
|
1790
|
+
return writer.arrayBuffer;
|
|
1791
|
+
}
|
|
1792
|
+
function encodeGeometry(writer, geometry, context) {
|
|
1793
|
+
switch (geometry.type) {
|
|
1794
|
+
case "Point":
|
|
1795
|
+
return encodePoint2(writer, context, geometry);
|
|
1796
|
+
case "LineString":
|
|
1797
|
+
return encodeLineString2(writer, context, geometry);
|
|
1798
|
+
case "Polygon":
|
|
1799
|
+
return encodePolygon2(writer, context, geometry);
|
|
1800
|
+
case "MultiPoint":
|
|
1801
|
+
return encodeMultiPoint2(writer, context, geometry);
|
|
1802
|
+
case "MultiLineString":
|
|
1803
|
+
return encodeMultiLineString2(writer, context, geometry);
|
|
1804
|
+
case "MultiPolygon":
|
|
1805
|
+
return encodeMultiPolygon2(writer, context, geometry);
|
|
1806
|
+
case "GeometryCollection":
|
|
1807
|
+
return encodeGeometryCollection2(writer, context, geometry);
|
|
1808
|
+
default:
|
|
1809
|
+
throw new Error("unsupported geometry type");
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1812
|
+
function encodePoint2(writer, context, point) {
|
|
1813
|
+
const isEmpty = point.coordinates.length === 0 || point[0] === "undefined" || point[1] === "undefined";
|
|
1814
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Point, isEmpty);
|
|
1815
|
+
if (!isEmpty) {
|
|
1816
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1817
|
+
writeTwkbPoint(writer, context, point.coordinates, previousPoint);
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
function encodeLineString2(writer, context, lineString) {
|
|
1821
|
+
const points = lineString.coordinates;
|
|
1822
|
+
const isEmpty = points.length === 0;
|
|
1823
|
+
writeTwkbHeader(writer, context, WKBGeometryType.LineString, isEmpty);
|
|
1824
|
+
if (!isEmpty) {
|
|
1825
|
+
writer.writeVarInt(points.length);
|
|
1826
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1827
|
+
for (const point of points) {
|
|
1828
|
+
writeTwkbPoint(writer, context, point, previousPoint);
|
|
1829
|
+
}
|
|
1830
|
+
}
|
|
1831
|
+
return writer.arrayBuffer;
|
|
1832
|
+
}
|
|
1833
|
+
function encodePolygon2(writer, context, polygon) {
|
|
1834
|
+
const polygonRings = polygon.coordinates;
|
|
1835
|
+
const isEmpty = polygonRings.length === 0;
|
|
1836
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Polygon, isEmpty);
|
|
1837
|
+
if (!isEmpty) {
|
|
1838
|
+
writer.writeVarInt(polygonRings.length);
|
|
1839
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1840
|
+
for (const ring of polygonRings) {
|
|
1841
|
+
writer.writeVarInt(ring.length);
|
|
1842
|
+
for (const point of ring) {
|
|
1843
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
}
|
|
1847
|
+
return writer.arrayBuffer;
|
|
1848
|
+
}
|
|
1849
|
+
function encodeMultiPoint2(writer, context, multiPoint) {
|
|
1850
|
+
const points = multiPoint.coordinates;
|
|
1851
|
+
const isEmpty = points.length === 0;
|
|
1852
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPoint, isEmpty);
|
|
1853
|
+
if (!isEmpty) {
|
|
1854
|
+
writer.writeVarInt(points.length);
|
|
1855
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1856
|
+
for (let i = 0; i < points.length; i++) {
|
|
1857
|
+
writeTwkbPoint(writer, context, previousPoint, points[i]);
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
function encodeMultiLineString2(writer, context, multiLineStrings) {
|
|
1862
|
+
const lineStrings = multiLineStrings.coordinates;
|
|
1863
|
+
const isEmpty = lineStrings.length === 0;
|
|
1864
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiLineString, isEmpty);
|
|
1865
|
+
if (!isEmpty) {
|
|
1866
|
+
writer.writeVarInt(lineStrings.length);
|
|
1867
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1868
|
+
for (const lineString of lineStrings) {
|
|
1869
|
+
writer.writeVarInt(lineString.length);
|
|
1870
|
+
for (const point of lineString) {
|
|
1871
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
1872
|
+
}
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
return writer.arrayBuffer;
|
|
1876
|
+
}
|
|
1877
|
+
function encodeMultiPolygon2(writer, context, multiPolygon) {
|
|
1878
|
+
const { coordinates } = multiPolygon;
|
|
1879
|
+
const isEmpty = coordinates.length === 0;
|
|
1880
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPolygon, isEmpty);
|
|
1881
|
+
if (!isEmpty) {
|
|
1882
|
+
const polygons = coordinates;
|
|
1883
|
+
writer.writeVarInt(polygons.length);
|
|
1884
|
+
const previousPoint = [0, 0, 0, 0];
|
|
1885
|
+
for (const polygonRings of polygons) {
|
|
1886
|
+
writer.writeVarInt(polygonRings.length);
|
|
1887
|
+
for (const ring of polygonRings) {
|
|
1888
|
+
writer.writeVarInt(ring.length);
|
|
1889
|
+
for (const point of ring) {
|
|
1890
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
}
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
function encodeGeometryCollection2(writer, context, geometryCollection) {
|
|
1897
|
+
const { geometries } = geometryCollection;
|
|
1898
|
+
const isEmpty = geometries.length === 0;
|
|
1899
|
+
writeTwkbHeader(writer, context, WKBGeometryType.GeometryCollection, isEmpty);
|
|
1900
|
+
if (geometries.length > 0) {
|
|
1901
|
+
writer.writeVarInt(geometries.length);
|
|
1902
|
+
for (const geometry of geometries) {
|
|
1903
|
+
encodeGeometry(writer, geometry, context);
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
function writeTwkbHeader(writer, context, geometryType, isEmpty) {
|
|
1908
|
+
const type = (zigZagEncode(context.xy) << 4) + geometryType;
|
|
1909
|
+
let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
|
|
1910
|
+
metadataHeader += isEmpty ? 1 << 4 : 0;
|
|
1911
|
+
writer.writeUInt8(type);
|
|
1912
|
+
writer.writeUInt8(metadataHeader);
|
|
1913
|
+
if (context.hasZ || context.hasM) {
|
|
1914
|
+
let extendedPrecision = 0;
|
|
1915
|
+
if (context.hasZ) {
|
|
1916
|
+
extendedPrecision |= 1;
|
|
1917
|
+
}
|
|
1918
|
+
if (context.hasM) {
|
|
1919
|
+
extendedPrecision |= 2;
|
|
1920
|
+
}
|
|
1921
|
+
writer.writeUInt8(extendedPrecision);
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
function writeTwkbPoint(writer, context, point, previousPoint) {
|
|
1925
|
+
const x = point[0] * context.xyFactor;
|
|
1926
|
+
const y = point[1] * context.xyFactor;
|
|
1927
|
+
const z = point[2] * context.zFactor;
|
|
1928
|
+
const m = point[3] * context.mFactor;
|
|
1929
|
+
writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
|
|
1930
|
+
writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
|
|
1931
|
+
if (context.hasZ) {
|
|
1932
|
+
writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
|
|
1933
|
+
}
|
|
1934
|
+
if (context.hasM) {
|
|
1935
|
+
writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
|
|
1936
|
+
}
|
|
1937
|
+
previousPoint[0] = x;
|
|
1938
|
+
previousPoint[1] = y;
|
|
1939
|
+
previousPoint[2] = z;
|
|
1940
|
+
previousPoint[3] = m;
|
|
1941
|
+
}
|
|
1942
|
+
function zigZagEncode(value) {
|
|
1943
|
+
return value << 1 ^ value >> 31;
|
|
1944
|
+
}
|
|
1945
|
+
function getTwkbPrecision(xyPrecision, zPrecision, mPrecision) {
|
|
1946
|
+
return {
|
|
1947
|
+
xy: xyPrecision,
|
|
1948
|
+
z: zPrecision,
|
|
1949
|
+
m: mPrecision,
|
|
1950
|
+
xyFactor: Math.pow(10, xyPrecision),
|
|
1951
|
+
zFactor: Math.pow(10, zPrecision),
|
|
1952
|
+
mFactor: Math.pow(10, mPrecision)
|
|
1953
|
+
};
|
|
1954
|
+
}
|
|
1955
|
+
var init_encode_twkb = __esm({
|
|
1956
|
+
"src/lib/encode-twkb.ts"() {
|
|
1957
|
+
init_binary_writer();
|
|
1958
|
+
init_parse_wkb_header();
|
|
1959
|
+
}
|
|
1960
|
+
});
|
|
1961
|
+
|
|
1962
|
+
// src/twkb-writer.ts
|
|
1963
|
+
var TWKBWriter;
|
|
1964
|
+
var init_twkb_writer = __esm({
|
|
1965
|
+
"src/twkb-writer.ts"() {
|
|
1966
|
+
init_version();
|
|
1967
|
+
init_encode_twkb();
|
|
1968
|
+
TWKBWriter = {
|
|
1969
|
+
name: "TWKB (Tiny Well Known Binary)",
|
|
1970
|
+
id: "twkb",
|
|
1971
|
+
module: "wkt",
|
|
1972
|
+
version: VERSION,
|
|
1973
|
+
extensions: ["twkb"],
|
|
1974
|
+
encodeSync: async (data, options) => encodeTWKB,
|
|
1975
|
+
options: {
|
|
1976
|
+
twkb: {}
|
|
1977
|
+
}
|
|
1978
|
+
};
|
|
1979
|
+
}
|
|
1980
|
+
});
|
|
1981
|
+
|
|
961
1982
|
// src/index.ts
|
|
962
1983
|
var src_exports = {};
|
|
963
1984
|
__export(src_exports, {
|
|
1985
|
+
HexWKBLoader: () => HexWKBLoader,
|
|
1986
|
+
TWKBLoader: () => TWKBLoader,
|
|
1987
|
+
TWKBWriter: () => TWKBWriter,
|
|
964
1988
|
WKBLoader: () => WKBLoader,
|
|
965
1989
|
WKBWorkerLoader: () => WKBWorkerLoader,
|
|
966
1990
|
WKBWriter: () => WKBWriter,
|
|
1991
|
+
WKTCRSLoader: () => WKTCRSLoader,
|
|
1992
|
+
WKTCRSWriter: () => WKTCRSWriter,
|
|
967
1993
|
WKTLoader: () => WKTLoader,
|
|
968
1994
|
WKTWorkerLoader: () => WKTWorkerLoader,
|
|
969
|
-
WKTWriter: () => WKTWriter
|
|
1995
|
+
WKTWriter: () => WKTWriter,
|
|
1996
|
+
decodeHex: () => decodeHex,
|
|
1997
|
+
encodeHex: () => encodeHex,
|
|
1998
|
+
isTWKB: () => isTWKB,
|
|
1999
|
+
isWKB: () => isWKB,
|
|
2000
|
+
isWKT: () => isWKT,
|
|
2001
|
+
parseWKBHeader: () => parseWKBHeader
|
|
970
2002
|
});
|
|
971
|
-
var
|
|
2003
|
+
var init_src2 = __esm({
|
|
972
2004
|
"src/index.ts"() {
|
|
973
|
-
|
|
2005
|
+
init_wkt_crs_loader();
|
|
2006
|
+
init_wkt_crs_writer();
|
|
974
2007
|
init_wkt_loader();
|
|
975
2008
|
init_wkt_writer();
|
|
2009
|
+
init_wkb_loader();
|
|
976
2010
|
init_wkb_writer();
|
|
2011
|
+
init_hex_wkb_loader();
|
|
2012
|
+
init_twkb_loader();
|
|
2013
|
+
init_twkb_writer();
|
|
2014
|
+
init_parse_wkt();
|
|
2015
|
+
init_parse_wkb_header();
|
|
2016
|
+
init_parse_twkb();
|
|
2017
|
+
init_hex_transcoder();
|
|
977
2018
|
}
|
|
978
2019
|
});
|
|
979
2020
|
|
|
980
2021
|
// src/bundle.ts
|
|
981
2022
|
var require_bundle = __commonJS({
|
|
982
2023
|
"src/bundle.ts"(exports, module) {
|
|
983
|
-
var moduleExports = (
|
|
2024
|
+
var moduleExports = (init_src2(), src_exports);
|
|
984
2025
|
globalThis.loaders = globalThis.loaders || {};
|
|
985
2026
|
module.exports = Object.assign(globalThis.loaders, moduleExports);
|
|
986
2027
|
}
|