@deck.gl/geo-layers 9.0.0-beta.2 → 9.0.0-beta.3
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 +2796 -7199
- package/dist/geo-cell-layer/GeoCellLayer.js +51 -0
- package/dist/geohash-layer/geohash-layer.js +19 -0
- package/dist/geohash-layer/geohash-utils.js +50 -0
- package/dist/great-circle-layer/great-circle-layer.js +12 -0
- package/dist/h3-layers/h3-cluster-layer.js +47 -0
- package/dist/h3-layers/h3-hexagon-layer.js +204 -0
- package/dist/h3-layers/h3-utils.js +56 -0
- package/dist/index.cjs +3199 -0
- package/dist/index.cjs.map +7 -0
- package/{typed → dist}/index.d.ts +5 -5
- package/{typed → dist}/index.d.ts.map +1 -1
- package/dist/index.js +36 -0
- package/dist/{esm/mesh-layer → mesh-layer}/mesh-layer-fragment.glsl.js +0 -1
- package/dist/{esm/mesh-layer → mesh-layer}/mesh-layer-vertex.glsl.js +0 -1
- package/dist/mesh-layer/mesh-layer.js +129 -0
- package/{typed → dist}/mvt-layer/coordinate-transform.d.ts +1 -1
- package/{typed → dist}/mvt-layer/coordinate-transform.d.ts.map +1 -1
- package/dist/mvt-layer/coordinate-transform.js +41 -0
- package/dist/mvt-layer/find-index-binary.d.ts +11 -0
- package/dist/mvt-layer/find-index-binary.d.ts.map +1 -0
- package/dist/mvt-layer/find-index-binary.js +96 -0
- package/{typed → dist}/mvt-layer/mvt-layer.d.ts +6 -5
- package/dist/mvt-layer/mvt-layer.d.ts.map +1 -0
- package/dist/mvt-layer/mvt-layer.js +305 -0
- package/dist/quadkey-layer/quadkey-layer.js +22 -0
- package/dist/quadkey-layer/quadkey-utils.js +26 -0
- package/dist/s2-layer/s2-geometry.js +123 -0
- package/dist/s2-layer/s2-layer.js +38 -0
- package/dist/s2-layer/s2-utils.js +87 -0
- package/{typed → dist}/terrain-layer/terrain-layer.d.ts +3 -3
- package/dist/terrain-layer/terrain-layer.d.ts.map +1 -0
- package/dist/terrain-layer/terrain-layer.js +233 -0
- package/dist/tile-3d-layer/tile-3d-layer.js +302 -0
- package/{typed → dist}/tile-layer/tile-layer.d.ts +3 -3
- package/dist/tile-layer/tile-layer.d.ts.map +1 -0
- package/dist/tile-layer/tile-layer.js +204 -0
- package/dist/tileset-2d/index.js +4 -0
- package/dist/tileset-2d/memoize.js +41 -0
- package/{typed → dist}/tileset-2d/tile-2d-header.d.ts +2 -1
- package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
- package/dist/tileset-2d/tile-2d-header.js +135 -0
- package/{typed → dist}/tileset-2d/tile-2d-traversal.d.ts +1 -1
- package/{typed → dist}/tileset-2d/tile-2d-traversal.d.ts.map +1 -1
- package/dist/tileset-2d/tile-2d-traversal.js +182 -0
- package/{typed → dist}/tileset-2d/tileset-2d.d.ts +4 -4
- package/{typed → dist}/tileset-2d/tileset-2d.d.ts.map +1 -1
- package/dist/tileset-2d/tileset-2d.js +456 -0
- package/dist/tileset-2d/types.js +1 -0
- package/{typed → dist}/tileset-2d/utils.d.ts +2 -2
- package/dist/tileset-2d/utils.d.ts.map +1 -0
- package/dist/tileset-2d/utils.js +234 -0
- package/dist/trips-layer/trips-layer.js +93 -0
- package/dist/wms-layer/utils.js +13 -0
- package/dist/wms-layer/wms-layer.js +192 -0
- package/dist.min.js +27 -162
- package/package.json +32 -18
- package/src/index.ts +5 -5
- package/src/mvt-layer/coordinate-transform.ts +1 -1
- package/src/mvt-layer/find-index-binary.ts +5 -9
- package/src/mvt-layer/mvt-layer.ts +19 -15
- package/src/terrain-layer/terrain-layer.ts +13 -3
- package/src/tile-layer/tile-layer.ts +8 -9
- package/src/tileset-2d/tile-2d-header.ts +2 -1
- package/src/tileset-2d/tile-2d-traversal.ts +1 -1
- package/src/tileset-2d/tileset-2d.ts +7 -3
- package/src/tileset-2d/utils.ts +2 -2
- package/src/wms-layer/wms-layer.ts +1 -1
- package/dist/es5/geo-cell-layer/GeoCellLayer.js +0 -118
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +0 -1
- package/dist/es5/geohash-layer/geohash-layer.js +0 -67
- package/dist/es5/geohash-layer/geohash-layer.js.map +0 -1
- package/dist/es5/geohash-layer/geohash-utils.js +0 -77
- package/dist/es5/geohash-layer/geohash-utils.js.map +0 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js +0 -48
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +0 -162
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +0 -351
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-utils.js +0 -111
- package/dist/es5/h3-layers/h3-utils.js.map +0 -1
- package/dist/es5/index.js +0 -132
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +0 -9
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +0 -9
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer.js +0 -217
- package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
- package/dist/es5/mvt-layer/coordinate-transform.js +0 -83
- package/dist/es5/mvt-layer/coordinate-transform.js.map +0 -1
- package/dist/es5/mvt-layer/find-index-binary.js +0 -127
- package/dist/es5/mvt-layer/find-index-binary.js.map +0 -1
- package/dist/es5/mvt-layer/mvt-layer.js +0 -533
- package/dist/es5/mvt-layer/mvt-layer.js.map +0 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js +0 -72
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +0 -1
- package/dist/es5/quadkey-layer/quadkey-utils.js +0 -53
- package/dist/es5/quadkey-layer/quadkey-utils.js.map +0 -1
- package/dist/es5/s2-layer/s2-geometry.js +0 -158
- package/dist/es5/s2-layer/s2-geometry.js.map +0 -1
- package/dist/es5/s2-layer/s2-layer.js +0 -67
- package/dist/es5/s2-layer/s2-layer.js.map +0 -1
- package/dist/es5/s2-layer/s2-utils.js +0 -80
- package/dist/es5/s2-layer/s2-utils.js.map +0 -1
- package/dist/es5/terrain-layer/terrain-layer.js +0 -347
- package/dist/es5/terrain-layer/terrain-layer.js.map +0 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -511
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
- package/dist/es5/tile-layer/tile-layer.js +0 -363
- package/dist/es5/tile-layer/tile-layer.js.map +0 -1
- package/dist/es5/tileset-2d/index.js +0 -66
- package/dist/es5/tileset-2d/index.js.map +0 -1
- package/dist/es5/tileset-2d/memoize.js +0 -47
- package/dist/es5/tileset-2d/memoize.js.map +0 -1
- package/dist/es5/tileset-2d/tile-2d-header.js +0 -250
- package/dist/es5/tileset-2d/tile-2d-header.js.map +0 -1
- package/dist/es5/tileset-2d/tile-2d-traversal.js +0 -256
- package/dist/es5/tileset-2d/tile-2d-traversal.js.map +0 -1
- package/dist/es5/tileset-2d/tileset-2d.js +0 -757
- package/dist/es5/tileset-2d/tileset-2d.js.map +0 -1
- package/dist/es5/tileset-2d/types.js +0 -2
- package/dist/es5/tileset-2d/types.js.map +0 -1
- package/dist/es5/tileset-2d/utils.js +0 -302
- package/dist/es5/tileset-2d/utils.js.map +0 -1
- package/dist/es5/trips-layer/trips-layer.js +0 -114
- package/dist/es5/trips-layer/trips-layer.js.map +0 -1
- package/dist/es5/wms-layer/utils.js +0 -18
- package/dist/es5/wms-layer/utils.js.map +0 -1
- package/dist/es5/wms-layer/wms-layer.js +0 -376
- package/dist/es5/wms-layer/wms-layer.js.map +0 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js +0 -72
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +0 -1
- package/dist/esm/geohash-layer/geohash-layer.js +0 -26
- package/dist/esm/geohash-layer/geohash-layer.js.map +0 -1
- package/dist/esm/geohash-layer/geohash-utils.js +0 -56
- package/dist/esm/geohash-layer/geohash-utils.js.map +0 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js +0 -12
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js +0 -79
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +0 -280
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-utils.js +0 -54
- package/dist/esm/h3-layers/h3-utils.js.map +0 -1
- package/dist/esm/index.js +0 -17
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer.js +0 -178
- package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
- package/dist/esm/mvt-layer/coordinate-transform.js +0 -49
- package/dist/esm/mvt-layer/coordinate-transform.js.map +0 -1
- package/dist/esm/mvt-layer/find-index-binary.js +0 -99
- package/dist/esm/mvt-layer/find-index-binary.js.map +0 -1
- package/dist/esm/mvt-layer/mvt-layer.js +0 -427
- package/dist/esm/mvt-layer/mvt-layer.js.map +0 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js +0 -31
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +0 -1
- package/dist/esm/quadkey-layer/quadkey-utils.js +0 -24
- package/dist/esm/quadkey-layer/quadkey-utils.js.map +0 -1
- package/dist/esm/s2-layer/s2-geometry.js +0 -126
- package/dist/esm/s2-layer/s2-geometry.js.map +0 -1
- package/dist/esm/s2-layer/s2-layer.js +0 -26
- package/dist/esm/s2-layer/s2-layer.js.map +0 -1
- package/dist/esm/s2-layer/s2-utils.js +0 -69
- package/dist/esm/s2-layer/s2-utils.js.map +0 -1
- package/dist/esm/terrain-layer/terrain-layer.js +0 -292
- package/dist/esm/terrain-layer/terrain-layer.js.map +0 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -438
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
- package/dist/esm/tile-layer/tile-layer.js +0 -299
- package/dist/esm/tile-layer/tile-layer.js.map +0 -1
- package/dist/esm/tileset-2d/index.js +0 -4
- package/dist/esm/tileset-2d/index.js.map +0 -1
- package/dist/esm/tileset-2d/memoize.js +0 -40
- package/dist/esm/tileset-2d/memoize.js.map +0 -1
- package/dist/esm/tileset-2d/tile-2d-header.js +0 -179
- package/dist/esm/tileset-2d/tile-2d-header.js.map +0 -1
- package/dist/esm/tileset-2d/tile-2d-traversal.js +0 -184
- package/dist/esm/tileset-2d/tile-2d-traversal.js.map +0 -1
- package/dist/esm/tileset-2d/tileset-2d.js +0 -509
- package/dist/esm/tileset-2d/tileset-2d.js.map +0 -1
- package/dist/esm/tileset-2d/types.js +0 -2
- package/dist/esm/tileset-2d/types.js.map +0 -1
- package/dist/esm/tileset-2d/utils.js +0 -233
- package/dist/esm/tileset-2d/utils.js.map +0 -1
- package/dist/esm/trips-layer/trips-layer.js +0 -88
- package/dist/esm/trips-layer/trips-layer.js.map +0 -1
- package/dist/esm/wms-layer/utils.js +0 -9
- package/dist/esm/wms-layer/utils.js.map +0 -1
- package/dist/esm/wms-layer/wms-layer.js +0 -231
- package/dist/esm/wms-layer/wms-layer.js.map +0 -1
- package/typed/mvt-layer/find-index-binary.d.ts +0 -12
- package/typed/mvt-layer/find-index-binary.d.ts.map +0 -1
- package/typed/mvt-layer/mvt-layer.d.ts.map +0 -1
- package/typed/terrain-layer/terrain-layer.d.ts.map +0 -1
- package/typed/tile-layer/tile-layer.d.ts.map +0 -1
- package/typed/tileset-2d/tile-2d-header.d.ts.map +0 -1
- package/typed/tileset-2d/utils.d.ts.map +0 -1
- /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts +0 -0
- /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts.map +0 -0
- /package/{typed → dist}/geohash-layer/geohash-layer.d.ts +0 -0
- /package/{typed → dist}/geohash-layer/geohash-layer.d.ts.map +0 -0
- /package/{typed → dist}/geohash-layer/geohash-utils.d.ts +0 -0
- /package/{typed → dist}/geohash-layer/geohash-utils.d.ts.map +0 -0
- /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts +0 -0
- /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts.map +0 -0
- /package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts +0 -0
- /package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts.map +0 -0
- /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts +0 -0
- /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts.map +0 -0
- /package/{typed → dist}/h3-layers/h3-utils.d.ts +0 -0
- /package/{typed → dist}/h3-layers/h3-utils.d.ts.map +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer.d.ts +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer.d.ts.map +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts.map +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts.map +0 -0
- /package/{typed → dist}/s2-layer/s2-geometry.d.ts +0 -0
- /package/{typed → dist}/s2-layer/s2-geometry.d.ts.map +0 -0
- /package/{typed → dist}/s2-layer/s2-layer.d.ts +0 -0
- /package/{typed → dist}/s2-layer/s2-layer.d.ts.map +0 -0
- /package/{typed → dist}/s2-layer/s2-utils.d.ts +0 -0
- /package/{typed → dist}/s2-layer/s2-utils.d.ts.map +0 -0
- /package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts +0 -0
- /package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts.map +0 -0
- /package/{typed → dist}/tileset-2d/index.d.ts +0 -0
- /package/{typed → dist}/tileset-2d/index.d.ts.map +0 -0
- /package/{typed → dist}/tileset-2d/memoize.d.ts +0 -0
- /package/{typed → dist}/tileset-2d/memoize.d.ts.map +0 -0
- /package/{typed → dist}/tileset-2d/types.d.ts +0 -0
- /package/{typed → dist}/tileset-2d/types.d.ts.map +0 -0
- /package/{typed → dist}/trips-layer/trips-layer.d.ts +0 -0
- /package/{typed → dist}/trips-layer/trips-layer.d.ts.map +0 -0
- /package/{typed → dist}/wms-layer/utils.d.ts +0 -0
- /package/{typed → dist}/wms-layer/utils.d.ts.map +0 -0
- /package/{typed → dist}/wms-layer/wms-layer.d.ts +0 -0
- /package/{typed → dist}/wms-layer/wms-layer.d.ts.map +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CompositeLayer } from '@deck.gl/core';
|
|
2
|
+
import { PolygonLayer } from '@deck.gl/layers';
|
|
3
|
+
const defaultProps = {
|
|
4
|
+
...PolygonLayer.defaultProps
|
|
5
|
+
};
|
|
6
|
+
export default class GeoCellLayer extends CompositeLayer {
|
|
7
|
+
static { this.layerName = 'GeoCellLayer'; }
|
|
8
|
+
static { this.defaultProps = defaultProps; }
|
|
9
|
+
/** Implement to generate props to create geometry. */
|
|
10
|
+
indexToBounds() {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
renderLayers() {
|
|
14
|
+
// Rendering props underlying layer
|
|
15
|
+
const { elevationScale, extruded, wireframe, filled, stroked, lineWidthUnits, lineWidthScale, lineWidthMinPixels, lineWidthMaxPixels, lineJointRounded, lineMiterLimit, lineDashJustified, getElevation, getFillColor, getLineColor, getLineWidth } = this.props;
|
|
16
|
+
// Accessor props for underlying layers
|
|
17
|
+
const { updateTriggers, material, transitions } = this.props;
|
|
18
|
+
// Filled Polygon Layer
|
|
19
|
+
const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
|
|
20
|
+
const { updateTriggers: boundsUpdateTriggers, ...boundsProps } = this.indexToBounds() || {};
|
|
21
|
+
return new CellLayer({
|
|
22
|
+
filled,
|
|
23
|
+
wireframe,
|
|
24
|
+
extruded,
|
|
25
|
+
elevationScale,
|
|
26
|
+
stroked,
|
|
27
|
+
lineWidthUnits,
|
|
28
|
+
lineWidthScale,
|
|
29
|
+
lineWidthMinPixels,
|
|
30
|
+
lineWidthMaxPixels,
|
|
31
|
+
lineJointRounded,
|
|
32
|
+
lineMiterLimit,
|
|
33
|
+
lineDashJustified,
|
|
34
|
+
material,
|
|
35
|
+
transitions,
|
|
36
|
+
getElevation,
|
|
37
|
+
getFillColor,
|
|
38
|
+
getLineColor,
|
|
39
|
+
getLineWidth
|
|
40
|
+
}, this.getSubLayerProps({
|
|
41
|
+
id: 'cell',
|
|
42
|
+
updateTriggers: updateTriggers && {
|
|
43
|
+
...boundsUpdateTriggers,
|
|
44
|
+
getElevation: updateTriggers.getElevation,
|
|
45
|
+
getFillColor: updateTriggers.getFillColor,
|
|
46
|
+
getLineColor: updateTriggers.getLineColor,
|
|
47
|
+
getLineWidth: updateTriggers.getLineWidth
|
|
48
|
+
}
|
|
49
|
+
}), boundsProps);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import GeoCellLayer from "../geo-cell-layer/GeoCellLayer.js";
|
|
2
|
+
import { getGeohashPolygon } from "./geohash-utils.js";
|
|
3
|
+
const defaultProps = {
|
|
4
|
+
getGeohash: { type: 'accessor', value: (d) => d.geohash }
|
|
5
|
+
};
|
|
6
|
+
/** Render filled and/or stroked polygons based on the [Geohash](https://en.wikipedia.org/wiki/Geohash) geospatial indexing system. */
|
|
7
|
+
export default class GeohashLayer extends GeoCellLayer {
|
|
8
|
+
static { this.layerName = 'GeohashLayer'; }
|
|
9
|
+
static { this.defaultProps = defaultProps; }
|
|
10
|
+
indexToBounds() {
|
|
11
|
+
const { data, getGeohash } = this.props;
|
|
12
|
+
return {
|
|
13
|
+
data,
|
|
14
|
+
_normalize: false,
|
|
15
|
+
positionFormat: 'XY',
|
|
16
|
+
getPolygon: (x, objectInfo) => getGeohashPolygon(getGeohash(x, objectInfo))
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const BASE32_CODES = '0123456789bcdefghjkmnpqrstuvwxyz';
|
|
2
|
+
const BASE32_CODES_DICT = {};
|
|
3
|
+
for (let i = 0; i < BASE32_CODES.length; i++) {
|
|
4
|
+
BASE32_CODES_DICT[BASE32_CODES.charAt(i)] = i;
|
|
5
|
+
}
|
|
6
|
+
const MIN_LAT = -90;
|
|
7
|
+
const MAX_LAT = 90;
|
|
8
|
+
const MIN_LON = -180;
|
|
9
|
+
const MAX_LON = 180;
|
|
10
|
+
// Adapted from ngeohash decode_bbox
|
|
11
|
+
export function getGeohashBounds(geohash) {
|
|
12
|
+
let isLon = true;
|
|
13
|
+
let maxLat = MAX_LAT;
|
|
14
|
+
let minLat = MIN_LAT;
|
|
15
|
+
let maxLon = MAX_LON;
|
|
16
|
+
let minLon = MIN_LON;
|
|
17
|
+
let mid;
|
|
18
|
+
let hashValue = 0;
|
|
19
|
+
for (let i = 0, l = geohash.length; i < l; i++) {
|
|
20
|
+
const code = geohash[i].toLowerCase();
|
|
21
|
+
hashValue = BASE32_CODES_DICT[code];
|
|
22
|
+
for (let bits = 4; bits >= 0; bits--) {
|
|
23
|
+
const bit = (hashValue >> bits) & 1;
|
|
24
|
+
if (isLon) {
|
|
25
|
+
mid = (maxLon + minLon) / 2;
|
|
26
|
+
if (bit === 1) {
|
|
27
|
+
minLon = mid;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
maxLon = mid;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
mid = (maxLat + minLat) / 2;
|
|
35
|
+
if (bit === 1) {
|
|
36
|
+
minLat = mid;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
maxLat = mid;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
isLon = !isLon;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return [minLat, minLon, maxLat, maxLon];
|
|
46
|
+
}
|
|
47
|
+
export function getGeohashPolygon(geohash) {
|
|
48
|
+
const [s, w, n, e] = getGeohashBounds(geohash);
|
|
49
|
+
return [e, n, e, s, w, s, w, n, e, n];
|
|
50
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ArcLayer } from '@deck.gl/layers';
|
|
2
|
+
const defaultProps = {
|
|
3
|
+
getHeight: { type: 'accessor', value: 0 },
|
|
4
|
+
greatCircle: true
|
|
5
|
+
};
|
|
6
|
+
// This layer has been merged into the core ArcLayer
|
|
7
|
+
// Keeping for backward-compatibility
|
|
8
|
+
/** @deprecated Use ArcLayer with `greatCircle: true` instead */
|
|
9
|
+
export default class GreatCircleLayer extends ArcLayer {
|
|
10
|
+
static { this.layerName = 'GreatCircleLayer'; }
|
|
11
|
+
static { this.defaultProps = defaultProps; }
|
|
12
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { cellsToMultiPolygon } from 'h3-js';
|
|
2
|
+
import { createIterable } from '@deck.gl/core';
|
|
3
|
+
import { default as H3HexagonLayer } from "./h3-hexagon-layer.js";
|
|
4
|
+
import GeoCellLayer from "../geo-cell-layer/GeoCellLayer.js";
|
|
5
|
+
import { normalizeLongitudes } from "./h3-utils.js";
|
|
6
|
+
const defaultProps = {
|
|
7
|
+
getHexagons: { type: 'accessor', value: (d) => d.hexagons }
|
|
8
|
+
};
|
|
9
|
+
export default class H3ClusterLayer extends GeoCellLayer {
|
|
10
|
+
static { this.layerName = 'H3ClusterLayer'; }
|
|
11
|
+
static { this.defaultProps = defaultProps; }
|
|
12
|
+
initializeState() {
|
|
13
|
+
H3HexagonLayer._checkH3Lib();
|
|
14
|
+
}
|
|
15
|
+
updateState({ props, changeFlags }) {
|
|
16
|
+
if (changeFlags.dataChanged ||
|
|
17
|
+
(changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagons)) {
|
|
18
|
+
const { data, getHexagons } = props;
|
|
19
|
+
const polygons = [];
|
|
20
|
+
const { iterable, objectInfo } = createIterable(data);
|
|
21
|
+
for (const object of iterable) {
|
|
22
|
+
objectInfo.index++;
|
|
23
|
+
const hexagons = getHexagons(object, objectInfo);
|
|
24
|
+
const multiPolygon = cellsToMultiPolygon(hexagons, true);
|
|
25
|
+
for (const polygon of multiPolygon) {
|
|
26
|
+
// Normalize polygons to prevent wrapping over the anti-meridian
|
|
27
|
+
for (const ring of polygon) {
|
|
28
|
+
normalizeLongitudes(ring);
|
|
29
|
+
}
|
|
30
|
+
polygons.push(this.getSubLayerRow({ polygon }, object, objectInfo.index));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
this.setState({ polygons });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
indexToBounds() {
|
|
37
|
+
const { getElevation, getFillColor, getLineColor, getLineWidth } = this.props;
|
|
38
|
+
return {
|
|
39
|
+
data: this.state.polygons,
|
|
40
|
+
getPolygon: d => d.polygon,
|
|
41
|
+
getElevation: this.getSubLayerAccessor(getElevation),
|
|
42
|
+
getFillColor: this.getSubLayerAccessor(getFillColor),
|
|
43
|
+
getLineColor: this.getSubLayerAccessor(getLineColor),
|
|
44
|
+
getLineWidth: this.getSubLayerAccessor(getLineWidth)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { getResolution, cellToLatLng, latLngToCell, isPentagon, gridDistance, getHexagonEdgeLengthAvg } from 'h3-js';
|
|
2
|
+
import { CompositeLayer, createIterable } from '@deck.gl/core';
|
|
3
|
+
import { ColumnLayer, PolygonLayer } from '@deck.gl/layers';
|
|
4
|
+
import { flattenPolygon, getHexagonCentroid, h3ToPolygon } from "./h3-utils.js";
|
|
5
|
+
// There is a cost to updating the instanced geometries when using highPrecision: false
|
|
6
|
+
// This constant defines the distance between two hexagons that leads to "significant
|
|
7
|
+
// distortion." Smaller value makes the column layer more sensitive to viewport change.
|
|
8
|
+
const UPDATE_THRESHOLD_KM = 10;
|
|
9
|
+
function mergeTriggers(getHexagon, coverage) {
|
|
10
|
+
let trigger;
|
|
11
|
+
if (getHexagon === undefined || getHexagon === null) {
|
|
12
|
+
trigger = coverage;
|
|
13
|
+
}
|
|
14
|
+
else if (typeof getHexagon === 'object') {
|
|
15
|
+
trigger = { ...getHexagon, coverage };
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
trigger = { getHexagon, coverage };
|
|
19
|
+
}
|
|
20
|
+
return trigger;
|
|
21
|
+
}
|
|
22
|
+
const defaultProps = {
|
|
23
|
+
...PolygonLayer.defaultProps,
|
|
24
|
+
highPrecision: 'auto',
|
|
25
|
+
coverage: { type: 'number', min: 0, max: 1, value: 1 },
|
|
26
|
+
centerHexagon: null,
|
|
27
|
+
getHexagon: { type: 'accessor', value: (x) => x.hexagon },
|
|
28
|
+
extruded: true
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Render hexagons from the [H3](https://h3geo.org/) geospatial indexing system.
|
|
32
|
+
*/
|
|
33
|
+
export default class H3HexagonLayer extends CompositeLayer {
|
|
34
|
+
static { this.defaultProps = defaultProps; }
|
|
35
|
+
static { this.layerName = 'H3HexagonLayer'; }
|
|
36
|
+
// See `main/bundle.ts`
|
|
37
|
+
static { this._checkH3Lib = () => { }; }
|
|
38
|
+
initializeState() {
|
|
39
|
+
H3HexagonLayer._checkH3Lib();
|
|
40
|
+
this.state = {
|
|
41
|
+
edgeLengthKM: 0,
|
|
42
|
+
resolution: -1
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
shouldUpdateState({ changeFlags }) {
|
|
46
|
+
return this._shouldUseHighPrecision()
|
|
47
|
+
? changeFlags.propsOrDataChanged
|
|
48
|
+
: changeFlags.somethingChanged;
|
|
49
|
+
}
|
|
50
|
+
updateState({ props, changeFlags }) {
|
|
51
|
+
if (props.highPrecision !== true &&
|
|
52
|
+
(changeFlags.dataChanged ||
|
|
53
|
+
(changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagon))) {
|
|
54
|
+
const dataProps = this._calculateH3DataProps();
|
|
55
|
+
this.setState(dataProps);
|
|
56
|
+
}
|
|
57
|
+
this._updateVertices(this.context.viewport);
|
|
58
|
+
}
|
|
59
|
+
_calculateH3DataProps() {
|
|
60
|
+
let resolution = -1;
|
|
61
|
+
let hasPentagon = false;
|
|
62
|
+
let hasMultipleRes = false;
|
|
63
|
+
const { iterable, objectInfo } = createIterable(this.props.data);
|
|
64
|
+
for (const object of iterable) {
|
|
65
|
+
objectInfo.index++;
|
|
66
|
+
const hexId = this.props.getHexagon(object, objectInfo);
|
|
67
|
+
// Take the resolution of the first hex
|
|
68
|
+
const hexResolution = getResolution(hexId);
|
|
69
|
+
if (resolution < 0) {
|
|
70
|
+
resolution = hexResolution;
|
|
71
|
+
if (!this.props.highPrecision)
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
else if (resolution !== hexResolution) {
|
|
75
|
+
hasMultipleRes = true;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (isPentagon(hexId)) {
|
|
79
|
+
hasPentagon = true;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
resolution,
|
|
85
|
+
edgeLengthKM: resolution >= 0 ? getHexagonEdgeLengthAvg(resolution, 'km') : 0,
|
|
86
|
+
hasMultipleRes,
|
|
87
|
+
hasPentagon
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
_shouldUseHighPrecision() {
|
|
91
|
+
if (this.props.highPrecision === 'auto') {
|
|
92
|
+
const { resolution, hasPentagon, hasMultipleRes } = this.state;
|
|
93
|
+
const { viewport } = this.context;
|
|
94
|
+
return (Boolean(viewport?.resolution) ||
|
|
95
|
+
hasMultipleRes ||
|
|
96
|
+
hasPentagon ||
|
|
97
|
+
(resolution >= 0 && resolution <= 5));
|
|
98
|
+
}
|
|
99
|
+
return this.props.highPrecision;
|
|
100
|
+
}
|
|
101
|
+
_updateVertices(viewport) {
|
|
102
|
+
if (this._shouldUseHighPrecision()) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const { resolution, edgeLengthKM, centerHex } = this.state;
|
|
106
|
+
if (resolution < 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const hex = this.props.centerHexagon || latLngToCell(viewport.latitude, viewport.longitude, resolution);
|
|
110
|
+
if (centerHex === hex) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (centerHex) {
|
|
114
|
+
try {
|
|
115
|
+
const distance = gridDistance(centerHex, hex);
|
|
116
|
+
if (distance * edgeLengthKM < UPDATE_THRESHOLD_KM) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// gridDistance throws if the distance could not be computed
|
|
122
|
+
// due to the two indexes very far apart or on opposite sides of a pentagon.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const { unitsPerMeter } = viewport.distanceScales;
|
|
126
|
+
let vertices = h3ToPolygon(hex);
|
|
127
|
+
const [centerLat, centerLng] = cellToLatLng(hex);
|
|
128
|
+
const [centerX, centerY] = viewport.projectFlat([centerLng, centerLat]);
|
|
129
|
+
vertices = vertices.map(p => {
|
|
130
|
+
const worldPosition = viewport.projectFlat(p);
|
|
131
|
+
return [
|
|
132
|
+
(worldPosition[0] - centerX) / unitsPerMeter[0],
|
|
133
|
+
(worldPosition[1] - centerY) / unitsPerMeter[1]
|
|
134
|
+
];
|
|
135
|
+
});
|
|
136
|
+
this.setState({ centerHex: hex, vertices });
|
|
137
|
+
}
|
|
138
|
+
renderLayers() {
|
|
139
|
+
return this._shouldUseHighPrecision() ? this._renderPolygonLayer() : this._renderColumnLayer();
|
|
140
|
+
}
|
|
141
|
+
_getForwardProps() {
|
|
142
|
+
const { elevationScale, material, coverage, extruded, wireframe, stroked, filled, lineWidthUnits, lineWidthScale, lineWidthMinPixels, lineWidthMaxPixels, getFillColor, getElevation, getLineColor, getLineWidth, transitions, updateTriggers } = this.props;
|
|
143
|
+
return {
|
|
144
|
+
elevationScale,
|
|
145
|
+
extruded,
|
|
146
|
+
coverage,
|
|
147
|
+
wireframe,
|
|
148
|
+
stroked,
|
|
149
|
+
filled,
|
|
150
|
+
lineWidthUnits,
|
|
151
|
+
lineWidthScale,
|
|
152
|
+
lineWidthMinPixels,
|
|
153
|
+
lineWidthMaxPixels,
|
|
154
|
+
material,
|
|
155
|
+
getElevation,
|
|
156
|
+
getFillColor,
|
|
157
|
+
getLineColor,
|
|
158
|
+
getLineWidth,
|
|
159
|
+
transitions,
|
|
160
|
+
updateTriggers: {
|
|
161
|
+
getFillColor: updateTriggers.getFillColor,
|
|
162
|
+
getElevation: updateTriggers.getElevation,
|
|
163
|
+
getLineColor: updateTriggers.getLineColor,
|
|
164
|
+
getLineWidth: updateTriggers.getLineWidth
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
_renderPolygonLayer() {
|
|
169
|
+
const { data, getHexagon, updateTriggers, coverage } = this.props;
|
|
170
|
+
const SubLayerClass = this.getSubLayerClass('hexagon-cell-hifi', PolygonLayer);
|
|
171
|
+
const forwardProps = this._getForwardProps();
|
|
172
|
+
forwardProps.updateTriggers.getPolygon = mergeTriggers(updateTriggers.getHexagon, coverage);
|
|
173
|
+
return new SubLayerClass(forwardProps, this.getSubLayerProps({
|
|
174
|
+
id: 'hexagon-cell-hifi',
|
|
175
|
+
updateTriggers: forwardProps.updateTriggers
|
|
176
|
+
}), {
|
|
177
|
+
data,
|
|
178
|
+
_normalize: false,
|
|
179
|
+
_windingOrder: 'CCW',
|
|
180
|
+
positionFormat: 'XY',
|
|
181
|
+
getPolygon: (object, objectInfo) => {
|
|
182
|
+
const hexagonId = getHexagon(object, objectInfo);
|
|
183
|
+
return flattenPolygon(h3ToPolygon(hexagonId, coverage));
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
_renderColumnLayer() {
|
|
188
|
+
const { data, getHexagon, updateTriggers } = this.props;
|
|
189
|
+
const SubLayerClass = this.getSubLayerClass('hexagon-cell', ColumnLayer);
|
|
190
|
+
const forwardProps = this._getForwardProps();
|
|
191
|
+
forwardProps.updateTriggers.getPosition = updateTriggers.getHexagon;
|
|
192
|
+
return new SubLayerClass(forwardProps, this.getSubLayerProps({
|
|
193
|
+
id: 'hexagon-cell',
|
|
194
|
+
flatShading: true,
|
|
195
|
+
updateTriggers: forwardProps.updateTriggers
|
|
196
|
+
}), {
|
|
197
|
+
data,
|
|
198
|
+
diskResolution: 6, // generate an extruded hexagon as the base geometry
|
|
199
|
+
radius: 1,
|
|
200
|
+
vertices: this.state.vertices,
|
|
201
|
+
getPosition: getHexagonCentroid.bind(null, getHexagon)
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { cellToBoundary, cellToLatLng } from 'h3-js';
|
|
2
|
+
import { lerp } from '@math.gl/core';
|
|
3
|
+
// normalize longitudes w.r.t center (refLng), when not provided first vertex
|
|
4
|
+
export function normalizeLongitudes(vertices, refLng) {
|
|
5
|
+
refLng = refLng === undefined ? vertices[0][0] : refLng;
|
|
6
|
+
for (const pt of vertices) {
|
|
7
|
+
const deltaLng = pt[0] - refLng;
|
|
8
|
+
if (deltaLng > 180) {
|
|
9
|
+
pt[0] -= 360;
|
|
10
|
+
}
|
|
11
|
+
else if (deltaLng < -180) {
|
|
12
|
+
pt[0] += 360;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// scale polygon vertices w.r.t center (hexId)
|
|
17
|
+
export function scalePolygon(hexId, vertices, factor) {
|
|
18
|
+
const [lat, lng] = cellToLatLng(hexId);
|
|
19
|
+
const actualCount = vertices.length;
|
|
20
|
+
// normalize with respect to center
|
|
21
|
+
normalizeLongitudes(vertices, lng);
|
|
22
|
+
// `cellToBoundary` returns same array object for first and last vertex (closed polygon),
|
|
23
|
+
// if so skip scaling the last vertex
|
|
24
|
+
const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;
|
|
25
|
+
for (let i = 0; i < vertexCount; i++) {
|
|
26
|
+
vertices[i][0] = lerp(lng, vertices[i][0], factor);
|
|
27
|
+
vertices[i][1] = lerp(lat, vertices[i][1], factor);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// gets hexagon centroid
|
|
31
|
+
export function getHexagonCentroid(getHexagon, object, objectInfo) {
|
|
32
|
+
const hexagonId = getHexagon(object, objectInfo);
|
|
33
|
+
const [lat, lng] = cellToLatLng(hexagonId);
|
|
34
|
+
return [lng, lat];
|
|
35
|
+
}
|
|
36
|
+
export function h3ToPolygon(hexId, coverage = 1) {
|
|
37
|
+
const vertices = cellToBoundary(hexId, true);
|
|
38
|
+
if (coverage !== 1) {
|
|
39
|
+
// scale and normalize vertices w.r.t to center
|
|
40
|
+
scalePolygon(hexId, vertices, coverage);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// normalize w.r.t to start vertex
|
|
44
|
+
normalizeLongitudes(vertices);
|
|
45
|
+
}
|
|
46
|
+
return vertices;
|
|
47
|
+
}
|
|
48
|
+
export function flattenPolygon(vertices) {
|
|
49
|
+
const positions = new Float64Array(vertices.length * 2);
|
|
50
|
+
let i = 0;
|
|
51
|
+
for (const pt of vertices) {
|
|
52
|
+
positions[i++] = pt[0];
|
|
53
|
+
positions[i++] = pt[1];
|
|
54
|
+
}
|
|
55
|
+
return positions;
|
|
56
|
+
}
|