@deck.gl/geo-layers 8.9.22 → 8.10.0-alpha.2

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.
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.normalizeLongitudes = normalizeLongitudes;
9
+ exports.scalePolygon = scalePolygon;
10
+ exports.getHexagonCentroid = getHexagonCentroid;
11
+ exports.h3ToPolygon = h3ToPolygon;
12
+ exports.flattenPolygon = flattenPolygon;
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _h3Js = require("h3-js");
17
+
18
+ var _core = require("@math.gl/core");
19
+
20
+ 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; } } }; }
21
+
22
+ 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); }
23
+
24
+ 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; }
25
+
26
+ function normalizeLongitudes(vertices, refLng) {
27
+ refLng = refLng === undefined ? vertices[0][0] : refLng;
28
+
29
+ var _iterator = _createForOfIteratorHelper(vertices),
30
+ _step;
31
+
32
+ try {
33
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
34
+ var pt = _step.value;
35
+ var deltaLng = pt[0] - refLng;
36
+
37
+ if (deltaLng > 180) {
38
+ pt[0] -= 360;
39
+ } else if (deltaLng < -180) {
40
+ pt[0] += 360;
41
+ }
42
+ }
43
+ } catch (err) {
44
+ _iterator.e(err);
45
+ } finally {
46
+ _iterator.f();
47
+ }
48
+ }
49
+
50
+ function scalePolygon(hexId, vertices, factor) {
51
+ var _cellToLatLng = (0, _h3Js.cellToLatLng)(hexId),
52
+ _cellToLatLng2 = (0, _slicedToArray2.default)(_cellToLatLng, 2),
53
+ lat = _cellToLatLng2[0],
54
+ lng = _cellToLatLng2[1];
55
+
56
+ var actualCount = vertices.length;
57
+ normalizeLongitudes(vertices, lng);
58
+ var vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;
59
+
60
+ for (var i = 0; i < vertexCount; i++) {
61
+ vertices[i][0] = (0, _core.lerp)(lng, vertices[i][0], factor);
62
+ vertices[i][1] = (0, _core.lerp)(lat, vertices[i][1], factor);
63
+ }
64
+ }
65
+
66
+ function getHexagonCentroid(getHexagon, object, objectInfo) {
67
+ var hexagonId = getHexagon(object, objectInfo);
68
+
69
+ var _cellToLatLng3 = (0, _h3Js.cellToLatLng)(hexagonId),
70
+ _cellToLatLng4 = (0, _slicedToArray2.default)(_cellToLatLng3, 2),
71
+ lat = _cellToLatLng4[0],
72
+ lng = _cellToLatLng4[1];
73
+
74
+ return [lng, lat];
75
+ }
76
+
77
+ function h3ToPolygon(hexId) {
78
+ var coverage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
79
+ var vertices = (0, _h3Js.cellToBoundary)(hexId, true);
80
+
81
+ if (coverage !== 1) {
82
+ scalePolygon(hexId, vertices, coverage);
83
+ } else {
84
+ normalizeLongitudes(vertices);
85
+ }
86
+
87
+ return vertices;
88
+ }
89
+
90
+ function flattenPolygon(vertices) {
91
+ var positions = new Float64Array(vertices.length * 2);
92
+ var i = 0;
93
+
94
+ var _iterator2 = _createForOfIteratorHelper(vertices),
95
+ _step2;
96
+
97
+ try {
98
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
99
+ var pt = _step2.value;
100
+ positions[i++] = pt[0];
101
+ positions[i++] = pt[1];
102
+ }
103
+ } catch (err) {
104
+ _iterator2.e(err);
105
+ } finally {
106
+ _iterator2.f();
107
+ }
108
+
109
+ return positions;
110
+ }
111
+ //# sourceMappingURL=h3-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/h3-layers/h3-utils.ts"],"names":["normalizeLongitudes","vertices","refLng","undefined","pt","deltaLng","scalePolygon","hexId","factor","lat","lng","actualCount","length","vertexCount","i","getHexagonCentroid","getHexagon","object","objectInfo","hexagonId","h3ToPolygon","coverage","flattenPolygon","positions","Float64Array"],"mappings":"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","sourcesContent":["import {CoordPair, H3IndexInput, cellToBoundary, cellToLatLng} from 'h3-js';\nimport {lerp} from '@math.gl/core';\n\n// normalize longitudes w.r.t center (refLng), when not provided first vertex\nexport function normalizeLongitudes(vertices: CoordPair[], refLng?: number): void {\n refLng = refLng === undefined ? vertices[0][0] : refLng;\n for (const pt of vertices) {\n const deltaLng = pt[0] - refLng;\n if (deltaLng > 180) {\n pt[0] -= 360;\n } else if (deltaLng < -180) {\n pt[0] += 360;\n }\n }\n}\n\n// scale polygon vertices w.r.t center (hexId)\nexport function scalePolygon(hexId: H3IndexInput, vertices: CoordPair[], factor: number): void {\n const [lat, lng] = cellToLatLng(hexId);\n const actualCount = vertices.length;\n\n // normalize with respect to center\n normalizeLongitudes(vertices, lng);\n\n // `cellToBoundary` returns same array object for first and last vertex (closed polygon),\n // if so skip scaling the last vertex\n const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;\n for (let i = 0; i < vertexCount; i++) {\n vertices[i][0] = lerp(lng, vertices[i][0], factor);\n vertices[i][1] = lerp(lat, vertices[i][1], factor);\n }\n}\n\n// gets hexagon centroid\nexport function getHexagonCentroid(getHexagon, object, objectInfo) {\n const hexagonId = getHexagon(object, objectInfo);\n const [lat, lng] = cellToLatLng(hexagonId);\n return [lng, lat];\n}\n\nexport function h3ToPolygon(hexId: H3IndexInput, coverage: number = 1): number[][] {\n const vertices = cellToBoundary(hexId, true);\n\n if (coverage !== 1) {\n // scale and normalize vertices w.r.t to center\n scalePolygon(hexId, vertices, coverage);\n } else {\n // normalize w.r.t to start vertex\n normalizeLongitudes(vertices);\n }\n\n return vertices;\n}\n\nexport function flattenPolygon(vertices: number[][]): Float64Array {\n const positions = new Float64Array(vertices.length * 2);\n let i = 0;\n for (const pt of vertices) {\n positions[i++] = pt[0];\n positions[i++] = pt[1];\n }\n return positions;\n}\n"],"file":"h3-utils.js"}
@@ -1,8 +1,9 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { h3SetToMultiPolygon } from 'h3-js';
2
+ import { cellsToMultiPolygon } from 'h3-js';
3
3
  import { createIterable } from '@deck.gl/core';
4
4
  import { default as H3HexagonLayer } from './h3-hexagon-layer';
5
5
  import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
