bruce-models 7.1.87 → 7.1.89
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/bruce-models.es5.js +2482 -176
- package/dist/bruce-models.es5.js.map +1 -1
- package/dist/bruce-models.umd.js +2475 -180
- package/dist/bruce-models.umd.js.map +1 -1
- package/dist/lib/bruce-models.js +3 -1
- package/dist/lib/bruce-models.js.map +1 -1
- package/dist/lib/client-file/client-file-value-map.js +197 -0
- package/dist/lib/client-file/client-file-value-map.js.map +1 -0
- package/dist/lib/client-file/client-file.js +0 -76
- package/dist/lib/client-file/client-file.js.map +1 -1
- package/dist/lib/client-file/value-map-grid.js +298 -0
- package/dist/lib/client-file/value-map-grid.js.map +1 -0
- package/dist/lib/client-file/value-map-metadata.js +362 -0
- package/dist/lib/client-file/value-map-metadata.js.map +1 -0
- package/dist/lib/client-file/value-map-reader.js +1547 -0
- package/dist/lib/client-file/value-map-reader.js.map +1 -0
- package/dist/lib/export/export-nsx.js +32 -0
- package/dist/lib/export/export-nsx.js.map +1 -0
- package/dist/types/bruce-models.d.ts +3 -1
- package/dist/types/client-file/client-file-value-map.d.ts +186 -0
- package/dist/types/client-file/client-file.d.ts +1 -14
- package/dist/types/client-file/value-map-grid.d.ts +108 -0
- package/dist/types/client-file/value-map-metadata.d.ts +176 -0
- package/dist/types/client-file/value-map-reader.d.ts +520 -0
- package/dist/types/export/export-nsx.d.ts +16 -0
- package/package.json +1 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValueMapGrid = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* The mapping between a value map's raster and the world.
|
|
6
|
+
* Turns a position, a bounding box or a ring into the texels they cover, and a texel back into a position.
|
|
7
|
+
*/
|
|
8
|
+
var ValueMapGrid;
|
|
9
|
+
(function (ValueMapGrid) {
|
|
10
|
+
/**
|
|
11
|
+
* A grid over one archive's extent.
|
|
12
|
+
*/
|
|
13
|
+
class Grid {
|
|
14
|
+
/**
|
|
15
|
+
* A grid over a Geometry block, sized either by the block or by a composite passed in.
|
|
16
|
+
*/
|
|
17
|
+
constructor(geometry, width, height, extent) {
|
|
18
|
+
const block = Object.assign({}, geometry || {}, extent || {});
|
|
19
|
+
const needed = ["West", "East", "South", "North"];
|
|
20
|
+
if (width == null || height == null) {
|
|
21
|
+
needed.push("ResolutionX", "ResolutionY");
|
|
22
|
+
}
|
|
23
|
+
for (const key of needed) {
|
|
24
|
+
if (block[key] == null) {
|
|
25
|
+
throw new Error("The value map's Geometry block has no " + key
|
|
26
|
+
+ ", so its raster cannot be placed on the world.");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
this.Width = width != null ? Math.round(width) : Math.round(block.ResolutionX);
|
|
30
|
+
this.Height = height != null ? Math.round(height) : Math.round(block.ResolutionY);
|
|
31
|
+
this.West = block.West;
|
|
32
|
+
this.East = block.East;
|
|
33
|
+
this.South = block.South;
|
|
34
|
+
this.North = block.North;
|
|
35
|
+
this.LonStep = (this.East - this.West) / this.Width;
|
|
36
|
+
this.LatStep = (this.North - this.South) / this.Height;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The position of a texel corner.
|
|
40
|
+
*/
|
|
41
|
+
Corner(x, y) {
|
|
42
|
+
return {
|
|
43
|
+
Longitude: this.West + x * this.LonStep,
|
|
44
|
+
Latitude: this.North - y * this.LatStep
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The position at the middle of a texel, which is where its value was sampled.
|
|
49
|
+
*/
|
|
50
|
+
Centre(row, column) {
|
|
51
|
+
return {
|
|
52
|
+
Longitude: this.West + (column + 0.5) * this.LonStep,
|
|
53
|
+
Latitude: this.North - (row + 0.5) * this.LatStep
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The texel covering a position, or null when it falls outside the raster.
|
|
58
|
+
*/
|
|
59
|
+
TexelAt(longitude, latitude) {
|
|
60
|
+
const column = Math.floor((longitude - this.West) / this.LonStep);
|
|
61
|
+
const row = Math.floor((this.North - latitude) / this.LatStep);
|
|
62
|
+
if (row >= 0 && row < this.Height && column >= 0 && column < this.Width) {
|
|
63
|
+
return { Row: row, Column: column };
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A ring of texel corners as positions.
|
|
69
|
+
*/
|
|
70
|
+
RingToPoints(ring) {
|
|
71
|
+
return ring.map((corner) => this.Corner(corner.X, corner.Y));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Every texel a bounding box covers, clipped to the raster.
|
|
75
|
+
*
|
|
76
|
+
* The whole box rather than its middle, since something smaller than a texel still lands on
|
|
77
|
+
* two when it sits on the join, and reading only the centre would miss the other one.
|
|
78
|
+
*/
|
|
79
|
+
TexelsIn(bounds) {
|
|
80
|
+
if (!bounds) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const west = bounds.minLongitude;
|
|
84
|
+
const east = bounds.maxLongitude;
|
|
85
|
+
const south = bounds.minLatitude;
|
|
86
|
+
const north = bounds.maxLatitude;
|
|
87
|
+
if (west == null || east == null || south == null || north == null) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
if (east < this.West || west > this.East || north < this.South || south > this.North) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
// Clamped rather than dropped, so a box overlapping an edge keeps the part that is on
|
|
94
|
+
// the raster instead of reporting nothing.
|
|
95
|
+
const left = this.clampColumn((west - this.West) / this.LonStep);
|
|
96
|
+
const right = this.clampColumn((east - this.West) / this.LonStep);
|
|
97
|
+
const top = this.clampRow((this.North - north) / this.LatStep);
|
|
98
|
+
const bottom = this.clampRow((this.North - south) / this.LatStep);
|
|
99
|
+
const hits = [];
|
|
100
|
+
for (let row = top; row <= bottom; row++) {
|
|
101
|
+
for (let column = left; column <= right; column++) {
|
|
102
|
+
hits.push({ Row: row, Column: column });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return hits;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Every texel a closed ring actually touches, rather than every texel its box covers.
|
|
109
|
+
*
|
|
110
|
+
* A box always claims at least as much as the shape inside it, so this can only ever take texels away.
|
|
111
|
+
*
|
|
112
|
+
* Slivers count: a ring clipping the corner of a texel has water there as much
|
|
113
|
+
* as one sitting in the middle of it, so an edge crossing the cell is a hit on its own.
|
|
114
|
+
*/
|
|
115
|
+
TexelsUnder(ring) {
|
|
116
|
+
const points = (ring || []).map((point) => ({
|
|
117
|
+
Longitude: point.Longitude,
|
|
118
|
+
Latitude: point.Latitude
|
|
119
|
+
}));
|
|
120
|
+
if (points.length < 3) {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
const first = points[0];
|
|
124
|
+
const last = points[points.length - 1];
|
|
125
|
+
if (first.Longitude !== last.Longitude || first.Latitude !== last.Latitude) {
|
|
126
|
+
points.push(first);
|
|
127
|
+
}
|
|
128
|
+
let minLon = Number.POSITIVE_INFINITY;
|
|
129
|
+
let maxLon = Number.NEGATIVE_INFINITY;
|
|
130
|
+
let minLat = Number.POSITIVE_INFINITY;
|
|
131
|
+
let maxLat = Number.NEGATIVE_INFINITY;
|
|
132
|
+
for (const point of points) {
|
|
133
|
+
minLon = Math.min(minLon, point.Longitude);
|
|
134
|
+
maxLon = Math.max(maxLon, point.Longitude);
|
|
135
|
+
minLat = Math.min(minLat, point.Latitude);
|
|
136
|
+
maxLat = Math.max(maxLat, point.Latitude);
|
|
137
|
+
}
|
|
138
|
+
if (maxLon < this.West || minLon > this.East || maxLat < this.South || minLat > this.North) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const left = this.clampColumn((minLon - this.West) / this.LonStep);
|
|
142
|
+
const right = this.clampColumn((maxLon - this.West) / this.LonStep);
|
|
143
|
+
const top = this.clampRow((this.North - maxLat) / this.LatStep);
|
|
144
|
+
const bottom = this.clampRow((this.North - minLat) / this.LatStep);
|
|
145
|
+
const hits = [];
|
|
146
|
+
for (let row = top; row <= bottom; row++) {
|
|
147
|
+
const north = this.North - row * this.LatStep;
|
|
148
|
+
const south = north - this.LatStep;
|
|
149
|
+
for (let column = left; column <= right; column++) {
|
|
150
|
+
const west = this.West + column * this.LonStep;
|
|
151
|
+
const east = west + this.LonStep;
|
|
152
|
+
if (CellMeetsRing(points, west, east, south, north)) {
|
|
153
|
+
hits.push({ Row: row, Column: column });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return hits;
|
|
158
|
+
}
|
|
159
|
+
clampColumn(at) {
|
|
160
|
+
return Math.max(0, Math.min(this.Width - 1, Math.floor(at)));
|
|
161
|
+
}
|
|
162
|
+
clampRow(at) {
|
|
163
|
+
return Math.max(0, Math.min(this.Height - 1, Math.floor(at)));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
ValueMapGrid.Grid = Grid;
|
|
167
|
+
// Metres per degree at the equator, used only to work out how many texels an extent implies at a given ground resolution.
|
|
168
|
+
const METRES_PER_DEGREE_LON = 111320;
|
|
169
|
+
const METRES_PER_DEGREE_LAT = 110574;
|
|
170
|
+
/**
|
|
171
|
+
* The grid a set of tiles should be composited onto, sized so the finest one keeps its detail.
|
|
172
|
+
*
|
|
173
|
+
* Capped, because a pyramid's finest tile can imply a raster far larger than either an analysis
|
|
174
|
+
* or a texture upload needs, and every frame pays for it.
|
|
175
|
+
*/
|
|
176
|
+
function CompositeSize(tiles, extent, cap) {
|
|
177
|
+
let finest = 0;
|
|
178
|
+
for (const tile of tiles || []) {
|
|
179
|
+
if (tile.TexelMetres > 0 && (!finest || tile.TexelMetres < finest)) {
|
|
180
|
+
finest = tile.TexelMetres;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!(finest > 0)) {
|
|
184
|
+
finest = 1;
|
|
185
|
+
}
|
|
186
|
+
const middle = ((extent.South + extent.North) / 2) * Math.PI / 180;
|
|
187
|
+
const widthMetres = Math.max((extent.East - extent.West) * METRES_PER_DEGREE_LON * Math.cos(middle), 1);
|
|
188
|
+
const heightMetres = Math.max((extent.North - extent.South) * METRES_PER_DEGREE_LAT, 1);
|
|
189
|
+
let width = Math.max(1, Math.ceil(widthMetres / finest));
|
|
190
|
+
let height = Math.max(1, Math.ceil(heightMetres / finest));
|
|
191
|
+
const longest = Math.max(width, height);
|
|
192
|
+
if (cap > 0 && longest > cap) {
|
|
193
|
+
const shrink = cap / longest;
|
|
194
|
+
width = Math.max(1, Math.round(width * shrink));
|
|
195
|
+
height = Math.max(1, Math.round(height * shrink));
|
|
196
|
+
}
|
|
197
|
+
return { Width: width, Height: height };
|
|
198
|
+
}
|
|
199
|
+
ValueMapGrid.CompositeSize = CompositeSize;
|
|
200
|
+
/**
|
|
201
|
+
* Where one tile lands on a composite of that size over that extent.
|
|
202
|
+
*/
|
|
203
|
+
function TileRect(tile, extent, size) {
|
|
204
|
+
const spanLon = extent.East - extent.West;
|
|
205
|
+
const spanLat = extent.North - extent.South;
|
|
206
|
+
const left = Math.round((tile.West - extent.West) / spanLon * size.Width);
|
|
207
|
+
const right = Math.round((tile.East - extent.West) / spanLon * size.Width);
|
|
208
|
+
const top = Math.round((extent.North - tile.North) / spanLat * size.Height);
|
|
209
|
+
const bottom = Math.round((extent.North - tile.South) / spanLat * size.Height);
|
|
210
|
+
return {
|
|
211
|
+
Left: left,
|
|
212
|
+
Top: top,
|
|
213
|
+
Width: Math.max(1, right - left),
|
|
214
|
+
Height: Math.max(1, bottom - top)
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
ValueMapGrid.TileRect = TileRect;
|
|
218
|
+
/**
|
|
219
|
+
* Whether a position falls inside a closed ring, by the crossing count.
|
|
220
|
+
*/
|
|
221
|
+
function PointInRing(points, longitude, latitude) {
|
|
222
|
+
let inside = false;
|
|
223
|
+
for (let at = 0; at < points.length - 1; at++) {
|
|
224
|
+
const from = points[at];
|
|
225
|
+
const to = points[at + 1];
|
|
226
|
+
if ((from.Latitude > latitude) !== (to.Latitude > latitude)) {
|
|
227
|
+
const crossing = from.Longitude
|
|
228
|
+
+ (latitude - from.Latitude) / (to.Latitude - from.Latitude)
|
|
229
|
+
* (to.Longitude - from.Longitude);
|
|
230
|
+
if (crossing > longitude) {
|
|
231
|
+
inside = !inside;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return inside;
|
|
236
|
+
}
|
|
237
|
+
ValueMapGrid.PointInRing = PointInRing;
|
|
238
|
+
/**
|
|
239
|
+
* Whether a texel's rectangle and a closed ring overlap at all.
|
|
240
|
+
*/
|
|
241
|
+
function CellMeetsRing(points, west, east, south, north) {
|
|
242
|
+
if (PointInRing(points, (west + east) / 2, (south + north) / 2)) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
for (const point of points) {
|
|
246
|
+
if (point.Longitude >= west && point.Longitude <= east
|
|
247
|
+
&& point.Latitude >= south && point.Latitude <= north) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const corners = [
|
|
252
|
+
{ Longitude: west, Latitude: south },
|
|
253
|
+
{ Longitude: east, Latitude: south },
|
|
254
|
+
{ Longitude: east, Latitude: north },
|
|
255
|
+
{ Longitude: west, Latitude: north },
|
|
256
|
+
{ Longitude: west, Latitude: south }
|
|
257
|
+
];
|
|
258
|
+
for (let at = 0; at < points.length - 1; at++) {
|
|
259
|
+
for (let side = 0; side < 4; side++) {
|
|
260
|
+
if (SegmentsCross(points[at], points[at + 1], corners[side], corners[side + 1])) {
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
ValueMapGrid.CellMeetsRing = CellMeetsRing;
|
|
268
|
+
/**
|
|
269
|
+
* Whether two segments intersect, including when one merely touches the other.
|
|
270
|
+
*/
|
|
271
|
+
function SegmentsCross(a, b, c, d) {
|
|
272
|
+
const side = (p, q, r) => (q.Longitude - p.Longitude) * (r.Latitude - p.Latitude) - (q.Latitude - p.Latitude) * (r.Longitude - p.Longitude);
|
|
273
|
+
const d1 = side(c, d, a);
|
|
274
|
+
const d2 = side(c, d, b);
|
|
275
|
+
const d3 = side(a, b, c);
|
|
276
|
+
const d4 = side(a, b, d);
|
|
277
|
+
if (((d1 > 0) !== (d2 > 0)) && ((d3 > 0) !== (d4 > 0))) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
// Touching counts, so a ring running exactly along a texel edge is not missed.
|
|
281
|
+
return ((d1 === 0 && OnSegment(c, d, a)) ||
|
|
282
|
+
(d2 === 0 && OnSegment(c, d, b)) ||
|
|
283
|
+
(d3 === 0 && OnSegment(a, b, c)) ||
|
|
284
|
+
(d4 === 0 && OnSegment(a, b, d)));
|
|
285
|
+
}
|
|
286
|
+
ValueMapGrid.SegmentsCross = SegmentsCross;
|
|
287
|
+
/**
|
|
288
|
+
* Whether a point already known to be on a segment's line lies between its ends.
|
|
289
|
+
*/
|
|
290
|
+
function OnSegment(from, to, at) {
|
|
291
|
+
return (at.Longitude >= Math.min(from.Longitude, to.Longitude) &&
|
|
292
|
+
at.Longitude <= Math.max(from.Longitude, to.Longitude) &&
|
|
293
|
+
at.Latitude >= Math.min(from.Latitude, to.Latitude) &&
|
|
294
|
+
at.Latitude <= Math.max(from.Latitude, to.Latitude));
|
|
295
|
+
}
|
|
296
|
+
ValueMapGrid.OnSegment = OnSegment;
|
|
297
|
+
})(ValueMapGrid = exports.ValueMapGrid || (exports.ValueMapGrid = {}));
|
|
298
|
+
//# sourceMappingURL=value-map-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-map-grid.js","sourceRoot":"","sources":["../../../src/client-file/value-map-grid.ts"],"names":[],"mappings":"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"}
|