@math.gl/wkb 5.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/wkt.js ADDED
@@ -0,0 +1,224 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { getWellKnownDimensionSize, inferWellKnownGeometryDimension } from "./types.js";
5
+ /** Parses one WKT geometry, including Z/M/ZM, collections, alternate MultiPoint, and empties. */
6
+ export function parseWKT(text) {
7
+ const parser = new WKTParser(text);
8
+ const geometry = parser.parseGeometry(2);
9
+ parser.assertComplete();
10
+ return geometry;
11
+ }
12
+ /** Formats one geometry as WKT using an explicit or tuple-inferred semantic dimension. */
13
+ export function formatWKT(geometry, dimension = inferWellKnownGeometryDimension(geometry)) {
14
+ const dimensionToken = dimension === 'xy' ? '' : ` ${dimension.slice(2).toUpperCase()}`;
15
+ if (geometry.type === 'GeometryCollection') {
16
+ if (geometry.geometries.length === 0)
17
+ return `GEOMETRYCOLLECTION${dimensionToken} EMPTY`;
18
+ return `GEOMETRYCOLLECTION${dimensionToken} (${geometry.geometries.map(child => formatWKT(child, dimension)).join(', ')})`;
19
+ }
20
+ const type = geometry.type.toUpperCase();
21
+ if (isEmptyCoordinates(geometry.coordinates))
22
+ return `${type}${dimensionToken} EMPTY`;
23
+ return `${type}${dimensionToken} ${formatCoordinateNesting(geometry.coordinates, getGeometryDepth(geometry.type))}`;
24
+ }
25
+ class WKTParser {
26
+ constructor(text) {
27
+ this.index = 0;
28
+ this.tokens = tokenizeWKT(text);
29
+ }
30
+ parseGeometry(inheritedDimensionSize) {
31
+ const type = this.takeWord().toUpperCase();
32
+ let dimensionSize = inheritedDimensionSize;
33
+ if (['Z', 'M', 'ZM'].includes(this.peek().toUpperCase())) {
34
+ const dimension = this.take().toUpperCase();
35
+ dimensionSize = dimension === 'ZM' ? 4 : 3;
36
+ }
37
+ if (this.peek().toUpperCase() === 'EMPTY') {
38
+ this.take();
39
+ return makeEmptyGeometry(type, dimensionSize);
40
+ }
41
+ if (type === 'GEOMETRYCOLLECTION') {
42
+ this.expect('(');
43
+ const geometries = [];
44
+ if (this.peek() !== ')') {
45
+ do
46
+ geometries.push(this.parseGeometry(dimensionSize));
47
+ while (this.takeIf(','));
48
+ }
49
+ this.expect(')');
50
+ return { type: 'GeometryCollection', geometries };
51
+ }
52
+ const coordinates = this.parseCoordinateNesting(getWKTDepth(type), dimensionSize);
53
+ return makeGeometry(type, coordinates);
54
+ }
55
+ assertComplete() {
56
+ if (this.index !== this.tokens.length)
57
+ throw new Error(`Unexpected WKT token ${this.peek()}`);
58
+ }
59
+ parseCoordinateNesting(depth, dimensionSize) {
60
+ this.expect('(');
61
+ if (depth === 0) {
62
+ const coordinate = this.readCoordinate(dimensionSize);
63
+ this.expect(')');
64
+ return coordinate;
65
+ }
66
+ const values = [];
67
+ if (this.peek() !== ')') {
68
+ do {
69
+ if (depth === 1 && this.peek() !== '(') {
70
+ values.push(this.readCoordinate(dimensionSize));
71
+ }
72
+ else {
73
+ values.push(this.parseCoordinateNesting(depth - 1, dimensionSize));
74
+ }
75
+ } while (this.takeIf(','));
76
+ }
77
+ this.expect(')');
78
+ return values;
79
+ }
80
+ readCoordinate(dimensionSize) {
81
+ const values = [];
82
+ while (values.length < dimensionSize && isNumberToken(this.peek())) {
83
+ values.push(Number(this.take()));
84
+ }
85
+ if (values.length < 2)
86
+ throw new Error('WKT coordinate requires at least two numbers');
87
+ return values;
88
+ }
89
+ peek() {
90
+ return this.tokens[this.index] || '';
91
+ }
92
+ take() {
93
+ if (this.index >= this.tokens.length)
94
+ throw new Error('Unexpected end of WKT');
95
+ return this.tokens[this.index++];
96
+ }
97
+ takeWord() {
98
+ const token = this.take();
99
+ if (!/^[A-Za-z_]+$/.test(token))
100
+ throw new Error(`Expected WKT geometry type, found ${token}`);
101
+ return token;
102
+ }
103
+ takeIf(token) {
104
+ if (this.peek() !== token)
105
+ return false;
106
+ this.index++;
107
+ return true;
108
+ }
109
+ expect(token) {
110
+ const actual = this.take();
111
+ if (actual !== token)
112
+ throw new Error(`Expected WKT token ${token}, found ${actual}`);
113
+ }
114
+ }
115
+ function tokenizeWKT(text) {
116
+ const tokens = [];
117
+ const tokenPattern = /[A-Za-z_]+|[(),]|[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/gy;
118
+ let index = 0;
119
+ while (index < text.length) {
120
+ while (index < text.length && /\s/.test(text[index]))
121
+ index++;
122
+ if (index === text.length)
123
+ break;
124
+ tokenPattern.lastIndex = index;
125
+ const match = tokenPattern.exec(text);
126
+ if (!match) {
127
+ throw new Error(`Unexpected WKT character ${JSON.stringify(text[index])} at ${index}`);
128
+ }
129
+ tokens.push(match[0]);
130
+ index = tokenPattern.lastIndex;
131
+ }
132
+ return tokens;
133
+ }
134
+ function formatCoordinateNesting(value, depth) {
135
+ if (depth === 0)
136
+ return `(${value.map(formatNumber).join(' ')})`;
137
+ return `(${value
138
+ .map(child => {
139
+ if (depth === 1)
140
+ return child.map(formatNumber).join(' ');
141
+ return formatCoordinateNesting(child, depth - 1);
142
+ })
143
+ .join(', ')})`;
144
+ }
145
+ function formatNumber(value) {
146
+ if (!Number.isFinite(value))
147
+ return 'NaN';
148
+ return String(value);
149
+ }
150
+ function getGeometryDepth(type) {
151
+ switch (type) {
152
+ case 'Point':
153
+ return 0;
154
+ case 'LineString':
155
+ case 'MultiPoint':
156
+ return 1;
157
+ case 'Polygon':
158
+ case 'MultiLineString':
159
+ return 2;
160
+ case 'MultiPolygon':
161
+ return 3;
162
+ }
163
+ }
164
+ function getWKTDepth(type) {
165
+ switch (type) {
166
+ case 'POINT':
167
+ return 0;
168
+ case 'LINESTRING':
169
+ return 1;
170
+ case 'POLYGON':
171
+ return 2;
172
+ case 'MULTIPOINT':
173
+ return 1;
174
+ case 'MULTILINESTRING':
175
+ return 2;
176
+ case 'MULTIPOLYGON':
177
+ return 3;
178
+ default:
179
+ throw new Error(`Unsupported WKT geometry type ${type}`);
180
+ }
181
+ }
182
+ function makeGeometry(type, coordinates) {
183
+ const canonical = type[0] + type.slice(1).toLowerCase();
184
+ const names = {
185
+ Point: 'Point',
186
+ Linestring: 'LineString',
187
+ Polygon: 'Polygon',
188
+ Multipoint: 'MultiPoint',
189
+ Multilinestring: 'MultiLineString',
190
+ Multipolygon: 'MultiPolygon'
191
+ };
192
+ const geometryType = names[canonical];
193
+ if (!geometryType)
194
+ throw new Error(`Unsupported WKT geometry type ${type}`);
195
+ return { type: geometryType, coordinates };
196
+ }
197
+ function makeEmptyGeometry(type, dimensionSize) {
198
+ if (type === 'GEOMETRYCOLLECTION')
199
+ return { type: 'GeometryCollection', geometries: [] };
200
+ if (type === 'POINT') {
201
+ return {
202
+ type: 'Point',
203
+ coordinates: new Array(getValidDimensionSize(dimensionSize)).fill(Number.NaN)
204
+ };
205
+ }
206
+ return makeGeometry(type, []);
207
+ }
208
+ function getValidDimensionSize(size) {
209
+ if (size === 2 || size === 3 || size === 4)
210
+ return size;
211
+ return getWellKnownDimensionSize('xy');
212
+ }
213
+ function isEmptyCoordinates(value) {
214
+ if (value.length === 0)
215
+ return true;
216
+ if (typeof value[0] === 'number') {
217
+ return value.every(component => !Number.isFinite(component));
218
+ }
219
+ return value.every(child => isEmptyCoordinates(child));
220
+ }
221
+ function isNumberToken(token) {
222
+ return token !== '' && Number.isFinite(Number(token));
223
+ }
224
+ //# sourceMappingURL=wkt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wkt.js","sourceRoot":"","sources":["../src/wkt.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@math.gl/wkb",
3
+ "description": "Dependency-free WKB and WKT geometry codecs",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "version": "5.0.0-alpha.2",
10
+ "keywords": [
11
+ "wkb",
12
+ "wkt",
13
+ "geometry",
14
+ "geospatial",
15
+ "math"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/visgl/math.gl.git"
20
+ },
21
+ "types": "dist/index.d.ts",
22
+ "main": "dist/index.cjs",
23
+ "module": "dist/index.js",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.cjs"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "src"
34
+ ],
35
+ "sideEffects": false,
36
+ "gitHead": "1b21ecbe8872e604b1b362fe09ab59240bd5b41e"
37
+ }
package/src/index.ts ADDED
@@ -0,0 +1,37 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export type {WellKnownDimension, WellKnownGeometry} from './types';
6
+ export {
7
+ getWellKnownDimensionSize,
8
+ inferWellKnownGeometryDimension
9
+ } from './types';
10
+
11
+ export type {WKBParseOptions, WKBParseResult} from './wkb';
12
+ export {parseWKB, writeWKB} from './wkb';
13
+
14
+ export type {
15
+ WKBBounds,
16
+ WKBDialect,
17
+ WKBGeometryCounts,
18
+ WKBGeometryType,
19
+ WKBHeader,
20
+ WKBScanResult,
21
+ WKBTraversalOptions,
22
+ WKBVisitor
23
+ } from './wkb-reader';
24
+ export {inspectWKBHeader, scanWKB, visitWKB} from './wkb-reader';
25
+
26
+ export type {
27
+ WKBBuilderBaseOptions,
28
+ WKBBuilderMeasureOptions,
29
+ WKBBuilderOptions,
30
+ WKBBuilderWriteOptions,
31
+ WKBCoordinateTransform,
32
+ WKBGeometryArray,
33
+ WKBGeometryWriter
34
+ } from './wkb-builder';
35
+ export {WKBBuilder} from './wkb-builder';
36
+
37
+ export {formatWKT, parseWKT} from './wkt';
package/src/types.ts ADDED
@@ -0,0 +1,54 @@
1
+ // math.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /** Semantic coordinate dimensions used by WKB and WKT. M is distinct from Z. */
6
+ export type WellKnownDimension = 'xy' | 'xyz' | 'xym' | 'xyzm';
7
+
8
+ /** Immutable, format-neutral geometry value shared by the WKB and WKT codecs. */
9
+ export type WellKnownGeometry =
10
+ | Readonly<{type: 'Point'; coordinates: readonly number[]}>
11
+ | Readonly<{type: 'LineString'; coordinates: readonly (readonly number[])[]}>
12
+ | Readonly<{type: 'Polygon'; coordinates: readonly (readonly (readonly number[])[])[]}>
13
+ | Readonly<{type: 'MultiPoint'; coordinates: readonly (readonly number[])[]}>
14
+ | Readonly<{
15
+ type: 'MultiLineString';
16
+ coordinates: readonly (readonly (readonly number[])[])[];
17
+ }>
18
+ | Readonly<{
19
+ type: 'MultiPolygon';
20
+ coordinates: readonly (readonly (readonly (readonly number[])[])[])[];
21
+ }>
22
+ | Readonly<{type: 'GeometryCollection'; geometries: readonly WellKnownGeometry[]}>;
23
+
24
+ /** Returns the number of coordinate components in a semantic dimension. */
25
+ export function getWellKnownDimensionSize(dimension: WellKnownDimension): 2 | 3 | 4 {
26
+ switch (dimension) {
27
+ case 'xy':
28
+ return 2;
29
+ case 'xyz':
30
+ case 'xym':
31
+ return 3;
32
+ case 'xyzm':
33
+ return 4;
34
+ }
35
+ }
36
+
37
+ /** Infers tuple width from the deepest non-empty geometry coordinate. Three values mean XYZ. */
38
+ export function inferWellKnownGeometryDimension(geometry: WellKnownGeometry): WellKnownDimension {
39
+ const size = getGeometryDimensionSize(geometry);
40
+ return size >= 4 ? 'xyzm' : size === 3 ? 'xyz' : 'xy';
41
+ }
42
+
43
+ function getGeometryDimensionSize(geometry: WellKnownGeometry): number {
44
+ if (geometry.type === 'GeometryCollection') {
45
+ return Math.max(2, ...geometry.geometries.map(getGeometryDimensionSize));
46
+ }
47
+ return getCoordinateDimension(geometry.coordinates);
48
+ }
49
+
50
+ function getCoordinateDimension(value: readonly unknown[]): number {
51
+ if (value.length === 0) return 2;
52
+ if (typeof value[0] === 'number') return value.length;
53
+ return Math.max(2, ...value.map(child => getCoordinateDimension(child as readonly unknown[])));
54
+ }