@deck.gl/geo-layers 8.7.0-beta.6 → 8.7.1
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 +218 -146
- package/dist/es5/geo-cell-layer/GeoCellLayer.js +112 -0
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -0
- package/dist/es5/h3-layers/h3-cluster-layer.js +10 -59
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/index.js +8 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +22 -20
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js +69 -0
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -0
- package/dist/es5/quadkey-layer/quadkey-utils.js +51 -0
- package/dist/es5/quadkey-layer/quadkey-utils.js.map +1 -0
- package/dist/es5/s2-layer/s2-layer.js +10 -68
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/tile-layer/utils.js +1 -1
- package/dist/es5/tile-layer/utils.js.map +1 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js +68 -0
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -0
- package/dist/esm/h3-layers/h3-cluster-layer.js +7 -51
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +13 -9
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js +26 -0
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -0
- package/dist/esm/quadkey-layer/quadkey-utils.js +24 -0
- package/dist/esm/quadkey-layer/quadkey-utils.js.map +1 -0
- package/dist/esm/s2-layer/s2-layer.js +6 -59
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/tile-layer/utils.js +1 -1
- package/dist/esm/tile-layer/utils.js.map +1 -1
- package/dist.min.js +2 -2
- package/package.json +2 -2
- package/src/geo-cell-layer/GeoCellLayer.js +80 -0
- package/src/h3-layers/h3-cluster-layer.js +8 -64
- package/src/index.ts +1 -0
- package/src/mvt-layer/mvt-layer.js +12 -7
- package/src/quadkey-layer/quadkey-layer.js +22 -0
- package/src/quadkey-layer/quadkey-utils.js +28 -0
- package/src/s2-layer/s2-layer.js +9 -75
- package/src/tile-layer/utils.js +4 -4
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@deck.gl/geo-layers",
|
|
3
3
|
"description": "deck.gl layers supporting geospatial use cases and GIS formats",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "8.7.
|
|
5
|
+
"version": "8.7.1",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"@deck.gl/mesh-layers": "^8.0.0",
|
|
50
50
|
"@loaders.gl/core": "^3.0.0"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "8a2f488c640bbf80982c684e7fd741982afe1d81"
|
|
53
53
|
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import {CompositeLayer} from '@deck.gl/core';
|
|
2
|
+
import {PolygonLayer} from '@deck.gl/layers';
|
|
3
|
+
|
|
4
|
+
const defaultProps = {
|
|
5
|
+
...PolygonLayer.defaultProps
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default class GeoCellLayer extends CompositeLayer {
|
|
9
|
+
// Implement to generate props to create geometry
|
|
10
|
+
indexToBounds() {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
renderLayers() {
|
|
15
|
+
// Rendering props underlying layer
|
|
16
|
+
const {
|
|
17
|
+
elevationScale,
|
|
18
|
+
extruded,
|
|
19
|
+
wireframe,
|
|
20
|
+
filled,
|
|
21
|
+
stroked,
|
|
22
|
+
lineWidthUnits,
|
|
23
|
+
lineWidthScale,
|
|
24
|
+
lineWidthMinPixels,
|
|
25
|
+
lineWidthMaxPixels,
|
|
26
|
+
lineJointRounded,
|
|
27
|
+
lineMiterLimit,
|
|
28
|
+
lineDashJustified,
|
|
29
|
+
getElevation,
|
|
30
|
+
getFillColor,
|
|
31
|
+
getLineColor,
|
|
32
|
+
getLineWidth
|
|
33
|
+
} = this.props;
|
|
34
|
+
|
|
35
|
+
// Accessor props for underlying layers
|
|
36
|
+
const {updateTriggers, material, transitions} = this.props;
|
|
37
|
+
|
|
38
|
+
// Filled Polygon Layer
|
|
39
|
+
const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
|
|
40
|
+
return new CellLayer(
|
|
41
|
+
{
|
|
42
|
+
filled,
|
|
43
|
+
wireframe,
|
|
44
|
+
|
|
45
|
+
extruded,
|
|
46
|
+
elevationScale,
|
|
47
|
+
|
|
48
|
+
stroked,
|
|
49
|
+
lineWidthUnits,
|
|
50
|
+
lineWidthScale,
|
|
51
|
+
lineWidthMinPixels,
|
|
52
|
+
lineWidthMaxPixels,
|
|
53
|
+
lineJointRounded,
|
|
54
|
+
lineMiterLimit,
|
|
55
|
+
lineDashJustified,
|
|
56
|
+
|
|
57
|
+
material,
|
|
58
|
+
transitions,
|
|
59
|
+
|
|
60
|
+
getElevation,
|
|
61
|
+
getFillColor,
|
|
62
|
+
getLineColor,
|
|
63
|
+
getLineWidth
|
|
64
|
+
},
|
|
65
|
+
this.getSubLayerProps({
|
|
66
|
+
id: 'cell',
|
|
67
|
+
updateTriggers: {
|
|
68
|
+
getElevation: updateTriggers.getElevation,
|
|
69
|
+
getFillColor: updateTriggers.getFillColor,
|
|
70
|
+
getLineColor: updateTriggers.getLineColor,
|
|
71
|
+
getLineWidth: updateTriggers.getLineWidth
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
this.indexToBounds()
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
GeoCellLayer.layerName = 'GeoCellLayer';
|
|
80
|
+
GeoCellLayer.defaultProps = defaultProps;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import {h3SetToMultiPolygon} from 'h3-js';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import {createIterable} from '@deck.gl/core';
|
|
4
|
+
import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
|
|
5
5
|
|
|
6
6
|
const defaultProps = {
|
|
7
|
-
...PolygonLayer.defaultProps,
|
|
8
7
|
getHexagons: {type: 'accessor', value: d => d.hexagons}
|
|
9
8
|
};
|
|
10
9
|
|
|
11
|
-
export default class H3ClusterLayer extends
|
|
10
|
+
export default class H3ClusterLayer extends GeoCellLayer {
|
|
12
11
|
updateState({props, oldProps, changeFlags}) {
|
|
13
12
|
if (
|
|
14
13
|
changeFlags.dataChanged ||
|
|
@@ -32,66 +31,11 @@ export default class H3ClusterLayer extends CompositeLayer {
|
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
filled,
|
|
41
|
-
stroked,
|
|
42
|
-
lineWidthScale,
|
|
43
|
-
lineWidthMinPixels,
|
|
44
|
-
lineWidthMaxPixels,
|
|
45
|
-
lineJointRounded,
|
|
46
|
-
lineMiterLimit,
|
|
47
|
-
lineDashJustified,
|
|
48
|
-
material,
|
|
49
|
-
|
|
50
|
-
getFillColor,
|
|
51
|
-
getLineColor,
|
|
52
|
-
getLineWidth,
|
|
53
|
-
getLineDashArray,
|
|
54
|
-
getElevation,
|
|
55
|
-
transitions,
|
|
56
|
-
updateTriggers
|
|
57
|
-
} = this.props;
|
|
58
|
-
|
|
59
|
-
const SubLayerClass = this.getSubLayerClass('cluster-region', PolygonLayer);
|
|
60
|
-
|
|
61
|
-
return new SubLayerClass(
|
|
62
|
-
{
|
|
63
|
-
filled,
|
|
64
|
-
wireframe,
|
|
65
|
-
|
|
66
|
-
extruded,
|
|
67
|
-
elevationScale,
|
|
68
|
-
|
|
69
|
-
stroked,
|
|
70
|
-
lineWidthScale,
|
|
71
|
-
lineWidthMinPixels,
|
|
72
|
-
lineWidthMaxPixels,
|
|
73
|
-
lineJointRounded,
|
|
74
|
-
lineMiterLimit,
|
|
75
|
-
lineDashJustified,
|
|
76
|
-
|
|
77
|
-
material,
|
|
78
|
-
transitions,
|
|
79
|
-
|
|
80
|
-
getFillColor: this.getSubLayerAccessor(getFillColor),
|
|
81
|
-
getLineColor: this.getSubLayerAccessor(getLineColor),
|
|
82
|
-
getLineWidth: this.getSubLayerAccessor(getLineWidth),
|
|
83
|
-
getLineDashArray: this.getSubLayerAccessor(getLineDashArray),
|
|
84
|
-
getElevation: this.getSubLayerAccessor(getElevation)
|
|
85
|
-
},
|
|
86
|
-
this.getSubLayerProps({
|
|
87
|
-
id: 'cluster-region',
|
|
88
|
-
updateTriggers
|
|
89
|
-
}),
|
|
90
|
-
{
|
|
91
|
-
data: this.state.polygons,
|
|
92
|
-
getPolygon: d => d.polygon
|
|
93
|
-
}
|
|
94
|
-
);
|
|
34
|
+
indexToBounds() {
|
|
35
|
+
return {
|
|
36
|
+
data: this.state.polygons,
|
|
37
|
+
getPolygon: d => d.polygon
|
|
38
|
+
};
|
|
95
39
|
}
|
|
96
40
|
}
|
|
97
41
|
|
package/src/index.ts
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
export {default as GreatCircleLayer} from './great-circle-layer/great-circle-layer';
|
|
23
23
|
export {default as S2Layer} from './s2-layer/s2-layer';
|
|
24
|
+
export {default as QuadkeyLayer} from './quadkey-layer/quadkey-layer';
|
|
24
25
|
export {default as TileLayer} from './tile-layer/tile-layer';
|
|
25
26
|
export {default as TripsLayer} from './trips-layer/trips-layer';
|
|
26
27
|
export {default as H3ClusterLayer} from './h3-layers/h3-cluster-layer';
|
|
@@ -15,6 +15,7 @@ import {GeoJsonLayer} from '@deck.gl/layers';
|
|
|
15
15
|
const WORLD_SIZE = 512;
|
|
16
16
|
|
|
17
17
|
const defaultProps = {
|
|
18
|
+
...GeoJsonLayer.defaultProps,
|
|
18
19
|
uniqueIdProperty: {type: 'string', value: ''},
|
|
19
20
|
highlightedFeatureId: null,
|
|
20
21
|
loaders: [MVTWorkerLoader],
|
|
@@ -24,7 +25,10 @@ const defaultProps = {
|
|
|
24
25
|
export default class MVTLayer extends TileLayer {
|
|
25
26
|
initializeState() {
|
|
26
27
|
super.initializeState();
|
|
28
|
+
// GlobeView doesn't work well with binary data
|
|
29
|
+
const binary = this.context.viewport.resolution !== undefined ? false : this.props.binary;
|
|
27
30
|
this.setState({
|
|
31
|
+
binary,
|
|
28
32
|
data: null,
|
|
29
33
|
tileJSON: null
|
|
30
34
|
});
|
|
@@ -110,7 +114,8 @@ export default class MVTLayer extends TileLayer {
|
|
|
110
114
|
return Promise.reject('Invalid URL');
|
|
111
115
|
}
|
|
112
116
|
let loadOptions = this.getLoadOptions();
|
|
113
|
-
const {binary
|
|
117
|
+
const {binary} = this.state;
|
|
118
|
+
const {fetch} = this.props;
|
|
114
119
|
const {signal, x, y, z} = tile;
|
|
115
120
|
loadOptions = {
|
|
116
121
|
...loadOptions,
|
|
@@ -152,7 +157,7 @@ export default class MVTLayer extends TileLayer {
|
|
|
152
157
|
|
|
153
158
|
const subLayers = super.renderSubLayers(props);
|
|
154
159
|
|
|
155
|
-
if (this.
|
|
160
|
+
if (this.state.binary && !(subLayers instanceof GeoJsonLayer)) {
|
|
156
161
|
log.warn('renderSubLayers() must return GeoJsonLayer when using binary:true')();
|
|
157
162
|
}
|
|
158
163
|
|
|
@@ -193,7 +198,7 @@ export default class MVTLayer extends TileLayer {
|
|
|
193
198
|
|
|
194
199
|
const isWGS84 = this.context.viewport.resolution;
|
|
195
200
|
|
|
196
|
-
if (this.
|
|
201
|
+
if (this.state.binary && info.index !== -1) {
|
|
197
202
|
const {data} = params.sourceLayer.props;
|
|
198
203
|
info.object = binaryToGeojson(data, {globalFeatureId: info.index});
|
|
199
204
|
}
|
|
@@ -212,8 +217,8 @@ export default class MVTLayer extends TileLayer {
|
|
|
212
217
|
}
|
|
213
218
|
|
|
214
219
|
getHighlightedObjectIndex(tile) {
|
|
215
|
-
const {hoveredFeatureId, hoveredFeatureLayerName} = this.state;
|
|
216
|
-
const {uniqueIdProperty, highlightedFeatureId
|
|
220
|
+
const {hoveredFeatureId, hoveredFeatureLayerName, binary} = this.state;
|
|
221
|
+
const {uniqueIdProperty, highlightedFeatureId} = this.props;
|
|
217
222
|
const data = tile.content;
|
|
218
223
|
|
|
219
224
|
const isHighlighted = isFeatureIdDefined(highlightedFeatureId);
|
|
@@ -293,7 +298,7 @@ export default class MVTLayer extends TileLayer {
|
|
|
293
298
|
return null;
|
|
294
299
|
}
|
|
295
300
|
|
|
296
|
-
if (this.
|
|
301
|
+
if (this.state.binary && Array.isArray(tile.content) && !tile.content.length) {
|
|
297
302
|
// TODO: @loaders.gl/mvt returns [] when no content. It should return a valid empty binary.
|
|
298
303
|
// https://github.com/visgl/loaders.gl/pull/1137
|
|
299
304
|
return [];
|
|
@@ -301,7 +306,7 @@ export default class MVTLayer extends TileLayer {
|
|
|
301
306
|
|
|
302
307
|
if (tile._contentWGS84 === undefined) {
|
|
303
308
|
// Create a cache to transform only once
|
|
304
|
-
const content = this.
|
|
309
|
+
const content = this.state.binary ? binaryToGeojson(tile.content) : tile.content;
|
|
305
310
|
tile._contentWGS84 = content.map(feature =>
|
|
306
311
|
transformTileCoordsToWGS84(feature, tile.bbox, this.context.viewport)
|
|
307
312
|
);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
|
|
2
|
+
import {getQuadkeyPolygon} from './quadkey-utils';
|
|
3
|
+
|
|
4
|
+
const defaultProps = {
|
|
5
|
+
getQuadkey: {type: 'accessor', value: d => d.quadkey}
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export default class QuadkeyLayer extends GeoCellLayer {
|
|
9
|
+
indexToBounds() {
|
|
10
|
+
const {data, getQuadkey} = this.props;
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
data,
|
|
14
|
+
_normalize: false,
|
|
15
|
+
positionFormat: 'XY',
|
|
16
|
+
getPolygon: (x, objectInfo) => getQuadkeyPolygon(getQuadkey(x, objectInfo))
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
QuadkeyLayer.layerName = 'QuadkeyLayer';
|
|
22
|
+
QuadkeyLayer.defaultProps = defaultProps;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {worldToLngLat} from '@math.gl/web-mercator';
|
|
2
|
+
|
|
3
|
+
const TILE_SIZE = 512;
|
|
4
|
+
|
|
5
|
+
export function quadkeyToWorldBounds(quadkey) {
|
|
6
|
+
let x = 0;
|
|
7
|
+
let y = 0;
|
|
8
|
+
let mask = 1 << quadkey.length;
|
|
9
|
+
const scale = mask / TILE_SIZE;
|
|
10
|
+
|
|
11
|
+
for (let i = 0; i < quadkey.length; i++) {
|
|
12
|
+
mask >>= 1;
|
|
13
|
+
const q = parseInt(quadkey[i]);
|
|
14
|
+
if (q % 2) x |= mask;
|
|
15
|
+
if (q > 1) y |= mask;
|
|
16
|
+
}
|
|
17
|
+
return [
|
|
18
|
+
[x / scale, TILE_SIZE - y / scale],
|
|
19
|
+
[(x + 0.99) / scale, TILE_SIZE - (y + 0.99) / scale]
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getQuadkeyPolygon(quadkey) {
|
|
24
|
+
const [topLeft, bottomRight] = quadkeyToWorldBounds(quadkey);
|
|
25
|
+
const [w, n] = worldToLngLat(topLeft);
|
|
26
|
+
const [e, s] = worldToLngLat(bottomRight);
|
|
27
|
+
return [e, n, e, s, w, s, w, n, e, n];
|
|
28
|
+
}
|
package/src/s2-layer/s2-layer.js
CHANGED
|
@@ -18,89 +18,23 @@
|
|
|
18
18
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
19
|
// THE SOFTWARE.
|
|
20
20
|
|
|
21
|
-
import
|
|
22
|
-
import {PolygonLayer} from '@deck.gl/layers';
|
|
23
|
-
|
|
21
|
+
import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
|
|
24
22
|
import {getS2Polygon} from './s2-utils';
|
|
25
23
|
|
|
26
24
|
const defaultProps = {
|
|
27
|
-
...PolygonLayer.defaultProps,
|
|
28
25
|
getS2Token: {type: 'accessor', value: d => d.token}
|
|
29
26
|
};
|
|
30
27
|
|
|
31
|
-
export default class S2Layer extends
|
|
32
|
-
|
|
33
|
-
// Layer prop
|
|
28
|
+
export default class S2Layer extends GeoCellLayer {
|
|
29
|
+
indexToBounds() {
|
|
34
30
|
const {data, getS2Token} = this.props;
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
stroked,
|
|
43
|
-
lineWidthUnits,
|
|
44
|
-
lineWidthScale,
|
|
45
|
-
lineWidthMinPixels,
|
|
46
|
-
lineWidthMaxPixels,
|
|
47
|
-
lineJointRounded,
|
|
48
|
-
lineMiterLimit,
|
|
49
|
-
lineDashJustified,
|
|
50
|
-
getElevation,
|
|
51
|
-
getFillColor,
|
|
52
|
-
getLineColor,
|
|
53
|
-
getLineWidth,
|
|
54
|
-
getLineDashArray
|
|
55
|
-
} = this.props;
|
|
56
|
-
|
|
57
|
-
// Accessor props for underlying layers
|
|
58
|
-
const {updateTriggers, material} = this.props;
|
|
59
|
-
|
|
60
|
-
// Filled Polygon Layer
|
|
61
|
-
const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
|
|
62
|
-
return new CellLayer(
|
|
63
|
-
{
|
|
64
|
-
filled,
|
|
65
|
-
wireframe,
|
|
66
|
-
|
|
67
|
-
extruded,
|
|
68
|
-
elevationScale,
|
|
69
|
-
|
|
70
|
-
stroked,
|
|
71
|
-
lineWidthUnits,
|
|
72
|
-
lineWidthScale,
|
|
73
|
-
lineWidthMinPixels,
|
|
74
|
-
lineWidthMaxPixels,
|
|
75
|
-
lineJointRounded,
|
|
76
|
-
lineMiterLimit,
|
|
77
|
-
lineDashJustified,
|
|
78
|
-
|
|
79
|
-
material,
|
|
80
|
-
|
|
81
|
-
getElevation,
|
|
82
|
-
getFillColor,
|
|
83
|
-
getLineColor,
|
|
84
|
-
getLineWidth,
|
|
85
|
-
getLineDashArray
|
|
86
|
-
},
|
|
87
|
-
this.getSubLayerProps({
|
|
88
|
-
id: 'cell',
|
|
89
|
-
updateTriggers: {
|
|
90
|
-
getElevation: updateTriggers.getElevation,
|
|
91
|
-
getFillColor: updateTriggers.getFillColor,
|
|
92
|
-
getLineColor: updateTriggers.getLineColor,
|
|
93
|
-
getLineWidth: updateTriggers.getLineWidth,
|
|
94
|
-
getLineDashArray: updateTriggers.getLineDashArray
|
|
95
|
-
}
|
|
96
|
-
}),
|
|
97
|
-
{
|
|
98
|
-
data,
|
|
99
|
-
_normalize: false,
|
|
100
|
-
positionFormat: 'XY',
|
|
101
|
-
getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
|
|
102
|
-
}
|
|
103
|
-
);
|
|
32
|
+
return {
|
|
33
|
+
data,
|
|
34
|
+
_normalize: false,
|
|
35
|
+
positionFormat: 'XY',
|
|
36
|
+
getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
|
|
37
|
+
};
|
|
104
38
|
}
|
|
105
39
|
}
|
|
106
40
|
|
package/src/tile-layer/utils.js
CHANGED
|
@@ -33,13 +33,13 @@ export const urlType = {
|
|
|
33
33
|
function transformBox(bbox, modelMatrix) {
|
|
34
34
|
const transformedCoords = [
|
|
35
35
|
// top-left
|
|
36
|
-
modelMatrix.
|
|
36
|
+
modelMatrix.transformAsPoint([bbox[0], bbox[1]]),
|
|
37
37
|
// top-right
|
|
38
|
-
modelMatrix.
|
|
38
|
+
modelMatrix.transformAsPoint([bbox[2], bbox[1]]),
|
|
39
39
|
// bottom-left
|
|
40
|
-
modelMatrix.
|
|
40
|
+
modelMatrix.transformAsPoint([bbox[0], bbox[3]]),
|
|
41
41
|
// bottom-right
|
|
42
|
-
modelMatrix.
|
|
42
|
+
modelMatrix.transformAsPoint([bbox[2], bbox[3]])
|
|
43
43
|
];
|
|
44
44
|
const transformedBox = [
|
|
45
45
|
// Minimum x coord
|