@loaders.gl/wkt 4.0.0-alpha.5 → 4.0.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.
Files changed (93) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/dist.min.js +9 -3
  3. package/dist/es5/bundle.js +6 -0
  4. package/dist/es5/bundle.js.map +1 -0
  5. package/dist/es5/index.js +46 -0
  6. package/dist/es5/index.js.map +1 -0
  7. package/dist/es5/lib/encode-wkb.js +373 -0
  8. package/dist/es5/lib/encode-wkb.js.map +1 -0
  9. package/dist/es5/lib/encode-wkt.js +45 -0
  10. package/dist/es5/lib/encode-wkt.js.map +1 -0
  11. package/dist/es5/lib/parse-wkb.js +290 -0
  12. package/dist/es5/lib/parse-wkb.js.map +1 -0
  13. package/dist/es5/lib/parse-wkt.js +176 -0
  14. package/dist/es5/lib/parse-wkt.js.map +1 -0
  15. package/dist/es5/lib/utils/binary-writer.js +161 -0
  16. package/dist/es5/lib/utils/binary-writer.js.map +1 -0
  17. package/dist/es5/lib/utils/version.js +9 -0
  18. package/dist/es5/lib/utils/version.js.map +1 -0
  19. package/dist/es5/wkb-loader.js +54 -0
  20. package/dist/es5/wkb-loader.js.map +1 -0
  21. package/dist/es5/wkb-writer.js +25 -0
  22. package/dist/es5/wkb-writer.js.map +1 -0
  23. package/dist/es5/wkt-loader.js +51 -0
  24. package/dist/es5/wkt-loader.js.map +1 -0
  25. package/dist/es5/wkt-writer.js +22 -0
  26. package/dist/es5/wkt-writer.js.map +1 -0
  27. package/dist/es5/workers/wkb-worker.js +6 -0
  28. package/dist/es5/workers/wkb-worker.js.map +1 -0
  29. package/dist/es5/workers/wkt-worker.js +6 -0
  30. package/dist/es5/workers/wkt-worker.js.map +1 -0
  31. package/dist/esm/bundle.js +4 -0
  32. package/dist/esm/bundle.js.map +1 -0
  33. package/dist/esm/index.js +5 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/lib/encode-wkb.js +252 -0
  36. package/dist/esm/lib/encode-wkb.js.map +1 -0
  37. package/dist/esm/lib/encode-wkt.js +39 -0
  38. package/dist/esm/lib/encode-wkt.js.map +1 -0
  39. package/dist/esm/lib/parse-wkb.js +255 -0
  40. package/dist/esm/lib/parse-wkb.js.map +1 -0
  41. package/dist/esm/lib/parse-wkt.js +170 -0
  42. package/dist/esm/lib/parse-wkt.js.map +1 -0
  43. package/dist/esm/lib/utils/binary-writer.js +114 -0
  44. package/dist/esm/lib/utils/binary-writer.js.map +1 -0
  45. package/dist/esm/lib/utils/version.js +2 -0
  46. package/dist/esm/lib/utils/version.js.map +1 -0
  47. package/dist/esm/wkb-loader.js +23 -0
  48. package/dist/esm/wkb-loader.js.map +1 -0
  49. package/dist/esm/wkb-writer.js +17 -0
  50. package/dist/esm/wkb-writer.js.map +1 -0
  51. package/dist/esm/wkt-loader.js +22 -0
  52. package/dist/esm/wkt-loader.js.map +1 -0
  53. package/dist/esm/wkt-writer.js +14 -0
  54. package/dist/esm/wkt-writer.js.map +1 -0
  55. package/dist/esm/workers/wkb-worker.js +4 -0
  56. package/dist/esm/workers/wkb-worker.js.map +1 -0
  57. package/dist/esm/workers/wkt-worker.js +4 -0
  58. package/dist/esm/workers/wkt-worker.js.map +1 -0
  59. package/dist/index.js +13 -5
  60. package/dist/lib/encode-wkb.d.ts +6 -1
  61. package/dist/lib/encode-wkb.d.ts.map +1 -1
  62. package/dist/lib/encode-wkb.js +250 -278
  63. package/dist/lib/encode-wkt.js +35 -41
  64. package/dist/lib/parse-wkb.js +208 -276
  65. package/dist/lib/parse-wkt.js +218 -189
  66. package/dist/lib/utils/binary-writer.js +117 -150
  67. package/dist/lib/utils/version.js +7 -2
  68. package/dist/wkb-loader.js +32 -20
  69. package/dist/wkb-writer.d.ts +1 -1
  70. package/dist/wkb-writer.d.ts.map +1 -1
  71. package/dist/wkb-writer.js +25 -13
  72. package/dist/wkt-loader.js +31 -19
  73. package/dist/wkt-worker.js +48 -16
  74. package/dist/wkt-writer.js +22 -13
  75. package/dist/workers/wkb-worker.js +5 -4
  76. package/dist/workers/wkt-worker.js +5 -4
  77. package/package.json +6 -6
  78. package/src/lib/encode-wkb.ts +12 -1
  79. package/src/wkb-writer.ts +6 -3
  80. package/dist/bundle.js.map +0 -1
  81. package/dist/index.js.map +0 -1
  82. package/dist/lib/encode-wkb.js.map +0 -1
  83. package/dist/lib/encode-wkt.js.map +0 -1
  84. package/dist/lib/parse-wkb.js.map +0 -1
  85. package/dist/lib/parse-wkt.js.map +0 -1
  86. package/dist/lib/utils/binary-writer.js.map +0 -1
  87. package/dist/lib/utils/version.js.map +0 -1
  88. package/dist/wkb-loader.js.map +0 -1
  89. package/dist/wkb-writer.js.map +0 -1
  90. package/dist/wkt-loader.js.map +0 -1
  91. package/dist/wkt-writer.js.map +0 -1
  92. package/dist/workers/wkb-worker.js.map +0 -1
  93. package/dist/workers/wkt-worker.js.map +0 -1
