@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/src/lib/parse-wkb.ts
CHANGED
|
@@ -1,59 +1,70 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
1
3
|
import type {
|
|
2
4
|
TypedArray,
|
|
3
5
|
BinaryGeometry,
|
|
4
6
|
BinaryPointGeometry,
|
|
5
7
|
BinaryLineGeometry,
|
|
6
|
-
BinaryPolygonGeometry
|
|
8
|
+
BinaryPolygonGeometry,
|
|
9
|
+
Geometry
|
|
7
10
|
} from '@loaders.gl/schema';
|
|
11
|
+
import {binaryToGeometry} from '@loaders.gl/gis';
|
|
12
|
+
import type {WKBLoaderOptions} from '../wkb-loader';
|
|
13
|
+
|
|
14
|
+
import {parseWKBHeader, WKBGeometryType} from './parse-wkb-header';
|
|
15
|
+
|
|
16
|
+
export function parseWKB(
|
|
17
|
+
arrayBuffer: ArrayBuffer,
|
|
18
|
+
options?: WKBLoaderOptions
|
|
19
|
+
): BinaryGeometry | Geometry {
|
|
20
|
+
const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
|
|
21
|
+
const shape = options?.wkb?.shape || 'binary-geometry';
|
|
22
|
+
switch (shape) {
|
|
23
|
+
case 'binary-geometry':
|
|
24
|
+
return binaryGeometry;
|
|
25
|
+
case 'geometry':
|
|
26
|
+
return binaryToGeometry(binaryGeometry);
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(shape);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
8
31
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export default function parseWKB(arrayBuffer: ArrayBuffer): BinaryGeometry {
|
|
17
|
-
const view = new DataView(arrayBuffer);
|
|
18
|
-
let offset = 0;
|
|
19
|
-
|
|
20
|
-
// Check endianness of data
|
|
21
|
-
const littleEndian = view.getUint8(offset) === 1;
|
|
22
|
-
offset++;
|
|
32
|
+
export function parseWKBToBinary(
|
|
33
|
+
arrayBuffer: ArrayBuffer,
|
|
34
|
+
options?: WKBLoaderOptions
|
|
35
|
+
): BinaryGeometry {
|
|
36
|
+
const dataView = new DataView(arrayBuffer);
|
|
23
37
|
|
|
24
|
-
|
|
25
|
-
const geometryCode = view.getUint32(offset, littleEndian);
|
|
26
|
-
offset += 4;
|
|
38
|
+
const wkbHeader = parseWKBHeader(dataView);
|
|
27
39
|
|
|
28
|
-
const geometryType
|
|
29
|
-
const
|
|
30
|
-
const dimension = NUM_DIMENSIONS[type];
|
|
40
|
+
const {geometryType, dimensions, littleEndian} = wkbHeader;
|
|
41
|
+
const offset = wkbHeader.byteOffset;
|
|
31
42
|
|
|
32
43
|
switch (geometryType) {
|
|
33
|
-
case
|
|
34
|
-
const point = parsePoint(
|
|
44
|
+
case WKBGeometryType.Point:
|
|
45
|
+
const point = parsePoint(dataView, offset, dimensions, littleEndian);
|
|
35
46
|
return point.geometry;
|
|
36
|
-
case
|
|
37
|
-
const line = parseLineString(
|
|
47
|
+
case WKBGeometryType.LineString:
|
|
48
|
+
const line = parseLineString(dataView, offset, dimensions, littleEndian);
|
|
38
49
|
return line.geometry;
|
|
39
|
-
case
|
|
40
|
-
const polygon = parsePolygon(
|
|
50
|
+
case WKBGeometryType.Polygon:
|
|
51
|
+
const polygon = parsePolygon(dataView, offset, dimensions, littleEndian);
|
|
41
52
|
return polygon.geometry;
|
|
42
|
-
case
|
|
43
|
-
const multiPoint = parseMultiPoint(
|
|
53
|
+
case WKBGeometryType.MultiPoint:
|
|
54
|
+
const multiPoint = parseMultiPoint(dataView, offset, dimensions, littleEndian);
|
|
44
55
|
multiPoint.type = 'Point';
|
|
45
56
|
return multiPoint;
|
|
46
|
-
case
|
|
47
|
-
const multiLine = parseMultiLineString(
|
|
57
|
+
case WKBGeometryType.MultiLineString:
|
|
58
|
+
const multiLine = parseMultiLineString(dataView, offset, dimensions, littleEndian);
|
|
48
59
|
multiLine.type = 'LineString';
|
|
49
60
|
return multiLine;
|
|
50
|
-
case
|
|
51
|
-
const multiPolygon = parseMultiPolygon(
|
|
61
|
+
case WKBGeometryType.MultiPolygon:
|
|
62
|
+
const multiPolygon = parseMultiPolygon(dataView, offset, dimensions, littleEndian);
|
|
52
63
|
multiPolygon.type = 'Polygon';
|
|
53
64
|
return multiPolygon;
|
|
54
|
-
// case
|
|
65
|
+
// case WKBGeometryType.GeometryCollection:
|
|
55
66
|
// TODO: handle GeometryCollections
|
|
56
|
-
// return parseGeometryCollection(
|
|
67
|
+
// return parseGeometryCollection(dataView, offset, dimensions, littleEndian);
|
|
57
68
|
default:
|
|
58
69
|
throw new Error(`WKB: Unsupported geometry type: ${geometryType}`);
|
|
59
70
|
}
|
|
@@ -61,14 +72,14 @@ export default function parseWKB(arrayBuffer: ArrayBuffer): BinaryGeometry {
|
|
|
61
72
|
|
|
62
73
|
// Primitives; parse point and linear ring
|
|
63
74
|
function parsePoint(
|
|
64
|
-
|
|
75
|
+
dataView: DataView,
|
|
65
76
|
offset: number,
|
|
66
77
|
dimension: number,
|
|
67
78
|
littleEndian: boolean
|
|
68
79
|
): {geometry: BinaryPointGeometry; offset: number} {
|
|
69
80
|
const positions = new Float64Array(dimension);
|
|
70
81
|
for (let i = 0; i < dimension; i++) {
|
|
71
|
-
positions[i] =
|
|
82
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
72
83
|
offset += 8;
|
|
73
84
|
}
|
|
74
85
|
|
|
@@ -79,18 +90,18 @@ function parsePoint(
|
|
|
79
90
|
}
|
|
80
91
|
|
|
81
92
|
function parseLineString(
|
|
82
|
-
|
|
93
|
+
dataView: DataView,
|
|
83
94
|
offset: number,
|
|
84
95
|
dimension: number,
|
|
85
96
|
littleEndian: boolean
|
|
86
97
|
): {geometry: BinaryLineGeometry; offset: number} {
|
|
87
|
-
const nPoints =
|
|
98
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
88
99
|
offset += 4;
|
|
89
100
|
|
|
90
101
|
// Instantiate array
|
|
91
102
|
const positions = new Float64Array(nPoints * dimension);
|
|
92
103
|
for (let i = 0; i < nPoints * dimension; i++) {
|
|
93
|
-
positions[i] =
|
|
104
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
94
105
|
offset += 8;
|
|
95
106
|
}
|
|
96
107
|
|
|
@@ -113,17 +124,17 @@ function parseLineString(
|
|
|
113
124
|
const cumulativeSum = (sum: number) => (value: number) => (sum += value);
|
|
114
125
|
|
|
115
126
|
function parsePolygon(
|
|
116
|
-
|
|
127
|
+
dataView: DataView,
|
|
117
128
|
offset: number,
|
|
118
129
|
dimension: number,
|
|
119
130
|
littleEndian: boolean
|
|
120
131
|
): {geometry: BinaryPolygonGeometry; offset: number} {
|
|
121
|
-
const nRings =
|
|
132
|
+
const nRings = dataView.getUint32(offset, littleEndian);
|
|
122
133
|
offset += 4;
|
|
123
134
|
|
|
124
135
|
const rings: TypedArray[] = [];
|
|
125
136
|
for (let i = 0; i < nRings; i++) {
|
|
126
|
-
const parsed = parseLineString(
|
|
137
|
+
const parsed = parseLineString(dataView, offset, dimension, littleEndian);
|
|
127
138
|
const {positions} = parsed.geometry;
|
|
128
139
|
offset = parsed.offset;
|
|
129
140
|
rings.push(positions.value);
|
|
@@ -152,28 +163,28 @@ function parsePolygon(
|
|
|
152
163
|
}
|
|
153
164
|
|
|
154
165
|
function parseMultiPoint(
|
|
155
|
-
|
|
166
|
+
dataView: DataView,
|
|
156
167
|
offset: number,
|
|
157
168
|
dimension: number,
|
|
158
169
|
littleEndian: boolean
|
|
159
170
|
): BinaryPointGeometry {
|
|
160
|
-
const nPoints =
|
|
171
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
161
172
|
offset += 4;
|
|
162
173
|
|
|
163
174
|
const binaryPointGeometries: BinaryPointGeometry[] = [];
|
|
164
175
|
for (let i = 0; i < nPoints; i++) {
|
|
165
176
|
// Byte order for point
|
|
166
|
-
const littleEndianPoint =
|
|
177
|
+
const littleEndianPoint = dataView.getUint8(offset) === 1;
|
|
167
178
|
offset++;
|
|
168
179
|
|
|
169
180
|
// Assert point type
|
|
170
|
-
if (
|
|
181
|
+
if (dataView.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
|
|
171
182
|
throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
|
|
172
183
|
}
|
|
173
184
|
|
|
174
185
|
offset += 4;
|
|
175
186
|
|
|
176
|
-
const parsed = parsePoint(
|
|
187
|
+
const parsed = parsePoint(dataView, offset, dimension, littleEndianPoint);
|
|
177
188
|
offset = parsed.offset;
|
|
178
189
|
binaryPointGeometries.push(parsed.geometry);
|
|
179
190
|
}
|
|
@@ -182,27 +193,27 @@ function parseMultiPoint(
|
|
|
182
193
|
}
|
|
183
194
|
|
|
184
195
|
function parseMultiLineString(
|
|
185
|
-
|
|
196
|
+
dataView: DataView,
|
|
186
197
|
offset: number,
|
|
187
198
|
dimension: number,
|
|
188
199
|
littleEndian: boolean
|
|
189
200
|
): BinaryLineGeometry {
|
|
190
|
-
const nLines =
|
|
201
|
+
const nLines = dataView.getUint32(offset, littleEndian);
|
|
191
202
|
offset += 4;
|
|
192
203
|
|
|
193
204
|
const binaryLineGeometries: BinaryLineGeometry[] = [];
|
|
194
205
|
for (let i = 0; i < nLines; i++) {
|
|
195
206
|
// Byte order for line
|
|
196
|
-
const littleEndianLine =
|
|
207
|
+
const littleEndianLine = dataView.getUint8(offset) === 1;
|
|
197
208
|
offset++;
|
|
198
209
|
|
|
199
210
|
// Assert type LineString
|
|
200
|
-
if (
|
|
211
|
+
if (dataView.getUint32(offset, littleEndianLine) % 1000 !== 2) {
|
|
201
212
|
throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
|
|
202
213
|
}
|
|
203
214
|
offset += 4;
|
|
204
215
|
|
|
205
|
-
const parsed = parseLineString(
|
|
216
|
+
const parsed = parseLineString(dataView, offset, dimension, littleEndianLine);
|
|
206
217
|
offset = parsed.offset;
|
|
207
218
|
binaryLineGeometries.push(parsed.geometry);
|
|
208
219
|
}
|
|
@@ -211,27 +222,27 @@ function parseMultiLineString(
|
|
|
211
222
|
}
|
|
212
223
|
|
|
213
224
|
function parseMultiPolygon(
|
|
214
|
-
|
|
225
|
+
dataView: DataView,
|
|
215
226
|
offset: number,
|
|
216
227
|
dimension: number,
|
|
217
228
|
littleEndian: boolean
|
|
218
229
|
): BinaryPolygonGeometry {
|
|
219
|
-
const nPolygons =
|
|
230
|
+
const nPolygons = dataView.getUint32(offset, littleEndian);
|
|
220
231
|
offset += 4;
|
|
221
232
|
|
|
222
233
|
const binaryPolygonGeometries: BinaryPolygonGeometry[] = [];
|
|
223
234
|
for (let i = 0; i < nPolygons; i++) {
|
|
224
235
|
// Byte order for polygon
|
|
225
|
-
const littleEndianPolygon =
|
|
236
|
+
const littleEndianPolygon = dataView.getUint8(offset) === 1;
|
|
226
237
|
offset++;
|
|
227
238
|
|
|
228
239
|
// Assert type Polygon
|
|
229
|
-
if (
|
|
240
|
+
if (dataView.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
|
|
230
241
|
throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
|
|
231
242
|
}
|
|
232
243
|
offset += 4;
|
|
233
244
|
|
|
234
|
-
const parsed = parsePolygon(
|
|
245
|
+
const parsed = parsePolygon(dataView, offset, dimension, littleEndianPolygon);
|
|
235
246
|
offset = parsed.offset;
|
|
236
247
|
binaryPolygonGeometries.push(parsed.geometry);
|
|
237
248
|
}
|
|
@@ -0,0 +1,147 @@
|
|
|
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
|
+
/* eslint-disable no-console */ // TODO switch to options.log
|
|
5
|
+
|
|
6
|
+
export type ParseWKTCRSOptions = {
|
|
7
|
+
sort?: boolean;
|
|
8
|
+
keywords?: string[];
|
|
9
|
+
raw?: boolean;
|
|
10
|
+
debug?: boolean;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type WKTCRS = any;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @param wkt
|
|
18
|
+
* @param options
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export function parseWKTCRS(wkt: string, options?: ParseWKTCRSOptions): WKTCRS {
|
|
22
|
+
if (options?.debug) {
|
|
23
|
+
console.log('[wktcrs] parse starting with\n', wkt);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// move all keywords into first array item slot
|
|
27
|
+
// from PARAM[12345, 67890] to ["PARAM", 12345, 67890]
|
|
28
|
+
wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, (match) => `["${match.substr(0, match.length - 1)}",`);
|
|
29
|
+
|
|
30
|
+
// wrap variables in strings
|
|
31
|
+
// from [...,NORTH] to [...,"NORTH"]
|
|
32
|
+
wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, (match, p1) => {
|
|
33
|
+
const varname = p1.substr(0, p1.length - 1);
|
|
34
|
+
return ',' + `"${options?.raw ? 'raw:' : ''}${varname}"${p1[p1.length - 1]}`;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
if (options?.raw) {
|
|
38
|
+
// replace all numbers with strings
|
|
39
|
+
wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function (match, p1) {
|
|
40
|
+
return ',' + `"${options?.raw ? 'raw:' : ''}${p1}"`;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// str should now be valid JSON
|
|
45
|
+
if (options?.debug) {
|
|
46
|
+
console.log(`[wktcrs] json'd wkt: '${wkt}'`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let data;
|
|
50
|
+
try {
|
|
51
|
+
data = JSON.parse(wkt);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error(`[wktcrs] failed to parse '${wkt}'`);
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (options?.debug) {
|
|
58
|
+
console.log(`[wktcrs] json parsed: '${wkt}'`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function process(data, parent) {
|
|
62
|
+
const kw = data[0];
|
|
63
|
+
|
|
64
|
+
// after removing the first element with .shift()
|
|
65
|
+
// data is now just an array of attributes
|
|
66
|
+
|
|
67
|
+
data.forEach(function (it) {
|
|
68
|
+
if (Array.isArray(it)) {
|
|
69
|
+
process(it, data);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const kwarr = `MULTIPLE_${kw}`;
|
|
74
|
+
|
|
75
|
+
if (kwarr in parent) {
|
|
76
|
+
parent[kwarr].push(data);
|
|
77
|
+
} else if (kw in parent) {
|
|
78
|
+
parent[kwarr] = [parent[kw], data];
|
|
79
|
+
delete parent[kw];
|
|
80
|
+
} else {
|
|
81
|
+
parent[kw] = data;
|
|
82
|
+
}
|
|
83
|
+
return parent;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const result = process(data, [data]);
|
|
87
|
+
if (options?.debug) {
|
|
88
|
+
console.log('[wktcrs] parse returning', result);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (options?.sort) {
|
|
92
|
+
sort(result, options);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function sort(data: string[], options?: {keywords?: string[]}) {
|
|
99
|
+
const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
|
|
100
|
+
|
|
101
|
+
const keywords: string[] = options?.keywords || [];
|
|
102
|
+
if (!options?.keywords) {
|
|
103
|
+
// try to find multiples
|
|
104
|
+
const counts = {};
|
|
105
|
+
if (Array.isArray(data)) {
|
|
106
|
+
data.forEach((it) => {
|
|
107
|
+
if (Array.isArray(it) && it.length >= 2 && typeof it[1] === 'string') {
|
|
108
|
+
const k = it[0];
|
|
109
|
+
if (!counts[k]) counts[k] = 0;
|
|
110
|
+
counts[k]++;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
for (const k in counts) {
|
|
114
|
+
if (counts[k] > 0) keywords.push(k);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
keys.forEach((key) => {
|
|
120
|
+
data[key] = sort(data[key]);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
keywords.forEach((key) => {
|
|
124
|
+
const indices: number[] = [];
|
|
125
|
+
const params: string[] = [];
|
|
126
|
+
|
|
127
|
+
data.forEach((item, i) => {
|
|
128
|
+
if (Array.isArray(item) && item[0] === key) {
|
|
129
|
+
indices.push(i);
|
|
130
|
+
params.push(item);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
params.sort((a, b) => {
|
|
135
|
+
a = a[1].toString();
|
|
136
|
+
b = b[1].toString();
|
|
137
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// replace in order
|
|
141
|
+
params.forEach((param, i) => {
|
|
142
|
+
data[indices[i]] = param;
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
return data;
|
|
147
|
+
}
|