@map-colonies/mc-utils 1.5.0 → 1.6.0
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/README.md +67 -67
- package/dist/arrays/index.d.ts +1 -1
- package/dist/arrays/index.js +13 -13
- package/dist/arrays/subGroups.d.ts +8 -8
- package/dist/arrays/subGroups.js +138 -138
- package/dist/communication/http/httpClient.d.ts +26 -26
- package/dist/communication/http/httpClient.js +333 -333
- package/dist/communication/http/index.d.ts +1 -1
- package/dist/communication/http/index.js +13 -13
- package/dist/communication/index.d.ts +1 -1
- package/dist/communication/index.js +13 -13
- package/dist/dateTime/getUTCDate.d.ts +2 -0
- package/dist/dateTime/getUTCDate.d.ts.map +1 -0
- package/dist/dateTime/getUTCDate.js +11 -0
- package/dist/dateTime/getUTCDate.js.map +1 -0
- package/dist/dateTime/index.d.ts +2 -0
- package/dist/dateTime/index.d.ts.map +1 -0
- package/dist/dateTime/index.js +14 -0
- package/dist/dateTime/index.js.map +1 -0
- package/dist/geo/bboxUtils.d.ts +23 -23
- package/dist/geo/bboxUtils.js +89 -89
- package/dist/geo/geoConvertor.d.ts +18 -18
- package/dist/geo/geoConvertor.js +51 -51
- package/dist/geo/geoHash.d.ts +24 -24
- package/dist/geo/geoHash.js +242 -242
- package/dist/geo/geoIntersection.d.ts +12 -12
- package/dist/geo/geoIntersection.js +27 -27
- package/dist/geo/index.d.ts +8 -8
- package/dist/geo/index.js +20 -20
- package/dist/geo/tileBatcher.d.ts +8 -8
- package/dist/geo/tileBatcher.js +167 -167
- package/dist/geo/tileRanger.d.ts +39 -39
- package/dist/geo/tileRanger.js +254 -254
- package/dist/geo/tiles.d.ts +32 -32
- package/dist/geo/tiles.js +65 -65
- package/dist/geo/tilesGenerator.d.ts +2 -2
- package/dist/geo/tilesGenerator.js +94 -94
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/models/enums/geo/index.d.ts +1 -1
- package/dist/models/enums/geo/index.js +13 -13
- package/dist/models/enums/geo/tileOrigin.d.ts +7 -7
- package/dist/models/enums/geo/tileOrigin.js +11 -11
- package/dist/models/enums/index.d.ts +1 -1
- package/dist/models/enums/index.js +13 -13
- package/dist/models/index.d.ts +2 -2
- package/dist/models/index.js +14 -14
- package/dist/models/interfaces/geo/iPoint.d.ts +7 -7
- package/dist/models/interfaces/geo/iPoint.js +2 -2
- package/dist/models/interfaces/geo/iTile.d.ts +15 -15
- package/dist/models/interfaces/geo/iTile.js +2 -2
- package/dist/models/interfaces/geo/index.d.ts +2 -2
- package/dist/models/interfaces/geo/index.js +14 -14
- package/dist/models/interfaces/iLogger.d.ts +6 -6
- package/dist/models/interfaces/iLogger.js +2 -2
- package/dist/models/interfaces/index.d.ts +2 -2
- package/dist/models/interfaces/index.js +14 -14
- package/package.json +76 -76
package/dist/geo/tileRanger.js
CHANGED
|
@@ -1,255 +1,255 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
3
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
4
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
5
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
6
|
-
function step(op) {
|
|
7
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
8
|
-
while (_) try {
|
|
9
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
10
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
11
|
-
switch (op[0]) {
|
|
12
|
-
case 0: case 1: t = op; break;
|
|
13
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
14
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
15
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
16
|
-
default:
|
|
17
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
18
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
19
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
20
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
21
|
-
if (t[2]) _.ops.pop();
|
|
22
|
-
_.trys.pop(); continue;
|
|
23
|
-
}
|
|
24
|
-
op = body.call(thisArg, _);
|
|
25
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
26
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
var __values = (this && this.__values) || function(o) {
|
|
30
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
31
|
-
if (m) return m.call(o);
|
|
32
|
-
if (o && typeof o.length === "number") return {
|
|
33
|
-
next: function () {
|
|
34
|
-
if (o && i >= o.length) o = void 0;
|
|
35
|
-
return { value: o && o[i++], done: !o };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
39
|
-
};
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.TileRanger = void 0;
|
|
42
|
-
var turf_1 = require("@turf/turf");
|
|
43
|
-
var bboxUtils_1 = require("./bboxUtils");
|
|
44
|
-
var tiles_1 = require("./tiles");
|
|
45
|
-
var tilesGenerator_1 = require("./tilesGenerator");
|
|
46
|
-
var TileIntersectionState;
|
|
47
|
-
(function (TileIntersectionState) {
|
|
48
|
-
TileIntersectionState["FULL"] = "full";
|
|
49
|
-
TileIntersectionState["PARTIAL"] = "partial";
|
|
50
|
-
TileIntersectionState["NONE"] = "none";
|
|
51
|
-
})(TileIntersectionState || (TileIntersectionState = {}));
|
|
52
|
-
/**
|
|
53
|
-
* class for generating and decoding tile hashes
|
|
54
|
-
*/
|
|
55
|
-
var TileRanger = /** @class */ (function () {
|
|
56
|
-
function TileRanger() {
|
|
57
|
-
this.tileFootprintIntersection = function (tile, intersectionParams) {
|
|
58
|
-
var tileBbox = (0, tiles_1.tileToBbox)(tile);
|
|
59
|
-
var tilePoly = (0, turf_1.bboxPolygon)(tileBbox);
|
|
60
|
-
var intersection = (0, turf_1.intersect)(intersectionParams.footprint, tilePoly);
|
|
61
|
-
if (intersection === null) {
|
|
62
|
-
return TileIntersectionState.NONE;
|
|
63
|
-
}
|
|
64
|
-
if (tile.zoom === intersectionParams.maxZoom) {
|
|
65
|
-
return TileIntersectionState.FULL;
|
|
66
|
-
}
|
|
67
|
-
var intArea = (0, turf_1.area)(intersection);
|
|
68
|
-
var hashArea = (0, turf_1.area)(tilePoly);
|
|
69
|
-
if (intArea == hashArea) {
|
|
70
|
-
return TileIntersectionState.FULL;
|
|
71
|
-
}
|
|
72
|
-
return TileIntersectionState.PARTIAL;
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* converts tile to tile range of specified zoom level
|
|
77
|
-
* @param tile
|
|
78
|
-
* @param zoom target tile range zoom
|
|
79
|
-
* @returns
|
|
80
|
-
*/
|
|
81
|
-
TileRanger.prototype.tileToRange = function (tile, zoom) {
|
|
82
|
-
var minX, minY, maxX, maxY;
|
|
83
|
-
minX = tile.x;
|
|
84
|
-
maxX = tile.x + 1;
|
|
85
|
-
minY = tile.y;
|
|
86
|
-
maxY = tile.y + 1;
|
|
87
|
-
if (tile.zoom < zoom) {
|
|
88
|
-
var dz = zoom - tile.zoom;
|
|
89
|
-
minX = minX << dz;
|
|
90
|
-
maxX = maxX << dz;
|
|
91
|
-
minY = minY << dz;
|
|
92
|
-
maxY = maxY << dz;
|
|
93
|
-
}
|
|
94
|
-
else if (tile.zoom > zoom) {
|
|
95
|
-
var dz = tile.zoom - zoom;
|
|
96
|
-
minX = minX >> dz;
|
|
97
|
-
minY = minY >> dz;
|
|
98
|
-
maxX = minX + 1;
|
|
99
|
-
maxY = minY + 1;
|
|
100
|
-
}
|
|
101
|
-
return {
|
|
102
|
-
minX: minX,
|
|
103
|
-
minY: minY,
|
|
104
|
-
maxX: maxX,
|
|
105
|
-
maxY: maxY,
|
|
106
|
-
zoom: zoom,
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* generate tile hashes
|
|
111
|
-
* @param footprint footprint to cover with generated tile hashes
|
|
112
|
-
* @param zoom max hash zoom
|
|
113
|
-
* @returns
|
|
114
|
-
*/
|
|
115
|
-
TileRanger.prototype.encodeFootprint = function (footprint, zoom) {
|
|
116
|
-
var bbox, intersectionParams;
|
|
117
|
-
return __generator(this, function (_a) {
|
|
118
|
-
switch (_a.label) {
|
|
119
|
-
case 0:
|
|
120
|
-
bbox = (0, turf_1.bbox)(footprint);
|
|
121
|
-
if (!this.isBbox(footprint)) return [3 /*break*/, 2];
|
|
122
|
-
return [4 /*yield*/, (0, bboxUtils_1.bboxToTileRange)(bbox, zoom)];
|
|
123
|
-
case 1:
|
|
124
|
-
_a.sent();
|
|
125
|
-
return [3 /*break*/, 4];
|
|
126
|
-
case 2:
|
|
127
|
-
intersectionParams = {
|
|
128
|
-
footprint: footprint,
|
|
129
|
-
maxZoom: zoom,
|
|
130
|
-
};
|
|
131
|
-
return [5 /*yield**/, __values(this.generateRanges(bbox, zoom, intersectionParams, this.tileFootprintIntersection))];
|
|
132
|
-
case 3:
|
|
133
|
-
_a.sent();
|
|
134
|
-
_a.label = 4;
|
|
135
|
-
case 4: return [2 /*return*/];
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
};
|
|
139
|
-
TileRanger.prototype.generateTiles = function (area, zoom) {
|
|
140
|
-
var gen;
|
|
141
|
-
if (Array.isArray(area)) {
|
|
142
|
-
gen = [(0, bboxUtils_1.bboxToTileRange)(area, zoom)];
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
gen = this.encodeFootprint(area, zoom);
|
|
146
|
-
}
|
|
147
|
-
return (0, tilesGenerator_1.tilesGenerator)(gen);
|
|
148
|
-
};
|
|
149
|
-
TileRanger.prototype.generateRanges = function (bbox, zoom, intersectionTarget, intersectionFunction) {
|
|
150
|
-
var boundingRange, dx, dy, minXZoom, minYZoom, minZoom, minimalRange, x, y, tile, intersection;
|
|
151
|
-
return __generator(this, function (_a) {
|
|
152
|
-
switch (_a.label) {
|
|
153
|
-
case 0:
|
|
154
|
-
boundingRange = (0, bboxUtils_1.bboxToTileRange)(bbox, zoom);
|
|
155
|
-
dx = boundingRange.maxX - boundingRange.minX;
|
|
156
|
-
dy = boundingRange.maxY - boundingRange.minY;
|
|
157
|
-
minXZoom = Math.max(Math.floor(Math.log2(1 << (zoom + 1)) / dx) - 1, 0);
|
|
158
|
-
minYZoom = Math.max(Math.floor(Math.log2(1 << zoom) / dy), 0);
|
|
159
|
-
minZoom = Math.min(minXZoom, minYZoom);
|
|
160
|
-
minimalRange = (0, bboxUtils_1.bboxToTileRange)(bbox, minZoom);
|
|
161
|
-
x = minimalRange.minX;
|
|
162
|
-
_a.label = 1;
|
|
163
|
-
case 1:
|
|
164
|
-
if (!(x < minimalRange.maxX)) return [3 /*break*/, 8];
|
|
165
|
-
y = minimalRange.minY;
|
|
166
|
-
_a.label = 2;
|
|
167
|
-
case 2:
|
|
168
|
-
if (!(y < minimalRange.maxY)) return [3 /*break*/, 7];
|
|
169
|
-
tile = { x: x, y: y, zoom: minimalRange.zoom };
|
|
170
|
-
intersection = intersectionFunction(tile, intersectionTarget);
|
|
171
|
-
if (!(intersection === TileIntersectionState.FULL)) return [3 /*break*/, 4];
|
|
172
|
-
return [4 /*yield*/, this.tileToRange(tile, zoom)];
|
|
173
|
-
case 3:
|
|
174
|
-
_a.sent();
|
|
175
|
-
return [3 /*break*/, 6];
|
|
176
|
-
case 4:
|
|
177
|
-
if (!(intersection === TileIntersectionState.PARTIAL)) return [3 /*break*/, 6];
|
|
178
|
-
//optimize partial base hashes
|
|
179
|
-
return [5 /*yield**/, __values(this.optimizeHash(tile, zoom, intersectionTarget, intersectionFunction))];
|
|
180
|
-
case 5:
|
|
181
|
-
//optimize partial base hashes
|
|
182
|
-
_a.sent();
|
|
183
|
-
_a.label = 6;
|
|
184
|
-
case 6:
|
|
185
|
-
y++;
|
|
186
|
-
return [3 /*break*/, 2];
|
|
187
|
-
case 7:
|
|
188
|
-
x++;
|
|
189
|
-
return [3 /*break*/, 1];
|
|
190
|
-
case 8: return [2 /*return*/];
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
};
|
|
194
|
-
TileRanger.prototype.optimizeHash = function (tile, targetZoom, intersectionTarget, intersectionFunction) {
|
|
195
|
-
var tiles, tiles_2, tiles_2_1, subTile, intersection, e_1_1;
|
|
196
|
-
var e_1, _a;
|
|
197
|
-
return __generator(this, function (_b) {
|
|
198
|
-
switch (_b.label) {
|
|
199
|
-
case 0:
|
|
200
|
-
tiles = this.generateSubTiles(tile);
|
|
201
|
-
_b.label = 1;
|
|
202
|
-
case 1:
|
|
203
|
-
_b.trys.push([1, 8, 9, 10]);
|
|
204
|
-
tiles_2 = __values(tiles), tiles_2_1 = tiles_2.next();
|
|
205
|
-
_b.label = 2;
|
|
206
|
-
case 2:
|
|
207
|
-
if (!!tiles_2_1.done) return [3 /*break*/, 7];
|
|
208
|
-
subTile = tiles_2_1.value;
|
|
209
|
-
intersection = intersectionFunction(subTile, intersectionTarget);
|
|
210
|
-
if (!(intersection === TileIntersectionState.FULL)) return [3 /*break*/, 4];
|
|
211
|
-
return [4 /*yield*/, this.tileToRange(subTile, targetZoom)];
|
|
212
|
-
case 3:
|
|
213
|
-
_b.sent();
|
|
214
|
-
return [3 /*break*/, 6];
|
|
215
|
-
case 4:
|
|
216
|
-
if (!(intersection === TileIntersectionState.PARTIAL)) return [3 /*break*/, 6];
|
|
217
|
-
return [5 /*yield**/, __values(this.optimizeHash(subTile, targetZoom, intersectionTarget, intersectionFunction))];
|
|
218
|
-
case 5:
|
|
219
|
-
_b.sent();
|
|
220
|
-
_b.label = 6;
|
|
221
|
-
case 6:
|
|
222
|
-
tiles_2_1 = tiles_2.next();
|
|
223
|
-
return [3 /*break*/, 2];
|
|
224
|
-
case 7: return [3 /*break*/, 10];
|
|
225
|
-
case 8:
|
|
226
|
-
e_1_1 = _b.sent();
|
|
227
|
-
e_1 = { error: e_1_1 };
|
|
228
|
-
return [3 /*break*/, 10];
|
|
229
|
-
case 9:
|
|
230
|
-
try {
|
|
231
|
-
if (tiles_2_1 && !tiles_2_1.done && (_a = tiles_2.return)) _a.call(tiles_2);
|
|
232
|
-
}
|
|
233
|
-
finally { if (e_1) throw e_1.error; }
|
|
234
|
-
return [7 /*endfinally*/];
|
|
235
|
-
case 10: return [2 /*return*/];
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
};
|
|
239
|
-
TileRanger.prototype.generateSubTiles = function (tile) {
|
|
240
|
-
var tile0 = { x: tile.x << 1, y: tile.y << 1, zoom: tile.zoom + 1 };
|
|
241
|
-
var tile1 = { x: tile0.x + 1, y: tile0.y, zoom: tile0.zoom };
|
|
242
|
-
var tile2 = { x: tile0.x, y: tile0.y + 1, zoom: tile0.zoom };
|
|
243
|
-
var tile3 = { x: tile0.x + 1, y: tile0.y + 1, zoom: tile0.zoom };
|
|
244
|
-
var tiles = [tile0, tile1, tile2, tile3];
|
|
245
|
-
return tiles;
|
|
246
|
-
};
|
|
247
|
-
TileRanger.prototype.isBbox = function (footprint) {
|
|
248
|
-
var bbox = (0, turf_1.bbox)(footprint);
|
|
249
|
-
var bboxPoly = (0, turf_1.bboxPolygon)(bbox);
|
|
250
|
-
return (0, turf_1.booleanEqual)(footprint, bboxPoly);
|
|
251
|
-
};
|
|
252
|
-
return TileRanger;
|
|
253
|
-
}());
|
|
254
|
-
exports.TileRanger = TileRanger;
|
|
1
|
+
"use strict";
|
|
2
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
3
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
4
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
5
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
6
|
+
function step(op) {
|
|
7
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
8
|
+
while (_) try {
|
|
9
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
10
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
11
|
+
switch (op[0]) {
|
|
12
|
+
case 0: case 1: t = op; break;
|
|
13
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
14
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
15
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
16
|
+
default:
|
|
17
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
18
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
19
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
20
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
21
|
+
if (t[2]) _.ops.pop();
|
|
22
|
+
_.trys.pop(); continue;
|
|
23
|
+
}
|
|
24
|
+
op = body.call(thisArg, _);
|
|
25
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
26
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var __values = (this && this.__values) || function(o) {
|
|
30
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
31
|
+
if (m) return m.call(o);
|
|
32
|
+
if (o && typeof o.length === "number") return {
|
|
33
|
+
next: function () {
|
|
34
|
+
if (o && i >= o.length) o = void 0;
|
|
35
|
+
return { value: o && o[i++], done: !o };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.TileRanger = void 0;
|
|
42
|
+
var turf_1 = require("@turf/turf");
|
|
43
|
+
var bboxUtils_1 = require("./bboxUtils");
|
|
44
|
+
var tiles_1 = require("./tiles");
|
|
45
|
+
var tilesGenerator_1 = require("./tilesGenerator");
|
|
46
|
+
var TileIntersectionState;
|
|
47
|
+
(function (TileIntersectionState) {
|
|
48
|
+
TileIntersectionState["FULL"] = "full";
|
|
49
|
+
TileIntersectionState["PARTIAL"] = "partial";
|
|
50
|
+
TileIntersectionState["NONE"] = "none";
|
|
51
|
+
})(TileIntersectionState || (TileIntersectionState = {}));
|
|
52
|
+
/**
|
|
53
|
+
* class for generating and decoding tile hashes
|
|
54
|
+
*/
|
|
55
|
+
var TileRanger = /** @class */ (function () {
|
|
56
|
+
function TileRanger() {
|
|
57
|
+
this.tileFootprintIntersection = function (tile, intersectionParams) {
|
|
58
|
+
var tileBbox = (0, tiles_1.tileToBbox)(tile);
|
|
59
|
+
var tilePoly = (0, turf_1.bboxPolygon)(tileBbox);
|
|
60
|
+
var intersection = (0, turf_1.intersect)(intersectionParams.footprint, tilePoly);
|
|
61
|
+
if (intersection === null) {
|
|
62
|
+
return TileIntersectionState.NONE;
|
|
63
|
+
}
|
|
64
|
+
if (tile.zoom === intersectionParams.maxZoom) {
|
|
65
|
+
return TileIntersectionState.FULL;
|
|
66
|
+
}
|
|
67
|
+
var intArea = (0, turf_1.area)(intersection);
|
|
68
|
+
var hashArea = (0, turf_1.area)(tilePoly);
|
|
69
|
+
if (intArea == hashArea) {
|
|
70
|
+
return TileIntersectionState.FULL;
|
|
71
|
+
}
|
|
72
|
+
return TileIntersectionState.PARTIAL;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* converts tile to tile range of specified zoom level
|
|
77
|
+
* @param tile
|
|
78
|
+
* @param zoom target tile range zoom
|
|
79
|
+
* @returns
|
|
80
|
+
*/
|
|
81
|
+
TileRanger.prototype.tileToRange = function (tile, zoom) {
|
|
82
|
+
var minX, minY, maxX, maxY;
|
|
83
|
+
minX = tile.x;
|
|
84
|
+
maxX = tile.x + 1;
|
|
85
|
+
minY = tile.y;
|
|
86
|
+
maxY = tile.y + 1;
|
|
87
|
+
if (tile.zoom < zoom) {
|
|
88
|
+
var dz = zoom - tile.zoom;
|
|
89
|
+
minX = minX << dz;
|
|
90
|
+
maxX = maxX << dz;
|
|
91
|
+
minY = minY << dz;
|
|
92
|
+
maxY = maxY << dz;
|
|
93
|
+
}
|
|
94
|
+
else if (tile.zoom > zoom) {
|
|
95
|
+
var dz = tile.zoom - zoom;
|
|
96
|
+
minX = minX >> dz;
|
|
97
|
+
minY = minY >> dz;
|
|
98
|
+
maxX = minX + 1;
|
|
99
|
+
maxY = minY + 1;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
minX: minX,
|
|
103
|
+
minY: minY,
|
|
104
|
+
maxX: maxX,
|
|
105
|
+
maxY: maxY,
|
|
106
|
+
zoom: zoom,
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* generate tile hashes
|
|
111
|
+
* @param footprint footprint to cover with generated tile hashes
|
|
112
|
+
* @param zoom max hash zoom
|
|
113
|
+
* @returns
|
|
114
|
+
*/
|
|
115
|
+
TileRanger.prototype.encodeFootprint = function (footprint, zoom) {
|
|
116
|
+
var bbox, intersectionParams;
|
|
117
|
+
return __generator(this, function (_a) {
|
|
118
|
+
switch (_a.label) {
|
|
119
|
+
case 0:
|
|
120
|
+
bbox = (0, turf_1.bbox)(footprint);
|
|
121
|
+
if (!this.isBbox(footprint)) return [3 /*break*/, 2];
|
|
122
|
+
return [4 /*yield*/, (0, bboxUtils_1.bboxToTileRange)(bbox, zoom)];
|
|
123
|
+
case 1:
|
|
124
|
+
_a.sent();
|
|
125
|
+
return [3 /*break*/, 4];
|
|
126
|
+
case 2:
|
|
127
|
+
intersectionParams = {
|
|
128
|
+
footprint: footprint,
|
|
129
|
+
maxZoom: zoom,
|
|
130
|
+
};
|
|
131
|
+
return [5 /*yield**/, __values(this.generateRanges(bbox, zoom, intersectionParams, this.tileFootprintIntersection))];
|
|
132
|
+
case 3:
|
|
133
|
+
_a.sent();
|
|
134
|
+
_a.label = 4;
|
|
135
|
+
case 4: return [2 /*return*/];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
TileRanger.prototype.generateTiles = function (area, zoom) {
|
|
140
|
+
var gen;
|
|
141
|
+
if (Array.isArray(area)) {
|
|
142
|
+
gen = [(0, bboxUtils_1.bboxToTileRange)(area, zoom)];
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
gen = this.encodeFootprint(area, zoom);
|
|
146
|
+
}
|
|
147
|
+
return (0, tilesGenerator_1.tilesGenerator)(gen);
|
|
148
|
+
};
|
|
149
|
+
TileRanger.prototype.generateRanges = function (bbox, zoom, intersectionTarget, intersectionFunction) {
|
|
150
|
+
var boundingRange, dx, dy, minXZoom, minYZoom, minZoom, minimalRange, x, y, tile, intersection;
|
|
151
|
+
return __generator(this, function (_a) {
|
|
152
|
+
switch (_a.label) {
|
|
153
|
+
case 0:
|
|
154
|
+
boundingRange = (0, bboxUtils_1.bboxToTileRange)(bbox, zoom);
|
|
155
|
+
dx = boundingRange.maxX - boundingRange.minX;
|
|
156
|
+
dy = boundingRange.maxY - boundingRange.minY;
|
|
157
|
+
minXZoom = Math.max(Math.floor(Math.log2(1 << (zoom + 1)) / dx) - 1, 0);
|
|
158
|
+
minYZoom = Math.max(Math.floor(Math.log2(1 << zoom) / dy), 0);
|
|
159
|
+
minZoom = Math.min(minXZoom, minYZoom);
|
|
160
|
+
minimalRange = (0, bboxUtils_1.bboxToTileRange)(bbox, minZoom);
|
|
161
|
+
x = minimalRange.minX;
|
|
162
|
+
_a.label = 1;
|
|
163
|
+
case 1:
|
|
164
|
+
if (!(x < minimalRange.maxX)) return [3 /*break*/, 8];
|
|
165
|
+
y = minimalRange.minY;
|
|
166
|
+
_a.label = 2;
|
|
167
|
+
case 2:
|
|
168
|
+
if (!(y < minimalRange.maxY)) return [3 /*break*/, 7];
|
|
169
|
+
tile = { x: x, y: y, zoom: minimalRange.zoom };
|
|
170
|
+
intersection = intersectionFunction(tile, intersectionTarget);
|
|
171
|
+
if (!(intersection === TileIntersectionState.FULL)) return [3 /*break*/, 4];
|
|
172
|
+
return [4 /*yield*/, this.tileToRange(tile, zoom)];
|
|
173
|
+
case 3:
|
|
174
|
+
_a.sent();
|
|
175
|
+
return [3 /*break*/, 6];
|
|
176
|
+
case 4:
|
|
177
|
+
if (!(intersection === TileIntersectionState.PARTIAL)) return [3 /*break*/, 6];
|
|
178
|
+
//optimize partial base hashes
|
|
179
|
+
return [5 /*yield**/, __values(this.optimizeHash(tile, zoom, intersectionTarget, intersectionFunction))];
|
|
180
|
+
case 5:
|
|
181
|
+
//optimize partial base hashes
|
|
182
|
+
_a.sent();
|
|
183
|
+
_a.label = 6;
|
|
184
|
+
case 6:
|
|
185
|
+
y++;
|
|
186
|
+
return [3 /*break*/, 2];
|
|
187
|
+
case 7:
|
|
188
|
+
x++;
|
|
189
|
+
return [3 /*break*/, 1];
|
|
190
|
+
case 8: return [2 /*return*/];
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
TileRanger.prototype.optimizeHash = function (tile, targetZoom, intersectionTarget, intersectionFunction) {
|
|
195
|
+
var tiles, tiles_2, tiles_2_1, subTile, intersection, e_1_1;
|
|
196
|
+
var e_1, _a;
|
|
197
|
+
return __generator(this, function (_b) {
|
|
198
|
+
switch (_b.label) {
|
|
199
|
+
case 0:
|
|
200
|
+
tiles = this.generateSubTiles(tile);
|
|
201
|
+
_b.label = 1;
|
|
202
|
+
case 1:
|
|
203
|
+
_b.trys.push([1, 8, 9, 10]);
|
|
204
|
+
tiles_2 = __values(tiles), tiles_2_1 = tiles_2.next();
|
|
205
|
+
_b.label = 2;
|
|
206
|
+
case 2:
|
|
207
|
+
if (!!tiles_2_1.done) return [3 /*break*/, 7];
|
|
208
|
+
subTile = tiles_2_1.value;
|
|
209
|
+
intersection = intersectionFunction(subTile, intersectionTarget);
|
|
210
|
+
if (!(intersection === TileIntersectionState.FULL)) return [3 /*break*/, 4];
|
|
211
|
+
return [4 /*yield*/, this.tileToRange(subTile, targetZoom)];
|
|
212
|
+
case 3:
|
|
213
|
+
_b.sent();
|
|
214
|
+
return [3 /*break*/, 6];
|
|
215
|
+
case 4:
|
|
216
|
+
if (!(intersection === TileIntersectionState.PARTIAL)) return [3 /*break*/, 6];
|
|
217
|
+
return [5 /*yield**/, __values(this.optimizeHash(subTile, targetZoom, intersectionTarget, intersectionFunction))];
|
|
218
|
+
case 5:
|
|
219
|
+
_b.sent();
|
|
220
|
+
_b.label = 6;
|
|
221
|
+
case 6:
|
|
222
|
+
tiles_2_1 = tiles_2.next();
|
|
223
|
+
return [3 /*break*/, 2];
|
|
224
|
+
case 7: return [3 /*break*/, 10];
|
|
225
|
+
case 8:
|
|
226
|
+
e_1_1 = _b.sent();
|
|
227
|
+
e_1 = { error: e_1_1 };
|
|
228
|
+
return [3 /*break*/, 10];
|
|
229
|
+
case 9:
|
|
230
|
+
try {
|
|
231
|
+
if (tiles_2_1 && !tiles_2_1.done && (_a = tiles_2.return)) _a.call(tiles_2);
|
|
232
|
+
}
|
|
233
|
+
finally { if (e_1) throw e_1.error; }
|
|
234
|
+
return [7 /*endfinally*/];
|
|
235
|
+
case 10: return [2 /*return*/];
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
TileRanger.prototype.generateSubTiles = function (tile) {
|
|
240
|
+
var tile0 = { x: tile.x << 1, y: tile.y << 1, zoom: tile.zoom + 1 };
|
|
241
|
+
var tile1 = { x: tile0.x + 1, y: tile0.y, zoom: tile0.zoom };
|
|
242
|
+
var tile2 = { x: tile0.x, y: tile0.y + 1, zoom: tile0.zoom };
|
|
243
|
+
var tile3 = { x: tile0.x + 1, y: tile0.y + 1, zoom: tile0.zoom };
|
|
244
|
+
var tiles = [tile0, tile1, tile2, tile3];
|
|
245
|
+
return tiles;
|
|
246
|
+
};
|
|
247
|
+
TileRanger.prototype.isBbox = function (footprint) {
|
|
248
|
+
var bbox = (0, turf_1.bbox)(footprint);
|
|
249
|
+
var bboxPoly = (0, turf_1.bboxPolygon)(bbox);
|
|
250
|
+
return (0, turf_1.booleanEqual)(footprint, bboxPoly);
|
|
251
|
+
};
|
|
252
|
+
return TileRanger;
|
|
253
|
+
}());
|
|
254
|
+
exports.TileRanger = TileRanger;
|
|
255
255
|
//# sourceMappingURL=tileRanger.js.map
|
package/dist/geo/tiles.d.ts
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { BBox2d } from '@turf/helpers/dist/js/lib/geojson';
|
|
2
|
-
import { ITile } from '../models/interfaces/geo/iTile';
|
|
3
|
-
/**
|
|
4
|
-
* calculates tile size (resolution) in degrees
|
|
5
|
-
* @param zoomLevel zoom level of returned tile size
|
|
6
|
-
* @returns tile size (resolution) in degrees
|
|
7
|
-
*/
|
|
8
|
-
export declare function degreesPerTile(zoomLevel: number): number;
|
|
9
|
-
/**
|
|
10
|
-
* returns pixel size (resolution) in degrees
|
|
11
|
-
* @param zoomLevel tile zoom level of returned tile pixel size
|
|
12
|
-
* @returns pixel size (resolution) in degrees
|
|
13
|
-
*/
|
|
14
|
-
export declare function degreesPerPixel(zoomLevel: number): number;
|
|
15
|
-
/**
|
|
16
|
-
* coverts tile coordinates between ll and ul
|
|
17
|
-
* @param tile source tile
|
|
18
|
-
* @returns converted tile
|
|
19
|
-
*/
|
|
20
|
-
export declare function flipYAxis(tile: ITile): ITile;
|
|
21
|
-
/**
|
|
22
|
-
* converts pixel size (resolution) in degrees to matching zoom level (rounded down)
|
|
23
|
-
* @param resolution pixel size (resolution) in degrees
|
|
24
|
-
* @returns zoom level for given pixel size
|
|
25
|
-
*/
|
|
26
|
-
export declare function degreesPerPixelToZoomLevel(resolution: number): number;
|
|
27
|
-
/**
|
|
28
|
-
* returns bbox of given tile
|
|
29
|
-
* @param tile
|
|
30
|
-
* @returns
|
|
31
|
-
*/
|
|
32
|
-
export declare function tileToBbox(tile: ITile): BBox2d;
|
|
1
|
+
import { BBox2d } from '@turf/helpers/dist/js/lib/geojson';
|
|
2
|
+
import { ITile } from '../models/interfaces/geo/iTile';
|
|
3
|
+
/**
|
|
4
|
+
* calculates tile size (resolution) in degrees
|
|
5
|
+
* @param zoomLevel zoom level of returned tile size
|
|
6
|
+
* @returns tile size (resolution) in degrees
|
|
7
|
+
*/
|
|
8
|
+
export declare function degreesPerTile(zoomLevel: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* returns pixel size (resolution) in degrees
|
|
11
|
+
* @param zoomLevel tile zoom level of returned tile pixel size
|
|
12
|
+
* @returns pixel size (resolution) in degrees
|
|
13
|
+
*/
|
|
14
|
+
export declare function degreesPerPixel(zoomLevel: number): number;
|
|
15
|
+
/**
|
|
16
|
+
* coverts tile coordinates between ll and ul
|
|
17
|
+
* @param tile source tile
|
|
18
|
+
* @returns converted tile
|
|
19
|
+
*/
|
|
20
|
+
export declare function flipYAxis(tile: ITile): ITile;
|
|
21
|
+
/**
|
|
22
|
+
* converts pixel size (resolution) in degrees to matching zoom level (rounded down)
|
|
23
|
+
* @param resolution pixel size (resolution) in degrees
|
|
24
|
+
* @returns zoom level for given pixel size
|
|
25
|
+
*/
|
|
26
|
+
export declare function degreesPerPixelToZoomLevel(resolution: number): number;
|
|
27
|
+
/**
|
|
28
|
+
* returns bbox of given tile
|
|
29
|
+
* @param tile
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
export declare function tileToBbox(tile: ITile): BBox2d;
|
|
33
33
|
//# sourceMappingURL=tiles.d.ts.map
|