@@ -1,323 +1,295 @@
1
- import BinaryWriter from './utils/binary-writer';
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
- WKB[WKB["Point"] = 1] = "Point";
6
- WKB[WKB["LineString"] = 2] = "LineString";
7
- WKB[WKB["Polygon"] = 3] = "Polygon";
8
- WKB[WKB["MultiPoint"] = 4] = "MultiPoint";
9
- WKB[WKB["MultiLineString"] = 5] = "MultiLineString";
10
- WKB[WKB["MultiPolygon"] = 6] = "MultiPolygon";
11
- WKB[WKB["GeometryCollection"] = 7] = "GeometryCollection";
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
- export default function encodeWKB(geometry, options = {
15
- hasZ: false,
16
- hasM: false
17
- }) {
18
- if (geometry.type === 'Feature') {
19
- geometry = geometry.geometry;
20
- }
21
-
22
- switch (geometry.type) {
23
- case 'Point':
24
- return encodePoint(geometry.coordinates, options);
25
-
26
- case 'LineString':
27
- return encodeLineString(geometry.coordinates, options);
28
-
29
- case 'Polygon':
30
- return encodePolygon(geometry.coordinates, options);
31
-
32
- case 'MultiPoint':
33
- return encodeMultiPoint(geometry, options);
34
-
35
- case 'MultiPolygon':
36
- return encodeMultiPolygon(geometry, options);
37
-
38
- case 'MultiLineString':
39
- return encodeMultiLineString(geometry, options);
40
-
41
- case 'GeometryCollection':
42
- return encodeGeometryCollection(geometry, options);
43
-
44
- default:
45
- const exhaustiveCheck = geometry;
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
- switch (geometry.type) {
52
- case 'Point':
53
- return getPointSize(options);
54
-
55
- case 'LineString':
56
- return getLineStringSize(geometry.coordinates, options);
57
-
58
- case 'Polygon':
59
- return getPolygonSize(geometry.coordinates, options);
60
-
61
- case 'MultiPoint':
62
- return getMultiPointSize(geometry, options);
63
-
64
- case 'MultiPolygon':
65
- return getMultiPolygonSize(geometry, options);
66
-
67
- case 'MultiLineString':
68
- return getMultiLineStringSize(geometry, options);
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
- const writer = new BinaryWriter(getPointSize(options));
81
- writer.writeInt8(1);
82
- writeWkbType(writer, WKB.Point, options);
83
-
84
- if (typeof coordinates[0] === 'undefined' && typeof coordinates[1] === 'undefined') {
85
- writer.writeDoubleLE(NaN);
86
- writer.writeDoubleLE(NaN);
87
-
88
- if (options.hasZ) {
89
- writer.writeDoubleLE(NaN);
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
- if (options.hasM) {
93
- writer.writeDoubleLE(NaN);
97
+ else {
98
+ writeCoordinate(writer, coordinates, options);
94
99
  }
95
- } else {
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
- writer.writeDoubleLE(coordinate[0]);
104
- writer.writeDoubleLE(coordinate[1]);
105
-
106
- if (options.hasZ) {
107
- writer.writeDoubleLE(coordinate[2]);
108
- }
109
-
110
- if (options.hasM) {
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
- const coordinateSize = getCoordinateSize(options);
117
- return 1 + 4 + coordinateSize;
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
- const size = getLineStringSize(coordinates, options);
122
- const writer = new BinaryWriter(size);
123
- writer.writeInt8(1);
124
- writeWkbType(writer, WKB.LineString, options);
125
- writer.writeUInt32LE(coordinates.length);
126
-
127
- for (const coordinate of coordinates) {
128
- writeCoordinate(writer, coordinate, options);
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
- const coordinateSize = getCoordinateSize(options);
136
- return 1 + 4 + 4 + coordinates.length * coordinateSize;
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
- const writer = new BinaryWriter(getPolygonSize(coordinates, options));
141
- writer.writeInt8(1);
142
- writeWkbType(writer, WKB.Polygon, options);
143
- const [exteriorRing, ...interiorRings] = coordinates;
144
-
145
- if (exteriorRing.length > 0) {
146
- writer.writeUInt32LE(1 + interiorRings.length);
147
- writer.writeUInt32LE(exteriorRing.length);
148
- } else {
149
- writer.writeUInt32LE(0);
150
- }
151
-
152
- for (const coordinate of exteriorRing) {
153
- writeCoordinate(writer, coordinate, options);
154
- }
155
-
156
- for (const interiorRing of interiorRings) {
157
- writer.writeUInt32LE(interiorRing.length);
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
- const coordinateSize = getCoordinateSize(options);
169
- const [exteriorRing, ...interiorRings] = coordinates;
170
- let size = 1 + 4 + 4;
171
-
172
- if (exteriorRing.length > 0) {
173
- size += 4 + exteriorRing.length * coordinateSize;
174
- }
175
-
176
- for (const interiorRing of interiorRings) {
177
- size += 4 + interiorRing.length * coordinateSize;
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
- const writer = new BinaryWriter(getMultiPointSize(multiPoint, options));
185
- const points = multiPoint.coordinates;
186
- writer.writeInt8(1);
187
- writeWkbType(writer, WKB.MultiPoint, options);
188
- writer.writeUInt32LE(points.length);
189
-
190
- for (const point of points) {
191
- const arrayBuffer = encodePoint(point, options);
192
- writer.writeBuffer(arrayBuffer);
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
- let coordinateSize = getCoordinateSize(options);
200
- const points = multiPoint.coordinates;
201
- coordinateSize += 5;
202
- return 1 + 4 + 4 + points.length * coordinateSize;
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
- const writer = new BinaryWriter(getMultiLineStringSize(multiLineString, options));
207
- const lineStrings = multiLineString.coordinates;
208
- writer.writeInt8(1);
209
- writeWkbType(writer, WKB.MultiLineString, options);
210
- writer.writeUInt32LE(lineStrings.length);
211
-
212
- for (const lineString of lineStrings) {
213
- const encodedLineString = encodeLineString(lineString, options);
214
- writer.writeBuffer(encodedLineString);
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
- let size = 1 + 4 + 4;
222
- const lineStrings = multiLineString.coordinates;
223
-
224
- for (const lineString of lineStrings) {
225
- size += getLineStringSize(lineString, options);
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
- const writer = new BinaryWriter(getMultiPolygonSize(multiPolygon, options));
233
- const polygons = multiPolygon.coordinates;
234
- writer.writeInt8(1);
235
- writeWkbType(writer, WKB.MultiPolygon, options);
236
- writer.writeUInt32LE(polygons.length);
237
-
238
- for (const polygon of polygons) {
239
- const encodedPolygon = encodePolygon(polygon, options);
240
- writer.writeBuffer(encodedPolygon);
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
- let size = 1 + 4 + 4;
248
- const polygons = multiPolygon.coordinates;
249
-
250
- for (const polygon of polygons) {
251
- size += getPolygonSize(polygon, options);
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
- const writer = new BinaryWriter(getGeometryCollectionSize(collection, options));
259
- writer.writeInt8(1);
260
- writeWkbType(writer, WKB.GeometryCollection, options);
261
- writer.writeUInt32LE(collection.geometries.length);
262
-
263
- for (const geometry of collection.geometries) {
264
- const arrayBuffer = encodeWKB(geometry, options);
265
- writer.writeBuffer(arrayBuffer);
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
- let size = 1 + 4 + 4;
273
-
274
- for (const geometry of collection.geometries) {
275
- size += getGeometrySize(geometry, options);
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
- const {
283
- hasZ,
284
- hasM,
285
- srid
286
- } = options;
287
- let dimensionType = 0;
288
-
289
- if (!srid) {
290
- if (hasZ && hasM) {
291
- dimensionType += 3000;
292
- } else if (hasZ) {
293
- dimensionType += 1000;
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
- } else {
298
- if (hasZ) {
299
- dimensionType |= 0x80000000;
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
- let coordinateSize = 16;
312
-
313
- if (options.hasZ) {
314
- coordinateSize += 8;
315
- }
316
-
317
- if (options.hasM) {
318
- coordinateSize += 8;
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
@@ -1,52 +1,46 @@
1
- export default function encodeWKT(geometry) {
2
- if (geometry.type === 'Feature') {
3
- geometry = geometry.geometry;
4
- }
5
-
6
- switch (geometry.type) {
7
- case 'Point':
8
- return "POINT ".concat(wrapParens(pairWKT(geometry.coordinates)));
9
-
10
- case 'LineString':
11
- return "LINESTRING ".concat(wrapParens(ringWKT(geometry.coordinates)));
12
-
13
- case 'Polygon':
14
- return "POLYGON ".concat(wrapParens(ringsWKT(geometry.coordinates)));
15
-
16
- case 'MultiPoint':
17
- return "MULTIPOINT ".concat(wrapParens(ringWKT(geometry.coordinates)));
18
-
19
- case 'MultiPolygon':
20
- return "MULTIPOLYGON ".concat(wrapParens(multiRingsWKT(geometry.coordinates)));
21
-
22
- case 'MultiLineString':
23
- return "MULTILINESTRING ".concat(wrapParens(ringsWKT(geometry.coordinates)));
24
-
25
- case 'GeometryCollection':
26
- return "GEOMETRYCOLLECTION ".concat(wrapParens(geometry.geometries.map(encodeWKT).join(', ')));
27
-
28
- default:
29
- throw new Error('stringify requires a valid GeoJSON Feature or geometry object as input');
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
- return c.join(' ');
33
+ return c.join(' ');
35
34
  }
36
-
37
35
  function ringWKT(r) {
38
- return r.map(pairWKT).join(', ');
36
+ return r.map(pairWKT).join(', ');
39
37
  }
40
-
41
38
  function ringsWKT(r) {
42
- return r.map(ringWKT).map(wrapParens).join(', ');
39
+ return r.map(ringWKT).map(wrapParens).join(', ');
43
40
  }
44
-
45
41
  function multiRingsWKT(r) {
46
- return r.map(ringsWKT).map(wrapParens).join(', ');
42
+ return r.map(ringsWKT).map(wrapParens).join(', ');
47
43
  }
48
-
49
44
  function wrapParens(s) {
50
- return "(".concat(s, ")");
45
+ return `(${s})`;
51
46
  }
52
- //# sourceMappingURL=encode-wkt.js.map