@loaders.gl/wkt 4.0.0-alpha.9 → 4.0.0-beta.1
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
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { BinaryReader } from './utils/binary-reader';
|
|
2
|
+
import { WKBGeometryType } from './parse-wkb-header';
|
|
3
|
+
export function isTWKB(arrayBuffer) {
|
|
4
|
+
const binaryReader = new BinaryReader(arrayBuffer);
|
|
5
|
+
const type = binaryReader.readUInt8();
|
|
6
|
+
const geometryType = type & 0x0f;
|
|
7
|
+
if (geometryType < 1 || geometryType > 7) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
export function parseTWKBGeometry(arrayBuffer) {
|
|
13
|
+
const binaryReader = new BinaryReader(arrayBuffer);
|
|
14
|
+
const context = parseTWKBHeader(binaryReader);
|
|
15
|
+
if (context.hasSizeAttribute) {
|
|
16
|
+
binaryReader.readVarInt();
|
|
17
|
+
}
|
|
18
|
+
if (context.hasBoundingBox) {
|
|
19
|
+
let dimensions = 2;
|
|
20
|
+
if (context.hasZ) {
|
|
21
|
+
dimensions++;
|
|
22
|
+
}
|
|
23
|
+
if (context.hasM) {
|
|
24
|
+
dimensions++;
|
|
25
|
+
}
|
|
26
|
+
for (let i = 0; i < dimensions; i++) {
|
|
27
|
+
binaryReader.readVarInt();
|
|
28
|
+
binaryReader.readVarInt();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return parseGeometry(binaryReader, context, context.geometryType);
|
|
32
|
+
}
|
|
33
|
+
function parseTWKBHeader(binaryReader) {
|
|
34
|
+
const type = binaryReader.readUInt8();
|
|
35
|
+
const metadataHeader = binaryReader.readUInt8();
|
|
36
|
+
const geometryType = type & 0x0f;
|
|
37
|
+
const precision = zigZagDecode(type >> 4);
|
|
38
|
+
const hasExtendedPrecision = Boolean(metadataHeader >> 3 & 1);
|
|
39
|
+
let hasZ = false;
|
|
40
|
+
let hasM = false;
|
|
41
|
+
let zPrecision = 0;
|
|
42
|
+
let zPrecisionFactor = 1;
|
|
43
|
+
let mPrecision = 0;
|
|
44
|
+
let mPrecisionFactor = 1;
|
|
45
|
+
if (hasExtendedPrecision) {
|
|
46
|
+
const extendedPrecision = binaryReader.readUInt8();
|
|
47
|
+
hasZ = (extendedPrecision & 0x01) === 0x01;
|
|
48
|
+
hasM = (extendedPrecision & 0x02) === 0x02;
|
|
49
|
+
zPrecision = zigZagDecode((extendedPrecision & 0x1c) >> 2);
|
|
50
|
+
zPrecisionFactor = Math.pow(10, zPrecision);
|
|
51
|
+
mPrecision = zigZagDecode((extendedPrecision & 0xe0) >> 5);
|
|
52
|
+
mPrecisionFactor = Math.pow(10, mPrecision);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
geometryType,
|
|
56
|
+
precision,
|
|
57
|
+
precisionFactor: Math.pow(10, precision),
|
|
58
|
+
hasBoundingBox: Boolean(metadataHeader >> 0 & 1),
|
|
59
|
+
hasSizeAttribute: Boolean(metadataHeader >> 1 & 1),
|
|
60
|
+
hasIdList: Boolean(metadataHeader >> 2 & 1),
|
|
61
|
+
hasExtendedPrecision,
|
|
62
|
+
isEmpty: Boolean(metadataHeader >> 4 & 1),
|
|
63
|
+
hasZ,
|
|
64
|
+
hasM,
|
|
65
|
+
zPrecision,
|
|
66
|
+
zPrecisionFactor,
|
|
67
|
+
mPrecision,
|
|
68
|
+
mPrecisionFactor
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function parseGeometry(binaryReader, context, geometryType) {
|
|
72
|
+
switch (geometryType) {
|
|
73
|
+
case WKBGeometryType.Point:
|
|
74
|
+
return parsePoint(binaryReader, context);
|
|
75
|
+
case WKBGeometryType.LineString:
|
|
76
|
+
return parseLineString(binaryReader, context);
|
|
77
|
+
case WKBGeometryType.Polygon:
|
|
78
|
+
return parsePolygon(binaryReader, context);
|
|
79
|
+
case WKBGeometryType.MultiPoint:
|
|
80
|
+
return parseMultiPoint(binaryReader, context);
|
|
81
|
+
case WKBGeometryType.MultiLineString:
|
|
82
|
+
return parseMultiLineString(binaryReader, context);
|
|
83
|
+
case WKBGeometryType.MultiPolygon:
|
|
84
|
+
return parseMultiPolygon(binaryReader, context);
|
|
85
|
+
case WKBGeometryType.GeometryCollection:
|
|
86
|
+
return parseGeometryCollection(binaryReader, context);
|
|
87
|
+
default:
|
|
88
|
+
throw new Error("GeometryType ".concat(geometryType, " not supported"));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function parsePoint(reader, context) {
|
|
92
|
+
if (context.isEmpty) {
|
|
93
|
+
return {
|
|
94
|
+
type: 'Point',
|
|
95
|
+
coordinates: []
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
type: 'Point',
|
|
100
|
+
coordinates: readFirstPoint(reader, context)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function parseLineString(reader, context) {
|
|
104
|
+
if (context.isEmpty) {
|
|
105
|
+
return {
|
|
106
|
+
type: 'LineString',
|
|
107
|
+
coordinates: []
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const pointCount = reader.readVarInt();
|
|
111
|
+
const previousPoint = makePreviousPoint(context);
|
|
112
|
+
const points = [];
|
|
113
|
+
for (let i = 0; i < pointCount; i++) {
|
|
114
|
+
points.push(parseNextPoint(reader, context, previousPoint));
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
type: 'LineString',
|
|
118
|
+
coordinates: points
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function parsePolygon(reader, context) {
|
|
122
|
+
if (context.isEmpty) {
|
|
123
|
+
return {
|
|
124
|
+
type: 'Polygon',
|
|
125
|
+
coordinates: []
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const ringCount = reader.readVarInt();
|
|
129
|
+
const previousPoint = makePreviousPoint(context);
|
|
130
|
+
const exteriorRingLength = reader.readVarInt();
|
|
131
|
+
const exteriorRing = [];
|
|
132
|
+
for (let i = 0; i < exteriorRingLength; i++) {
|
|
133
|
+
exteriorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
134
|
+
}
|
|
135
|
+
const polygon = [exteriorRing];
|
|
136
|
+
for (let i = 1; i < ringCount; i++) {
|
|
137
|
+
const interiorRingCount = reader.readVarInt();
|
|
138
|
+
const interiorRing = [];
|
|
139
|
+
for (let j = 0; j < interiorRingCount; j++) {
|
|
140
|
+
interiorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
141
|
+
}
|
|
142
|
+
polygon.push(interiorRing);
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
type: 'Polygon',
|
|
146
|
+
coordinates: polygon
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function parseMultiPoint(reader, context) {
|
|
150
|
+
if (context.isEmpty) {
|
|
151
|
+
return {
|
|
152
|
+
type: 'MultiPoint',
|
|
153
|
+
coordinates: []
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const previousPoint = makePreviousPoint(context);
|
|
157
|
+
const pointCount = reader.readVarInt();
|
|
158
|
+
const coordinates = [];
|
|
159
|
+
for (let i = 0; i < pointCount; i++) {
|
|
160
|
+
coordinates.push(parseNextPoint(reader, context, previousPoint));
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
type: 'MultiPoint',
|
|
164
|
+
coordinates
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function parseMultiLineString(reader, context) {
|
|
168
|
+
if (context.isEmpty) {
|
|
169
|
+
return {
|
|
170
|
+
type: 'MultiLineString',
|
|
171
|
+
coordinates: []
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
const previousPoint = makePreviousPoint(context);
|
|
175
|
+
const lineStringCount = reader.readVarInt();
|
|
176
|
+
const coordinates = [];
|
|
177
|
+
for (let i = 0; i < lineStringCount; i++) {
|
|
178
|
+
const pointCount = reader.readVarInt();
|
|
179
|
+
const lineString = [];
|
|
180
|
+
for (let j = 0; j < pointCount; j++) {
|
|
181
|
+
lineString.push(parseNextPoint(reader, context, previousPoint));
|
|
182
|
+
}
|
|
183
|
+
coordinates.push(lineString);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
type: 'MultiLineString',
|
|
187
|
+
coordinates
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function parseMultiPolygon(reader, context) {
|
|
191
|
+
if (context.isEmpty) {
|
|
192
|
+
return {
|
|
193
|
+
type: 'MultiPolygon',
|
|
194
|
+
coordinates: []
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
const previousPoint = makePreviousPoint(context);
|
|
198
|
+
const polygonCount = reader.readVarInt();
|
|
199
|
+
const polygons = [];
|
|
200
|
+
for (let i = 0; i < polygonCount; i++) {
|
|
201
|
+
const ringCount = reader.readVarInt();
|
|
202
|
+
const exteriorPointCount = reader.readVarInt();
|
|
203
|
+
const exteriorRing = [];
|
|
204
|
+
for (let j = 0; j < exteriorPointCount; j++) {
|
|
205
|
+
exteriorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
206
|
+
}
|
|
207
|
+
const polygon = exteriorRing ? [exteriorRing] : [];
|
|
208
|
+
for (let j = 1; j < ringCount; j++) {
|
|
209
|
+
const interiorRing = [];
|
|
210
|
+
const interiorRingLength = reader.readVarInt();
|
|
211
|
+
for (let k = 0; k < interiorRingLength; k++) {
|
|
212
|
+
interiorRing.push(parseNextPoint(reader, context, previousPoint));
|
|
213
|
+
}
|
|
214
|
+
polygon.push(interiorRing);
|
|
215
|
+
}
|
|
216
|
+
polygons.push(polygon);
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
type: 'MultiPolygon',
|
|
220
|
+
coordinates: polygons
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function parseGeometryCollection(reader, context) {
|
|
224
|
+
return {
|
|
225
|
+
type: 'GeometryCollection',
|
|
226
|
+
geometries: []
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function zigZagDecode(value) {
|
|
230
|
+
return value >> 1 ^ -(value & 1);
|
|
231
|
+
}
|
|
232
|
+
function makePointCoordinates(x, y, z, m) {
|
|
233
|
+
return z !== undefined ? m !== undefined ? [x, y, z, m] : [x, y, z] : [x, y];
|
|
234
|
+
}
|
|
235
|
+
function makePreviousPoint(context) {
|
|
236
|
+
return makePointCoordinates(0, 0, context.hasZ ? 0 : undefined, context.hasM ? 0 : undefined);
|
|
237
|
+
}
|
|
238
|
+
function readFirstPoint(reader, context) {
|
|
239
|
+
const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
240
|
+
const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
241
|
+
const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : undefined;
|
|
242
|
+
const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : undefined;
|
|
243
|
+
return makePointCoordinates(x, y, z, m);
|
|
244
|
+
}
|
|
245
|
+
function parseNextPoint(reader, context, previousPoint) {
|
|
246
|
+
previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
247
|
+
previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;
|
|
248
|
+
if (context.hasZ) {
|
|
249
|
+
previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;
|
|
250
|
+
}
|
|
251
|
+
if (context.hasM) {
|
|
252
|
+
previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;
|
|
253
|
+
}
|
|
254
|
+
return previousPoint.slice();
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=parse-twkb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-twkb.js","names":["BinaryReader","WKBGeometryType","isTWKB","arrayBuffer","binaryReader","type","readUInt8","geometryType","parseTWKBGeometry","context","parseTWKBHeader","hasSizeAttribute","readVarInt","hasBoundingBox","dimensions","hasZ","hasM","i","parseGeometry","metadataHeader","precision","zigZagDecode","hasExtendedPrecision","Boolean","zPrecision","zPrecisionFactor","mPrecision","mPrecisionFactor","extendedPrecision","Math","pow","precisionFactor","hasIdList","isEmpty","Point","parsePoint","LineString","parseLineString","Polygon","parsePolygon","MultiPoint","parseMultiPoint","MultiLineString","parseMultiLineString","MultiPolygon","parseMultiPolygon","GeometryCollection","parseGeometryCollection","Error","concat","reader","coordinates","readFirstPoint","pointCount","previousPoint","makePreviousPoint","points","push","parseNextPoint","ringCount","exteriorRingLength","exteriorRing","polygon","interiorRingCount","interiorRing","j","lineStringCount","lineString","polygonCount","polygons","exteriorPointCount","interiorRingLength","k","geometries","value","makePointCoordinates","x","y","z","m","undefined","slice"],"sources":["../../../src/lib/parse-twkb.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz\n\nimport type {Geometry, GeometryCollection} from '@loaders.gl/schema';\nimport type {Point, LineString, Polygon} from '@loaders.gl/schema';\nimport type {MultiPoint, MultiLineString, MultiPolygon} from '@loaders.gl/schema';\nimport {BinaryReader} from './utils/binary-reader';\nimport {WKBGeometryType} from './parse-wkb-header';\n\n/**\n * Check if an array buffer might be a TWKB array buffer\n * @param arrayBuffer The array buffer to check\n * @returns false if this is definitely not a TWKB array buffer, true if it might be a TWKB array buffer\n */\nexport function isTWKB(arrayBuffer: ArrayBuffer): boolean {\n const binaryReader = new BinaryReader(arrayBuffer);\n\n const type = binaryReader.readUInt8();\n const geometryType = type & 0x0f;\n\n // Only geometry types 1 to 7 (point to geometry collection are currently defined)\n if (geometryType < 1 || geometryType > 7) {\n return false;\n }\n\n return true;\n}\n\n/** Passed around between parsing functions, extracted from the header */\ntype TWKBHeader = {\n geometryType: WKBGeometryType;\n\n hasBoundingBox: boolean;\n hasSizeAttribute: boolean;\n hasIdList: boolean;\n hasExtendedPrecision: boolean;\n isEmpty: boolean;\n\n precision: number;\n precisionFactor: number;\n\n hasZ: boolean;\n zPrecision: number;\n zPrecisionFactor: number;\n\n hasM: boolean;\n mPrecision: number;\n mPrecisionFactor: number;\n};\n\nexport function parseTWKBGeometry(arrayBuffer: ArrayBuffer): Geometry {\n const binaryReader = new BinaryReader(arrayBuffer);\n\n const context = parseTWKBHeader(binaryReader);\n\n if (context.hasSizeAttribute) {\n binaryReader.readVarInt();\n }\n\n if (context.hasBoundingBox) {\n let dimensions = 2;\n\n if (context.hasZ) {\n dimensions++;\n }\n if (context.hasM) {\n dimensions++;\n }\n\n // TODO why are we throwing away these datums?\n for (let i = 0; i < dimensions; i++) {\n binaryReader.readVarInt();\n binaryReader.readVarInt();\n }\n }\n\n return parseGeometry(binaryReader, context, context.geometryType);\n}\n\nfunction parseTWKBHeader(binaryReader: BinaryReader): TWKBHeader {\n const type = binaryReader.readUInt8();\n const metadataHeader = binaryReader.readUInt8();\n\n const geometryType = type & 0x0f;\n\n const precision = zigZagDecode(type >> 4);\n\n const hasExtendedPrecision = Boolean((metadataHeader >> 3) & 1);\n let hasZ = false;\n let hasM = false;\n let zPrecision = 0;\n let zPrecisionFactor = 1;\n let mPrecision = 0;\n let mPrecisionFactor = 1;\n\n if (hasExtendedPrecision) {\n const extendedPrecision = binaryReader.readUInt8();\n hasZ = (extendedPrecision & 0x01) === 0x01;\n hasM = (extendedPrecision & 0x02) === 0x02;\n\n zPrecision = zigZagDecode((extendedPrecision & 0x1c) >> 2);\n zPrecisionFactor = Math.pow(10, zPrecision);\n\n mPrecision = zigZagDecode((extendedPrecision & 0xe0) >> 5);\n mPrecisionFactor = Math.pow(10, mPrecision);\n }\n\n return {\n geometryType,\n\n precision,\n precisionFactor: Math.pow(10, precision),\n\n hasBoundingBox: Boolean((metadataHeader >> 0) & 1),\n hasSizeAttribute: Boolean((metadataHeader >> 1) & 1),\n hasIdList: Boolean((metadataHeader >> 2) & 1),\n hasExtendedPrecision,\n isEmpty: Boolean((metadataHeader >> 4) & 1),\n\n hasZ,\n hasM,\n zPrecision,\n zPrecisionFactor,\n mPrecision,\n mPrecisionFactor\n };\n}\n\nfunction parseGeometry(\n binaryReader: BinaryReader,\n context: TWKBHeader,\n geometryType: WKBGeometryType\n): Geometry {\n switch (geometryType) {\n case WKBGeometryType.Point:\n return parsePoint(binaryReader, context);\n case WKBGeometryType.LineString:\n return parseLineString(binaryReader, context);\n case WKBGeometryType.Polygon:\n return parsePolygon(binaryReader, context);\n case WKBGeometryType.MultiPoint:\n return parseMultiPoint(binaryReader, context);\n case WKBGeometryType.MultiLineString:\n return parseMultiLineString(binaryReader, context);\n case WKBGeometryType.MultiPolygon:\n return parseMultiPolygon(binaryReader, context);\n case WKBGeometryType.GeometryCollection:\n return parseGeometryCollection(binaryReader, context);\n default:\n throw new Error(`GeometryType ${geometryType} not supported`);\n }\n}\n\n// GEOMETRIES\n\nfunction parsePoint(reader: BinaryReader, context: TWKBHeader): Point {\n if (context.isEmpty) {\n return {type: 'Point', coordinates: []};\n }\n\n return {type: 'Point', coordinates: readFirstPoint(reader, context)};\n}\n\nfunction parseLineString(reader: BinaryReader, context: TWKBHeader): LineString {\n if (context.isEmpty) {\n return {type: 'LineString', coordinates: []};\n }\n\n const pointCount = reader.readVarInt();\n\n const previousPoint = makePreviousPoint(context);\n\n const points: number[][] = [];\n for (let i = 0; i < pointCount; i++) {\n points.push(parseNextPoint(reader, context, previousPoint));\n }\n\n return {type: 'LineString', coordinates: points};\n}\n\nfunction parsePolygon(reader: BinaryReader, context: TWKBHeader): Polygon {\n if (context.isEmpty) {\n return {type: 'Polygon', coordinates: []};\n }\n\n const ringCount = reader.readVarInt();\n\n const previousPoint = makePreviousPoint(context);\n\n const exteriorRingLength = reader.readVarInt();\n const exteriorRing: number[][] = [];\n\n for (let i = 0; i < exteriorRingLength; i++) {\n exteriorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n const polygon: number[][][] = [exteriorRing];\n for (let i = 1; i < ringCount; i++) {\n const interiorRingCount = reader.readVarInt();\n\n const interiorRing: number[][] = [];\n for (let j = 0; j < interiorRingCount; j++) {\n interiorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n polygon.push(interiorRing);\n }\n\n return {type: 'Polygon', coordinates: polygon};\n}\n\nfunction parseMultiPoint(reader: BinaryReader, context: TWKBHeader): MultiPoint {\n if (context.isEmpty) {\n return {type: 'MultiPoint', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const pointCount = reader.readVarInt();\n\n const coordinates: number[][] = [];\n for (let i = 0; i < pointCount; i++) {\n coordinates.push(parseNextPoint(reader, context, previousPoint));\n }\n\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction parseMultiLineString(reader: BinaryReader, context: TWKBHeader): MultiLineString {\n if (context.isEmpty) {\n return {type: 'MultiLineString', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const lineStringCount = reader.readVarInt();\n\n const coordinates: number[][][] = [];\n for (let i = 0; i < lineStringCount; i++) {\n const pointCount = reader.readVarInt();\n\n const lineString: number[][] = [];\n for (let j = 0; j < pointCount; j++) {\n lineString.push(parseNextPoint(reader, context, previousPoint));\n }\n\n coordinates.push(lineString);\n }\n\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction parseMultiPolygon(reader: BinaryReader, context: TWKBHeader): MultiPolygon {\n if (context.isEmpty) {\n return {type: 'MultiPolygon', coordinates: []};\n }\n\n const previousPoint = makePreviousPoint(context);\n const polygonCount = reader.readVarInt();\n\n const polygons: number[][][][] = [];\n for (let i = 0; i < polygonCount; i++) {\n const ringCount = reader.readVarInt();\n\n const exteriorPointCount = reader.readVarInt();\n\n const exteriorRing: number[][] = [];\n for (let j = 0; j < exteriorPointCount; j++) {\n exteriorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n const polygon: number[][][] = exteriorRing ? [exteriorRing] : [];\n\n for (let j = 1; j < ringCount; j++) {\n const interiorRing: number[][] = [];\n\n const interiorRingLength = reader.readVarInt();\n\n for (let k = 0; k < interiorRingLength; k++) {\n interiorRing.push(parseNextPoint(reader, context, previousPoint));\n }\n\n polygon.push(interiorRing);\n }\n\n polygons.push(polygon);\n }\n\n return {type: 'MultiPolygon', coordinates: polygons};\n}\n\n/** Geometry collection not yet supported */\nfunction parseGeometryCollection(reader: BinaryReader, context: TWKBHeader): GeometryCollection {\n return {type: 'GeometryCollection', geometries: []};\n /**\n if (context.isEmpty) {\n return {type: 'GeometryCollection', geometries: []};\n }\n\n const geometryCount = reader.readVarInt();\n\n const geometries: Geometry[] = new Array(geometryCount);\n for (let i = 0; i < geometryCount; i++) {\n const geometry = parseGeometry(reader, context, geometryType);\n geometries.push(geometry);\n }\n\n return {type: 'GeometryCollection', geometries: []};\n */\n}\n\n// HELPERS\n\n/** \n * Maps negative values to positive values while going back and\n forth (0 = 0, -1 = 1, 1 = 2, -2 = 3, 2 = 4, -3 = 5, 3 = 6 ...)\n */\nfunction zigZagDecode(value: number): number {\n return (value >> 1) ^ -(value & 1);\n}\n\nfunction makePointCoordinates(x: number, y: number, z?: number, m?: number): number[] {\n return (z !== undefined ? (m !== undefined ? [x, y, z, m] : [x, y, z]) : [x, y]) as number[];\n}\n\nfunction makePreviousPoint(context: TWKBHeader): number[] {\n return makePointCoordinates(0, 0, context.hasZ ? 0 : undefined, context.hasM ? 0 : undefined);\n}\n\nfunction readFirstPoint(reader: BinaryReader, context: TWKBHeader): number[] {\n const x = zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n const y = zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n const z = context.hasZ ? zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor : undefined;\n const m = context.hasM ? zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor : undefined;\n return makePointCoordinates(x, y, z, m);\n}\n\n/**\n * Modifies previousPoint\n */\nfunction parseNextPoint(\n reader: BinaryReader,\n context: TWKBHeader,\n previousPoint: number[]\n): number[] {\n previousPoint[0] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n previousPoint[1] += zigZagDecode(reader.readVarInt()) / context.precisionFactor;\n\n if (context.hasZ) {\n previousPoint[2] += zigZagDecode(reader.readVarInt()) / context.zPrecisionFactor;\n }\n if (context.hasM) {\n previousPoint[3] += zigZagDecode(reader.readVarInt()) / context.mPrecisionFactor;\n }\n\n // Copy the point\n return previousPoint.slice();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const EWKB_FLAG_Z = 0x80000000;
|
|
2
|
+
const EWKB_FLAG_M = 0x40000000;
|
|
3
|
+
const EWKB_FLAG_SRID = 0x20000000;
|
|
4
|
+
const MAX_SRID = 10000;
|
|
5
|
+
export let WKBGeometryType = function (WKBGeometryType) {
|
|
6
|
+
WKBGeometryType[WKBGeometryType["Point"] = 1] = "Point";
|
|
7
|
+
WKBGeometryType[WKBGeometryType["LineString"] = 2] = "LineString";
|
|
8
|
+
WKBGeometryType[WKBGeometryType["Polygon"] = 3] = "Polygon";
|
|
9
|
+
WKBGeometryType[WKBGeometryType["MultiPoint"] = 4] = "MultiPoint";
|
|
10
|
+
WKBGeometryType[WKBGeometryType["MultiLineString"] = 5] = "MultiLineString";
|
|
11
|
+
WKBGeometryType[WKBGeometryType["MultiPolygon"] = 6] = "MultiPolygon";
|
|
12
|
+
WKBGeometryType[WKBGeometryType["GeometryCollection"] = 7] = "GeometryCollection";
|
|
13
|
+
return WKBGeometryType;
|
|
14
|
+
}({});
|
|
15
|
+
export function isWKB(arrayBuffer) {
|
|
16
|
+
const dataView = new DataView(arrayBuffer);
|
|
17
|
+
let byteOffset = 0;
|
|
18
|
+
const endianness = dataView.getUint8(byteOffset);
|
|
19
|
+
byteOffset += 1;
|
|
20
|
+
if (endianness > 1) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const littleEndian = endianness === 1;
|
|
24
|
+
const geometry = dataView.getUint32(byteOffset, littleEndian);
|
|
25
|
+
byteOffset += 4;
|
|
26
|
+
const geometryType = geometry & 0x07;
|
|
27
|
+
if (geometryType === 0 || geometryType > 7) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const geometryFlags = geometry - geometryType;
|
|
31
|
+
if (geometryFlags === 0 || geometryFlags === 1000 || geometryFlags === 2000 || geometryFlags === 3000) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (geometryFlags & EWKB_FLAG_SRID) {
|
|
38
|
+
const srid = dataView.getUint32(byteOffset, littleEndian);
|
|
39
|
+
byteOffset += 4;
|
|
40
|
+
if (srid > MAX_SRID) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
export function parseWKBHeader(dataView, target) {
|
|
47
|
+
const wkbHeader = Object.assign(target || {}, {
|
|
48
|
+
type: 'wkb',
|
|
49
|
+
geometryType: 1,
|
|
50
|
+
dimensions: 2,
|
|
51
|
+
coordinates: 'xy',
|
|
52
|
+
littleEndian: true,
|
|
53
|
+
byteOffset: 0
|
|
54
|
+
});
|
|
55
|
+
wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;
|
|
56
|
+
wkbHeader.byteOffset++;
|
|
57
|
+
const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
58
|
+
wkbHeader.byteOffset += 4;
|
|
59
|
+
wkbHeader.geometryType = geometryCode & 0x7;
|
|
60
|
+
const isoType = (geometryCode - wkbHeader.geometryType) / 1000;
|
|
61
|
+
switch (isoType) {
|
|
62
|
+
case 0:
|
|
63
|
+
break;
|
|
64
|
+
case 1:
|
|
65
|
+
wkbHeader.type = 'iso-wkb';
|
|
66
|
+
wkbHeader.dimensions = 3;
|
|
67
|
+
wkbHeader.coordinates = 'xyz';
|
|
68
|
+
break;
|
|
69
|
+
case 2:
|
|
70
|
+
wkbHeader.type = 'iso-wkb';
|
|
71
|
+
wkbHeader.dimensions = 3;
|
|
72
|
+
wkbHeader.coordinates = 'xym';
|
|
73
|
+
break;
|
|
74
|
+
case 3:
|
|
75
|
+
wkbHeader.type = 'iso-wkb';
|
|
76
|
+
wkbHeader.dimensions = 4;
|
|
77
|
+
wkbHeader.coordinates = 'xyzm';
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
throw new Error("WKB: Unsupported iso-wkb type: ".concat(isoType));
|
|
81
|
+
}
|
|
82
|
+
const ewkbZ = geometryCode & EWKB_FLAG_Z;
|
|
83
|
+
const ewkbM = geometryCode & EWKB_FLAG_M;
|
|
84
|
+
const ewkbSRID = geometryCode & EWKB_FLAG_SRID;
|
|
85
|
+
if (ewkbZ && ewkbM) {
|
|
86
|
+
wkbHeader.type = 'ewkb';
|
|
87
|
+
wkbHeader.dimensions = 4;
|
|
88
|
+
wkbHeader.coordinates = 'xyzm';
|
|
89
|
+
} else if (ewkbZ) {
|
|
90
|
+
wkbHeader.type = 'ewkb';
|
|
91
|
+
wkbHeader.dimensions = 3;
|
|
92
|
+
wkbHeader.coordinates = 'xyz';
|
|
93
|
+
} else if (ewkbM) {
|
|
94
|
+
wkbHeader.type = 'ewkb';
|
|
95
|
+
wkbHeader.dimensions = 3;
|
|
96
|
+
wkbHeader.coordinates = 'xym';
|
|
97
|
+
}
|
|
98
|
+
if (ewkbSRID) {
|
|
99
|
+
wkbHeader.type = 'ewkb';
|
|
100
|
+
wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);
|
|
101
|
+
wkbHeader.byteOffset += 4;
|
|
102
|
+
}
|
|
103
|
+
return wkbHeader;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=parse-wkb-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-wkb-header.js","names":["EWKB_FLAG_Z","EWKB_FLAG_M","EWKB_FLAG_SRID","MAX_SRID","WKBGeometryType","isWKB","arrayBuffer","dataView","DataView","byteOffset","endianness","getUint8","littleEndian","geometry","getUint32","geometryType","geometryFlags","srid","parseWKBHeader","target","wkbHeader","Object","assign","type","dimensions","coordinates","geometryCode","isoType","Error","concat","ewkbZ","ewkbM","ewkbSRID"],"sources":["../../../src/lib/parse-wkb-header.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nconst EWKB_FLAG_Z = 0x80000000;\nconst EWKB_FLAG_M = 0x40000000;\nconst EWKB_FLAG_SRID = 0x20000000;\n\nconst MAX_SRID = 10000; // TBD: Assume no more than 10K SRIDs are defined\n\n/**\n * Integer code for geometry types in WKB and related formats\n * Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary\n */\nexport enum WKBGeometryType {\n Point = 1,\n LineString = 2,\n Polygon = 3,\n MultiPoint = 4,\n MultiLineString = 5,\n MultiPolygon = 6,\n GeometryCollection = 7\n}\n\n/** Parsed WKB header */\nexport type WKBHeader = {\n /** WKB variant */\n type: 'wkb' | 'ewkb' | 'iso-wkb' | 'twkb';\n /** geometry type encoded in this WKB: point, line, polygon etc */\n geometryType: 1 | 2 | 3 | 4 | 5 | 6 | 7;\n /** Number of dimensions for coordinate data */\n dimensions: 2 | 3 | 4;\n /** Coordinate names, Z and M are controlled by flags */\n coordinates: 'xy' | 'xyz' | 'xym' | 'xyzm';\n srid?: number;\n /** true if binary data is stored as little endian */\n littleEndian: boolean;\n /** Offset to start of geometry */\n byteOffset: number;\n};\n\n/** Sanity checks that first to 5-9 bytes could represent a supported WKB dialect header */\nexport function isWKB(arrayBuffer: ArrayBuffer): boolean {\n const dataView = new DataView(arrayBuffer);\n let byteOffset = 0;\n\n const endianness = dataView.getUint8(byteOffset);\n byteOffset += 1;\n\n // Check valid endianness (only 0 or 1 are allowed)\n if (endianness > 1) {\n return false;\n }\n\n const littleEndian = endianness === 1;\n\n const geometry = dataView.getUint32(byteOffset, littleEndian);\n byteOffset += 4;\n\n // check valid geometry type (we don't support extension geometries)\n const geometryType = geometry & 0x07;\n if (geometryType === 0 || geometryType > 7) {\n return false;\n }\n\n const geometryFlags = geometry - geometryType;\n\n // Accept iso-wkb flags\n if (\n geometryFlags === 0 ||\n geometryFlags === 1000 ||\n geometryFlags === 2000 ||\n geometryFlags === 3000\n ) {\n return true;\n }\n\n // Accept ewkb flags but reject otherwise\n if ((geometryFlags & ~(EWKB_FLAG_Z | EWKB_FLAG_M | EWKB_FLAG_SRID)) !== 0) {\n return false;\n }\n\n if (geometryFlags & EWKB_FLAG_SRID) {\n const srid = dataView.getUint32(byteOffset, littleEndian);\n byteOffset += 4;\n\n if (srid > MAX_SRID) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Parses header and provides a byteOffset to start of geometry data\n * @param dataView\n * @param target optionally supply a WKBHeader object to avoid creating a new object for every call\n * @returns a header object describing the WKB data\n */\n// eslint-disable-next-line max-statements\nexport function parseWKBHeader(dataView: DataView, target?: WKBHeader): WKBHeader {\n const wkbHeader: WKBHeader = Object.assign(target || {}, {\n type: 'wkb',\n geometryType: 1,\n dimensions: 2,\n coordinates: 'xy',\n littleEndian: true,\n byteOffset: 0\n } as WKBHeader);\n\n // Check endianness of data\n wkbHeader.littleEndian = dataView.getUint8(wkbHeader.byteOffset) === 1;\n wkbHeader.byteOffset++;\n\n // 4-digit code representing dimension and type of geometry\n const geometryCode = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);\n wkbHeader.byteOffset += 4;\n\n wkbHeader.geometryType = (geometryCode & 0x7) as 1 | 2 | 3 | 4 | 5 | 6 | 7;\n\n // Check if iso-wkb variant: iso-wkb adds 1000, 2000 or 3000 to the geometry code\n const isoType = (geometryCode - wkbHeader.geometryType) / 1000;\n switch (isoType) {\n case 0:\n break;\n case 1:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xyz';\n break;\n case 2:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xym';\n break;\n case 3:\n wkbHeader.type = 'iso-wkb';\n wkbHeader.dimensions = 4;\n wkbHeader.coordinates = 'xyzm';\n break;\n default:\n throw new Error(`WKB: Unsupported iso-wkb type: ${isoType}`);\n }\n\n // Check if EWKB variant. Uses bitmasks for Z&M dimensions as well as optional SRID field\n const ewkbZ = geometryCode & EWKB_FLAG_Z;\n const ewkbM = geometryCode & EWKB_FLAG_M;\n const ewkbSRID = geometryCode & EWKB_FLAG_SRID;\n\n if (ewkbZ && ewkbM) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 4;\n wkbHeader.coordinates = 'xyzm';\n } else if (ewkbZ) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xyz';\n } else if (ewkbM) {\n wkbHeader.type = 'ewkb';\n wkbHeader.dimensions = 3;\n wkbHeader.coordinates = 'xym';\n }\n\n // If SRID present read four more bytes\n if (ewkbSRID) {\n wkbHeader.type = 'ewkb';\n // 4-digit code representing dimension and type of geometry\n wkbHeader.srid = dataView.getUint32(wkbHeader.byteOffset, wkbHeader.littleEndian);\n wkbHeader.byteOffset += 4;\n }\n\n return wkbHeader;\n}\n"],"mappings":"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"}
|
|
@@ -1,49 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { binaryToGeometry } from '@loaders.gl/gis';
|
|
2
|
+
import { parseWKBHeader, WKBGeometryType } from './parse-wkb-header';
|
|
3
|
+
export function parseWKB(arrayBuffer, options) {
|
|
4
|
+
var _options$wkb;
|
|
5
|
+
const binaryGeometry = parseWKBToBinary(arrayBuffer, options);
|
|
6
|
+
const shape = (options === null || options === void 0 ? void 0 : (_options$wkb = options.wkb) === null || _options$wkb === void 0 ? void 0 : _options$wkb.shape) || 'binary-geometry';
|
|
7
|
+
switch (shape) {
|
|
8
|
+
case 'binary-geometry':
|
|
9
|
+
return binaryGeometry;
|
|
10
|
+
case 'geometry':
|
|
11
|
+
return binaryToGeometry(binaryGeometry);
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(shape);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function parseWKBToBinary(arrayBuffer, options) {
|
|
17
|
+
const dataView = new DataView(arrayBuffer);
|
|
18
|
+
const wkbHeader = parseWKBHeader(dataView);
|
|
19
|
+
const {
|
|
20
|
+
geometryType,
|
|
21
|
+
dimensions,
|
|
22
|
+
littleEndian
|
|
23
|
+
} = wkbHeader;
|
|
24
|
+
const offset = wkbHeader.byteOffset;
|
|
17
25
|
switch (geometryType) {
|
|
18
|
-
case
|
|
19
|
-
const point = parsePoint(
|
|
26
|
+
case WKBGeometryType.Point:
|
|
27
|
+
const point = parsePoint(dataView, offset, dimensions, littleEndian);
|
|
20
28
|
return point.geometry;
|
|
21
|
-
case
|
|
22
|
-
const line = parseLineString(
|
|
29
|
+
case WKBGeometryType.LineString:
|
|
30
|
+
const line = parseLineString(dataView, offset, dimensions, littleEndian);
|
|
23
31
|
return line.geometry;
|
|
24
|
-
case
|
|
25
|
-
const polygon = parsePolygon(
|
|
32
|
+
case WKBGeometryType.Polygon:
|
|
33
|
+
const polygon = parsePolygon(dataView, offset, dimensions, littleEndian);
|
|
26
34
|
return polygon.geometry;
|
|
27
|
-
case
|
|
28
|
-
const multiPoint = parseMultiPoint(
|
|
35
|
+
case WKBGeometryType.MultiPoint:
|
|
36
|
+
const multiPoint = parseMultiPoint(dataView, offset, dimensions, littleEndian);
|
|
29
37
|
multiPoint.type = 'Point';
|
|
30
38
|
return multiPoint;
|
|
31
|
-
case
|
|
32
|
-
const multiLine = parseMultiLineString(
|
|
39
|
+
case WKBGeometryType.MultiLineString:
|
|
40
|
+
const multiLine = parseMultiLineString(dataView, offset, dimensions, littleEndian);
|
|
33
41
|
multiLine.type = 'LineString';
|
|
34
42
|
return multiLine;
|
|
35
|
-
case
|
|
36
|
-
const multiPolygon = parseMultiPolygon(
|
|
43
|
+
case WKBGeometryType.MultiPolygon:
|
|
44
|
+
const multiPolygon = parseMultiPolygon(dataView, offset, dimensions, littleEndian);
|
|
37
45
|
multiPolygon.type = 'Polygon';
|
|
38
46
|
return multiPolygon;
|
|
39
47
|
default:
|
|
40
48
|
throw new Error("WKB: Unsupported geometry type: ".concat(geometryType));
|
|
41
49
|
}
|
|
42
50
|
}
|
|
43
|
-
function parsePoint(
|
|
51
|
+
function parsePoint(dataView, offset, dimension, littleEndian) {
|
|
44
52
|
const positions = new Float64Array(dimension);
|
|
45
53
|
for (let i = 0; i < dimension; i++) {
|
|
46
|
-
positions[i] =
|
|
54
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
47
55
|
offset += 8;
|
|
48
56
|
}
|
|
49
57
|
return {
|
|
@@ -57,12 +65,12 @@ function parsePoint(view, offset, dimension, littleEndian) {
|
|
|
57
65
|
offset
|
|
58
66
|
};
|
|
59
67
|
}
|
|
60
|
-
function parseLineString(
|
|
61
|
-
const nPoints =
|
|
68
|
+
function parseLineString(dataView, offset, dimension, littleEndian) {
|
|
69
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
62
70
|
offset += 4;
|
|
63
71
|
const positions = new Float64Array(nPoints * dimension);
|
|
64
72
|
for (let i = 0; i < nPoints * dimension; i++) {
|
|
65
|
-
positions[i] =
|
|
73
|
+
positions[i] = dataView.getFloat64(offset, littleEndian);
|
|
66
74
|
offset += 8;
|
|
67
75
|
}
|
|
68
76
|
const pathIndices = [0];
|
|
@@ -85,12 +93,12 @@ function parseLineString(view, offset, dimension, littleEndian) {
|
|
|
85
93
|
};
|
|
86
94
|
}
|
|
87
95
|
const cumulativeSum = sum => value => sum += value;
|
|
88
|
-
function parsePolygon(
|
|
89
|
-
const nRings =
|
|
96
|
+
function parsePolygon(dataView, offset, dimension, littleEndian) {
|
|
97
|
+
const nRings = dataView.getUint32(offset, littleEndian);
|
|
90
98
|
offset += 4;
|
|
91
99
|
const rings = [];
|
|
92
100
|
for (let i = 0; i < nRings; i++) {
|
|
93
|
-
const parsed = parseLineString(
|
|
101
|
+
const parsed = parseLineString(dataView, offset, dimension, littleEndian);
|
|
94
102
|
const {
|
|
95
103
|
positions
|
|
96
104
|
} = parsed.geometry;
|
|
@@ -123,52 +131,52 @@ function parsePolygon(view, offset, dimension, littleEndian) {
|
|
|
123
131
|
offset
|
|
124
132
|
};
|
|
125
133
|
}
|
|
126
|
-
function parseMultiPoint(
|
|
127
|
-
const nPoints =
|
|
134
|
+
function parseMultiPoint(dataView, offset, dimension, littleEndian) {
|
|
135
|
+
const nPoints = dataView.getUint32(offset, littleEndian);
|
|
128
136
|
offset += 4;
|
|
129
137
|
const binaryPointGeometries = [];
|
|
130
138
|
for (let i = 0; i < nPoints; i++) {
|
|
131
|
-
const littleEndianPoint =
|
|
139
|
+
const littleEndianPoint = dataView.getUint8(offset) === 1;
|
|
132
140
|
offset++;
|
|
133
|
-
if (
|
|
141
|
+
if (dataView.getUint32(offset, littleEndianPoint) % 1000 !== 1) {
|
|
134
142
|
throw new Error('WKB: Inner geometries of MultiPoint not of type Point');
|
|
135
143
|
}
|
|
136
144
|
offset += 4;
|
|
137
|
-
const parsed = parsePoint(
|
|
145
|
+
const parsed = parsePoint(dataView, offset, dimension, littleEndianPoint);
|
|
138
146
|
offset = parsed.offset;
|
|
139
147
|
binaryPointGeometries.push(parsed.geometry);
|
|
140
148
|
}
|
|
141
149
|
return concatenateBinaryPointGeometries(binaryPointGeometries, dimension);
|
|
142
150
|
}
|
|
143
|
-
function parseMultiLineString(
|
|
144
|
-
const nLines =
|
|
151
|
+
function parseMultiLineString(dataView, offset, dimension, littleEndian) {
|
|
152
|
+
const nLines = dataView.getUint32(offset, littleEndian);
|
|
145
153
|
offset += 4;
|
|
146
154
|
const binaryLineGeometries = [];
|
|
147
155
|
for (let i = 0; i < nLines; i++) {
|
|
148
|
-
const littleEndianLine =
|
|
156
|
+
const littleEndianLine = dataView.getUint8(offset) === 1;
|
|
149
157
|
offset++;
|
|
150
|
-
if (
|
|
158
|
+
if (dataView.getUint32(offset, littleEndianLine) % 1000 !== 2) {
|
|
151
159
|
throw new Error('WKB: Inner geometries of MultiLineString not of type LineString');
|
|
152
160
|
}
|
|
153
161
|
offset += 4;
|
|
154
|
-
const parsed = parseLineString(
|
|
162
|
+
const parsed = parseLineString(dataView, offset, dimension, littleEndianLine);
|
|
155
163
|
offset = parsed.offset;
|
|
156
164
|
binaryLineGeometries.push(parsed.geometry);
|
|
157
165
|
}
|
|
158
166
|
return concatenateBinaryLineGeometries(binaryLineGeometries, dimension);
|
|
159
167
|
}
|
|
160
|
-
function parseMultiPolygon(
|
|
161
|
-
const nPolygons =
|
|
168
|
+
function parseMultiPolygon(dataView, offset, dimension, littleEndian) {
|
|
169
|
+
const nPolygons = dataView.getUint32(offset, littleEndian);
|
|
162
170
|
offset += 4;
|
|
163
171
|
const binaryPolygonGeometries = [];
|
|
164
172
|
for (let i = 0; i < nPolygons; i++) {
|
|
165
|
-
const littleEndianPolygon =
|
|
173
|
+
const littleEndianPolygon = dataView.getUint8(offset) === 1;
|
|
166
174
|
offset++;
|
|
167
|
-
if (
|
|
175
|
+
if (dataView.getUint32(offset, littleEndianPolygon) % 1000 !== 3) {
|
|
168
176
|
throw new Error('WKB: Inner geometries of MultiPolygon not of type Polygon');
|
|
169
177
|
}
|
|
170
178
|
offset += 4;
|
|
171
|
-
const parsed = parsePolygon(
|
|
179
|
+
const parsed = parsePolygon(dataView, offset, dimension, littleEndianPolygon);
|
|
172
180
|
offset = parsed.offset;
|
|
173
181
|
binaryPolygonGeometries.push(parsed.geometry);
|
|
174
182
|
}
|