6
+ import { normalizeLongitudes } from './h3-utils';
6
7
  const defaultProps = {
7
8
  getHexagons: {
8
9
  type: 'accessor',
@@ -32,9 +33,13 @@ export default class H3ClusterLayer extends GeoCellLayer {
32
33
  for (const object of iterable) {
33
34
  objectInfo.index++;
34
35
  const hexagons = getHexagons(object, objectInfo);
35
- const multiPolygon = h3SetToMultiPolygon(hexagons, true);
36
+ const multiPolygon = cellsToMultiPolygon(hexagons, true);
36
37
 
37
38
  for (const polygon of multiPolygon) {
39
+ for (const ring of polygon) {
40
+ normalizeLongitudes(ring);
41
+ }
42
+
38
43
  polygons.push(this.getSubLayerRow({
39
44
  polygon
40
45
  }, object, objectInfo.index));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/h3-layers/h3-cluster-layer.ts"],"names":["h3SetToMultiPolygon","createIterable","default","H3HexagonLayer","GeoCellLayer","defaultProps","getHexagons","type","value","d","hexagons","H3ClusterLayer","initializeState","_checkH3Lib","updateState","props","changeFlags","dataChanged","updateTriggersChanged","data","polygons","iterable","objectInfo","object","index","multiPolygon","polygon","push","getSubLayerRow","setState","indexToBounds","getElevation","getFillColor","getLineColor","getLineWidth","state","getPolygon","getSubLayerAccessor"],"mappings":";AAAA,SAAQA,mBAAR,QAAgD,OAAhD;AAEA,SAA0BC,cAA1B,QAA+E,eAA/E;AACA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,oBAAxC;AACA,OAAOC,YAAP,MAA8C,gCAA9C;AAEA,MAAMC,YAA+C,GAAG;AACtDC,EAAAA,WAAW,EAAE;AAACC,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAEC,CAAC,IAAIA,CAAC,CAACC;AAAjC;AADyC,CAAxD;AAkBA,eAAe,MAAMC,cAAN,SAAsEP,YAAtE,CAGb;AAIAQ,EAAAA,eAAe,GAAS;AACtBT,IAAAA,cAAc,CAACU,WAAf;AACD;;AAEDC,EAAAA,WAAW,CAAC;AAACC,IAAAA,KAAD;AAAQC,IAAAA;AAAR,GAAD,EAAqD;AAC9D,QACEA,WAAW,CAACC,WAAZ,IACCD,WAAW,CAACE,qBAAZ,IAAqCF,WAAW,CAACE,qBAAZ,CAAkCZ,WAF1E,EAGE;AACA,YAAM;AAACa,QAAAA,IAAD;AAAOb,QAAAA;AAAP,UAAsBS,KAA5B;AACA,YAAMK,QAAmC,GAAG,EAA5C;AAEA,YAAM;AAACC,QAAAA,QAAD;AAAWC,QAAAA;AAAX,UAAyBrB,cAAc,CAACkB,IAAD,CAA7C;;AACA,WAAK,MAAMI,MAAX,IAAqBF,QAArB,EAA+B;AAC7BC,QAAAA,UAAU,CAACE,KAAX;AACA,cAAMd,QAAQ,GAAGJ,WAAW,CAACiB,MAAD,EAASD,UAAT,CAA5B;AACA,cAAMG,YAAY,GAAGzB,mBAAmB,CAACU,QAAD,EAAW,IAAX,CAAxC;;AAEA,aAAK,MAAMgB,OAAX,IAAsBD,YAAtB,EAAoC;AAClCL,UAAAA,QAAQ,CAACO,IAAT,CAAc,KAAKC,cAAL,CAAoB;AAACF,YAAAA;AAAD,WAApB,EAA+BH,MAA/B,EAAuCD,UAAU,CAACE,KAAlD,CAAd;AACD;AACF;;AAED,WAAKK,QAAL,CAAc;AAACT,QAAAA;AAAD,OAAd;AACD;AACF;;AAEDU,EAAAA,aAAa,GAAmC;AAC9C,UAAM;AAACC,MAAAA,YAAD;AAAeC,MAAAA,YAAf;AAA6BC,MAAAA,YAA7B;AAA2CC,MAAAA;AAA3C,QAA2D,KAAKnB,KAAtE;AAEA,WAAO;AACLI,MAAAA,IAAI,EAAE,KAAKgB,KAAL,CAAWf,QADZ;AAELgB,MAAAA,UAAU,EAAE3B,CAAC,IAAIA,CAAC,CAACiB,OAFd;AAILK,MAAAA,YAAY,EAAE,KAAKM,mBAAL,CAAyBN,YAAzB,CAJT;AAKLC,MAAAA,YAAY,EAAE,KAAKK,mBAAL,CAAyBL,YAAzB,CALT;AAMLC,MAAAA,YAAY,EAAE,KAAKI,mBAAL,CAAyBJ,YAAzB,CANT;AAOLC,MAAAA,YAAY,EAAE,KAAKG,mBAAL,CAAyBH,YAAzB;AAPT,KAAP;AASD;;AA3CD;;gBAHmBvB,c,eAIA,gB;;gBAJAA,c,kBAKGN,Y","sourcesContent":["import {h3SetToMultiPolygon, H3IndexInput} from 'h3-js';\n\nimport {AccessorFunction, createIterable, UpdateParameters, DefaultProps} from '@deck.gl/core';\nimport {default as H3HexagonLayer} from './h3-hexagon-layer';\nimport GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';\n\nconst defaultProps: DefaultProps<H3ClusterLayerProps> = {\n getHexagons: {type: 'accessor', value: d => d.hexagons}\n};\n\n/** All properties supported by H3ClusterLayer. */\nexport type H3ClusterLayerProps<DataT = any> = _H3ClusterLayerProps<DataT> &\n GeoCellLayerProps<DataT>;\n\n/** Properties added by H3ClusterLayer. */\ntype _H3ClusterLayerProps<DataT> = {\n /**\n * Called for each data object to retrieve the hexagon identifiers.\n *\n * By default, it reads `hexagons` property of data object.\n */\n getHexagons?: AccessorFunction<DataT, H3IndexInput[]>;\n};\n\nexport default class H3ClusterLayer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<\n DataT,\n Required<_H3ClusterLayerProps<DataT>> & ExtraProps\n> {\n static layerName = 'H3ClusterLayer';\n static defaultProps = defaultProps;\n\n initializeState(): void {\n H3HexagonLayer._checkH3Lib();\n }\n\n updateState({props, changeFlags}: UpdateParameters<this>): void {\n if (\n changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagons)\n ) {\n const {data, getHexagons} = props;\n const polygons: {polygon: number[][][]}[] = [];\n\n const {iterable, objectInfo} = createIterable(data);\n for (const object of iterable) {\n objectInfo.index++;\n const hexagons = getHexagons(object, objectInfo);\n const multiPolygon = h3SetToMultiPolygon(hexagons, true);\n\n for (const polygon of multiPolygon) {\n polygons.push(this.getSubLayerRow({polygon}, object, objectInfo.index));\n }\n }\n\n this.setState({polygons});\n }\n }\n\n indexToBounds(): Partial<GeoCellLayer['props']> {\n const {getElevation, getFillColor, getLineColor, getLineWidth} = this.props;\n\n return {\n data: this.state.polygons,\n getPolygon: d => d.polygon,\n\n getElevation: this.getSubLayerAccessor(getElevation),\n getFillColor: this.getSubLayerAccessor(getFillColor),\n getLineColor: this.getSubLayerAccessor(getLineColor),\n getLineWidth: this.getSubLayerAccessor(getLineWidth)\n };\n }\n}\n"],"file":"h3-cluster-layer.js"}
1
+ {"version":3,"sources":["../../../src/h3-layers/h3-cluster-layer.ts"],"names":["cellsToMultiPolygon","createIterable","default","H3HexagonLayer","GeoCellLayer","normalizeLongitudes","defaultProps","getHexagons","type","value","d","hexagons","H3ClusterLayer","initializeState","_checkH3Lib","updateState","props","changeFlags","dataChanged","updateTriggersChanged","data","polygons","iterable","objectInfo","object","index","multiPolygon","polygon","ring","push","getSubLayerRow","setState","indexToBounds","getElevation","getFillColor","getLineColor","getLineWidth","state","getPolygon","getSubLayerAccessor"],"mappings":";AAAA,SAAQA,mBAAR,QAAgD,OAAhD;AAEA,SAA0BC,cAA1B,QAA+E,eAA/E;AACA,SAAQC,OAAO,IAAIC,cAAnB,QAAwC,oBAAxC;AACA,OAAOC,YAAP,MAA8C,gCAA9C;AACA,SAAQC,mBAAR,QAAkC,YAAlC;AAEA,MAAMC,YAA+C,GAAG;AACtDC,EAAAA,WAAW,EAAE;AAACC,IAAAA,IAAI,EAAE,UAAP;AAAmBC,IAAAA,KAAK,EAAEC,CAAC,IAAIA,CAAC,CAACC;AAAjC;AADyC,CAAxD;AAkBA,eAAe,MAAMC,cAAN,SAAsER,YAAtE,CAGb;AAIAS,EAAAA,eAAe,GAAS;AACtBV,IAAAA,cAAc,CAACW,WAAf;AACD;;AAEDC,EAAAA,WAAW,CAAC;AAACC,IAAAA,KAAD;AAAQC,IAAAA;AAAR,GAAD,EAAqD;AAC9D,QACEA,WAAW,CAACC,WAAZ,IACCD,WAAW,CAACE,qBAAZ,IAAqCF,WAAW,CAACE,qBAAZ,CAAkCZ,WAF1E,EAGE;AACA,YAAM;AAACa,QAAAA,IAAD;AAAOb,QAAAA;AAAP,UAAsBS,KAA5B;AACA,YAAMK,QAAmC,GAAG,EAA5C;AAEA,YAAM;AAACC,QAAAA,QAAD;AAAWC,QAAAA;AAAX,UAAyBtB,cAAc,CAACmB,IAAD,CAA7C;;AACA,WAAK,MAAMI,MAAX,IAAqBF,QAArB,EAA+B;AAC7BC,QAAAA,UAAU,CAACE,KAAX;AACA,cAAMd,QAAQ,GAAGJ,WAAW,CAACiB,MAAD,EAASD,UAAT,CAA5B;AACA,cAAMG,YAAY,GAAG1B,mBAAmB,CAACW,QAAD,EAAW,IAAX,CAAxC;;AAEA,aAAK,MAAMgB,OAAX,IAAsBD,YAAtB,EAAoC;AAElC,eAAK,MAAME,IAAX,IAAmBD,OAAnB,EAA4B;AAC1BtB,YAAAA,mBAAmB,CAACuB,IAAD,CAAnB;AACD;;AACDP,UAAAA,QAAQ,CAACQ,IAAT,CAAc,KAAKC,cAAL,CAAoB;AAACH,YAAAA;AAAD,WAApB,EAA+BH,MAA/B,EAAuCD,UAAU,CAACE,KAAlD,CAAd;AACD;AACF;;AAED,WAAKM,QAAL,CAAc;AAACV,QAAAA;AAAD,OAAd;AACD;AACF;;AAEDW,EAAAA,aAAa,GAAmC;AAC9C,UAAM;AAACC,MAAAA,YAAD;AAAeC,MAAAA,YAAf;AAA6BC,MAAAA,YAA7B;AAA2CC,MAAAA;AAA3C,QAA2D,KAAKpB,KAAtE;AAEA,WAAO;AACLI,MAAAA,IAAI,EAAE,KAAKiB,KAAL,CAAWhB,QADZ;AAELiB,MAAAA,UAAU,EAAE5B,CAAC,IAAIA,CAAC,CAACiB,OAFd;AAILM,MAAAA,YAAY,EAAE,KAAKM,mBAAL,CAAyBN,YAAzB,CAJT;AAKLC,MAAAA,YAAY,EAAE,KAAKK,mBAAL,CAAyBL,YAAzB,CALT;AAMLC,MAAAA,YAAY,EAAE,KAAKI,mBAAL,CAAyBJ,YAAzB,CANT;AAOLC,MAAAA,YAAY,EAAE,KAAKG,mBAAL,CAAyBH,YAAzB;AAPT,KAAP;AASD;;AA/CD;;gBAHmBxB,c,eAIA,gB;;gBAJAA,c,kBAKGN,Y","sourcesContent":["import {cellsToMultiPolygon, H3IndexInput} from 'h3-js';\n\nimport {AccessorFunction, createIterable, UpdateParameters, DefaultProps} from '@deck.gl/core';\nimport {default as H3HexagonLayer} from './h3-hexagon-layer';\nimport GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';\nimport {normalizeLongitudes} from './h3-utils';\n\nconst defaultProps: DefaultProps<H3ClusterLayerProps> = {\n getHexagons: {type: 'accessor', value: d => d.hexagons}\n};\n\n/** All properties supported by H3ClusterLayer. */\nexport type H3ClusterLayerProps<DataT = any> = _H3ClusterLayerProps<DataT> &\n GeoCellLayerProps<DataT>;\n\n/** Properties added by H3ClusterLayer. */\ntype _H3ClusterLayerProps<DataT> = {\n /**\n * Called for each data object to retrieve the hexagon identifiers.\n *\n * By default, it reads `hexagons` property of data object.\n */\n getHexagons?: AccessorFunction<DataT, H3IndexInput[]>;\n};\n\nexport default class H3ClusterLayer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<\n DataT,\n Required<_H3ClusterLayerProps<DataT>> & ExtraProps\n> {\n static layerName = 'H3ClusterLayer';\n static defaultProps = defaultProps;\n\n initializeState(): void {\n H3HexagonLayer._checkH3Lib();\n }\n\n updateState({props, changeFlags}: UpdateParameters<this>): void {\n if (\n changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagons)\n ) {\n const {data, getHexagons} = props;\n const polygons: {polygon: number[][][]}[] = [];\n\n const {iterable, objectInfo} = createIterable(data);\n for (const object of iterable) {\n objectInfo.index++;\n const hexagons = getHexagons(object, objectInfo);\n const multiPolygon = cellsToMultiPolygon(hexagons, true);\n\n for (const polygon of multiPolygon) {\n // Normalize polygons to prevent wrapping over the anti-meridian\n for (const ring of polygon) {\n normalizeLongitudes(ring);\n }\n polygons.push(this.getSubLayerRow({polygon}, object, objectInfo.index));\n }\n }\n\n this.setState({polygons});\n }\n }\n\n indexToBounds(): Partial<GeoCellLayer['props']> {\n const {getElevation, getFillColor, getLineColor, getLineWidth} = this.props;\n\n return {\n data: this.state.polygons,\n getPolygon: d => d.polygon,\n\n getElevation: this.getSubLayerAccessor(getElevation),\n getFillColor: this.getSubLayerAccessor(getFillColor),\n getLineColor: this.getSubLayerAccessor(getLineColor),\n getLineWidth: this.getSubLayerAccessor(getLineWidth)\n };\n }\n}\n"],"file":"h3-cluster-layer.js"}
@@ -1,63 +1,9 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { h3ToGeoBoundary, h3GetResolution, h3ToGeo, geoToH3, h3IsPentagon, h3Distance, edgeLength } from 'h3-js';
3
- import { lerp } from '@math.gl/core';
2
+ import { getResolution, cellToLatLng, latLngToCell, isPentagon, gridDistance, getHexagonEdgeLengthAvg } from 'h3-js';
4
3
  import { CompositeLayer, createIterable } from '@deck.gl/core';
5
4
  import { ColumnLayer, PolygonLayer } from '@deck.gl/layers';
5
+ import { flattenPolygon, getHexagonCentroid, h3ToPolygon } from './h3-utils';
6
6
  const UPDATE_THRESHOLD_KM = 10;
7
- export function normalizeLongitudes(vertices, refLng) {
8
- refLng = refLng === undefined ? vertices[0][0] : refLng;
9
-
10
- for (const pt of vertices) {
11
- const deltaLng = pt[0] - refLng;
12
-
13
- if (deltaLng > 180) {
14
- pt[0] -= 360;
15
- } else if (deltaLng < -180) {
16
- pt[0] += 360;
17
- }
18
- }
19
- }
20
- export function scalePolygon(hexId, vertices, factor) {
21
- const [lat, lng] = h3ToGeo(hexId);
22
- const actualCount = vertices.length;
23
- normalizeLongitudes(vertices, lng);
24
- const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;
25
-
26
- for (let i = 0; i < vertexCount; i++) {
27
- vertices[i][0] = lerp(lng, vertices[i][0], factor);
28
- vertices[i][1] = lerp(lat, vertices[i][1], factor);
29
- }
30
- }
31
-
32
- function getHexagonCentroid(getHexagon, object, objectInfo) {
33
- const hexagonId = getHexagon(object, objectInfo);
34
- const [lat, lng] = h3ToGeo(hexagonId);
35
- return [lng, lat];
36
- }
37
-
38
- function h3ToPolygon(hexId, coverage = 1) {
39
- const vertices = h3ToGeoBoundary(hexId, true);
40
-
41
- if (coverage !== 1) {
42
- scalePolygon(hexId, vertices, coverage);
43
- } else {
44
- normalizeLongitudes(vertices);
45
- }
46
-
47
- return vertices;
48
- }
49
-
50
- function flattenPolygon(vertices) {
51
- const positions = new Float64Array(vertices.length * 2);
52
- let i = 0;
53
-
54
- for (const pt of vertices) {
55
- positions[i++] = pt[0];
56
- positions[i++] = pt[1];
57
- }
58
-
59
- return positions;
60
- }
61
7
 
62
8
  function mergeTriggers(getHexagon, coverage) {
63
9
  let trigger;
@@ -140,7 +86,7 @@ export default class H3HexagonLayer extends CompositeLayer {
140
86
  for (const object of iterable) {
141
87
  objectInfo.index++;
142
88
  const hexId = this.props.getHexagon(object, objectInfo);
143
- const hexResolution = h3GetResolution(hexId);
89
+ const hexResolution = getResolution(hexId);
144
90
 
145
91
  if (resolution < 0) {
146
92
  resolution = hexResolution;
@@ -150,7 +96,7 @@ export default class H3HexagonLayer extends CompositeLayer {
150
96
  break;
151
97
  }
152
98
 
153
- if (h3IsPentagon(hexId)) {
99
+ if (isPentagon(hexId)) {
154
100
  hasPentagon = true;
155
101
  break;
156
102
  }
@@ -158,7 +104,7 @@ export default class H3HexagonLayer extends CompositeLayer {
158
104
 
159
105
  return {
160
106
  resolution,
161
- edgeLengthKM: resolution >= 0 ? edgeLength(resolution, 'km') : 0,
107
+ edgeLengthKM: resolution >= 0 ? getHexagonEdgeLengthAvg(resolution, 'km') : 0,
162
108
  hasMultipleRes,
163
109
  hasPentagon
164
110
  };
@@ -195,25 +141,27 @@ export default class H3HexagonLayer extends CompositeLayer {
195
141
  return;
196
142
  }
197
143
 
198
- const hex = this.props.centerHexagon || geoToH3(viewport.latitude, viewport.longitude, resolution);
144
+ const hex = this.props.centerHexagon || latLngToCell(viewport.latitude, viewport.longitude, resolution);
199
145
 
200
146
  if (centerHex === hex) {
201
147
  return;
202
148
  }
203
149
 
204
150
  if (centerHex) {
205
- const distance = h3Distance(centerHex, hex);
151
+ try {
152
+ const distance = gridDistance(centerHex, hex);
206
153
 
207
- if (distance >= 0 && distance * edgeLengthKM < UPDATE_THRESHOLD_KM) {
208
- return;
209
- }
154
+ if (distance * edgeLengthKM < UPDATE_THRESHOLD_KM) {
155
+ return;
156
+ }
157
+ } catch {}
210
158
  }
211
159
 
212
160
  const {
213
161
  unitsPerMeter
214
162
  } = viewport.distanceScales;
215
163
  let vertices = h3ToPolygon(hex);
216
- const [centerLat, centerLng] = h3ToGeo(hex);
164
+ const [centerLat, centerLng] = cellToLatLng(hex);
217
165
  const [centerX, centerY] = viewport.projectFlat([centerLng, centerLat]);
218
166
  vertices = vertices.map(p => {
219
167
  const worldPosition = viewport.projectFlat(p);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/h3-layers/h3-hexagon-layer.ts"],"names":["h3ToGeoBoundary","h3GetResolution","h3ToGeo","geoToH3","h3IsPentagon","h3Distance","edgeLength","lerp","CompositeLayer","createIterable","ColumnLayer","PolygonLayer","UPDATE_THRESHOLD_KM","normalizeLongitudes","vertices","refLng","undefined","pt","deltaLng","scalePolygon","hexId","factor","lat","lng","actualCount","length","vertexCount","i","getHexagonCentroid","getHexagon","object","objectInfo","hexagonId","h3ToPolygon","coverage","flattenPolygon","positions","Float64Array","mergeTriggers","trigger","defaultProps","highPrecision","type","min","max","value","centerHexagon","x","hexagon","extruded","H3HexagonLayer","initializeState","_checkH3Lib","state","edgeLengthKM","resolution","shouldUpdateState","changeFlags","_shouldUseHighPrecision","propsOrDataChanged","somethingChanged","updateState","props","dataChanged","updateTriggersChanged","dataProps","_calculateH3DataProps","setState","_updateVertices","context","viewport","hasPentagon","hasMultipleRes","iterable","data","index","hexResolution","Boolean","centerHex","hex","latitude","longitude","distance","unitsPerMeter","distanceScales","centerLat","centerLng","centerX","centerY","projectFlat","map","p","worldPosition","renderLayers","_renderPolygonLayer","_renderColumnLayer","_getForwardProps","elevationScale","material","wireframe","stroked","filled","lineWidthUnits","lineWidthScale","lineWidthMinPixels","lineWidthMaxPixels","getFillColor","getElevation","getLineColor","getLineWidth","transitions","updateTriggers","SubLayerClass","getSubLayerClass","forwardProps","getPolygon","getSubLayerProps","id","_normalize","_windingOrder","positionFormat","getPosition","flatShading","diskResolution","radius","bind"],"mappings":"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","sourcesContent":["import {\n h3ToGeoBoundary,\n h3GetResolution,\n h3ToGeo,\n geoToH3,\n h3IsPentagon,\n h3Distance,\n edgeLength,\n H3Index\n} from 'h3-js';\nimport {lerp} from '@math.gl/core';\nimport {\n AccessorFunction,\n CompositeLayer,\n createIterable,\n Layer,\n LayersList,\n UpdateParameters,\n WebMercatorViewport,\n DefaultProps\n} from '@deck.gl/core';\nimport {ColumnLayer, PolygonLayer, PolygonLayerProps} from '@deck.gl/layers';\n\n// There is a cost to updating the instanced geometries when using highPrecision: false\n// This constant defines the distance between two hexagons that leads to \"significant\n// distortion.\" Smaller value makes the column layer more sensitive to viewport change.\nconst UPDATE_THRESHOLD_KM = 10;\n\n// normalize longitudes w.r.t center (refLng), when not provided first vertex\nexport function normalizeLongitudes(vertices: number[][], refLng?: number): void {\n refLng = refLng === undefined ? vertices[0][0] : refLng;\n for (const pt of vertices) {\n const deltaLng = pt[0] - refLng;\n if (deltaLng > 180) {\n pt[0] -= 360;\n } else if (deltaLng < -180) {\n pt[0] += 360;\n }\n }\n}\n\n// scale polygon vertices w.r.t center (hexId)\nexport function scalePolygon(hexId: H3Index, vertices: number[][], factor: number): void {\n const [lat, lng] = h3ToGeo(hexId);\n const actualCount = vertices.length;\n\n // normalize with respect to center\n normalizeLongitudes(vertices, lng);\n\n // `h3ToGeoBoundary` returns same array object for first and last vertex (closed polygon),\n // if so skip scaling the last vertex\n const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;\n for (let i = 0; i < vertexCount; i++) {\n vertices[i][0] = lerp(lng, vertices[i][0], factor);\n vertices[i][1] = lerp(lat, vertices[i][1], factor);\n }\n}\n\nfunction getHexagonCentroid(getHexagon, object, objectInfo) {\n const hexagonId = getHexagon(object, objectInfo);\n const [lat, lng] = h3ToGeo(hexagonId);\n return [lng, lat];\n}\n\nfunction h3ToPolygon(hexId: H3Index, coverage: number = 1): number[][] {\n const vertices = h3ToGeoBoundary(hexId, true);\n\n if (coverage !== 1) {\n // scale and normalize vertices w.r.t to center\n scalePolygon(hexId, vertices, coverage);\n } else {\n // normalize w.r.t to start vertex\n normalizeLongitudes(vertices);\n }\n\n return vertices;\n}\n\nfunction flattenPolygon(vertices: number[][]): Float64Array {\n const positions = new Float64Array(vertices.length * 2);\n let i = 0;\n for (const pt of vertices) {\n positions[i++] = pt[0];\n positions[i++] = pt[1];\n }\n return positions;\n}\n\nfunction mergeTriggers(getHexagon, coverage) {\n let trigger;\n if (getHexagon === undefined || getHexagon === null) {\n trigger = coverage;\n } else if (typeof getHexagon === 'object') {\n trigger = {...getHexagon, coverage};\n } else {\n trigger = {getHexagon, coverage};\n }\n return trigger;\n}\n\nconst defaultProps: DefaultProps<H3HexagonLayerProps> = {\n ...PolygonLayer.defaultProps,\n highPrecision: 'auto',\n coverage: {type: 'number', min: 0, max: 1, value: 1},\n centerHexagon: null,\n getHexagon: {type: 'accessor', value: x => x.hexagon},\n extruded: true\n};\n\n/** All properties supported by H3HexagonLayer */\nexport type H3HexagonLayerProps<DataT = any> = _H3HexagonLayerProps<DataT> &\n PolygonLayerProps<DataT>;\n\n/** Props added by the H3HexagonLayer */\ntype _H3HexagonLayerProps<DataT> = {\n /**\n * Whether or not draw hexagons with high precision.\n * @default 'auto'\n */\n highPrecision?: boolean | 'auto';\n /**\n * Coverage of hexagon in cell.\n * @default 1\n */\n coverage?: number;\n /**\n * Center hexagon that best represents the shape of the set. If not specified, the hexagon closest to the center of the viewport is used.\n */\n centerHexagon?: H3Index | null;\n /**\n * Called for each data object to retrieve the quadkey string identifier.\n *\n * By default, it reads `hexagon` property of data object.\n */\n getHexagon?: AccessorFunction<DataT, string>;\n /**\n * Whether to extrude polygons.\n * @default true\n */\n extruded?: boolean;\n};\n\n/**\n * Render hexagons from the [H3](https://h3geo.org/) geospatial indexing system.\n */\nexport default class H3HexagonLayer<\n DataT = any,\n ExtraPropsT extends {} = {}\n> extends CompositeLayer<ExtraPropsT & Required<H3HexagonLayerProps<DataT>>> {\n static defaultProps = defaultProps;\n static layerName = 'H3HexagonLayer';\n\n // See `main/bundle.ts`\n static _checkH3Lib = () => {};\n\n initializeState() {\n H3HexagonLayer._checkH3Lib();\n this.state = {\n edgeLengthKM: 0,\n resolution: -1\n };\n }\n\n state!: {\n centerHex?: H3Index;\n edgeLengthKM: number;\n hasMultipleRes?: boolean;\n hasPentagon?: boolean;\n resolution: number;\n vertices?: number[][];\n };\n\n shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {\n return this._shouldUseHighPrecision()\n ? changeFlags.propsOrDataChanged\n : changeFlags.somethingChanged;\n }\n\n updateState({props, changeFlags}: UpdateParameters<this>): void {\n if (\n props.highPrecision !== true &&\n (changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagon))\n ) {\n const dataProps = this._calculateH3DataProps();\n this.setState(dataProps);\n }\n\n this._updateVertices(this.context.viewport as WebMercatorViewport);\n }\n\n private _calculateH3DataProps() {\n let resolution = -1;\n let hasPentagon = false;\n let hasMultipleRes = false;\n\n const {iterable, objectInfo} = createIterable(this.props.data);\n for (const object of iterable) {\n objectInfo.index++;\n const hexId = this.props.getHexagon(object, objectInfo);\n // Take the resolution of the first hex\n const hexResolution = h3GetResolution(hexId);\n if (resolution < 0) {\n resolution = hexResolution;\n if (!this.props.highPrecision) break;\n } else if (resolution !== hexResolution) {\n hasMultipleRes = true;\n break;\n }\n if (h3IsPentagon(hexId)) {\n hasPentagon = true;\n break;\n }\n }\n\n return {\n resolution,\n edgeLengthKM: resolution >= 0 ? edgeLength(resolution, 'km') : 0,\n hasMultipleRes,\n hasPentagon\n };\n }\n\n private _shouldUseHighPrecision(): boolean {\n if (this.props.highPrecision === 'auto') {\n const {resolution, hasPentagon, hasMultipleRes} = this.state;\n const {viewport} = this.context;\n return (\n Boolean(viewport?.resolution) ||\n hasMultipleRes ||\n hasPentagon ||\n (resolution >= 0 && resolution <= 5)\n );\n }\n\n return this.props.highPrecision;\n }\n\n private _updateVertices(viewport: WebMercatorViewport): void {\n if (this._shouldUseHighPrecision()) {\n return;\n }\n const {resolution, edgeLengthKM, centerHex} = this.state;\n if (resolution < 0) {\n return;\n }\n const hex =\n this.props.centerHexagon || geoToH3(viewport.latitude, viewport.longitude, resolution);\n if (centerHex === hex) {\n return;\n }\n if (centerHex) {\n const distance = h3Distance(centerHex, hex);\n // h3Distance returns a negative number if the distance could not be computed\n // due to the two indexes very far apart or on opposite sides of a pentagon.\n if (distance >= 0 && distance * edgeLengthKM < UPDATE_THRESHOLD_KM) {\n return;\n }\n }\n\n const {unitsPerMeter} = viewport.distanceScales;\n\n let vertices = h3ToPolygon(hex);\n const [centerLat, centerLng] = h3ToGeo(hex);\n\n const [centerX, centerY] = viewport.projectFlat([centerLng, centerLat]);\n vertices = vertices.map(p => {\n const worldPosition = viewport.projectFlat(p);\n return [\n (worldPosition[0] - centerX) / unitsPerMeter[0],\n (worldPosition[1] - centerY) / unitsPerMeter[1]\n ];\n });\n\n this.setState({centerHex: hex, vertices});\n }\n\n renderLayers(): Layer | null | LayersList {\n return this._shouldUseHighPrecision() ? this._renderPolygonLayer() : this._renderColumnLayer();\n }\n\n private _getForwardProps() {\n const {\n elevationScale,\n material,\n coverage,\n extruded,\n wireframe,\n stroked,\n filled,\n lineWidthUnits,\n lineWidthScale,\n lineWidthMinPixels,\n lineWidthMaxPixels,\n getFillColor,\n getElevation,\n getLineColor,\n getLineWidth,\n transitions,\n updateTriggers\n } = this.props;\n\n return {\n elevationScale,\n extruded,\n coverage,\n wireframe,\n stroked,\n filled,\n lineWidthUnits,\n lineWidthScale,\n lineWidthMinPixels,\n lineWidthMaxPixels,\n material,\n getElevation,\n getFillColor,\n getLineColor,\n getLineWidth,\n transitions,\n updateTriggers: {\n getFillColor: updateTriggers.getFillColor,\n getElevation: updateTriggers.getElevation,\n getLineColor: updateTriggers.getLineColor,\n getLineWidth: updateTriggers.getLineWidth\n } as {\n getFillColor: any;\n getElevation: any;\n getLineColor: any;\n getLineWidth: any;\n getPolygon?: any;\n getPosition?: any;\n }\n };\n }\n\n private _renderPolygonLayer(): PolygonLayer {\n const {data, getHexagon, updateTriggers, coverage} = this.props;\n\n const SubLayerClass = this.getSubLayerClass('hexagon-cell-hifi', PolygonLayer);\n const forwardProps = this._getForwardProps();\n forwardProps.updateTriggers.getPolygon = mergeTriggers(updateTriggers.getHexagon, coverage);\n\n return new SubLayerClass(\n forwardProps,\n this.getSubLayerProps({\n id: 'hexagon-cell-hifi',\n updateTriggers: forwardProps.updateTriggers\n }),\n {\n data,\n _normalize: false,\n _windingOrder: 'CCW',\n positionFormat: 'XY',\n getPolygon: (object, objectInfo) => {\n const hexagonId = getHexagon(object, objectInfo);\n return flattenPolygon(h3ToPolygon(hexagonId, coverage));\n }\n }\n );\n }\n\n private _renderColumnLayer(): ColumnLayer {\n const {data, getHexagon, updateTriggers} = this.props;\n\n const SubLayerClass = this.getSubLayerClass('hexagon-cell', ColumnLayer);\n const forwardProps = this._getForwardProps();\n forwardProps.updateTriggers.getPosition = updateTriggers.getHexagon;\n\n return new SubLayerClass(\n forwardProps,\n this.getSubLayerProps({\n id: 'hexagon-cell',\n flatShading: true,\n updateTriggers: forwardProps.updateTriggers\n }),\n {\n data,\n diskResolution: 6, // generate an extruded hexagon as the base geometry\n radius: 1,\n vertices: this.state.vertices,\n getPosition: getHexagonCentroid.bind(null, getHexagon)\n }\n );\n }\n}\n"],"file":"h3-hexagon-layer.js"}
1
+ {"version":3,"sources":["../../../src/h3-layers/h3-hexagon-layer.ts"],"names":["getResolution","cellToLatLng","latLngToCell","isPentagon","gridDistance","getHexagonEdgeLengthAvg","CompositeLayer","createIterable","ColumnLayer","PolygonLayer","flattenPolygon","getHexagonCentroid","h3ToPolygon","UPDATE_THRESHOLD_KM","mergeTriggers","getHexagon","coverage","trigger","undefined","defaultProps","highPrecision","type","min","max","value","centerHexagon","x","hexagon","extruded","H3HexagonLayer","initializeState","_checkH3Lib","state","edgeLengthKM","resolution","shouldUpdateState","changeFlags","_shouldUseHighPrecision","propsOrDataChanged","somethingChanged","updateState","props","dataChanged","updateTriggersChanged","dataProps","_calculateH3DataProps","setState","_updateVertices","context","viewport","hasPentagon","hasMultipleRes","iterable","objectInfo","data","object","index","hexId","hexResolution","Boolean","centerHex","hex","latitude","longitude","distance","unitsPerMeter","distanceScales","vertices","centerLat","centerLng","centerX","centerY","projectFlat","map","p","worldPosition","renderLayers","_renderPolygonLayer","_renderColumnLayer","_getForwardProps","elevationScale","material","wireframe","stroked","filled","lineWidthUnits","lineWidthScale","lineWidthMinPixels","lineWidthMaxPixels","getFillColor","getElevation","getLineColor","getLineWidth","transitions","updateTriggers","SubLayerClass","getSubLayerClass","forwardProps","getPolygon","getSubLayerProps","id","_normalize","_windingOrder","positionFormat","hexagonId","getPosition","flatShading","diskResolution","radius","bind"],"mappings":";AAAA,SACEA,aADF,EAEEC,YAFF,EAGEC,YAHF,EAIEC,UAJF,EAKEC,YALF,EAMEC,uBANF,QAQO,OARP;AASA,SAEEC,cAFF,EAGEC,cAHF,QASO,eATP;AAUA,SAAQC,WAAR,EAAqBC,YAArB,QAA2D,iBAA3D;AACA,SAAQC,cAAR,EAAwBC,kBAAxB,EAA4CC,WAA5C,QAA8D,YAA9D;AAKA,MAAMC,mBAAmB,GAAG,EAA5B;;AAEA,SAASC,aAAT,CAAuBC,UAAvB,EAAmCC,QAAnC,EAA6C;AAC3C,MAAIC,OAAJ;;AACA,MAAIF,UAAU,KAAKG,SAAf,IAA4BH,UAAU,KAAK,IAA/C,EAAqD;AACnDE,IAAAA,OAAO,GAAGD,QAAV;AACD,GAFD,MAEO,IAAI,OAAOD,UAAP,KAAsB,QAA1B,EAAoC;AACzCE,IAAAA,OAAO,GAAG,EAAC,GAAGF,UAAJ;AAAgBC,MAAAA;AAAhB,KAAV;AACD,GAFM,MAEA;AACLC,IAAAA,OAAO,GAAG;AAACF,MAAAA,UAAD;AAAaC,MAAAA;AAAb,KAAV;AACD;;AACD,SAAOC,OAAP;AACD;;AAED,MAAME,YAA+C,GAAG,EACtD,GAAGV,YAAY,CAACU,YADsC;AAEtDC,EAAAA,aAAa,EAAE,MAFuC;AAGtDJ,EAAAA,QAAQ,EAAE;AAACK,IAAAA,IAAI,EAAE,QAAP;AAAiBC,IAAAA,GAAG,EAAE,CAAtB;AAAyBC,IAAAA,GAAG,EAAE,CAA9B;AAAiCC,IAAAA,KAAK,EAAE;AAAxC,GAH4C;AAItDC,EAAAA,aAAa,EAAE,IAJuC;AAKtDV,EAAAA,UAAU,EAAE;AAACM,IAAAA,IAAI,EAAE,UAAP;AAAmBG,IAAAA,KAAK,EAAEE,CAAC,IAAIA,CAAC,CAACC;AAAjC,GAL0C;AAMtDC,EAAAA,QAAQ,EAAE;AAN4C,CAAxD;AA6CA,eAAe,MAAMC,cAAN,SAGLvB,cAHK,CAG8D;AAAA;AAAA;;AAAA;AAAA;;AAO3EwB,EAAAA,eAAe,GAAG;AAChBD,IAAAA,cAAc,CAACE,WAAf;;AACA,SAAKC,KAAL,GAAa;AACXC,MAAAA,YAAY,EAAE,CADH;AAEXC,MAAAA,UAAU,EAAE,CAAC;AAFF,KAAb;AAID;;AAWDC,EAAAA,iBAAiB,CAAC;AAACC,IAAAA;AAAD,GAAD,EAAiD;AAChE,WAAO,KAAKC,uBAAL,KACHD,WAAW,CAACE,kBADT,GAEHF,WAAW,CAACG,gBAFhB;AAGD;;AAEDC,EAAAA,WAAW,CAAC;AAACC,IAAAA,KAAD;AAAQL,IAAAA;AAAR,GAAD,EAAqD;AAC9D,QACEK,KAAK,CAACrB,aAAN,KAAwB,IAAxB,KACCgB,WAAW,CAACM,WAAZ,IACEN,WAAW,CAACO,qBAAZ,IAAqCP,WAAW,CAACO,qBAAZ,CAAkC5B,UAF1E,CADF,EAIE;AACA,YAAM6B,SAAS,GAAG,KAAKC,qBAAL,EAAlB;;AACA,WAAKC,QAAL,CAAcF,SAAd;AACD;;AAED,SAAKG,eAAL,CAAqB,KAAKC,OAAL,CAAaC,QAAlC;AACD;;AAEOJ,EAAAA,qBAAqB,GAAG;AAC9B,QAAIX,UAAU,GAAG,CAAC,CAAlB;AACA,QAAIgB,WAAW,GAAG,KAAlB;AACA,QAAIC,cAAc,GAAG,KAArB;AAEA,UAAM;AAACC,MAAAA,QAAD;AAAWC,MAAAA;AAAX,QAAyB9C,cAAc,CAAC,KAAKkC,KAAL,CAAWa,IAAZ,CAA7C;;AACA,SAAK,MAAMC,MAAX,IAAqBH,QAArB,EAA+B;AAC7BC,MAAAA,UAAU,CAACG,KAAX;AACA,YAAMC,KAAK,GAAG,KAAKhB,KAAL,CAAW1B,UAAX,CAAsBwC,MAAtB,EAA8BF,UAA9B,CAAd;AAEA,YAAMK,aAAa,GAAG1D,aAAa,CAACyD,KAAD,CAAnC;;AACA,UAAIvB,UAAU,GAAG,CAAjB,EAAoB;AAClBA,QAAAA,UAAU,GAAGwB,aAAb;AACA,YAAI,CAAC,KAAKjB,KAAL,CAAWrB,aAAhB,EAA+B;AAChC,OAHD,MAGO,IAAIc,UAAU,KAAKwB,aAAnB,EAAkC;AACvCP,QAAAA,cAAc,GAAG,IAAjB;AACA;AACD;;AACD,UAAIhD,UAAU,CAACsD,KAAD,CAAd,EAAuB;AACrBP,QAAAA,WAAW,GAAG,IAAd;AACA;AACD;AACF;;AAED,WAAO;AACLhB,MAAAA,UADK;AAELD,MAAAA,YAAY,EAAEC,UAAU,IAAI,CAAd,GAAkB7B,uBAAuB,CAAC6B,UAAD,EAAa,IAAb,CAAzC,GAA8D,CAFvE;AAGLiB,MAAAA,cAHK;AAILD,MAAAA;AAJK,KAAP;AAMD;;AAEOb,EAAAA,uBAAuB,GAAY;AACzC,QAAI,KAAKI,KAAL,CAAWrB,aAAX,KAA6B,MAAjC,EAAyC;AACvC,YAAM;AAACc,QAAAA,UAAD;AAAagB,QAAAA,WAAb;AAA0BC,QAAAA;AAA1B,UAA4C,KAAKnB,KAAvD;AACA,YAAM;AAACiB,QAAAA;AAAD,UAAa,KAAKD,OAAxB;AACA,aACEW,OAAO,CAACV,QAAD,aAACA,QAAD,uBAACA,QAAQ,CAAEf,UAAX,CAAP,IACAiB,cADA,IAEAD,WAFA,IAGChB,UAAU,IAAI,CAAd,IAAmBA,UAAU,IAAI,CAJpC;AAMD;;AAED,WAAO,KAAKO,KAAL,CAAWrB,aAAlB;AACD;;AAEO2B,EAAAA,eAAe,CAACE,QAAD,EAAsC;AAC3D,QAAI,KAAKZ,uBAAL,EAAJ,EAAoC;AAClC;AACD;;AACD,UAAM;AAACH,MAAAA,UAAD;AAAaD,MAAAA,YAAb;AAA2B2B,MAAAA;AAA3B,QAAwC,KAAK5B,KAAnD;;AACA,QAAIE,UAAU,GAAG,CAAjB,EAAoB;AAClB;AACD;;AACD,UAAM2B,GAAG,GACP,KAAKpB,KAAL,CAAWhB,aAAX,IAA4BvB,YAAY,CAAC+C,QAAQ,CAACa,QAAV,EAAoBb,QAAQ,CAACc,SAA7B,EAAwC7B,UAAxC,CAD1C;;AAEA,QAAI0B,SAAS,KAAKC,GAAlB,EAAuB;AACrB;AACD;;AACD,QAAID,SAAJ,EAAe;AACb,UAAI;AACF,cAAMI,QAAQ,GAAG5D,YAAY,CAACwD,SAAD,EAAYC,GAAZ,CAA7B;;AACA,YAAIG,QAAQ,GAAG/B,YAAX,GAA0BpB,mBAA9B,EAAmD;AACjD;AACD;AACF,OALD,CAKE,MAAM,CAGP;AACF;;AAED,UAAM;AAACoD,MAAAA;AAAD,QAAkBhB,QAAQ,CAACiB,cAAjC;AAEA,QAAIC,QAAQ,GAAGvD,WAAW,CAACiD,GAAD,CAA1B;AACA,UAAM,CAACO,SAAD,EAAYC,SAAZ,IAAyBpE,YAAY,CAAC4D,GAAD,CAA3C;AAEA,UAAM,CAACS,OAAD,EAAUC,OAAV,IAAqBtB,QAAQ,CAACuB,WAAT,CAAqB,CAACH,SAAD,EAAYD,SAAZ,CAArB,CAA3B;AACAD,IAAAA,QAAQ,GAAGA,QAAQ,CAACM,GAAT,CAAaC,CAAC,IAAI;AAC3B,YAAMC,aAAa,GAAG1B,QAAQ,CAACuB,WAAT,CAAqBE,CAArB,CAAtB;AACA,aAAO,CACL,CAACC,aAAa,CAAC,CAAD,CAAb,GAAmBL,OAApB,IAA+BL,aAAa,CAAC,CAAD,CADvC,EAEL,CAACU,aAAa,CAAC,CAAD,CAAb,GAAmBJ,OAApB,IAA+BN,aAAa,CAAC,CAAD,CAFvC,CAAP;AAID,KANU,CAAX;AAQA,SAAKnB,QAAL,CAAc;AAACc,MAAAA,SAAS,EAAEC,GAAZ;AAAiBM,MAAAA;AAAjB,KAAd;AACD;;AAEDS,EAAAA,YAAY,GAA8B;AACxC,WAAO,KAAKvC,uBAAL,KAAiC,KAAKwC,mBAAL,EAAjC,GAA8D,KAAKC,kBAAL,EAArE;AACD;;AAEOC,EAAAA,gBAAgB,GAAG;AACzB,UAAM;AACJC,MAAAA,cADI;AAEJC,MAAAA,QAFI;AAGJjE,MAAAA,QAHI;AAIJY,MAAAA,QAJI;AAKJsD,MAAAA,SALI;AAMJC,MAAAA,OANI;AAOJC,MAAAA,MAPI;AAQJC,MAAAA,cARI;AASJC,MAAAA,cATI;AAUJC,MAAAA,kBAVI;AAWJC,MAAAA,kBAXI;AAYJC,MAAAA,YAZI;AAaJC,MAAAA,YAbI;AAcJC,MAAAA,YAdI;AAeJC,MAAAA,YAfI;AAgBJC,MAAAA,WAhBI;AAiBJC,MAAAA;AAjBI,QAkBF,KAAKrD,KAlBT;AAoBA,WAAO;AACLuC,MAAAA,cADK;AAELpD,MAAAA,QAFK;AAGLZ,MAAAA,QAHK;AAILkE,MAAAA,SAJK;AAKLC,MAAAA,OALK;AAMLC,MAAAA,MANK;AAOLC,MAAAA,cAPK;AAQLC,MAAAA,cARK;AASLC,MAAAA,kBATK;AAULC,MAAAA,kBAVK;AAWLP,MAAAA,QAXK;AAYLS,MAAAA,YAZK;AAaLD,MAAAA,YAbK;AAcLE,MAAAA,YAdK;AAeLC,MAAAA,YAfK;AAgBLC,MAAAA,WAhBK;AAiBLC,MAAAA,cAAc,EAAE;AACdL,QAAAA,YAAY,EAAEK,cAAc,CAACL,YADf;AAEdC,QAAAA,YAAY,EAAEI,cAAc,CAACJ,YAFf;AAGdC,QAAAA,YAAY,EAAEG,cAAc,CAACH,YAHf;AAIdC,QAAAA,YAAY,EAAEE,cAAc,CAACF;AAJf;AAjBX,KAAP;AA+BD;;AAEOf,EAAAA,mBAAmB,GAAiB;AAC1C,UAAM;AAACvB,MAAAA,IAAD;AAAOvC,MAAAA,UAAP;AAAmB+E,MAAAA,cAAnB;AAAmC9E,MAAAA;AAAnC,QAA+C,KAAKyB,KAA1D;AAEA,UAAMsD,aAAa,GAAG,KAAKC,gBAAL,CAAsB,mBAAtB,EAA2CvF,YAA3C,CAAtB;;AACA,UAAMwF,YAAY,GAAG,KAAKlB,gBAAL,EAArB;;AACAkB,IAAAA,YAAY,CAACH,cAAb,CAA4BI,UAA5B,GAAyCpF,aAAa,CAACgF,cAAc,CAAC/E,UAAhB,EAA4BC,QAA5B,CAAtD;AAEA,WAAO,IAAI+E,aAAJ,CACLE,YADK,EAEL,KAAKE,gBAAL,CAAsB;AACpBC,MAAAA,EAAE,EAAE,mBADgB;AAEpBN,MAAAA,cAAc,EAAEG,YAAY,CAACH;AAFT,KAAtB,CAFK,EAML;AACExC,MAAAA,IADF;AAEE+C,MAAAA,UAAU,EAAE,KAFd;AAGEC,MAAAA,aAAa,EAAE,KAHjB;AAIEC,MAAAA,cAAc,EAAE,IAJlB;AAKEL,MAAAA,UAAU,EAAE,CAAC3C,MAAD,EAASF,UAAT,KAAwB;AAClC,cAAMmD,SAAS,GAAGzF,UAAU,CAACwC,MAAD,EAASF,UAAT,CAA5B;AACA,eAAO3C,cAAc,CAACE,WAAW,CAAC4F,SAAD,EAAYxF,QAAZ,CAAZ,CAArB;AACD;AARH,KANK,CAAP;AAiBD;;AAEO8D,EAAAA,kBAAkB,GAAgB;AACxC,UAAM;AAACxB,MAAAA,IAAD;AAAOvC,MAAAA,UAAP;AAAmB+E,MAAAA;AAAnB,QAAqC,KAAKrD,KAAhD;AAEA,UAAMsD,aAAa,GAAG,KAAKC,gBAAL,CAAsB,cAAtB,EAAsCxF,WAAtC,CAAtB;;AACA,UAAMyF,YAAY,GAAG,KAAKlB,gBAAL,EAArB;;AACAkB,IAAAA,YAAY,CAACH,cAAb,CAA4BW,WAA5B,GAA0CX,cAAc,CAAC/E,UAAzD;AAEA,WAAO,IAAIgF,aAAJ,CACLE,YADK,EAEL,KAAKE,gBAAL,CAAsB;AACpBC,MAAAA,EAAE,EAAE,cADgB;AAEpBM,MAAAA,WAAW,EAAE,IAFO;AAGpBZ,MAAAA,cAAc,EAAEG,YAAY,CAACH;AAHT,KAAtB,CAFK,EAOL;AACExC,MAAAA,IADF;AAEEqD,MAAAA,cAAc,EAAE,CAFlB;AAGEC,MAAAA,MAAM,EAAE,CAHV;AAIEzC,MAAAA,QAAQ,EAAE,KAAKnC,KAAL,CAAWmC,QAJvB;AAKEsC,MAAAA,WAAW,EAAE9F,kBAAkB,CAACkG,IAAnB,CAAwB,IAAxB,EAA8B9F,UAA9B;AALf,KAPK,CAAP;AAeD;;AA9O0E;;gBAHxDc,c,kBAIGV,Y;;gBAJHU,c,eAKA,gB;;gBALAA,c,iBAQE,MAAM,CAAE,C","sourcesContent":["import {\n getResolution,\n cellToLatLng,\n latLngToCell,\n isPentagon,\n gridDistance,\n getHexagonEdgeLengthAvg,\n H3Index\n} from 'h3-js';\nimport {\n AccessorFunction,\n CompositeLayer,\n createIterable,\n Layer,\n LayersList,\n UpdateParameters,\n WebMercatorViewport,\n DefaultProps\n} from '@deck.gl/core';\nimport {ColumnLayer, PolygonLayer, PolygonLayerProps} from '@deck.gl/layers';\nimport {flattenPolygon, getHexagonCentroid, h3ToPolygon} from './h3-utils';\n\n// There is a cost to updating the instanced geometries when using highPrecision: false\n// This constant defines the distance between two hexagons that leads to \"significant\n// distortion.\" Smaller value makes the column layer more sensitive to viewport change.\nconst UPDATE_THRESHOLD_KM = 10;\n\nfunction mergeTriggers(getHexagon, coverage) {\n let trigger;\n if (getHexagon === undefined || getHexagon === null) {\n trigger = coverage;\n } else if (typeof getHexagon === 'object') {\n trigger = {...getHexagon, coverage};\n } else {\n trigger = {getHexagon, coverage};\n }\n return trigger;\n}\n\nconst defaultProps: DefaultProps<H3HexagonLayerProps> = {\n ...PolygonLayer.defaultProps,\n highPrecision: 'auto',\n coverage: {type: 'number', min: 0, max: 1, value: 1},\n centerHexagon: null,\n getHexagon: {type: 'accessor', value: x => x.hexagon},\n extruded: true\n};\n\n/** All properties supported by H3HexagonLayer */\nexport type H3HexagonLayerProps<DataT = any> = _H3HexagonLayerProps<DataT> &\n PolygonLayerProps<DataT>;\n\n/** Props added by the H3HexagonLayer */\ntype _H3HexagonLayerProps<DataT> = {\n /**\n * Whether or not draw hexagons with high precision.\n * @default 'auto'\n */\n highPrecision?: boolean | 'auto';\n /**\n * Coverage of hexagon in cell.\n * @default 1\n */\n coverage?: number;\n /**\n * Center hexagon that best represents the shape of the set. If not specified, the hexagon closest to the center of the viewport is used.\n */\n centerHexagon?: H3Index | null;\n /**\n * Called for each data object to retrieve the quadkey string identifier.\n *\n * By default, it reads `hexagon` property of data object.\n */\n getHexagon?: AccessorFunction<DataT, string>;\n /**\n * Whether to extrude polygons.\n * @default true\n */\n extruded?: boolean;\n};\n\n/**\n * Render hexagons from the [H3](https://h3geo.org/) geospatial indexing system.\n */\nexport default class H3HexagonLayer<\n DataT = any,\n ExtraPropsT extends {} = {}\n> extends CompositeLayer<ExtraPropsT & Required<H3HexagonLayerProps<DataT>>> {\n static defaultProps = defaultProps;\n static layerName = 'H3HexagonLayer';\n\n // See `main/bundle.ts`\n static _checkH3Lib = () => {};\n\n initializeState() {\n H3HexagonLayer._checkH3Lib();\n this.state = {\n edgeLengthKM: 0,\n resolution: -1\n };\n }\n\n state!: {\n centerHex?: H3Index;\n edgeLengthKM: number;\n hasMultipleRes?: boolean;\n hasPentagon?: boolean;\n resolution: number;\n vertices?: number[][];\n };\n\n shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {\n return this._shouldUseHighPrecision()\n ? changeFlags.propsOrDataChanged\n : changeFlags.somethingChanged;\n }\n\n updateState({props, changeFlags}: UpdateParameters<this>): void {\n if (\n props.highPrecision !== true &&\n (changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged && changeFlags.updateTriggersChanged.getHexagon))\n ) {\n const dataProps = this._calculateH3DataProps();\n this.setState(dataProps);\n }\n\n this._updateVertices(this.context.viewport as WebMercatorViewport);\n }\n\n private _calculateH3DataProps() {\n let resolution = -1;\n let hasPentagon = false;\n let hasMultipleRes = false;\n\n const {iterable, objectInfo} = createIterable(this.props.data);\n for (const object of iterable) {\n objectInfo.index++;\n const hexId = this.props.getHexagon(object, objectInfo);\n // Take the resolution of the first hex\n const hexResolution = getResolution(hexId);\n if (resolution < 0) {\n resolution = hexResolution;\n if (!this.props.highPrecision) break;\n } else if (resolution !== hexResolution) {\n hasMultipleRes = true;\n break;\n }\n if (isPentagon(hexId)) {\n hasPentagon = true;\n break;\n }\n }\n\n return {\n resolution,\n edgeLengthKM: resolution >= 0 ? getHexagonEdgeLengthAvg(resolution, 'km') : 0,\n hasMultipleRes,\n hasPentagon\n };\n }\n\n private _shouldUseHighPrecision(): boolean {\n if (this.props.highPrecision === 'auto') {\n const {resolution, hasPentagon, hasMultipleRes} = this.state;\n const {viewport} = this.context;\n return (\n Boolean(viewport?.resolution) ||\n hasMultipleRes ||\n hasPentagon ||\n (resolution >= 0 && resolution <= 5)\n );\n }\n\n return this.props.highPrecision;\n }\n\n private _updateVertices(viewport: WebMercatorViewport): void {\n if (this._shouldUseHighPrecision()) {\n return;\n }\n const {resolution, edgeLengthKM, centerHex} = this.state;\n if (resolution < 0) {\n return;\n }\n const hex =\n this.props.centerHexagon || latLngToCell(viewport.latitude, viewport.longitude, resolution);\n if (centerHex === hex) {\n return;\n }\n if (centerHex) {\n try {\n const distance = gridDistance(centerHex, hex);\n if (distance * edgeLengthKM < UPDATE_THRESHOLD_KM) {\n return;\n }\n } catch {\n // gridDistance throws if the distance could not be computed\n // due to the two indexes very far apart or on opposite sides of a pentagon.\n }\n }\n\n const {unitsPerMeter} = viewport.distanceScales;\n\n let vertices = h3ToPolygon(hex);\n const [centerLat, centerLng] = cellToLatLng(hex);\n\n const [centerX, centerY] = viewport.projectFlat([centerLng, centerLat]);\n vertices = vertices.map(p => {\n const worldPosition = viewport.projectFlat(p);\n return [\n (worldPosition[0] - centerX) / unitsPerMeter[0],\n (worldPosition[1] - centerY) / unitsPerMeter[1]\n ];\n });\n\n this.setState({centerHex: hex, vertices});\n }\n\n renderLayers(): Layer | null | LayersList {\n return this._shouldUseHighPrecision() ? this._renderPolygonLayer() : this._renderColumnLayer();\n }\n\n private _getForwardProps() {\n const {\n elevationScale,\n material,\n coverage,\n extruded,\n wireframe,\n stroked,\n filled,\n lineWidthUnits,\n lineWidthScale,\n lineWidthMinPixels,\n lineWidthMaxPixels,\n getFillColor,\n getElevation,\n getLineColor,\n getLineWidth,\n transitions,\n updateTriggers\n } = this.props;\n\n return {\n elevationScale,\n extruded,\n coverage,\n wireframe,\n stroked,\n filled,\n lineWidthUnits,\n lineWidthScale,\n lineWidthMinPixels,\n lineWidthMaxPixels,\n material,\n getElevation,\n getFillColor,\n getLineColor,\n getLineWidth,\n transitions,\n updateTriggers: {\n getFillColor: updateTriggers.getFillColor,\n getElevation: updateTriggers.getElevation,\n getLineColor: updateTriggers.getLineColor,\n getLineWidth: updateTriggers.getLineWidth\n } as {\n getFillColor: any;\n getElevation: any;\n getLineColor: any;\n getLineWidth: any;\n getPolygon?: any;\n getPosition?: any;\n }\n };\n }\n\n private _renderPolygonLayer(): PolygonLayer {\n const {data, getHexagon, updateTriggers, coverage} = this.props;\n\n const SubLayerClass = this.getSubLayerClass('hexagon-cell-hifi', PolygonLayer);\n const forwardProps = this._getForwardProps();\n forwardProps.updateTriggers.getPolygon = mergeTriggers(updateTriggers.getHexagon, coverage);\n\n return new SubLayerClass(\n forwardProps,\n this.getSubLayerProps({\n id: 'hexagon-cell-hifi',\n updateTriggers: forwardProps.updateTriggers\n }),\n {\n data,\n _normalize: false,\n _windingOrder: 'CCW',\n positionFormat: 'XY',\n getPolygon: (object, objectInfo) => {\n const hexagonId = getHexagon(object, objectInfo);\n return flattenPolygon(h3ToPolygon(hexagonId, coverage));\n }\n }\n );\n }\n\n private _renderColumnLayer(): ColumnLayer {\n const {data, getHexagon, updateTriggers} = this.props;\n\n const SubLayerClass = this.getSubLayerClass('hexagon-cell', ColumnLayer);\n const forwardProps = this._getForwardProps();\n forwardProps.updateTriggers.getPosition = updateTriggers.getHexagon;\n\n return new SubLayerClass(\n forwardProps,\n this.getSubLayerProps({\n id: 'hexagon-cell',\n flatShading: true,\n updateTriggers: forwardProps.updateTriggers\n }),\n {\n data,\n diskResolution: 6, // generate an extruded hexagon as the base geometry\n radius: 1,\n vertices: this.state.vertices,\n getPosition: getHexagonCentroid.bind(null, getHexagon)\n }\n );\n }\n}\n"],"file":"h3-hexagon-layer.js"}
@@ -0,0 +1,54 @@
1
+ import { cellToBoundary, cellToLatLng } from 'h3-js';
2
+ import { lerp } from '@math.gl/core';
3
+ export function normalizeLongitudes(vertices, refLng) {
4
+ refLng = refLng === undefined ? vertices[0][0] : refLng;
5
+
6
+ for (const pt of vertices) {
7
+ const deltaLng = pt[0] - refLng;
8
+
9
+ if (deltaLng > 180) {
10
+ pt[0] -= 360;
11
+ } else if (deltaLng < -180) {
12
+ pt[0] += 360;
13
+ }
14
+ }
15
+ }
16
+ export function scalePolygon(hexId, vertices, factor) {
17
+ const [lat, lng] = cellToLatLng(hexId);
18
+ const actualCount = vertices.length;
19
+ normalizeLongitudes(vertices, lng);
20
+ const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;
21
+
22
+ for (let i = 0; i < vertexCount; i++) {
23
+ vertices[i][0] = lerp(lng, vertices[i][0], factor);
24
+ vertices[i][1] = lerp(lat, vertices[i][1], factor);
25
+ }
26
+ }
27
+ export function getHexagonCentroid(getHexagon, object, objectInfo) {
28
+ const hexagonId = getHexagon(object, objectInfo);
29
+ const [lat, lng] = cellToLatLng(hexagonId);
30
+ return [lng, lat];
31
+ }
32
+ export function h3ToPolygon(hexId, coverage = 1) {
33
+ const vertices = cellToBoundary(hexId, true);
34
+
35
+ if (coverage !== 1) {
36
+ scalePolygon(hexId, vertices, coverage);
37
+ } else {
38
+ normalizeLongitudes(vertices);
39
+ }
40
+
41
+ return vertices;
42
+ }
43
+ export function flattenPolygon(vertices) {
44
+ const positions = new Float64Array(vertices.length * 2);
45
+ let i = 0;
46
+
47
+ for (const pt of vertices) {
48
+ positions[i++] = pt[0];
49
+ positions[i++] = pt[1];
50
+ }
51
+
52
+ return positions;
53
+ }
54
+ //# sourceMappingURL=h3-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/h3-layers/h3-utils.ts"],"names":["cellToBoundary","cellToLatLng","lerp","normalizeLongitudes","vertices","refLng","undefined","pt","deltaLng","scalePolygon","hexId","factor","lat","lng","actualCount","length","vertexCount","i","getHexagonCentroid","getHexagon","object","objectInfo","hexagonId","h3ToPolygon","coverage","flattenPolygon","positions","Float64Array"],"mappings":"AAAA,SAAiCA,cAAjC,EAAiDC,YAAjD,QAAoE,OAApE;AACA,SAAQC,IAAR,QAAmB,eAAnB;AAGA,OAAO,SAASC,mBAAT,CAA6BC,QAA7B,EAAoDC,MAApD,EAA2E;AAChFA,EAAAA,MAAM,GAAGA,MAAM,KAAKC,SAAX,GAAuBF,QAAQ,CAAC,CAAD,CAAR,CAAY,CAAZ,CAAvB,GAAwCC,MAAjD;;AACA,OAAK,MAAME,EAAX,IAAiBH,QAAjB,EAA2B;AACzB,UAAMI,QAAQ,GAAGD,EAAE,CAAC,CAAD,CAAF,GAAQF,MAAzB;;AACA,QAAIG,QAAQ,GAAG,GAAf,EAAoB;AAClBD,MAAAA,EAAE,CAAC,CAAD,CAAF,IAAS,GAAT;AACD,KAFD,MAEO,IAAIC,QAAQ,GAAG,CAAC,GAAhB,EAAqB;AAC1BD,MAAAA,EAAE,CAAC,CAAD,CAAF,IAAS,GAAT;AACD;AACF;AACF;AAGD,OAAO,SAASE,YAAT,CAAsBC,KAAtB,EAA2CN,QAA3C,EAAkEO,MAAlE,EAAwF;AAC7F,QAAM,CAACC,GAAD,EAAMC,GAAN,IAAaZ,YAAY,CAACS,KAAD,CAA/B;AACA,QAAMI,WAAW,GAAGV,QAAQ,CAACW,MAA7B;AAGAZ,EAAAA,mBAAmB,CAACC,QAAD,EAAWS,GAAX,CAAnB;AAIA,QAAMG,WAAW,GAAGZ,QAAQ,CAAC,CAAD,CAAR,KAAgBA,QAAQ,CAACU,WAAW,GAAG,CAAf,CAAxB,GAA4CA,WAAW,GAAG,CAA1D,GAA8DA,WAAlF;;AACA,OAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,WAApB,EAAiCC,CAAC,EAAlC,EAAsC;AACpCb,IAAAA,QAAQ,CAACa,CAAD,CAAR,CAAY,CAAZ,IAAiBf,IAAI,CAACW,GAAD,EAAMT,QAAQ,CAACa,CAAD,CAAR,CAAY,CAAZ,CAAN,EAAsBN,MAAtB,CAArB;AACAP,IAAAA,QAAQ,CAACa,CAAD,CAAR,CAAY,CAAZ,IAAiBf,IAAI,CAACU,GAAD,EAAMR,QAAQ,CAACa,CAAD,CAAR,CAAY,CAAZ,CAAN,EAAsBN,MAAtB,CAArB;AACD;AACF;AAGD,OAAO,SAASO,kBAAT,CAA4BC,UAA5B,EAAwCC,MAAxC,EAAgDC,UAAhD,EAA4D;AACjE,QAAMC,SAAS,GAAGH,UAAU,CAACC,MAAD,EAASC,UAAT,CAA5B;AACA,QAAM,CAACT,GAAD,EAAMC,GAAN,IAAaZ,YAAY,CAACqB,SAAD,CAA/B;AACA,SAAO,CAACT,GAAD,EAAMD,GAAN,CAAP;AACD;AAED,OAAO,SAASW,WAAT,CAAqBb,KAArB,EAA0Cc,QAAgB,GAAG,CAA7D,EAA4E;AACjF,QAAMpB,QAAQ,GAAGJ,cAAc,CAACU,KAAD,EAAQ,IAAR,CAA/B;;AAEA,MAAIc,QAAQ,KAAK,CAAjB,EAAoB;AAElBf,IAAAA,YAAY,CAACC,KAAD,EAAQN,QAAR,EAAkBoB,QAAlB,CAAZ;AACD,GAHD,MAGO;AAELrB,IAAAA,mBAAmB,CAACC,QAAD,CAAnB;AACD;;AAED,SAAOA,QAAP;AACD;AAED,OAAO,SAASqB,cAAT,CAAwBrB,QAAxB,EAA4D;AACjE,QAAMsB,SAAS,GAAG,IAAIC,YAAJ,CAAiBvB,QAAQ,CAACW,MAAT,GAAkB,CAAnC,CAAlB;AACA,MAAIE,CAAC,GAAG,CAAR;;AACA,OAAK,MAAMV,EAAX,IAAiBH,QAAjB,EAA2B;AACzBsB,IAAAA,SAAS,CAACT,CAAC,EAAF,CAAT,GAAiBV,EAAE,CAAC,CAAD,CAAnB;AACAmB,IAAAA,SAAS,CAACT,CAAC,EAAF,CAAT,GAAiBV,EAAE,CAAC,CAAD,CAAnB;AACD;;AACD,SAAOmB,SAAP;AACD","sourcesContent":["import {CoordPair, H3IndexInput, cellToBoundary, cellToLatLng} from 'h3-js';\nimport {lerp} from '@math.gl/core';\n\n// normalize longitudes w.r.t center (refLng), when not provided first vertex\nexport function normalizeLongitudes(vertices: CoordPair[], refLng?: number): void {\n refLng = refLng === undefined ? vertices[0][0] : refLng;\n for (const pt of vertices) {\n const deltaLng = pt[0] - refLng;\n if (deltaLng > 180) {\n pt[0] -= 360;\n } else if (deltaLng < -180) {\n pt[0] += 360;\n }\n }\n}\n\n// scale polygon vertices w.r.t center (hexId)\nexport function scalePolygon(hexId: H3IndexInput, vertices: CoordPair[], factor: number): void {\n const [lat, lng] = cellToLatLng(hexId);\n const actualCount = vertices.length;\n\n // normalize with respect to center\n normalizeLongitudes(vertices, lng);\n\n // `cellToBoundary` returns same array object for first and last vertex (closed polygon),\n // if so skip scaling the last vertex\n const vertexCount = vertices[0] === vertices[actualCount - 1] ? actualCount - 1 : actualCount;\n for (let i = 0; i < vertexCount; i++) {\n vertices[i][0] = lerp(lng, vertices[i][0], factor);\n vertices[i][1] = lerp(lat, vertices[i][1], factor);\n }\n}\n\n// gets hexagon centroid\nexport function getHexagonCentroid(getHexagon, object, objectInfo) {\n const hexagonId = getHexagon(object, objectInfo);\n const [lat, lng] = cellToLatLng(hexagonId);\n return [lng, lat];\n}\n\nexport function h3ToPolygon(hexId: H3IndexInput, coverage: number = 1): number[][] {\n const vertices = cellToBoundary(hexId, true);\n\n if (coverage !== 1) {\n // scale and normalize vertices w.r.t to center\n scalePolygon(hexId, vertices, coverage);\n } else {\n // normalize w.r.t to start vertex\n normalizeLongitudes(vertices);\n }\n\n return vertices;\n}\n\nexport function flattenPolygon(vertices: number[][]): Float64Array {\n const positions = new Float64Array(vertices.length * 2);\n let i = 0;\n for (const pt of vertices) {\n positions[i++] = pt[0];\n positions[i++] = pt[1];\n }\n return positions;\n}\n"],"file":"h3-utils.js"}