@loaders.gl/wkt 4.2.0-alpha.4 → 4.2.0-alpha.6
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/dist/dist.dev.js +137 -218
- package/dist/dist.min.js +10 -0
- package/dist/hex-wkb-loader.d.ts +1 -1
- package/dist/hex-wkb-loader.d.ts.map +1 -1
- package/dist/hex-wkb-loader.js +44 -28
- package/dist/index.cjs +87 -62
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +14 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/lib/encode-twkb.js +158 -143
- package/dist/lib/encode-wkb.js +247 -211
- package/dist/lib/encode-wkt-crs.d.ts +1 -1
- package/dist/lib/encode-wkt-crs.d.ts.map +1 -1
- package/dist/lib/encode-wkt-crs.js +32 -18
- package/dist/lib/encode-wkt.js +35 -27
- package/dist/lib/parse-hex-wkb.js +1 -2
- package/dist/lib/parse-twkb.js +215 -218
- package/dist/lib/parse-wkb-header.js +124 -95
- package/dist/lib/parse-wkb.d.ts +1 -1
- package/dist/lib/parse-wkb.d.ts.map +1 -1
- package/dist/lib/parse-wkb.js +210 -235
- package/dist/lib/parse-wkt-crs.js +110 -86
- package/dist/lib/parse-wkt.js +251 -185
- package/dist/lib/utils/base64-encoder.js +151 -5
- package/dist/lib/utils/binary-reader.js +67 -64
- package/dist/lib/utils/binary-writer.js +117 -109
- package/dist/lib/utils/hex-encoder.js +46 -32
- package/dist/lib/utils/hex-transcoder.js +40 -24
- package/dist/lib/utils/version.js +7 -2
- package/dist/twkb-loader.js +26 -17
- package/dist/twkb-writer.js +18 -13
- package/dist/wkb-loader.js +26 -17
- package/dist/wkb-writer.js +22 -17
- package/dist/wkt-crs-loader.d.ts +1 -1
- package/dist/wkt-crs-loader.d.ts.map +1 -1
- package/dist/wkt-crs-loader.js +22 -15
- package/dist/wkt-crs-writer.d.ts +2 -2
- package/dist/wkt-crs-writer.d.ts.map +1 -1
- package/dist/wkt-crs-writer.js +23 -15
- package/dist/wkt-loader.js +28 -20
- package/dist/wkt-worker.js +4 -2
- package/dist/wkt-writer.js +19 -14
- package/dist/workers/wkb-worker.js +3 -1
- package/dist/workers/wkt-worker.js +3 -1
- package/package.json +11 -6
- package/src/lib/parse-wkb.ts +2 -2
- package/dist/hex-wkb-loader.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/encode-twkb.js.map +0 -1
- package/dist/lib/encode-wkb.js.map +0 -1
- package/dist/lib/encode-wkt-crs.js.map +0 -1
- package/dist/lib/encode-wkt.js.map +0 -1
- package/dist/lib/parse-hex-wkb.js.map +0 -1
- package/dist/lib/parse-twkb.js.map +0 -1
- package/dist/lib/parse-wkb-header.js.map +0 -1
- package/dist/lib/parse-wkb.js.map +0 -1
- package/dist/lib/parse-wkt-crs.js.map +0 -1
- package/dist/lib/parse-wkt.js.map +0 -1
- package/dist/lib/utils/base64-encoder.js.map +0 -1
- package/dist/lib/utils/binary-reader.js.map +0 -1
- package/dist/lib/utils/binary-writer.js.map +0 -1
- package/dist/lib/utils/hex-encoder.js.map +0 -1
- package/dist/lib/utils/hex-transcoder.js.map +0 -1
- package/dist/lib/utils/version.js.map +0 -1
- package/dist/twkb-loader.js.map +0 -1
- package/dist/twkb-writer.js.map +0 -1
- package/dist/wkb-loader.js.map +0 -1
- package/dist/wkb-writer.js.map +0 -1
- package/dist/wkt-crs-loader.js.map +0 -1
- package/dist/wkt-crs-writer.js.map +0 -1
- package/dist/wkt-loader.js.map +0 -1
- package/dist/wkt-writer.js.map +0 -1
- package/dist/workers/wkb-worker.js.map +0 -1
- package/dist/workers/wkt-worker.js.map +0 -1
package/dist/lib/encode-twkb.js
CHANGED
|
@@ -1,180 +1,195 @@
|
|
|
1
|
+
// loaders.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
// Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz
|
|
1
5
|
import { BinaryWriter } from "./utils/binary-writer.js";
|
|
2
6
|
import { WKBGeometryType } from "./parse-wkb-header.js";
|
|
3
7
|
export function encodeTWKB(geometry, options) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const writer = new BinaryWriter(0, true);
|
|
9
|
+
const context = {
|
|
10
|
+
...getTwkbPrecision(5, 0, 0),
|
|
11
|
+
hasZ: options?.hasZ,
|
|
12
|
+
hasM: options?.hasM
|
|
13
|
+
};
|
|
14
|
+
encodeGeometry(writer, geometry, context);
|
|
15
|
+
// TODO - we need to slice it?
|
|
16
|
+
return writer.arrayBuffer;
|
|
12
17
|
}
|
|
13
18
|
function encodeGeometry(writer, geometry, context) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
switch (geometry.type) {
|
|
20
|
+
case 'Point':
|
|
21
|
+
return encodePoint(writer, context, geometry);
|
|
22
|
+
case 'LineString':
|
|
23
|
+
return encodeLineString(writer, context, geometry);
|
|
24
|
+
case 'Polygon':
|
|
25
|
+
return encodePolygon(writer, context, geometry);
|
|
26
|
+
case 'MultiPoint':
|
|
27
|
+
return encodeMultiPoint(writer, context, geometry);
|
|
28
|
+
case 'MultiLineString':
|
|
29
|
+
return encodeMultiLineString(writer, context, geometry);
|
|
30
|
+
case 'MultiPolygon':
|
|
31
|
+
return encodeMultiPolygon(writer, context, geometry);
|
|
32
|
+
case 'GeometryCollection':
|
|
33
|
+
return encodeGeometryCollection(writer, context, geometry);
|
|
34
|
+
default:
|
|
35
|
+
throw new Error('unsupported geometry type');
|
|
36
|
+
}
|
|
32
37
|
}
|
|
33
38
|
function encodePoint(writer, context, point) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
const isEmpty = point.coordinates.length === 0 || point[0] === 'undefined' || point[1] === 'undefined';
|
|
40
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Point, isEmpty);
|
|
41
|
+
if (!isEmpty) {
|
|
42
|
+
const previousPoint = [0, 0, 0, 0];
|
|
43
|
+
writeTwkbPoint(writer, context, point.coordinates, previousPoint);
|
|
44
|
+
}
|
|
40
45
|
}
|
|
41
46
|
function encodeLineString(writer, context, lineString) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
const points = lineString.coordinates;
|
|
48
|
+
const isEmpty = points.length === 0;
|
|
49
|
+
writeTwkbHeader(writer, context, WKBGeometryType.LineString, isEmpty);
|
|
50
|
+
if (!isEmpty) {
|
|
51
|
+
writer.writeVarInt(points.length);
|
|
52
|
+
const previousPoint = [0, 0, 0, 0];
|
|
53
|
+
for (const point of points) {
|
|
54
|
+
writeTwkbPoint(writer, context, point, previousPoint);
|
|
55
|
+
}
|
|
50
56
|
}
|
|
51
|
-
|
|
52
|
-
return writer.arrayBuffer;
|
|
57
|
+
return writer.arrayBuffer;
|
|
53
58
|
}
|
|
54
59
|
function encodePolygon(writer, context, polygon) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
const polygonRings = polygon.coordinates;
|
|
61
|
+
const isEmpty = polygonRings.length === 0;
|
|
62
|
+
writeTwkbHeader(writer, context, WKBGeometryType.Polygon, isEmpty);
|
|
63
|
+
if (!isEmpty) {
|
|
64
|
+
writer.writeVarInt(polygonRings.length);
|
|
65
|
+
const previousPoint = [0, 0, 0, 0];
|
|
66
|
+
for (const ring of polygonRings) {
|
|
67
|
+
writer.writeVarInt(ring.length);
|
|
68
|
+
for (const point of ring) {
|
|
69
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
66
72
|
}
|
|
67
|
-
|
|
68
|
-
return writer.arrayBuffer;
|
|
73
|
+
return writer.arrayBuffer;
|
|
69
74
|
}
|
|
70
75
|
function encodeMultiPoint(writer, context, multiPoint) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
const points = multiPoint.coordinates;
|
|
77
|
+
const isEmpty = points.length === 0;
|
|
78
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPoint, isEmpty);
|
|
79
|
+
if (!isEmpty) {
|
|
80
|
+
writer.writeVarInt(points.length);
|
|
81
|
+
const previousPoint = [0, 0, 0, 0];
|
|
82
|
+
for (let i = 0; i < points.length; i++) {
|
|
83
|
+
writeTwkbPoint(writer, context, previousPoint, points[i]);
|
|
84
|
+
}
|
|
79
85
|
}
|
|
80
|
-
}
|
|
81
86
|
}
|
|
82
87
|
function encodeMultiLineString(writer, context, multiLineStrings) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
88
|
+
const lineStrings = multiLineStrings.coordinates;
|
|
89
|
+
const isEmpty = lineStrings.length === 0;
|
|
90
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiLineString, isEmpty);
|
|
91
|
+
if (!isEmpty) {
|
|
92
|
+
writer.writeVarInt(lineStrings.length);
|
|
93
|
+
const previousPoint = [0, 0, 0, 0];
|
|
94
|
+
for (const lineString of lineStrings) {
|
|
95
|
+
writer.writeVarInt(lineString.length);
|
|
96
|
+
for (const point of lineString) {
|
|
97
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
94
100
|
}
|
|
95
|
-
|
|
96
|
-
return writer.arrayBuffer;
|
|
101
|
+
return writer.arrayBuffer;
|
|
97
102
|
}
|
|
98
103
|
function encodeMultiPolygon(writer, context, multiPolygon) {
|
|
99
|
-
|
|
100
|
-
coordinates
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
104
|
+
const { coordinates } = multiPolygon;
|
|
105
|
+
const isEmpty = coordinates.length === 0;
|
|
106
|
+
writeTwkbHeader(writer, context, WKBGeometryType.MultiPolygon, isEmpty);
|
|
107
|
+
if (!isEmpty) {
|
|
108
|
+
const polygons = coordinates;
|
|
109
|
+
writer.writeVarInt(polygons.length);
|
|
110
|
+
const previousPoint = [0, 0, 0, 0];
|
|
111
|
+
for (const polygonRings of polygons) {
|
|
112
|
+
writer.writeVarInt(polygonRings.length);
|
|
113
|
+
for (const ring of polygonRings) {
|
|
114
|
+
writer.writeVarInt(ring.length);
|
|
115
|
+
for (const point of ring) {
|
|
116
|
+
writeTwkbPoint(writer, context, previousPoint, point);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
114
119
|
}
|
|
115
|
-
}
|
|
116
120
|
}
|
|
117
|
-
}
|
|
118
121
|
}
|
|
119
122
|
function encodeGeometryCollection(writer, context, geometryCollection) {
|
|
120
|
-
|
|
121
|
-
geometries
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
encodeGeometry(writer, geometry, context);
|
|
123
|
+
const { geometries } = geometryCollection;
|
|
124
|
+
const isEmpty = geometries.length === 0;
|
|
125
|
+
writeTwkbHeader(writer, context, WKBGeometryType.GeometryCollection, isEmpty);
|
|
126
|
+
if (geometries.length > 0) {
|
|
127
|
+
writer.writeVarInt(geometries.length);
|
|
128
|
+
for (const geometry of geometries) {
|
|
129
|
+
encodeGeometry(writer, geometry, context);
|
|
130
|
+
}
|
|
129
131
|
}
|
|
130
|
-
}
|
|
131
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
*
|
|
135
|
+
* @param writer
|
|
136
|
+
* @param context
|
|
137
|
+
* @param geometryType
|
|
138
|
+
* @param isEmpty
|
|
139
|
+
*/
|
|
132
140
|
function writeTwkbHeader(writer, context, geometryType, isEmpty) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
141
|
+
const type = (zigZagEncode(context.xy) << 4) + geometryType;
|
|
142
|
+
let metadataHeader = context.hasZ || context.hasM ? 1 << 3 : 0;
|
|
143
|
+
metadataHeader += isEmpty ? 1 << 4 : 0;
|
|
144
|
+
writer.writeUInt8(type);
|
|
145
|
+
writer.writeUInt8(metadataHeader);
|
|
146
|
+
if (context.hasZ || context.hasM) {
|
|
147
|
+
let extendedPrecision = 0;
|
|
148
|
+
if (context.hasZ) {
|
|
149
|
+
extendedPrecision |= 0x1;
|
|
150
|
+
}
|
|
151
|
+
if (context.hasM) {
|
|
152
|
+
extendedPrecision |= 0x2;
|
|
153
|
+
}
|
|
154
|
+
writer.writeUInt8(extendedPrecision);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Write one point to array buffer. ZigZagEncoding the delta fdrom the previous point. Mutates previousPoint.
|
|
159
|
+
* @param writer
|
|
160
|
+
* @param context
|
|
161
|
+
* @param previousPoint - Mutated by this function
|
|
162
|
+
* @param point
|
|
163
|
+
*/
|
|
164
|
+
function writeTwkbPoint(writer, context, point, previousPoint) {
|
|
165
|
+
const x = point[0] * context.xyFactor;
|
|
166
|
+
const y = point[1] * context.xyFactor;
|
|
167
|
+
const z = point[2] * context.zFactor;
|
|
168
|
+
const m = point[3] * context.mFactor;
|
|
169
|
+
writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
|
|
170
|
+
writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
|
|
140
171
|
if (context.hasZ) {
|
|
141
|
-
|
|
172
|
+
writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
|
|
142
173
|
}
|
|
143
174
|
if (context.hasM) {
|
|
144
|
-
|
|
175
|
+
writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
|
|
145
176
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const x = point[0] * context.xyFactor;
|
|
151
|
-
const y = point[1] * context.xyFactor;
|
|
152
|
-
const z = point[2] * context.zFactor;
|
|
153
|
-
const m = point[3] * context.mFactor;
|
|
154
|
-
writer.writeVarInt(zigZagEncode(x - previousPoint[0]));
|
|
155
|
-
writer.writeVarInt(zigZagEncode(y - previousPoint[1]));
|
|
156
|
-
if (context.hasZ) {
|
|
157
|
-
writer.writeVarInt(zigZagEncode(z - previousPoint[2]));
|
|
158
|
-
}
|
|
159
|
-
if (context.hasM) {
|
|
160
|
-
writer.writeVarInt(zigZagEncode(m - previousPoint[3]));
|
|
161
|
-
}
|
|
162
|
-
previousPoint[0] = x;
|
|
163
|
-
previousPoint[1] = y;
|
|
164
|
-
previousPoint[2] = z;
|
|
165
|
-
previousPoint[3] = m;
|
|
177
|
+
previousPoint[0] = x;
|
|
178
|
+
previousPoint[1] = y;
|
|
179
|
+
previousPoint[2] = z;
|
|
180
|
+
previousPoint[3] = m;
|
|
166
181
|
}
|
|
182
|
+
// HELPERS
|
|
167
183
|
function zigZagEncode(value) {
|
|
168
|
-
|
|
184
|
+
return (value << 1) ^ (value >> 31);
|
|
169
185
|
}
|
|
170
186
|
function getTwkbPrecision(xyPrecision, zPrecision, mPrecision) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
187
|
+
return {
|
|
188
|
+
xy: xyPrecision,
|
|
189
|
+
z: zPrecision,
|
|
190
|
+
m: mPrecision,
|
|
191
|
+
xyFactor: Math.pow(10, xyPrecision),
|
|
192
|
+
zFactor: Math.pow(10, zPrecision),
|
|
193
|
+
mFactor: Math.pow(10, mPrecision)
|
|
194
|
+
};
|
|
179
195
|
}
|
|
180
|
-
//# sourceMappingURL=encode-twkb.js.map
|