@loaders.gl/wkt 4.0.0-alpha.9 → 4.0.0-beta.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/README.md +4 -1
- package/dist/dist.min.js +1449 -404
- 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 +263 -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/lib/utils/version.js.map +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 +9 -9
- 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 +256 -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/lib/utils/version.js.map +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 -4
- 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 +230 -186
- 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 +356 -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 +19 -8
- 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 +22 -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/bundle.js +0 -5
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -13
- package/dist/lib/encode-wkb.d.ts.map +0 -1
- package/dist/lib/encode-wkb.js +0 -295
- package/dist/lib/encode-wkt.d.ts.map +0 -1
- package/dist/lib/encode-wkt.js +0 -46
- package/dist/lib/parse-wkb.d.ts +0 -3
- package/dist/lib/parse-wkb.d.ts.map +0 -1
- package/dist/lib/parse-wkb.js +0 -236
- package/dist/lib/parse-wkt.d.ts +0 -8
- package/dist/lib/parse-wkt.d.ts.map +0 -1
- package/dist/lib/parse-wkt.js +0 -227
- package/dist/lib/utils/binary-writer.d.ts.map +0 -1
- package/dist/lib/utils/binary-writer.js +0 -120
- package/dist/lib/utils/version.d.ts.map +0 -1
- package/dist/lib/utils/version.js +0 -7
- package/dist/wkb-loader.d.ts +0 -39
- package/dist/wkb-loader.d.ts.map +0 -1
- package/dist/wkb-loader.js +0 -34
- package/dist/wkb-writer.d.ts +0 -6
- package/dist/wkb-writer.d.ts.map +0 -1
- package/dist/wkb-writer.js +0 -26
- package/dist/wkt-loader.d.ts +0 -10
- package/dist/wkt-loader.d.ts.map +0 -1
- package/dist/wkt-loader.js +0 -33
- package/dist/wkt-writer.d.ts +0 -6
- package/dist/wkt-writer.d.ts.map +0 -1
- package/dist/wkt-writer.js +0 -23
- package/dist/workers/wkb-worker.js +0 -5
- package/dist/workers/wkt-worker.js +0 -5
- /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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loaders.gl/wkt",
|
|
3
3
|
"description": "Loader and Writer for the WKT (Well Known Text) Format",
|
|
4
|
-
"version": "4.0.0-
|
|
4
|
+
"version": "4.0.0-beta.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"fuzzer": "^0.2.1"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@loaders.gl/loader-utils": "4.0.0-
|
|
39
|
-
"@loaders.gl/schema": "4.0.0-
|
|
38
|
+
"@loaders.gl/loader-utils": "4.0.0-beta.2",
|
|
39
|
+
"@loaders.gl/schema": "4.0.0-beta.2"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "79c2033f755e88e11bc30a04428e3666b177b8fc"
|
|
42
42
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import type {LoaderWithParser} from '@loaders.gl/loader-utils';
|
|
4
|
+
import {BinaryGeometry} from '@loaders.gl/schema';
|
|
5
|
+
|
|
6
|
+
import type {WKBLoaderOptions} from './wkb-loader';
|
|
7
|
+
import {WKBLoader} from './wkb-loader';
|
|
8
|
+
import {VERSION} from './lib/utils/version';
|
|
9
|
+
import {decodeHex} from './lib/utils/hex-transcoder';
|
|
10
|
+
|
|
11
|
+
export type HexWKBLoaderOptions = WKBLoaderOptions;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Worker loader for Hex-encoded WKB (Well-Known Binary)
|
|
15
|
+
*/
|
|
16
|
+
export const HexWKBLoader: LoaderWithParser<BinaryGeometry, never, HexWKBLoaderOptions> = {
|
|
17
|
+
name: 'Hexadecimal WKB',
|
|
18
|
+
id: 'wkb',
|
|
19
|
+
module: 'wkt',
|
|
20
|
+
version: VERSION,
|
|
21
|
+
worker: true,
|
|
22
|
+
category: 'geometry',
|
|
23
|
+
extensions: ['wkb'],
|
|
24
|
+
mimeTypes: [],
|
|
25
|
+
options: WKBLoader.options,
|
|
26
|
+
text: true,
|
|
27
|
+
testText: isHexWKB,
|
|
28
|
+
// TODO - encoding here seems wasteful - extend hex transcoder?
|
|
29
|
+
parse: async (arrayBuffer: ArrayBuffer) => parseHexWKB(new TextDecoder().decode(arrayBuffer)),
|
|
30
|
+
parseTextSync: parseHexWKB
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function parseHexWKB(text: string, options?: HexWKBLoaderOptions): BinaryGeometry {
|
|
34
|
+
const uint8Array = decodeHex(text);
|
|
35
|
+
const binaryGeometry = WKBLoader.parseSync?.(uint8Array.buffer, options);
|
|
36
|
+
// @ts-expect-error
|
|
37
|
+
return binaryGeometry;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Check if string is a valid Well-known binary (WKB) in HEX format
|
|
42
|
+
* https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry
|
|
43
|
+
*
|
|
44
|
+
* @param str input string
|
|
45
|
+
* @returns true if string is a valid WKB in HEX format
|
|
46
|
+
*/
|
|
47
|
+
export function isHexWKB(string: string | null): boolean {
|
|
48
|
+
if (!string) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// check if the length of the string is even and is at least 10 characters long
|
|
52
|
+
if (string.length < 10 || string.length % 2 !== 0) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// check if first two characters are 00 or 01
|
|
56
|
+
if (!string.startsWith('00') && !string.startsWith('01')) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// check if the rest of the string is a valid hex
|
|
60
|
+
return /^[0-9a-fA-F]+$/.test(string.slice(2));
|
|
61
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
export {WKTCRSLoader} from './wkt-crs-loader';
|
|
4
|
+
export {WKTCRSWriter} from './wkt-crs-writer';
|
|
5
|
+
|
|
2
6
|
export {WKTLoader, WKTWorkerLoader} from './wkt-loader';
|
|
3
7
|
export {WKTWriter} from './wkt-writer';
|
|
8
|
+
|
|
9
|
+
export {WKBLoader, WKBWorkerLoader} from './wkb-loader';
|
|
4
10
|
export {WKBWriter} from './wkb-writer';
|
|
11
|
+
|
|
12
|
+
export {HexWKBLoader} from './hex-wkb-loader';
|
|
13
|
+
|
|
14
|
+
export {TWKBLoader} from './twkb-loader';
|
|
15
|
+
export {TWKBWriter} from './twkb-writer';
|
|
16
|
+
|
|
17
|
+
// EXPERIMENTAL APIs
|
|
18
|
+
export {isWKT} from './lib/parse-wkt';
|
|
19
|
+
|
|
20
|
+
export {isWKB, parseWKBHeader} from './lib/parse-wkb-header';
|
|
21
|
+
export type {WKBHeader} from './lib/parse-wkb-header';
|
|
22
|
+
|
|
23
|
+
export {isTWKB} from './lib/parse-twkb';
|
|
24
|
+
|
|
25
|
+
export {encodeHex, decodeHex} from './lib/utils/hex-transcoder';
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
// Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz
|
|
3
|
+
|
|
4
|
+
import type {Point, MultiPoint, LineString} from '@loaders.gl/schema';
|
|
5
|
+
import type {
|
|
6
|
+
MultiLineString,
|
|
7
|
+
Polygon,
|
|
8
|
+
MultiPolygon,
|
|
9
|
+
GeometryCollection,
|
|
10
|
+
Geometry
|
|
11
|
+
} from '@loaders.gl/schema';
|
|
12
|
+
|
|
13
|
+
import {BinaryWriter} from './utils/binary-writer';
|
|
14
|
+
import {WKBGeometryType} from './parse-wkb-header';
|
|
15
|
+
|
|
16
|
+
type TWKBPrecision = {
|
|
17
|
+
xy: number;
|
|
18
|
+
z: number;
|
|
19
|
+
m: number;
|
|
20
|
+
xyFactor: number;
|
|
21
|
+
zFactor: number;
|
|
22
|
+
mFactor: number;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type TWKBEncoderContext = TWKBPrecision & {
|
|
26
|
+
hasZ?: boolean;
|
|
27
|
+
hasM?: boolean;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export function encodeTWKB(
|
|
31
|
+
geometry: Geometry,
|
|
32
|
+
options?: {hasZ?: boolean; hasM?: boolean}
|
|
33
|
+
): ArrayBuffer {
|
|
34
|
+
const writer = new BinaryWriter(0, true);
|
|
35
|
+
|
|
36
|
+
const context: TWKBEncoderContext = {
|
|
37
|
+
...getTwkbPrecision(5, 0, 0),
|
|
38
|
+
hasZ: options?.hasZ,
|
|
39
|
+
hasM: options?.hasM
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
encodeGeometry(writer, geometry, context);
|
|
43
|
+
|
|
44
|
+
// TODO - we need to slice it?
|
|
45
|
+
return writer.arrayBuffer;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function encodeGeometry(writer: BinaryWriter, geometry: Geometry, context: TWKBEncoderContext) {
|
|
49
|
+
switch (geometry.type) {
|
|
50
|
+
case 'Point':
|
|
51
|
+
return encodePoint(writer, context, geometry);
|
|
52
|
+
case 'LineString':
|
|
53
|
+
return encodeLineString(writer, context, geometry);
|
|
54
|
+
case 'Polygon':
|
|
55
|
+
return encodePolygon(writer, context, geometry);
|
|
56
|
+
case 'MultiPoint':
|
|
57
|
+
return encodeMultiPoint(writer, context, geometry);
|
|
58
|
+
case 'MultiLineString':
|
|
59
|
+
return encodeMultiLineString(writer, context, geometry);
|
|
60
|
+
case 'MultiPolygon':
|
|
61
|
+
return encodeMultiPolygon(writer, context, geometry);
|
|
62
|
+
case 'GeometryCollection':
|
|
63
|
+
return encodeGeometryCollection(writer, context, geometry);
|
|
64
|
+
default:
|
|
65
|
+
throw new Error('unsupported geometry type');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function encodePoint(writer: BinaryWriter, context: TWKBEncoderContext, point: Point): void {
|
|
70
|
+
const isEmpty =
|
|
71
|
+
point.coordinates.length === 0 || point[0] === 'undefined' || point[1] === 'undefined';
|
|
72
|
+
|
|
73
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Point, isEmpty);
|
|
74
|
+
|
|
75
|
+
if (!isEmpty) {
|
|
76
|
+
const previousPoint = [0, 0, 0, 0];
|
|
77
|
+
writeTwkbPoint(writer, context, point.coordinates, previousPoint);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function encodeLineString(
|
|
82
|
+
writer: BinaryWriter,
|
|
83
|
+
context: TWKBEncoderContext,
|
|
84
|
+
lineString: LineString
|
|
85
|
+
): ArrayBuffer {
|
|
86
|
+
const points = lineString.coordinates;
|
|
87
|
+
const isEmpty = points.length === 0;
|
|
88
|
+
|
|
89
|
+
writeTwkbHeader(writer, context, WKBGeometryType.LineString, isEmpty);
|
|
90
|
+
|
|
91
|
+
if (!isEmpty) {
|
|
92
|
+
writer.writeVarInt(points.length);
|
|
93
|
+
const previousPoint = [0, 0, 0, 0];
|
|
94
|
+
for (const point of points) {
|
|
95
|
+
writeTwkbPoint(writer, context, point, previousPoint);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return writer.arrayBuffer;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function encodePolygon(
|
|
103
|
+
writer: BinaryWriter,
|
|
104
|
+
context: TWKBEncoderContext,
|
|
105
|
+
polygon: Polygon
|
|
106
|
+
): ArrayBuffer {
|
|
107
|
+
const polygonRings = polygon.coordinates;
|
|
108
|
+
|
|
109
|
+
const isEmpty = polygonRings.length === 0;
|
|
110
|
+
|
|
111
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Polygon, isEmpty);
|
|
112
|
+
|
|
113
|
+
if (!isEmpty) {
|
|
114
|
+
writer.writeVarInt(polygonRings.length);
|
|
115
|
+
|
|
116
|
+
const previousPoint = [0, 0, 0, 0];
|
|
117
|
+
for (const ring of polygonRings) {
|
|
118
|
+
writer.writeVarInt(ring.length);
|
|
119
|
+
for (const point of ring) {
|
|
120
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return writer.arrayBuffer;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function encodeMultiPoint(
|
|
129
|
+
writer: BinaryWriter,
|
|
130
|
+
context: TWKBEncoderContext,
|
|
131
|
+
multiPoint: MultiPoint
|
|
132
|
+
): void {
|
|
133
|
+
const points = multiPoint.coordinates;
|
|
134
|
+
const isEmpty = points.length === 0;
|
|
135
|
+
|
|
136
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPoint, isEmpty);
|
|
137
|
+
|
|
138
|
+
if (!isEmpty) {
|
|
139
|
+
writer.writeVarInt(points.length);
|
|
140
|
+
|
|
141
|
+
const previousPoint = [0, 0, 0, 0];
|
|
142
|
+
for (let i = 0; i < points.length; i++) {
|
|
143
|
+
writeTwkbPoint(writer, context, previousPoint, points[i]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function encodeMultiLineString(
|
|
149
|
+
writer: BinaryWriter,
|
|
150
|
+
context: TWKBEncoderContext,
|
|
151
|
+
multiLineStrings: MultiLineString
|
|
152
|
+
): ArrayBuffer {
|
|
153
|
+
const lineStrings = multiLineStrings.coordinates;
|
|
154
|
+
const isEmpty = lineStrings.length === 0;
|
|
155
|
+
|
|
156
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiLineString, isEmpty);
|
|
157
|
+
|
|
158
|
+
if (!isEmpty) {
|
|
159
|
+
writer.writeVarInt(lineStrings.length);
|
|
160
|
+
|
|
161
|
+
const previousPoint = [0, 0, 0, 0];
|
|
162
|
+
for (const lineString of lineStrings) {
|
|
163
|
+
writer.writeVarInt(lineString.length);
|
|
164
|
+
|
|
165
|
+
for (const point of lineString) {
|
|
166
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return writer.arrayBuffer;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function encodeMultiPolygon(
|
|
175
|
+
writer: BinaryWriter,
|
|
176
|
+
context: TWKBEncoderContext,
|
|
177
|
+
multiPolygon: MultiPolygon
|
|
178
|
+
): void {
|
|
179
|
+
const {coordinates} = multiPolygon;
|
|
180
|
+
const isEmpty = coordinates.length === 0;
|
|
181
|
+
|
|
182
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPolygon, isEmpty);
|
|
183
|
+
|
|
184
|
+
if (!isEmpty) {
|
|
185
|
+
const polygons = coordinates;
|
|
186
|
+
writer.writeVarInt(polygons.length);
|
|
187
|
+
|
|
188
|
+
const previousPoint = [0, 0, 0, 0];
|
|
189
|
+
|
|
190
|
+
for (const polygonRings of polygons) {
|
|
191
|
+
writer.writeVarInt(polygonRings.length);
|
|
192
|
+
for (const ring of polygonRings) {
|
|
193
|
+
writer.writeVarInt(ring.length);
|
|
194
|
+
for (const point of ring) {
|
|
195
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function encodeGeometryCollection(
|
|
203
|
+
writer: BinaryWriter,
|
|
204
|
+
context: TWKBEncoderContext,
|
|
205
|
+
geometryCollection: GeometryCollection
|
|
206
|
+
): void {
|
|
207
|
+
const {geometries} = geometryCollection;
|
|
208
|
+
const isEmpty = geometries.length === 0;
|
|
209
|
+
|
|
210
|
+
writeTwkbHeader(writer, context, WKBGeometryType.GeometryCollection, isEmpty);
|
|
211
|
+
|
|
212
|
+
if (geometries.length > 0) {
|
|
213
|
+
writer.writeVarInt(geometries.length);
|
|
214
|
+
for (const geometry of geometries) {
|
|
215
|
+
encodeGeometry(writer, geometry, context);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
*
|
|
222
|
+
* @param writer
|
|
223
|
+
* @param context
|
|
224
|
+
* @param geometryType
|
|
225
|
+
* @param isEmpty
|
|
226
|
+
*/
|
|
227
|
+
function writeTwkbHeader(
|
|
228
|
+
writer: BinaryWriter,
|
|
229
|
+
context: TWKBEncoderContext,
|
|
230
|
+
geometryType: WKBGeometryType,
|
|
231
|
+
isEmpty: boolean
|
|
232
|
+
) {
|
|
233
|
+
const type = (zigZagEncode(context.xy) << 4) + geometryType;
|
|
234
|
+
let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
|
|
235
|
+
metadataHeader += isEmpty ? 1 << 4 : 0;
|
|
236
|
+
|
|
237
|
+
writer.writeUInt8(type);
|
|
238
|
+
writer.writeUInt8(metadataHeader);
|
|
239
|
+
|
|
240
|
+
if (context.hasZ || context.hasM) {
|
|
241
|
+
let extendedPrecision = 0;
|
|
242
|
+
if (context.hasZ) {
|
|
243
|
+
extendedPrecision |= 0x1;
|
|
244
|
+
}
|
|
245
|
+
if (context.hasM) {
|
|
246
|
+
extendedPrecision |= 0x2;
|
|
247
|
+
}
|
|
248
|
+
writer.writeUInt8(extendedPrecision);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Write one point to array buffer. ZigZagEncoding the delta fdrom the previous point. Mutates previousPoint.
|
|
254
|
+
* @param writer
|
|
255
|
+
* @param context
|
|
256
|
+
* @param previousPoint - Mutated by this function
|
|
257
|
+
* @param point
|
|
258
|
+
*/
|
|
259
|
+
function writeTwkbPoint(
|
|
260
|
+
writer: BinaryWriter,
|
|
261
|
+
context: TWKBEncoderContext,
|
|
262
|
+
point: number[],
|
|
263
|
+
previousPoint: number[]
|
|
264
|
+
): void {
|
|
265
|
+
const x = point[0] * context.xyFactor;
|
|
266
|
+
const y = point[1] * context.xyFactor;
|
|
267
|
+
const z = point[2] * context.zFactor;
|
|
268
|
+
const m = point[3] * context.mFactor;
|
|
269
|
+
|
|
270
|
+
writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
|
|
271
|
+
writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
|
|
272
|
+
if (context.hasZ) {
|
|
273
|
+
writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
|
|
274
|
+
}
|
|
275
|
+
if (context.hasM) {
|
|
276
|
+
writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
previousPoint[0] = x;
|
|
280
|
+
previousPoint[1] = y;
|
|
281
|
+
previousPoint[2] = z;
|
|
282
|
+
previousPoint[3] = m;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// HELPERS
|
|
286
|
+
|
|
287
|
+
function zigZagEncode(value: number): number {
|
|
288
|
+
return (value << 1) ^ (value >> 31);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
function getTwkbPrecision(
|
|
292
|
+
xyPrecision: number,
|
|
293
|
+
zPrecision: number,
|
|
294
|
+
mPrecision: number
|
|
295
|
+
): TWKBPrecision {
|
|
296
|
+
return {
|
|
297
|
+
xy: xyPrecision,
|
|
298
|
+
z: zPrecision,
|
|
299
|
+
m: mPrecision,
|
|
300
|
+
xyFactor: Math.pow(10, xyPrecision),
|
|
301
|
+
zFactor: Math.pow(10, zPrecision),
|
|
302
|
+
mFactor: Math.pow(10, mPrecision)
|
|
303
|
+
};
|
|
304
|
+
}
|
package/src/lib/encode-wkb.ts
CHANGED
|
@@ -14,13 +14,13 @@ import type {
|
|
|
14
14
|
GeometryCollection
|
|
15
15
|
} from '@loaders.gl/schema';
|
|
16
16
|
|
|
17
|
-
import BinaryWriter from './utils/binary-writer';
|
|
17
|
+
import {BinaryWriter} from './utils/binary-writer';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Integer code for geometry type
|
|
21
21
|
* Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary
|
|
22
22
|
*/
|
|
23
|
-
enum WKB {
|
|
23
|
+
export enum WKB {
|
|
24
24
|
Point = 1,
|
|
25
25
|
LineString = 2,
|
|
26
26
|
Polygon = 3,
|
|
@@ -33,7 +33,7 @@ enum WKB {
|
|
|
33
33
|
/**
|
|
34
34
|
* Options for encodeWKB
|
|
35
35
|
*/
|
|
36
|
-
|
|
36
|
+
type WKBOptions = {
|
|
37
37
|
/** Does the GeoJSON input have Z values? */
|
|
38
38
|
hasZ?: boolean;
|
|
39
39
|
|
|
@@ -42,14 +42,14 @@ interface WKBOptions {
|
|
|
42
42
|
|
|
43
43
|
/** Spatial reference for input GeoJSON */
|
|
44
44
|
srid?: any;
|
|
45
|
-
}
|
|
45
|
+
};
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Encodes a GeoJSON object into WKB
|
|
49
49
|
* @param geojson A GeoJSON Feature or Geometry
|
|
50
50
|
* @returns string
|
|
51
51
|
*/
|
|
52
|
-
export
|
|
52
|
+
export function encodeWKB(
|
|
53
53
|
geometry: Geometry | Feature,
|
|
54
54
|
options: WKBOptions | {wkb: WKBOptions} = {}
|
|
55
55
|
): ArrayBuffer {
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
// parse-wkt-crs was forked from https://github.com/DanielJDufour/wkt-crs under Creative Commons CC0 1.0 license.
|
|
3
|
+
|
|
4
|
+
import type {WKTCRS} from './parse-wkt-crs';
|
|
5
|
+
|
|
6
|
+
export type EncodeWKTCRSOptions = {
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* convert JSON representation of Well-Known Text
|
|
12
|
+
* back to standard Well-Known Text
|
|
13
|
+
*/
|
|
14
|
+
export function encodeWKTCRS(wkt: WKTCRS, options?: EncodeWKTCRSOptions): string {
|
|
15
|
+
if (Array.isArray(wkt) && wkt.length === 1 && Array.isArray(wkt[0])) {
|
|
16
|
+
wkt = wkt[0]; // ignore first extra wrapper array
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const [kw, ...attrs] = wkt;
|
|
20
|
+
const str = `${kw}[${attrs
|
|
21
|
+
.map((attr) => {
|
|
22
|
+
if (Array.isArray(attr)) {
|
|
23
|
+
return encodeWKTCRS(attr, options);
|
|
24
|
+
} else if (typeof attr === 'number') {
|
|
25
|
+
return attr.toString();
|
|
26
|
+
} else if (typeof attr === 'string') {
|
|
27
|
+
// can't automatically convert all caps to varibale
|
|
28
|
+
// because EPSG is string in AUTHORITY["EPSG", ...]
|
|
29
|
+
if (attr.startsWith('raw:')) {
|
|
30
|
+
// convert "raw:NORTH" to NORTH
|
|
31
|
+
return attr.replace('raw:', '');
|
|
32
|
+
}
|
|
33
|
+
return `"${attr}"`;
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`[wktcrs] unexpected attribute "${attr}"`);
|
|
36
|
+
})
|
|
37
|
+
.join(',')}]`;
|
|
38
|
+
return str;
|
|
39
|
+
}
|
package/src/lib/encode-wkt.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
1
2
|
// Fork of https://github.com/mapbox/wellknown under ISC license (MIT/BSD-2-clause equivalent)
|
|
2
|
-
|
|
3
|
+
|
|
3
4
|
import type {Feature, Geometry} from '@loaders.gl/schema';
|
|
4
5
|
|
|
5
6
|
/**
|
|
@@ -7,7 +8,7 @@ import type {Feature, Geometry} from '@loaders.gl/schema';
|
|
|
7
8
|
* @param geojson
|
|
8
9
|
* @returns string
|
|
9
10
|
*/
|
|
10
|
-
export
|
|
11
|
+
export function encodeWKT(geometry: Geometry | Feature): string {
|
|
11
12
|
if (geometry.type === 'Feature') {
|
|
12
13
|
geometry = geometry.geometry;
|
|
13
14
|
}
|
|
File without changes
|