@loaders.gl/wkt 4.0.0-alpha.5 → 4.0.0-alpha.7
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/bundle.js +2 -2
- package/dist/dist.min.js +9 -3
- package/dist/es5/bundle.js +6 -0
- package/dist/es5/bundle.js.map +1 -0
- package/dist/es5/index.js +46 -0
- package/dist/es5/index.js.map +1 -0
- package/dist/es5/lib/encode-wkb.js +374 -0
- package/dist/es5/lib/encode-wkb.js.map +1 -0
- package/dist/es5/lib/encode-wkt.js +45 -0
- package/dist/es5/lib/encode-wkt.js.map +1 -0
- package/dist/es5/lib/parse-wkb.js +290 -0
- package/dist/es5/lib/parse-wkb.js.map +1 -0
- package/dist/es5/lib/parse-wkt.js +176 -0
- package/dist/es5/lib/parse-wkt.js.map +1 -0
- package/dist/es5/lib/utils/binary-writer.js +161 -0
- package/dist/es5/lib/utils/binary-writer.js.map +1 -0
- package/dist/es5/lib/utils/version.js +9 -0
- package/dist/es5/lib/utils/version.js.map +1 -0
- package/dist/es5/wkb-loader.js +54 -0
- package/dist/es5/wkb-loader.js.map +1 -0
- package/dist/es5/wkb-writer.js +25 -0
- package/dist/es5/wkb-writer.js.map +1 -0
- package/dist/es5/wkt-loader.js +51 -0
- package/dist/es5/wkt-loader.js.map +1 -0
- package/dist/es5/wkt-writer.js +22 -0
- package/dist/es5/wkt-writer.js.map +1 -0
- package/dist/es5/workers/wkb-worker.js +6 -0
- package/dist/es5/workers/wkb-worker.js.map +1 -0
- package/dist/es5/workers/wkt-worker.js +6 -0
- package/dist/es5/workers/wkt-worker.js.map +1 -0
- package/dist/esm/bundle.js +4 -0
- package/dist/esm/bundle.js.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/encode-wkb.js +253 -0
- package/dist/esm/lib/encode-wkb.js.map +1 -0
- package/dist/esm/lib/encode-wkt.js +39 -0
- package/dist/esm/lib/encode-wkt.js.map +1 -0
- package/dist/esm/lib/parse-wkb.js +255 -0
- package/dist/esm/lib/parse-wkb.js.map +1 -0
- package/dist/esm/lib/parse-wkt.js +170 -0
- package/dist/esm/lib/parse-wkt.js.map +1 -0
- package/dist/esm/lib/utils/binary-writer.js +114 -0
- package/dist/esm/lib/utils/binary-writer.js.map +1 -0
- package/dist/esm/lib/utils/version.js +2 -0
- package/dist/esm/lib/utils/version.js.map +1 -0
- package/dist/esm/wkb-loader.js +23 -0
- package/dist/esm/wkb-loader.js.map +1 -0
- package/dist/esm/wkb-writer.js +17 -0
- package/dist/esm/wkb-writer.js.map +1 -0
- package/dist/esm/wkt-loader.js +22 -0
- package/dist/esm/wkt-loader.js.map +1 -0
- package/dist/esm/wkt-writer.js +14 -0
- package/dist/esm/wkt-writer.js.map +1 -0
- package/dist/esm/workers/wkb-worker.js +4 -0
- package/dist/esm/workers/wkb-worker.js.map +1 -0
- package/dist/esm/workers/wkt-worker.js +4 -0
- package/dist/esm/workers/wkt-worker.js.map +1 -0
- package/dist/index.js +13 -5
- package/dist/lib/encode-wkb.d.ts +6 -1
- package/dist/lib/encode-wkb.d.ts.map +1 -1
- package/dist/lib/encode-wkb.js +250 -278
- package/dist/lib/encode-wkt.js +35 -41
- package/dist/lib/parse-wkb.js +208 -276
- package/dist/lib/parse-wkt.js +218 -189
- package/dist/lib/utils/binary-writer.js +117 -150
- package/dist/lib/utils/version.js +7 -2
- package/dist/wkb-loader.js +32 -20
- package/dist/wkb-writer.d.ts +1 -1
- package/dist/wkb-writer.d.ts.map +1 -1
- package/dist/wkb-writer.js +25 -13
- package/dist/wkt-loader.js +31 -19
- package/dist/wkt-worker.js +48 -16
- package/dist/wkt-writer.js +22 -13
- package/dist/workers/wkb-worker.js +5 -4
- package/dist/workers/wkt-worker.js +5 -4
- package/package.json +6 -6
- package/src/lib/encode-wkb.ts +12 -1
- package/src/wkb-writer.ts +6 -3
- package/dist/bundle.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/encode-wkb.js.map +0 -1
- package/dist/lib/encode-wkt.js.map +0 -1
- package/dist/lib/parse-wkb.js.map +0 -1
- package/dist/lib/parse-wkt.js.map +0 -1
- package/dist/lib/utils/binary-writer.js.map +0 -1
- package/dist/lib/utils/version.js.map +0 -1
- package/dist/wkb-loader.js.map +0 -1
- package/dist/wkb-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-wkb.js
CHANGED
|
@@ -1,323 +1,295 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
// loaders.gl, MIT license
|
|
3
|
+
// Forked from https://github.com/cschwarz/wkx under MIT license, Copyright (c) 2013 Christian Schwarz
|
|
4
|
+
// Reference: https://www.ogc.org/standards/sfa
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const binary_writer_1 = __importDefault(require("./utils/binary-writer"));
|
|
10
|
+
/**
|
|
11
|
+
* Integer code for geometry type
|
|
12
|
+
* Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary
|
|
13
|
+
*/
|
|
2
14
|
var WKB;
|
|
3
|
-
|
|
4
15
|
(function (WKB) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
WKB[WKB["Point"] = 1] = "Point";
|
|
17
|
+
WKB[WKB["LineString"] = 2] = "LineString";
|
|
18
|
+
WKB[WKB["Polygon"] = 3] = "Polygon";
|
|
19
|
+
WKB[WKB["MultiPoint"] = 4] = "MultiPoint";
|
|
20
|
+
WKB[WKB["MultiLineString"] = 5] = "MultiLineString";
|
|
21
|
+
WKB[WKB["MultiPolygon"] = 6] = "MultiPolygon";
|
|
22
|
+
WKB[WKB["GeometryCollection"] = 7] = "GeometryCollection";
|
|
12
23
|
})(WKB || (WKB = {}));
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
geometry
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
throw new Error("Unhandled case: ".concat(exhaustiveCheck));
|
|
47
|
-
}
|
|
24
|
+
/**
|
|
25
|
+
* Encodes a GeoJSON object into WKB
|
|
26
|
+
* @param geojson A GeoJSON Feature or Geometry
|
|
27
|
+
* @returns string
|
|
28
|
+
*/
|
|
29
|
+
function encodeWKB(geometry, options = {}) {
|
|
30
|
+
if (geometry.type === 'Feature') {
|
|
31
|
+
geometry = geometry.geometry;
|
|
32
|
+
}
|
|
33
|
+
// Options should be wrapped in a `wkb` key, but we allow top-level options here for backwards
|
|
34
|
+
// compatibility
|
|
35
|
+
if ('wkb' in options) {
|
|
36
|
+
options = options.wkb;
|
|
37
|
+
}
|
|
38
|
+
switch (geometry.type) {
|
|
39
|
+
case 'Point':
|
|
40
|
+
return encodePoint(geometry.coordinates, options);
|
|
41
|
+
case 'LineString':
|
|
42
|
+
return encodeLineString(geometry.coordinates, options);
|
|
43
|
+
case 'Polygon':
|
|
44
|
+
return encodePolygon(geometry.coordinates, options);
|
|
45
|
+
case 'MultiPoint':
|
|
46
|
+
return encodeMultiPoint(geometry, options);
|
|
47
|
+
case 'MultiPolygon':
|
|
48
|
+
return encodeMultiPolygon(geometry, options);
|
|
49
|
+
case 'MultiLineString':
|
|
50
|
+
return encodeMultiLineString(geometry, options);
|
|
51
|
+
case 'GeometryCollection':
|
|
52
|
+
return encodeGeometryCollection(geometry, options);
|
|
53
|
+
default:
|
|
54
|
+
const exhaustiveCheck = geometry;
|
|
55
|
+
throw new Error(`Unhandled case: ${exhaustiveCheck}`);
|
|
56
|
+
}
|
|
48
57
|
}
|
|
49
|
-
|
|
58
|
+
exports.default = encodeWKB;
|
|
59
|
+
/** Calculate the binary size (in the WKB encoding) of a specific GeoJSON geometry */
|
|
50
60
|
function getGeometrySize(geometry, options) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
case 'GeometryCollection':
|
|
71
|
-
return getGeometryCollectionSize(geometry, options);
|
|
72
|
-
|
|
73
|
-
default:
|
|
74
|
-
const exhaustiveCheck = geometry;
|
|
75
|
-
throw new Error("Unhandled case: ".concat(exhaustiveCheck));
|
|
76
|
-
}
|
|
61
|
+
switch (geometry.type) {
|
|
62
|
+
case 'Point':
|
|
63
|
+
return getPointSize(options);
|
|
64
|
+
case 'LineString':
|
|
65
|
+
return getLineStringSize(geometry.coordinates, options);
|
|
66
|
+
case 'Polygon':
|
|
67
|
+
return getPolygonSize(geometry.coordinates, options);
|
|
68
|
+
case 'MultiPoint':
|
|
69
|
+
return getMultiPointSize(geometry, options);
|
|
70
|
+
case 'MultiPolygon':
|
|
71
|
+
return getMultiPolygonSize(geometry, options);
|
|
72
|
+
case 'MultiLineString':
|
|
73
|
+
return getMultiLineStringSize(geometry, options);
|
|
74
|
+
case 'GeometryCollection':
|
|
75
|
+
return getGeometryCollectionSize(geometry, options);
|
|
76
|
+
default:
|
|
77
|
+
const exhaustiveCheck = geometry;
|
|
78
|
+
throw new Error(`Unhandled case: ${exhaustiveCheck}`);
|
|
79
|
+
}
|
|
77
80
|
}
|
|
78
|
-
|
|
81
|
+
/** Encode Point geometry as WKB ArrayBuffer */
|
|
79
82
|
function encodePoint(coordinates, options) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
const writer = new binary_writer_1.default(getPointSize(options));
|
|
84
|
+
writer.writeInt8(1);
|
|
85
|
+
writeWkbType(writer, WKB.Point, options);
|
|
86
|
+
// I believe this special case is to handle writing Point(NaN, NaN) correctly
|
|
87
|
+
if (typeof coordinates[0] === 'undefined' && typeof coordinates[1] === 'undefined') {
|
|
88
|
+
writer.writeDoubleLE(NaN);
|
|
89
|
+
writer.writeDoubleLE(NaN);
|
|
90
|
+
if (options.hasZ) {
|
|
91
|
+
writer.writeDoubleLE(NaN);
|
|
92
|
+
}
|
|
93
|
+
if (options.hasM) {
|
|
94
|
+
writer.writeDoubleLE(NaN);
|
|
95
|
+
}
|
|
90
96
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
writer.writeDoubleLE(NaN);
|
|
97
|
+
else {
|
|
98
|
+
writeCoordinate(writer, coordinates, options);
|
|
94
99
|
}
|
|
95
|
-
|
|
96
|
-
writeCoordinate(writer, coordinates, options);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return writer.arrayBuffer;
|
|
100
|
+
return writer.arrayBuffer;
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
+
/** Write coordinate to buffer */
|
|
102
103
|
function writeCoordinate(writer, coordinate, options) {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
writer.writeDoubleLE(coordinate[3]);
|
|
112
|
-
}
|
|
104
|
+
writer.writeDoubleLE(coordinate[0]);
|
|
105
|
+
writer.writeDoubleLE(coordinate[1]);
|
|
106
|
+
if (options.hasZ) {
|
|
107
|
+
writer.writeDoubleLE(coordinate[2]);
|
|
108
|
+
}
|
|
109
|
+
if (options.hasM) {
|
|
110
|
+
writer.writeDoubleLE(coordinate[3]);
|
|
111
|
+
}
|
|
113
112
|
}
|
|
114
|
-
|
|
113
|
+
/** Get encoded size of Point geometry */
|
|
115
114
|
function getPointSize(options) {
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
const coordinateSize = getCoordinateSize(options);
|
|
116
|
+
return 1 + 4 + coordinateSize;
|
|
118
117
|
}
|
|
119
|
-
|
|
118
|
+
/** Encode LineString geometry as WKB ArrayBuffer */
|
|
120
119
|
function encodeLineString(coordinates, options) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
return writer.arrayBuffer;
|
|
120
|
+
const size = getLineStringSize(coordinates, options);
|
|
121
|
+
const writer = new binary_writer_1.default(size);
|
|
122
|
+
writer.writeInt8(1);
|
|
123
|
+
writeWkbType(writer, WKB.LineString, options);
|
|
124
|
+
writer.writeUInt32LE(coordinates.length);
|
|
125
|
+
for (const coordinate of coordinates) {
|
|
126
|
+
writeCoordinate(writer, coordinate, options);
|
|
127
|
+
}
|
|
128
|
+
return writer.arrayBuffer;
|
|
132
129
|
}
|
|
133
|
-
|
|
130
|
+
/** Get encoded size of LineString geometry */
|
|
134
131
|
function getLineStringSize(coordinates, options) {
|
|
135
|
-
|
|
136
|
-
|
|
132
|
+
const coordinateSize = getCoordinateSize(options);
|
|
133
|
+
return 1 + 4 + 4 + coordinates.length * coordinateSize;
|
|
137
134
|
}
|
|
138
|
-
|
|
135
|
+
/** Encode Polygon geometry as WKB ArrayBuffer */
|
|
139
136
|
function encodePolygon(coordinates, options) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
for (const coordinate of interiorRing) {
|
|
160
|
-
writeCoordinate(writer, coordinate, options);
|
|
137
|
+
const writer = new binary_writer_1.default(getPolygonSize(coordinates, options));
|
|
138
|
+
writer.writeInt8(1);
|
|
139
|
+
writeWkbType(writer, WKB.Polygon, options);
|
|
140
|
+
const [exteriorRing, ...interiorRings] = coordinates;
|
|
141
|
+
if (exteriorRing.length > 0) {
|
|
142
|
+
writer.writeUInt32LE(1 + interiorRings.length);
|
|
143
|
+
writer.writeUInt32LE(exteriorRing.length);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
writer.writeUInt32LE(0);
|
|
147
|
+
}
|
|
148
|
+
for (const coordinate of exteriorRing) {
|
|
149
|
+
writeCoordinate(writer, coordinate, options);
|
|
150
|
+
}
|
|
151
|
+
for (const interiorRing of interiorRings) {
|
|
152
|
+
writer.writeUInt32LE(interiorRing.length);
|
|
153
|
+
for (const coordinate of interiorRing) {
|
|
154
|
+
writeCoordinate(writer, coordinate, options);
|
|
155
|
+
}
|
|
161
156
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return writer.arrayBuffer;
|
|
157
|
+
return writer.arrayBuffer;
|
|
165
158
|
}
|
|
166
|
-
|
|
159
|
+
/** Get encoded size of Polygon geometry */
|
|
167
160
|
function getPolygonSize(coordinates, options) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
size
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return size;
|
|
161
|
+
const coordinateSize = getCoordinateSize(options);
|
|
162
|
+
const [exteriorRing, ...interiorRings] = coordinates;
|
|
163
|
+
let size = 1 + 4 + 4;
|
|
164
|
+
if (exteriorRing.length > 0) {
|
|
165
|
+
size += 4 + exteriorRing.length * coordinateSize;
|
|
166
|
+
}
|
|
167
|
+
for (const interiorRing of interiorRings) {
|
|
168
|
+
size += 4 + interiorRing.length * coordinateSize;
|
|
169
|
+
}
|
|
170
|
+
return size;
|
|
181
171
|
}
|
|
182
|
-
|
|
172
|
+
/** Encode MultiPoint geometry as WKB ArrayBufer */
|
|
183
173
|
function encodeMultiPoint(multiPoint, options) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
return writer.arrayBuffer;
|
|
174
|
+
const writer = new binary_writer_1.default(getMultiPointSize(multiPoint, options));
|
|
175
|
+
const points = multiPoint.coordinates;
|
|
176
|
+
writer.writeInt8(1);
|
|
177
|
+
writeWkbType(writer, WKB.MultiPoint, options);
|
|
178
|
+
writer.writeUInt32LE(points.length);
|
|
179
|
+
for (const point of points) {
|
|
180
|
+
// TODO: add srid to this options object? {srid: multiPoint.srid}
|
|
181
|
+
const arrayBuffer = encodePoint(point, options);
|
|
182
|
+
writer.writeBuffer(arrayBuffer);
|
|
183
|
+
}
|
|
184
|
+
return writer.arrayBuffer;
|
|
196
185
|
}
|
|
197
|
-
|
|
186
|
+
/** Get encoded size of MultiPoint geometry */
|
|
198
187
|
function getMultiPointSize(multiPoint, options) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
188
|
+
let coordinateSize = getCoordinateSize(options);
|
|
189
|
+
const points = multiPoint.coordinates;
|
|
190
|
+
// This is because each point has a 5-byte header?
|
|
191
|
+
coordinateSize += 5;
|
|
192
|
+
return 1 + 4 + 4 + points.length * coordinateSize;
|
|
203
193
|
}
|
|
204
|
-
|
|
194
|
+
/** Encode MultiLineString geometry as WKB ArrayBufer */
|
|
205
195
|
function encodeMultiLineString(multiLineString, options) {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return writer.arrayBuffer;
|
|
196
|
+
const writer = new binary_writer_1.default(getMultiLineStringSize(multiLineString, options));
|
|
197
|
+
const lineStrings = multiLineString.coordinates;
|
|
198
|
+
writer.writeInt8(1);
|
|
199
|
+
writeWkbType(writer, WKB.MultiLineString, options);
|
|
200
|
+
writer.writeUInt32LE(lineStrings.length);
|
|
201
|
+
for (const lineString of lineStrings) {
|
|
202
|
+
// TODO: Handle srid?
|
|
203
|
+
const encodedLineString = encodeLineString(lineString, options);
|
|
204
|
+
writer.writeBuffer(encodedLineString);
|
|
205
|
+
}
|
|
206
|
+
return writer.arrayBuffer;
|
|
218
207
|
}
|
|
219
|
-
|
|
208
|
+
/** Get encoded size of MultiLineString geometry */
|
|
220
209
|
function getMultiLineStringSize(multiLineString, options) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
return size;
|
|
210
|
+
let size = 1 + 4 + 4;
|
|
211
|
+
const lineStrings = multiLineString.coordinates;
|
|
212
|
+
for (const lineString of lineStrings) {
|
|
213
|
+
size += getLineStringSize(lineString, options);
|
|
214
|
+
}
|
|
215
|
+
return size;
|
|
229
216
|
}
|
|
230
|
-
|
|
231
217
|
function encodeMultiPolygon(multiPolygon, options) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
return writer.arrayBuffer;
|
|
218
|
+
const writer = new binary_writer_1.default(getMultiPolygonSize(multiPolygon, options));
|
|
219
|
+
const polygons = multiPolygon.coordinates;
|
|
220
|
+
writer.writeInt8(1);
|
|
221
|
+
writeWkbType(writer, WKB.MultiPolygon, options);
|
|
222
|
+
writer.writeUInt32LE(polygons.length);
|
|
223
|
+
for (const polygon of polygons) {
|
|
224
|
+
const encodedPolygon = encodePolygon(polygon, options);
|
|
225
|
+
writer.writeBuffer(encodedPolygon);
|
|
226
|
+
}
|
|
227
|
+
return writer.arrayBuffer;
|
|
244
228
|
}
|
|
245
|
-
|
|
246
229
|
function getMultiPolygonSize(multiPolygon, options) {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return size;
|
|
230
|
+
let size = 1 + 4 + 4;
|
|
231
|
+
const polygons = multiPolygon.coordinates;
|
|
232
|
+
for (const polygon of polygons) {
|
|
233
|
+
size += getPolygonSize(polygon, options);
|
|
234
|
+
}
|
|
235
|
+
return size;
|
|
255
236
|
}
|
|
256
|
-
|
|
257
237
|
function encodeGeometryCollection(collection, options) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
return writer.arrayBuffer;
|
|
238
|
+
const writer = new binary_writer_1.default(getGeometryCollectionSize(collection, options));
|
|
239
|
+
writer.writeInt8(1);
|
|
240
|
+
writeWkbType(writer, WKB.GeometryCollection, options);
|
|
241
|
+
writer.writeUInt32LE(collection.geometries.length);
|
|
242
|
+
for (const geometry of collection.geometries) {
|
|
243
|
+
// TODO: handle srid? {srid: collection.srid}
|
|
244
|
+
const arrayBuffer = encodeWKB(geometry, options);
|
|
245
|
+
writer.writeBuffer(arrayBuffer);
|
|
246
|
+
}
|
|
247
|
+
return writer.arrayBuffer;
|
|
269
248
|
}
|
|
270
|
-
|
|
271
249
|
function getGeometryCollectionSize(collection, options) {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
return size;
|
|
250
|
+
let size = 1 + 4 + 4;
|
|
251
|
+
for (const geometry of collection.geometries) {
|
|
252
|
+
size += getGeometrySize(geometry, options);
|
|
253
|
+
}
|
|
254
|
+
return size;
|
|
279
255
|
}
|
|
280
|
-
|
|
256
|
+
// HELPERS
|
|
257
|
+
/**
|
|
258
|
+
* Construct and write WKB integer code
|
|
259
|
+
* Reference: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry#Well-known_binary
|
|
260
|
+
*/
|
|
281
261
|
function writeWkbType(writer, geometryType, options) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
} else if (hasM) {
|
|
295
|
-
dimensionType += 2000;
|
|
262
|
+
const { hasZ, hasM, srid } = options;
|
|
263
|
+
let dimensionType = 0;
|
|
264
|
+
if (!srid) {
|
|
265
|
+
if (hasZ && hasM) {
|
|
266
|
+
dimensionType += 3000;
|
|
267
|
+
}
|
|
268
|
+
else if (hasZ) {
|
|
269
|
+
dimensionType += 1000;
|
|
270
|
+
}
|
|
271
|
+
else if (hasM) {
|
|
272
|
+
dimensionType += 2000;
|
|
273
|
+
}
|
|
296
274
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
275
|
+
else {
|
|
276
|
+
if (hasZ) {
|
|
277
|
+
dimensionType |= 0x80000000;
|
|
278
|
+
}
|
|
279
|
+
if (hasM) {
|
|
280
|
+
dimensionType |= 0x40000000;
|
|
281
|
+
}
|
|
300
282
|
}
|
|
301
|
-
|
|
302
|
-
if (hasM) {
|
|
303
|
-
dimensionType |= 0x40000000;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
writer.writeUInt32LE(dimensionType + geometryType >>> 0);
|
|
283
|
+
writer.writeUInt32LE((dimensionType + geometryType) >>> 0);
|
|
308
284
|
}
|
|
309
|
-
|
|
285
|
+
/** Get coordinate size given Z/M dimensions */
|
|
310
286
|
function getCoordinateSize(options) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
coordinateSize
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
return coordinateSize;
|
|
287
|
+
let coordinateSize = 16;
|
|
288
|
+
if (options.hasZ) {
|
|
289
|
+
coordinateSize += 8;
|
|
290
|
+
}
|
|
291
|
+
if (options.hasM) {
|
|
292
|
+
coordinateSize += 8;
|
|
293
|
+
}
|
|
294
|
+
return coordinateSize;
|
|
322
295
|
}
|
|
323
|
-
//# sourceMappingURL=encode-wkb.js.map
|
package/dist/lib/encode-wkt.js
CHANGED
|
@@ -1,52 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Stringifies a GeoJSON object into WKT
|
|
5
|
+
* @param geojson
|
|
6
|
+
* @returns string
|
|
7
|
+
*/
|
|
8
|
+
function encodeWKT(geometry) {
|
|
9
|
+
if (geometry.type === 'Feature') {
|
|
10
|
+
geometry = geometry.geometry;
|
|
11
|
+
}
|
|
12
|
+
switch (geometry.type) {
|
|
13
|
+
case 'Point':
|
|
14
|
+
return `POINT ${wrapParens(pairWKT(geometry.coordinates))}`;
|
|
15
|
+
case 'LineString':
|
|
16
|
+
return `LINESTRING ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
17
|
+
case 'Polygon':
|
|
18
|
+
return `POLYGON ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
19
|
+
case 'MultiPoint':
|
|
20
|
+
return `MULTIPOINT ${wrapParens(ringWKT(geometry.coordinates))}`;
|
|
21
|
+
case 'MultiPolygon':
|
|
22
|
+
return `MULTIPOLYGON ${wrapParens(multiRingsWKT(geometry.coordinates))}`;
|
|
23
|
+
case 'MultiLineString':
|
|
24
|
+
return `MULTILINESTRING ${wrapParens(ringsWKT(geometry.coordinates))}`;
|
|
25
|
+
case 'GeometryCollection':
|
|
26
|
+
return `GEOMETRYCOLLECTION ${wrapParens(geometry.geometries.map(encodeWKT).join(', '))}`;
|
|
27
|
+
default:
|
|
28
|
+
throw new Error('stringify requires a valid GeoJSON Feature or geometry object as input');
|
|
29
|
+
}
|
|
31
30
|
}
|
|
32
|
-
|
|
31
|
+
exports.default = encodeWKT;
|
|
33
32
|
function pairWKT(c) {
|
|
34
|
-
|
|
33
|
+
return c.join(' ');
|
|
35
34
|
}
|
|
36
|
-
|
|
37
35
|
function ringWKT(r) {
|
|
38
|
-
|
|
36
|
+
return r.map(pairWKT).join(', ');
|
|
39
37
|
}
|
|
40
|
-
|
|
41
38
|
function ringsWKT(r) {
|
|
42
|
-
|
|
39
|
+
return r.map(ringWKT).map(wrapParens).join(', ');
|
|
43
40
|
}
|
|
44
|
-
|
|
45
41
|
function multiRingsWKT(r) {
|
|
46
|
-
|
|
42
|
+
return r.map(ringsWKT).map(wrapParens).join(', ');
|
|
47
43
|
}
|
|
48
|
-
|
|
49
44
|
function wrapParens(s) {
|
|
50
|
-
|
|
45
|
+
return `(${s})`;
|
|
51
46
|
}
|
|
52
|
-
//# sourceMappingURL=encode-wkt.js.map
|