@deck.gl/geo-layers 8.7.0-alpha.3 → 8.7.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/dist.dev.js +9310 -6135
- package/dist/es5/great-circle-layer/great-circle-layer.js +26 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +149 -87
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +326 -230
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js +9 -9
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js +153 -132
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/coordinate-transform.js +46 -20
- package/dist/es5/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/es5/mvt-layer/find-index-binary.js +45 -26
- package/dist/es5/mvt-layer/find-index-binary.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +395 -280
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-geometry.js +43 -32
- package/dist/es5/s2-layer/s2-geometry.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js +104 -69
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-utils.js +27 -28
- package/dist/es5/s2-layer/s2-utils.js.map +1 -1
- package/dist/es5/terrain-layer/terrain-layer.js +250 -208
- package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +384 -329
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-2d-header.js +182 -118
- package/dist/es5/tile-layer/tile-2d-header.js.map +1 -1
- package/dist/es5/tile-layer/tile-2d-traversal.js +176 -113
- package/dist/es5/tile-layer/tile-2d-traversal.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +253 -214
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tile-layer/tileset-2d.js +519 -300
- package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
- package/dist/es5/tile-layer/utils.js +110 -61
- package/dist/es5/tile-layer/utils.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js +81 -44
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +2 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js +2 -8
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/coordinate-transform.js +1 -1
- package/dist/esm/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +27 -1
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js +8 -10
- package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +2 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +8 -16
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tile-layer/tileset-2d.js +85 -79
- package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
- package/dist.min.js +2 -2
- package/package.json +12 -12
- package/src/h3-layers/h3-hexagon-layer.js +2 -1
- package/src/{index.js → index.ts} +0 -0
- package/src/mesh-layer/mesh-layer-vertex.glsl.js +24 -23
- package/src/mesh-layer/mesh-layer.js +5 -4
- package/src/mvt-layer/coordinate-transform.js +1 -1
- package/src/mvt-layer/mvt-layer.js +17 -1
- package/src/terrain-layer/terrain-layer.js +10 -9
- package/src/tile-3d-layer/tile-3d-layer.js +10 -2
- package/src/tile-layer/tile-layer.js +11 -12
- package/src/tile-layer/tileset-2d.js +103 -90
|
@@ -1,165 +1,228 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
6
8
|
exports.getOSMTileIndices = getOSMTileIndices;
|
|
7
9
|
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
|
|
12
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
+
|
|
14
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
15
|
+
|
|
8
16
|
var _culling = require("@math.gl/culling");
|
|
9
17
|
|
|
10
18
|
var _webMercator = require("@math.gl/web-mercator");
|
|
11
19
|
|
|
12
20
|
var _utils = require("./utils");
|
|
13
21
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const REF_POINTS_9 = REF_POINTS_5.concat([[0, 0.5], [0.5, 0], [1, 0.5], [0.5, 1]]);
|
|
18
|
-
const REF_POINTS_11 = REF_POINTS_9.concat([[0.25, 0.5], [0.75, 0.5]]);
|
|
22
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
23
|
+
|
|
24
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
27
|
+
|
|
28
|
+
var TILE_SIZE = 512;
|
|
29
|
+
var MAX_MAPS = 3;
|
|
30
|
+
var REF_POINTS_5 = [[0.5, 0.5], [0, 0], [0, 1], [1, 0], [1, 1]];
|
|
31
|
+
var REF_POINTS_9 = REF_POINTS_5.concat([[0, 0.5], [0.5, 0], [1, 0.5], [0.5, 1]]);
|
|
32
|
+
var REF_POINTS_11 = REF_POINTS_9.concat([[0.25, 0.5], [0.75, 0.5]]);
|
|
33
|
+
|
|
34
|
+
var OSMNode = function () {
|
|
35
|
+
function OSMNode(x, y, z) {
|
|
36
|
+
(0, _classCallCheck2.default)(this, OSMNode);
|
|
22
37
|
this.x = x;
|
|
23
38
|
this.y = y;
|
|
24
39
|
this.z = z;
|
|
25
40
|
}
|
|
26
41
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
42
|
+
(0, _createClass2.default)(OSMNode, [{
|
|
43
|
+
key: "children",
|
|
44
|
+
get: function get() {
|
|
45
|
+
if (!this._children) {
|
|
46
|
+
var x = this.x * 2;
|
|
47
|
+
var y = this.y * 2;
|
|
48
|
+
var z = this.z + 1;
|
|
49
|
+
this._children = [new OSMNode(x, y, z), new OSMNode(x, y + 1, z), new OSMNode(x + 1, y, z), new OSMNode(x + 1, y + 1, z)];
|
|
50
|
+
}
|
|
37
51
|
|
|
38
|
-
|
|
39
|
-
const {
|
|
40
|
-
viewport,
|
|
41
|
-
cullingVolume,
|
|
42
|
-
elevationBounds,
|
|
43
|
-
minZ,
|
|
44
|
-
maxZ,
|
|
45
|
-
bounds,
|
|
46
|
-
offset,
|
|
47
|
-
project
|
|
48
|
-
} = params;
|
|
49
|
-
const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);
|
|
50
|
-
|
|
51
|
-
if (bounds && !this.insideBounds(bounds)) {
|
|
52
|
-
return false;
|
|
52
|
+
return this._children;
|
|
53
53
|
}
|
|
54
|
+
}, {
|
|
55
|
+
key: "update",
|
|
56
|
+
value: function update(params) {
|
|
57
|
+
var viewport = params.viewport,
|
|
58
|
+
cullingVolume = params.cullingVolume,
|
|
59
|
+
elevationBounds = params.elevationBounds,
|
|
60
|
+
minZ = params.minZ,
|
|
61
|
+
maxZ = params.maxZ,
|
|
62
|
+
bounds = params.bounds,
|
|
63
|
+
offset = params.offset,
|
|
64
|
+
project = params.project;
|
|
65
|
+
var boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);
|
|
66
|
+
|
|
67
|
+
if (bounds && !this.insideBounds(bounds)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
54
70
|
|
|
55
|
-
|
|
71
|
+
var isInside = cullingVolume.computeVisibility(boundingVolume);
|
|
56
72
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
73
|
+
if (isInside < 0) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
60
76
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
z
|
|
64
|
-
} = this;
|
|
77
|
+
if (!this.childVisible) {
|
|
78
|
+
var z = this.z;
|
|
65
79
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
if (z < maxZ && z >= minZ) {
|
|
81
|
+
var distance = boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale / viewport.height;
|
|
82
|
+
z += Math.floor(Math.log2(distance));
|
|
83
|
+
}
|
|
70
84
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
if (z >= maxZ) {
|
|
86
|
+
this.selected = true;
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
74
89
|
}
|
|
75
|
-
}
|
|
76
90
|
|
|
77
|
-
|
|
78
|
-
|
|
91
|
+
this.selected = false;
|
|
92
|
+
this.childVisible = true;
|
|
79
93
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
94
|
+
var _iterator = _createForOfIteratorHelper(this.children),
|
|
95
|
+
_step;
|
|
83
96
|
|
|
84
|
-
|
|
85
|
-
|
|
97
|
+
try {
|
|
98
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
99
|
+
var child = _step.value;
|
|
100
|
+
child.update(params);
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
_iterator.e(err);
|
|
104
|
+
} finally {
|
|
105
|
+
_iterator.f();
|
|
106
|
+
}
|
|
86
107
|
|
|
87
|
-
|
|
88
|
-
if (this.selected) {
|
|
89
|
-
result.push(this);
|
|
108
|
+
return true;
|
|
90
109
|
}
|
|
110
|
+
}, {
|
|
111
|
+
key: "getSelected",
|
|
112
|
+
value: function getSelected() {
|
|
113
|
+
var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
91
114
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
node.getSelected(result);
|
|
115
|
+
if (this.selected) {
|
|
116
|
+
result.push(this);
|
|
95
117
|
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return result;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
insideBounds([minX, minY, maxX, maxY]) {
|
|
102
|
-
const scale = Math.pow(2, this.z);
|
|
103
|
-
const extent = TILE_SIZE / scale;
|
|
104
|
-
return this.x * extent < maxX && this.y * extent < maxY && (this.x + 1) * extent > minX && (this.y + 1) * extent > minY;
|
|
105
|
-
}
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
if (this._children) {
|
|
120
|
+
var _iterator2 = _createForOfIteratorHelper(this._children),
|
|
121
|
+
_step2;
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
125
|
+
var node = _step2.value;
|
|
126
|
+
node.getSelected(result);
|
|
127
|
+
}
|
|
128
|
+
} catch (err) {
|
|
129
|
+
_iterator2.e(err);
|
|
130
|
+
} finally {
|
|
131
|
+
_iterator2.f();
|
|
120
132
|
}
|
|
121
133
|
}
|
|
122
134
|
|
|
123
|
-
return
|
|
135
|
+
return result;
|
|
124
136
|
}
|
|
137
|
+
}, {
|
|
138
|
+
key: "insideBounds",
|
|
139
|
+
value: function insideBounds(_ref) {
|
|
140
|
+
var _ref2 = (0, _slicedToArray2.default)(_ref, 4),
|
|
141
|
+
minX = _ref2[0],
|
|
142
|
+
minY = _ref2[1],
|
|
143
|
+
maxX = _ref2[2],
|
|
144
|
+
maxY = _ref2[3];
|
|
145
|
+
|
|
146
|
+
var scale = Math.pow(2, this.z);
|
|
147
|
+
var extent = TILE_SIZE / scale;
|
|
148
|
+
return this.x * extent < maxX && this.y * extent < maxY && (this.x + 1) * extent > minX && (this.y + 1) * extent > minY;
|
|
149
|
+
}
|
|
150
|
+
}, {
|
|
151
|
+
key: "getBoundingVolume",
|
|
152
|
+
value: function getBoundingVolume(zRange, worldOffset, project) {
|
|
153
|
+
if (project) {
|
|
154
|
+
var refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;
|
|
155
|
+
var refPointPositions = [];
|
|
156
|
+
|
|
157
|
+
var _iterator3 = _createForOfIteratorHelper(refPoints),
|
|
158
|
+
_step3;
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
162
|
+
var p = _step3.value;
|
|
163
|
+
var lngLat = (0, _utils.osmTile2lngLat)(this.x + p[0], this.y + p[1], this.z);
|
|
164
|
+
lngLat[2] = zRange[0];
|
|
165
|
+
refPointPositions.push(project(lngLat));
|
|
166
|
+
|
|
167
|
+
if (zRange[0] !== zRange[1]) {
|
|
168
|
+
lngLat[2] = zRange[1];
|
|
169
|
+
refPointPositions.push(project(lngLat));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
} catch (err) {
|
|
173
|
+
_iterator3.e(err);
|
|
174
|
+
} finally {
|
|
175
|
+
_iterator3.f();
|
|
176
|
+
}
|
|
125
177
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const originX = this.x * extent + worldOffset * TILE_SIZE;
|
|
129
|
-
const originY = TILE_SIZE - (this.y + 1) * extent;
|
|
130
|
-
return new _culling.AxisAlignedBoundingBox([originX, originY, zRange[0]], [originX + extent, originY + extent, zRange[1]]);
|
|
131
|
-
}
|
|
178
|
+
return (0, _culling.makeOrientedBoundingBoxFromPoints)(refPointPositions);
|
|
179
|
+
}
|
|
132
180
|
|
|
133
|
-
|
|
181
|
+
var scale = Math.pow(2, this.z);
|
|
182
|
+
var extent = TILE_SIZE / scale;
|
|
183
|
+
var originX = this.x * extent + worldOffset * TILE_SIZE;
|
|
184
|
+
var originY = TILE_SIZE - (this.y + 1) * extent;
|
|
185
|
+
return new _culling.AxisAlignedBoundingBox([originX, originY, zRange[0]], [originX + extent, originY + extent, zRange[1]]);
|
|
186
|
+
}
|
|
187
|
+
}]);
|
|
188
|
+
return OSMNode;
|
|
189
|
+
}();
|
|
134
190
|
|
|
135
191
|
function getOSMTileIndices(viewport, maxZ, zRange, bounds) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
normal,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
192
|
+
var project = viewport.resolution ? viewport.projectPosition : null;
|
|
193
|
+
var planes = Object.values(viewport.getFrustumPlanes()).map(function (_ref3) {
|
|
194
|
+
var normal = _ref3.normal,
|
|
195
|
+
distance = _ref3.distance;
|
|
196
|
+
return new _culling.Plane(normal.clone().negate(), distance);
|
|
197
|
+
});
|
|
198
|
+
var cullingVolume = new _culling.CullingVolume(planes);
|
|
199
|
+
var unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];
|
|
200
|
+
var elevationMin = zRange && zRange[0] * unitsPerMeter || 0;
|
|
201
|
+
var elevationMax = zRange && zRange[1] * unitsPerMeter || 0;
|
|
202
|
+
var minZ = viewport.pitch <= 60 ? maxZ : 0;
|
|
146
203
|
|
|
147
204
|
if (bounds) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
205
|
+
var _bounds = bounds,
|
|
206
|
+
_bounds2 = (0, _slicedToArray2.default)(_bounds, 4),
|
|
207
|
+
minLng = _bounds2[0],
|
|
208
|
+
minLat = _bounds2[1],
|
|
209
|
+
maxLng = _bounds2[2],
|
|
210
|
+
maxLat = _bounds2[3];
|
|
211
|
+
|
|
212
|
+
var topLeft = (0, _webMercator.lngLatToWorld)([minLng, maxLat]);
|
|
213
|
+
var bottomRight = (0, _webMercator.lngLatToWorld)([maxLng, minLat]);
|
|
151
214
|
bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];
|
|
152
215
|
}
|
|
153
216
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
viewport,
|
|
157
|
-
project,
|
|
158
|
-
cullingVolume,
|
|
217
|
+
var root = new OSMNode(0, 0, 0);
|
|
218
|
+
var traversalParams = {
|
|
219
|
+
viewport: viewport,
|
|
220
|
+
project: project,
|
|
221
|
+
cullingVolume: cullingVolume,
|
|
159
222
|
elevationBounds: [elevationMin, elevationMax],
|
|
160
|
-
minZ,
|
|
161
|
-
maxZ,
|
|
162
|
-
bounds,
|
|
223
|
+
minZ: minZ,
|
|
224
|
+
maxZ: maxZ,
|
|
225
|
+
bounds: bounds,
|
|
163
226
|
offset: 0
|
|
164
227
|
};
|
|
165
228
|
root.update(traversalParams);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/tile-layer/tile-2d-traversal.js"],"names":["TILE_SIZE","MAX_MAPS","REF_POINTS_5","REF_POINTS_9","concat","REF_POINTS_11","OSMNode","constructor","x","y","z","children","_children","update","params","viewport","cullingVolume","elevationBounds","minZ","maxZ","bounds","offset","project","boundingVolume","getBoundingVolume","insideBounds","isInside","computeVisibility","childVisible","distance","distanceTo","cameraPosition","scale","height","Math","floor","log2","selected","child","getSelected","result","push","node","minX","minY","maxX","maxY","pow","extent","zRange","worldOffset","refPoints","refPointPositions","p","lngLat","originX","originY","AxisAlignedBoundingBox","getOSMTileIndices","resolution","projectPosition","planes","Object","values","getFrustumPlanes","map","normal","Plane","clone","negate","CullingVolume","unitsPerMeter","distanceScales","elevationMin","elevationMax","pitch","minLng","minLat","maxLng","maxLat","topLeft","bottomRight","root","traversalParams","subViewports","length"],"mappings":"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","sourcesContent":["/* eslint-disable complexity */\nimport {\n CullingVolume,\n Plane,\n AxisAlignedBoundingBox,\n makeOrientedBoundingBoxFromPoints\n} from '@math.gl/culling';\nimport {lngLatToWorld} from '@math.gl/web-mercator';\nimport {osmTile2lngLat} from './utils';\n\nconst TILE_SIZE = 512;\n// number of world copies to check\nconst MAX_MAPS = 3;\n// for calculating bounding volume of a tile in a non-web-mercator viewport\nconst REF_POINTS_5 = [\n [0.5, 0.5],\n [0, 0],\n [0, 1],\n [1, 0],\n [1, 1]\n]; // 4 corners and center\nconst REF_POINTS_9 = REF_POINTS_5.concat([\n [0, 0.5],\n [0.5, 0],\n [1, 0.5],\n [0.5, 1]\n]); // 4 corners, center and 4 mid points\nconst REF_POINTS_11 = REF_POINTS_9.concat([\n [0.25, 0.5],\n [0.75, 0.5]\n]); // 2 additional points on equator for top tile\n\nclass OSMNode {\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n get children() {\n if (!this._children) {\n const x = this.x * 2;\n const y = this.y * 2;\n const z = this.z + 1;\n this._children = [\n new OSMNode(x, y, z),\n new OSMNode(x, y + 1, z),\n new OSMNode(x + 1, y, z),\n new OSMNode(x + 1, y + 1, z)\n ];\n }\n return this._children;\n }\n\n update(params) {\n const {viewport, cullingVolume, elevationBounds, minZ, maxZ, bounds, offset, project} = params;\n const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);\n\n // First, check if this tile is visible\n if (bounds && !this.insideBounds(bounds)) {\n return false;\n }\n\n const isInside = cullingVolume.computeVisibility(boundingVolume);\n if (isInside < 0) {\n return false;\n }\n\n // Avoid loading overlapping tiles - if a descendant is requested, do not request the ancester\n if (!this.childVisible) {\n let {z} = this;\n if (z < maxZ && z >= minZ) {\n // Adjust LOD\n // If the tile is far enough from the camera, accept a lower zoom level\n const distance =\n (boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale) / viewport.height;\n z += Math.floor(Math.log2(distance));\n }\n if (z >= maxZ) {\n // LOD is acceptable\n this.selected = true;\n return true;\n }\n }\n\n // LOD is not enough, recursively test child tiles\n this.selected = false;\n this.childVisible = true;\n for (const child of this.children) {\n child.update(params);\n }\n return true;\n }\n\n getSelected(result = []) {\n if (this.selected) {\n result.push(this);\n }\n if (this._children) {\n for (const node of this._children) {\n node.getSelected(result);\n }\n }\n return result;\n }\n\n insideBounds([minX, minY, maxX, maxY]) {\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n\n return (\n this.x * extent < maxX &&\n this.y * extent < maxY &&\n (this.x + 1) * extent > minX &&\n (this.y + 1) * extent > minY\n );\n }\n\n getBoundingVolume(zRange, worldOffset, project) {\n if (project) {\n // Custom projection\n // Estimate bounding box from sample points\n // At low zoom level we need more samples to calculate the bounding volume correctly\n const refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;\n\n // Convert from tile-relative coordinates to common space\n const refPointPositions = [];\n for (const p of refPoints) {\n const lngLat = osmTile2lngLat(this.x + p[0], this.y + p[1], this.z);\n lngLat[2] = zRange[0];\n refPointPositions.push(project(lngLat));\n\n if (zRange[0] !== zRange[1]) {\n // Account for the elevation volume\n lngLat[2] = zRange[1];\n refPointPositions.push(project(lngLat));\n }\n }\n\n return makeOrientedBoundingBoxFromPoints(refPointPositions);\n }\n\n // Use WebMercator projection\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n const originX = this.x * extent + worldOffset * TILE_SIZE;\n // deck's common space is y-flipped\n const originY = TILE_SIZE - (this.y + 1) * extent;\n\n return new AxisAlignedBoundingBox(\n [originX, originY, zRange[0]],\n [originX + extent, originY + extent, zRange[1]]\n );\n }\n}\n\nexport function getOSMTileIndices(viewport, maxZ, zRange, bounds) {\n const project = viewport.resolution ? viewport.projectPosition : null;\n\n // Get the culling volume of the current camera\n const planes = Object.values(viewport.getFrustumPlanes()).map(\n ({normal, distance}) => new Plane(normal.clone().negate(), distance)\n );\n const cullingVolume = new CullingVolume(planes);\n\n // Project zRange from meters to common space\n const unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];\n const elevationMin = (zRange && zRange[0] * unitsPerMeter) || 0;\n const elevationMax = (zRange && zRange[1] * unitsPerMeter) || 0;\n\n // Always load at the current zoom level if pitch is small\n const minZ = viewport.pitch <= 60 ? maxZ : 0;\n\n // Map extent to OSM position\n if (bounds) {\n const [minLng, minLat, maxLng, maxLat] = bounds;\n const topLeft = lngLatToWorld([minLng, maxLat]);\n const bottomRight = lngLatToWorld([maxLng, minLat]);\n bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];\n }\n\n const root = new OSMNode(0, 0, 0);\n const traversalParams = {\n viewport,\n project,\n cullingVolume,\n elevationBounds: [elevationMin, elevationMax],\n minZ,\n maxZ,\n bounds,\n // num. of worlds from the center. For repeated maps\n offset: 0\n };\n\n root.update(traversalParams);\n\n if (viewport.subViewports && viewport.subViewports.length > 1) {\n // Check worlds in repeated maps\n traversalParams.offset = -1;\n while (root.update(traversalParams)) {\n if (--traversalParams.offset < -MAX_MAPS) {\n break;\n }\n }\n traversalParams.offset = 1;\n while (root.update(traversalParams)) {\n if (++traversalParams.offset > MAX_MAPS) {\n break;\n }\n }\n }\n\n return root.getSelected();\n}\n"],"file":"tile-2d-traversal.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/tile-layer/tile-2d-traversal.js"],"names":["TILE_SIZE","MAX_MAPS","REF_POINTS_5","REF_POINTS_9","concat","REF_POINTS_11","OSMNode","x","y","z","_children","params","viewport","cullingVolume","elevationBounds","minZ","maxZ","bounds","offset","project","boundingVolume","getBoundingVolume","insideBounds","isInside","computeVisibility","childVisible","distance","distanceTo","cameraPosition","scale","height","Math","floor","log2","selected","children","child","update","result","push","node","getSelected","minX","minY","maxX","maxY","pow","extent","zRange","worldOffset","refPoints","refPointPositions","p","lngLat","originX","originY","AxisAlignedBoundingBox","getOSMTileIndices","resolution","projectPosition","planes","Object","values","getFrustumPlanes","map","normal","Plane","clone","negate","CullingVolume","unitsPerMeter","distanceScales","elevationMin","elevationMax","pitch","minLng","minLat","maxLng","maxLat","topLeft","bottomRight","root","traversalParams","subViewports","length"],"mappings":"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","sourcesContent":["/* eslint-disable complexity */\nimport {\n CullingVolume,\n Plane,\n AxisAlignedBoundingBox,\n makeOrientedBoundingBoxFromPoints\n} from '@math.gl/culling';\nimport {lngLatToWorld} from '@math.gl/web-mercator';\nimport {osmTile2lngLat} from './utils';\n\nconst TILE_SIZE = 512;\n// number of world copies to check\nconst MAX_MAPS = 3;\n// for calculating bounding volume of a tile in a non-web-mercator viewport\nconst REF_POINTS_5 = [\n [0.5, 0.5],\n [0, 0],\n [0, 1],\n [1, 0],\n [1, 1]\n]; // 4 corners and center\nconst REF_POINTS_9 = REF_POINTS_5.concat([\n [0, 0.5],\n [0.5, 0],\n [1, 0.5],\n [0.5, 1]\n]); // 4 corners, center and 4 mid points\nconst REF_POINTS_11 = REF_POINTS_9.concat([\n [0.25, 0.5],\n [0.75, 0.5]\n]); // 2 additional points on equator for top tile\n\nclass OSMNode {\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n get children() {\n if (!this._children) {\n const x = this.x * 2;\n const y = this.y * 2;\n const z = this.z + 1;\n this._children = [\n new OSMNode(x, y, z),\n new OSMNode(x, y + 1, z),\n new OSMNode(x + 1, y, z),\n new OSMNode(x + 1, y + 1, z)\n ];\n }\n return this._children;\n }\n\n update(params) {\n const {viewport, cullingVolume, elevationBounds, minZ, maxZ, bounds, offset, project} = params;\n const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);\n\n // First, check if this tile is visible\n if (bounds && !this.insideBounds(bounds)) {\n return false;\n }\n\n const isInside = cullingVolume.computeVisibility(boundingVolume);\n if (isInside < 0) {\n return false;\n }\n\n // Avoid loading overlapping tiles - if a descendant is requested, do not request the ancester\n if (!this.childVisible) {\n let {z} = this;\n if (z < maxZ && z >= minZ) {\n // Adjust LOD\n // If the tile is far enough from the camera, accept a lower zoom level\n const distance =\n (boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale) / viewport.height;\n z += Math.floor(Math.log2(distance));\n }\n if (z >= maxZ) {\n // LOD is acceptable\n this.selected = true;\n return true;\n }\n }\n\n // LOD is not enough, recursively test child tiles\n this.selected = false;\n this.childVisible = true;\n for (const child of this.children) {\n child.update(params);\n }\n return true;\n }\n\n getSelected(result = []) {\n if (this.selected) {\n result.push(this);\n }\n if (this._children) {\n for (const node of this._children) {\n node.getSelected(result);\n }\n }\n return result;\n }\n\n insideBounds([minX, minY, maxX, maxY]) {\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n\n return (\n this.x * extent < maxX &&\n this.y * extent < maxY &&\n (this.x + 1) * extent > minX &&\n (this.y + 1) * extent > minY\n );\n }\n\n getBoundingVolume(zRange, worldOffset, project) {\n if (project) {\n // Custom projection\n // Estimate bounding box from sample points\n // At low zoom level we need more samples to calculate the bounding volume correctly\n const refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;\n\n // Convert from tile-relative coordinates to common space\n const refPointPositions = [];\n for (const p of refPoints) {\n const lngLat = osmTile2lngLat(this.x + p[0], this.y + p[1], this.z);\n lngLat[2] = zRange[0];\n refPointPositions.push(project(lngLat));\n\n if (zRange[0] !== zRange[1]) {\n // Account for the elevation volume\n lngLat[2] = zRange[1];\n refPointPositions.push(project(lngLat));\n }\n }\n\n return makeOrientedBoundingBoxFromPoints(refPointPositions);\n }\n\n // Use WebMercator projection\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n const originX = this.x * extent + worldOffset * TILE_SIZE;\n // deck's common space is y-flipped\n const originY = TILE_SIZE - (this.y + 1) * extent;\n\n return new AxisAlignedBoundingBox(\n [originX, originY, zRange[0]],\n [originX + extent, originY + extent, zRange[1]]\n );\n }\n}\n\nexport function getOSMTileIndices(viewport, maxZ, zRange, bounds) {\n const project = viewport.resolution ? viewport.projectPosition : null;\n\n // Get the culling volume of the current camera\n const planes = Object.values(viewport.getFrustumPlanes()).map(\n ({normal, distance}) => new Plane(normal.clone().negate(), distance)\n );\n const cullingVolume = new CullingVolume(planes);\n\n // Project zRange from meters to common space\n const unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];\n const elevationMin = (zRange && zRange[0] * unitsPerMeter) || 0;\n const elevationMax = (zRange && zRange[1] * unitsPerMeter) || 0;\n\n // Always load at the current zoom level if pitch is small\n const minZ = viewport.pitch <= 60 ? maxZ : 0;\n\n // Map extent to OSM position\n if (bounds) {\n const [minLng, minLat, maxLng, maxLat] = bounds;\n const topLeft = lngLatToWorld([minLng, maxLat]);\n const bottomRight = lngLatToWorld([maxLng, minLat]);\n bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];\n }\n\n const root = new OSMNode(0, 0, 0);\n const traversalParams = {\n viewport,\n project,\n cullingVolume,\n elevationBounds: [elevationMin, elevationMax],\n minZ,\n maxZ,\n bounds,\n // num. of worlds from the center. For repeated maps\n offset: 0\n };\n\n root.update(traversalParams);\n\n if (viewport.subViewports && viewport.subViewports.length > 1) {\n // Check worlds in repeated maps\n traversalParams.offset = -1;\n while (root.update(traversalParams)) {\n if (--traversalParams.offset < -MAX_MAPS) {\n break;\n }\n }\n traversalParams.offset = 1;\n while (root.update(traversalParams)) {\n if (++traversalParams.offset > MAX_MAPS) {\n break;\n }\n }\n }\n\n return root.getSelected();\n}\n"],"file":"tile-2d-traversal.js"}
|