@deck.gl-community/editable-layers 9.0.0-alpha.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/README.md +82 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.js +14 -0
- package/dist/curve-utils.d.ts +2 -0
- package/dist/curve-utils.js +61 -0
- package/dist/edit-modes/composite-mode.d.ts +14 -0
- package/dist/edit-modes/composite-mode.js +47 -0
- package/dist/edit-modes/draw-90degree-polygon-mode.d.ts +11 -0
- package/dist/edit-modes/draw-90degree-polygon-mode.js +179 -0
- package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts +24 -0
- package/dist/edit-modes/draw-circle-by-diameter-mode.js +78 -0
- package/dist/edit-modes/draw-circle-from-center-mode.d.ts +22 -0
- package/dist/edit-modes/draw-circle-from-center-mode.js +70 -0
- package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.d.ts +5 -0
- package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.js +20 -0
- package/dist/edit-modes/draw-ellipse-using-three-points-mode.d.ts +5 -0
- package/dist/edit-modes/draw-ellipse-using-three-points-mode.js +16 -0
- package/dist/edit-modes/draw-line-string-mode.d.ts +25 -0
- package/dist/edit-modes/draw-line-string-mode.js +170 -0
- package/dist/edit-modes/draw-point-mode.d.ts +8 -0
- package/dist/edit-modes/draw-point-mode.js +28 -0
- package/dist/edit-modes/draw-polygon-by-dragging-mode.d.ts +14 -0
- package/dist/edit-modes/draw-polygon-by-dragging-mode.js +87 -0
- package/dist/edit-modes/draw-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/draw-polygon-mode.js +143 -0
- package/dist/edit-modes/draw-rectangle-from-center-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-from-center-mode.js +17 -0
- package/dist/edit-modes/draw-rectangle-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-mode.js +11 -0
- package/dist/edit-modes/draw-rectangle-using-three-points-mode.d.ts +5 -0
- package/dist/edit-modes/draw-rectangle-using-three-points-mode.js +28 -0
- package/dist/edit-modes/draw-square-from-center-mode.d.ts +5 -0
- package/dist/edit-modes/draw-square-from-center-mode.js +35 -0
- package/dist/edit-modes/draw-square-mode.d.ts +5 -0
- package/dist/edit-modes/draw-square-mode.js +28 -0
- package/dist/edit-modes/duplicate-mode.d.ts +7 -0
- package/dist/edit-modes/duplicate-mode.js +17 -0
- package/dist/edit-modes/edit-mode.d.ts +11 -0
- package/dist/edit-modes/edit-mode.js +2 -0
- package/dist/edit-modes/elevation-mode.d.ts +13 -0
- package/dist/edit-modes/elevation-mode.js +49 -0
- package/dist/edit-modes/extend-line-string-mode.d.ts +9 -0
- package/dist/edit-modes/extend-line-string-mode.js +72 -0
- package/dist/edit-modes/extrude-mode.d.ts +15 -0
- package/dist/edit-modes/extrude-mode.js +186 -0
- package/dist/edit-modes/geojson-edit-mode.d.ts +33 -0
- package/dist/edit-modes/geojson-edit-mode.js +208 -0
- package/dist/edit-modes/immutable-feature-collection.d.ts +43 -0
- package/dist/edit-modes/immutable-feature-collection.js +300 -0
- package/dist/edit-modes/measure-angle-mode.d.ts +11 -0
- package/dist/edit-modes/measure-angle-mode.js +99 -0
- package/dist/edit-modes/measure-area-mode.d.ts +8 -0
- package/dist/edit-modes/measure-area-mode.js +50 -0
- package/dist/edit-modes/measure-distance-mode.d.ts +19 -0
- package/dist/edit-modes/measure-distance-mode.js +171 -0
- package/dist/edit-modes/modify-mode.d.ts +15 -0
- package/dist/edit-modes/modify-mode.js +203 -0
- package/dist/edit-modes/resize-circle-mode.d.ts +16 -0
- package/dist/edit-modes/resize-circle-mode.js +142 -0
- package/dist/edit-modes/rotate-mode.d.ts +17 -0
- package/dist/edit-modes/rotate-mode.js +151 -0
- package/dist/edit-modes/scale-mode.d.ts +27 -0
- package/dist/edit-modes/scale-mode.js +173 -0
- package/dist/edit-modes/snappable-mode.d.ts +21 -0
- package/dist/edit-modes/snappable-mode.js +109 -0
- package/dist/edit-modes/split-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/split-polygon-mode.js +164 -0
- package/dist/edit-modes/three-click-polygon-mode.d.ts +10 -0
- package/dist/edit-modes/three-click-polygon-mode.js +72 -0
- package/dist/edit-modes/transform-mode.d.ts +9 -0
- package/dist/edit-modes/transform-mode.js +63 -0
- package/dist/edit-modes/translate-mode.d.ts +13 -0
- package/dist/edit-modes/translate-mode.js +113 -0
- package/dist/edit-modes/two-click-polygon-mode.d.ts +13 -0
- package/dist/edit-modes/two-click-polygon-mode.js +93 -0
- package/dist/edit-modes/types.d.ts +86 -0
- package/dist/edit-modes/types.js +1 -0
- package/dist/edit-modes/utils.d.ts +36 -0
- package/dist/edit-modes/utils.js +381 -0
- package/dist/edit-modes/view-mode.d.ts +3 -0
- package/dist/edit-modes/view-mode.js +3 -0
- package/dist/editable-layers/editable-geojson-layer.d.ts +98 -0
- package/dist/editable-layers/editable-geojson-layer.js +450 -0
- package/dist/editable-layers/editable-h3-cluster-layer.d.ts +34 -0
- package/dist/editable-layers/editable-h3-cluster-layer.js +164 -0
- package/dist/editable-layers/editable-layer.d.ts +49 -0
- package/dist/editable-layers/editable-layer.js +195 -0
- package/dist/editable-layers/editable-path-layer.d.ts +9 -0
- package/dist/editable-layers/editable-path-layer.js +34 -0
- package/dist/editable-layers/elevated-edit-handle-layer.d.ts +7 -0
- package/dist/editable-layers/elevated-edit-handle-layer.js +24 -0
- package/dist/editable-layers/junction-scatterplot-layer.d.ts +14 -0
- package/dist/editable-layers/junction-scatterplot-layer.js +41 -0
- package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.d.ts +4 -0
- package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.js +55 -0
- package/dist/editable-layers/path-marker-layer/create-path-markers.d.ts +16 -0
- package/dist/editable-layers/path-marker-layer/create-path-markers.js +75 -0
- package/dist/editable-layers/path-marker-layer/path-marker-layer.d.ts +40 -0
- package/dist/editable-layers/path-marker-layer/path-marker-layer.js +121 -0
- package/dist/editable-layers/path-marker-layer/polyline.d.ts +18 -0
- package/dist/editable-layers/path-marker-layer/polyline.js +37 -0
- package/dist/editable-layers/path-outline-layer/path-outline-layer.d.ts +26 -0
- package/dist/editable-layers/path-outline-layer/path-outline-layer.js +106 -0
- package/dist/editable-layers/selection-layer.d.ts +26 -0
- package/dist/editable-layers/selection-layer.js +167 -0
- package/dist/geojson-types.d.ts +58 -0
- package/dist/geojson-types.js +2 -0
- package/dist/index.cjs +5825 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.js +62 -0
- package/dist/lib/constants.d.ts +6 -0
- package/dist/lib/constants.js +6 -0
- package/dist/lib/deck-renderer/deck-cache.d.ts +14 -0
- package/dist/lib/deck-renderer/deck-cache.js +51 -0
- package/dist/lib/deck-renderer/deck-drawer.d.ts +63 -0
- package/dist/lib/deck-renderer/deck-drawer.js +232 -0
- package/dist/lib/feature.d.ts +10 -0
- package/dist/lib/feature.js +16 -0
- package/dist/lib/layer-mouse-event.d.ts +11 -0
- package/dist/lib/layer-mouse-event.js +24 -0
- package/dist/lib/layers/junctions-layer.d.ts +8 -0
- package/dist/lib/layers/junctions-layer.js +33 -0
- package/dist/lib/layers/segments-layer.d.ts +18 -0
- package/dist/lib/layers/segments-layer.js +94 -0
- package/dist/lib/layers/texts-layer.d.ts +8 -0
- package/dist/lib/layers/texts-layer.js +32 -0
- package/dist/lib/math.d.ts +11 -0
- package/dist/lib/math.js +22 -0
- package/dist/lib/nebula-layer.d.ts +13 -0
- package/dist/lib/nebula-layer.js +26 -0
- package/dist/lib/nebula.d.ts +34 -0
- package/dist/lib/nebula.js +254 -0
- package/dist/lib/style.d.ts +19 -0
- package/dist/lib/style.js +20 -0
- package/dist/memoize.d.ts +6 -0
- package/dist/memoize.js +40 -0
- package/dist/mode-handlers/composite-mode-handler.d.ts +24 -0
- package/dist/mode-handlers/composite-mode-handler.js +55 -0
- package/dist/mode-handlers/draw-90degree-polygon-handler.d.ts +13 -0
- package/dist/mode-handlers/draw-90degree-polygon-handler.js +169 -0
- package/dist/mode-handlers/draw-circle-by-bounding-box-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-circle-by-bounding-box-handler.js +29 -0
- package/dist/mode-handlers/draw-circle-from-center-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-circle-from-center-handler.js +27 -0
- package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.js +30 -0
- package/dist/mode-handlers/draw-ellipse-using-three-points-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-ellipse-using-three-points-handler.js +37 -0
- package/dist/mode-handlers/draw-line-string-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-line-string-handler.js +83 -0
- package/dist/mode-handlers/draw-point-handler.d.ts +5 -0
- package/dist/mode-handlers/draw-point-handler.js +11 -0
- package/dist/mode-handlers/draw-polygon-handler.d.ts +11 -0
- package/dist/mode-handlers/draw-polygon-handler.js +92 -0
- package/dist/mode-handlers/draw-rectangle-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-rectangle-handler.js +18 -0
- package/dist/mode-handlers/draw-rectangle-using-three-points-handler.d.ts +9 -0
- package/dist/mode-handlers/draw-rectangle-using-three-points-handler.js +49 -0
- package/dist/mode-handlers/duplicate-handler.d.ts +9 -0
- package/dist/mode-handlers/duplicate-handler.js +19 -0
- package/dist/mode-handlers/elevation-handler.d.ts +19 -0
- package/dist/mode-handlers/elevation-handler.js +48 -0
- package/dist/mode-handlers/extrude-handler.d.ts +18 -0
- package/dist/mode-handlers/extrude-handler.js +176 -0
- package/dist/mode-handlers/mode-handler.d.ts +61 -0
- package/dist/mode-handlers/mode-handler.js +286 -0
- package/dist/mode-handlers/modify-handler.d.ts +19 -0
- package/dist/mode-handlers/modify-handler.js +193 -0
- package/dist/mode-handlers/rotate-handler.d.ts +17 -0
- package/dist/mode-handlers/rotate-handler.js +74 -0
- package/dist/mode-handlers/scale-handler.d.ts +17 -0
- package/dist/mode-handlers/scale-handler.js +76 -0
- package/dist/mode-handlers/snappable-handler.d.ts +33 -0
- package/dist/mode-handlers/snappable-handler.js +133 -0
- package/dist/mode-handlers/split-polygon-handler.d.ts +11 -0
- package/dist/mode-handlers/split-polygon-handler.js +154 -0
- package/dist/mode-handlers/three-click-polygon-handler.d.ts +5 -0
- package/dist/mode-handlers/three-click-polygon-handler.js +18 -0
- package/dist/mode-handlers/translate-handler.d.ts +17 -0
- package/dist/mode-handlers/translate-handler.js +72 -0
- package/dist/mode-handlers/two-click-polygon-handler.d.ts +5 -0
- package/dist/mode-handlers/two-click-polygon-handler.js +18 -0
- package/dist/mode-handlers/view-handler.d.ts +8 -0
- package/dist/mode-handlers/view-handler.js +10 -0
- package/dist/shaderlib/color/color.d.ts +8 -0
- package/dist/shaderlib/color/color.js +51 -0
- package/dist/shaderlib/outline/outline.d.ts +8 -0
- package/dist/shaderlib/outline/outline.js +97 -0
- package/dist/shaderlib/utils/utils.d.ts +8 -0
- package/dist/shaderlib/utils/utils.js +28 -0
- package/dist/translateFromCenter.d.ts +4 -0
- package/dist/translateFromCenter.js +19 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +1 -0
- package/dist/utils.d.ts +20 -0
- package/dist/utils.js +144 -0
- package/package.json +84 -0
- package/src/constants.ts +15 -0
- package/src/curve-utils.ts +77 -0
- package/src/edit-modes/composite-mode.ts +74 -0
- package/src/edit-modes/draw-90degree-polygon-mode.ts +220 -0
- package/src/edit-modes/draw-circle-by-diameter-mode.ts +88 -0
- package/src/edit-modes/draw-circle-from-center-mode.ts +79 -0
- package/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts +25 -0
- package/src/edit-modes/draw-ellipse-using-three-points-mode.ts +23 -0
- package/src/edit-modes/draw-line-string-mode.ts +200 -0
- package/src/edit-modes/draw-point-mode.ts +35 -0
- package/src/edit-modes/draw-polygon-by-dragging-mode.ts +106 -0
- package/src/edit-modes/draw-polygon-mode.ts +171 -0
- package/src/edit-modes/draw-rectangle-from-center-mode.ts +23 -0
- package/src/edit-modes/draw-rectangle-mode.ts +14 -0
- package/src/edit-modes/draw-rectangle-using-three-points-mode.ts +36 -0
- package/src/edit-modes/draw-square-from-center-mode.ts +46 -0
- package/src/edit-modes/draw-square-mode.ts +36 -0
- package/src/edit-modes/duplicate-mode.ts +21 -0
- package/src/edit-modes/edit-mode.ts +30 -0
- package/src/edit-modes/elevation-mode.ts +86 -0
- package/src/edit-modes/extend-line-string-mode.ts +87 -0
- package/src/edit-modes/extrude-mode.ts +254 -0
- package/src/edit-modes/geojson-edit-mode.ts +283 -0
- package/src/edit-modes/immutable-feature-collection.ts +417 -0
- package/src/edit-modes/measure-angle-mode.ts +127 -0
- package/src/edit-modes/measure-area-mode.ts +62 -0
- package/src/edit-modes/measure-distance-mode.ts +215 -0
- package/src/edit-modes/modify-mode.ts +293 -0
- package/src/edit-modes/resize-circle-mode.ts +202 -0
- package/src/edit-modes/rotate-mode.ts +208 -0
- package/src/edit-modes/scale-mode.ts +231 -0
- package/src/edit-modes/snappable-mode.ts +174 -0
- package/src/edit-modes/split-polygon-mode.ts +201 -0
- package/src/edit-modes/three-click-polygon-mode.ts +111 -0
- package/src/edit-modes/transform-mode.ts +75 -0
- package/src/edit-modes/translate-mode.ts +161 -0
- package/src/edit-modes/two-click-polygon-mode.ts +132 -0
- package/src/edit-modes/types.ts +135 -0
- package/src/edit-modes/utils.ts +513 -0
- package/src/edit-modes/view-mode.ts +3 -0
- package/src/editable-layers/editable-geojson-layer.ts +603 -0
- package/src/editable-layers/editable-h3-cluster-layer.ts +226 -0
- package/src/editable-layers/editable-layer.ts +252 -0
- package/src/editable-layers/editable-path-layer.ts +51 -0
- package/src/editable-layers/elevated-edit-handle-layer.ts +33 -0
- package/src/editable-layers/junction-scatterplot-layer.ts +53 -0
- package/src/editable-layers/path-marker-layer/arrow-2d-geometry.ts +61 -0
- package/src/editable-layers/path-marker-layer/create-path-markers.ts +107 -0
- package/src/editable-layers/path-marker-layer/path-marker-layer.ts +179 -0
- package/src/editable-layers/path-marker-layer/polyline.ts +40 -0
- package/src/editable-layers/path-outline-layer/path-outline-layer.ts +147 -0
- package/src/editable-layers/selection-layer.ts +209 -0
- package/src/geojson-types.ts +89 -0
- package/src/index.ts +125 -0
- package/src/lib/constants.ts +6 -0
- package/src/lib/deck-renderer/deck-cache.ts +61 -0
- package/src/lib/deck-renderer/deck-drawer.ts +263 -0
- package/src/lib/feature.ts +27 -0
- package/src/lib/layer-mouse-event.ts +32 -0
- package/src/lib/layers/junctions-layer.ts +40 -0
- package/src/lib/layers/segments-layer.ts +108 -0
- package/src/lib/layers/texts-layer.ts +43 -0
- package/src/lib/math.ts +26 -0
- package/src/lib/nebula-layer.ts +33 -0
- package/src/lib/nebula.ts +323 -0
- package/src/lib/style.ts +22 -0
- package/src/memoize.ts +43 -0
- package/src/mode-handlers/composite-mode-handler.ts +89 -0
- package/src/mode-handlers/draw-90degree-polygon-handler.ts +201 -0
- package/src/mode-handlers/draw-circle-by-bounding-box-handler.ts +39 -0
- package/src/mode-handlers/draw-circle-from-center-handler.ts +38 -0
- package/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts +41 -0
- package/src/mode-handlers/draw-ellipse-using-three-points-handler.ts +46 -0
- package/src/mode-handlers/draw-line-string-handler.ts +108 -0
- package/src/mode-handlers/draw-point-handler.ts +15 -0
- package/src/mode-handlers/draw-polygon-handler.ts +121 -0
- package/src/mode-handlers/draw-rectangle-handler.ts +28 -0
- package/src/mode-handlers/draw-rectangle-using-three-points-handler.ts +60 -0
- package/src/mode-handlers/duplicate-handler.ts +25 -0
- package/src/mode-handlers/elevation-handler.ts +88 -0
- package/src/mode-handlers/extrude-handler.ts +245 -0
- package/src/mode-handlers/mode-handler.ts +394 -0
- package/src/mode-handlers/modify-handler.ts +263 -0
- package/src/mode-handlers/rotate-handler.ts +107 -0
- package/src/mode-handlers/scale-handler.ts +105 -0
- package/src/mode-handlers/snappable-handler.ts +184 -0
- package/src/mode-handlers/split-polygon-handler.ts +177 -0
- package/src/mode-handlers/three-click-polygon-handler.ts +25 -0
- package/src/mode-handlers/translate-handler.ts +110 -0
- package/src/mode-handlers/two-click-polygon-handler.ts +25 -0
- package/src/mode-handlers/view-handler.ts +13 -0
- package/src/shaderlib/color/color.ts +56 -0
- package/src/shaderlib/outline/outline.ts +101 -0
- package/src/shaderlib/utils/utils.ts +33 -0
- package/src/translateFromCenter.ts +48 -0
- package/src/types.ts +39 -0
- package/src/utils.ts +185 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ArrowStyles, DEFAULT_STYLE, MAX_ARROWS } from '../style';
|
|
2
|
+
import NebulaLayer from '../nebula-layer';
|
|
3
|
+
import { toDeckColor } from '../../utils';
|
|
4
|
+
import DeckCache from '../deck-renderer/deck-cache';
|
|
5
|
+
import PathMarkerLayer from '../../editable-layers/path-marker-layer/path-marker-layer';
|
|
6
|
+
|
|
7
|
+
const NEBULA_TO_DECK_DIRECTIONS = {
|
|
8
|
+
[ArrowStyles.NONE]: { forward: false, backward: false },
|
|
9
|
+
[ArrowStyles.FORWARD]: { forward: true, backward: false },
|
|
10
|
+
[ArrowStyles.BACKWARD]: { forward: false, backward: true },
|
|
11
|
+
[ArrowStyles.BOTH]: { forward: true, backward: true },
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default class SegmentsLayer extends NebulaLayer {
|
|
15
|
+
deckCache: DeckCache<any, any>;
|
|
16
|
+
noBlend: boolean;
|
|
17
|
+
highlightColor: [number, number, number, number];
|
|
18
|
+
arrowSize: number;
|
|
19
|
+
jointRounded: boolean;
|
|
20
|
+
capRounded: boolean;
|
|
21
|
+
dashed: boolean;
|
|
22
|
+
markerLayerProps: Record<string, any> | null | undefined;
|
|
23
|
+
|
|
24
|
+
constructor(config: Record<string, any>) {
|
|
25
|
+
super(config);
|
|
26
|
+
this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data));
|
|
27
|
+
this.enableSelection = true;
|
|
28
|
+
this.enablePicking = config.enablePicking ?? true;
|
|
29
|
+
this.noBlend = config.noBlend ?? false;
|
|
30
|
+
this.jointRounded = config.jointRounded ?? true;
|
|
31
|
+
this.capRounded = config.capRounded ?? true;
|
|
32
|
+
this.dashed = config.dashed ?? false;
|
|
33
|
+
this.markerLayerProps = config.markerLayerProps ?? null;
|
|
34
|
+
this.highlightColor = [1, 1, 1, 1];
|
|
35
|
+
this.arrowSize = 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
getMouseOverSegment(): any {
|
|
39
|
+
// TODO: remove references
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
_calcMarkerPercentages(nf: Record<string, any>): number[] {
|
|
44
|
+
const { arrowPercentages } = nf.style;
|
|
45
|
+
if (arrowPercentages) {
|
|
46
|
+
return arrowPercentages;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const arrowStyle = nf.style.arrowStyle || DEFAULT_STYLE.arrowStyle;
|
|
50
|
+
if (arrowStyle === ArrowStyles.NONE) return [];
|
|
51
|
+
|
|
52
|
+
const arrowCount = Math.min(nf.style.arrowCount || DEFAULT_STYLE.arrowCount, MAX_ARROWS);
|
|
53
|
+
return [[0.5], [0.33, 0.66], [0.25, 0.5, 0.75]][arrowCount - 1];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
_getHighlightedObjectIndex({ nebula }: Record<string, any>): number {
|
|
57
|
+
const { deckglMouseOverInfo } = nebula;
|
|
58
|
+
if (deckglMouseOverInfo) {
|
|
59
|
+
const { originalLayer, index } = deckglMouseOverInfo;
|
|
60
|
+
if (originalLayer === this) {
|
|
61
|
+
return index;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// no object
|
|
66
|
+
return -1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
render({ nebula }: Record<string, any>) {
|
|
70
|
+
const defaultColor: [number, number, number, number] = [0x0, 0x0, 0x0, 0xff];
|
|
71
|
+
const { objects, updateTrigger } = this.deckCache;
|
|
72
|
+
|
|
73
|
+
return new PathMarkerLayer<any>({
|
|
74
|
+
id: `segments-${this.id}`,
|
|
75
|
+
data: objects,
|
|
76
|
+
opacity: 1,
|
|
77
|
+
fp64: false,
|
|
78
|
+
jointRounded: this.jointRounded,
|
|
79
|
+
capRounded: this.capRounded,
|
|
80
|
+
pickable: true,
|
|
81
|
+
sizeScale: this.arrowSize || 6,
|
|
82
|
+
parameters: {
|
|
83
|
+
depthCompare: 'always',
|
|
84
|
+
blendColorOperation: this.noBlend ? undefined : 'max',
|
|
85
|
+
},
|
|
86
|
+
getPath: (nf: any) => nf.geoJson.geometry.coordinates,
|
|
87
|
+
getColor: (nf: any) => toDeckColor(nf.style.lineColor, defaultColor),
|
|
88
|
+
getWidth: (nf: any) => nf.style.lineWidthMeters || 1,
|
|
89
|
+
getZLevel: (nf: any) => nf.style.zLevel * 255,
|
|
90
|
+
getDirection: (nf: any) => NEBULA_TO_DECK_DIRECTIONS[nf.style.arrowStyle],
|
|
91
|
+
getMarkerColor: (nf: any) => toDeckColor(nf.style.arrowColor, defaultColor),
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
93
|
+
getMarkerPercentages: this._calcMarkerPercentages,
|
|
94
|
+
updateTriggers: { all: updateTrigger },
|
|
95
|
+
|
|
96
|
+
highlightedObjectIndex: this._getHighlightedObjectIndex({ nebula }),
|
|
97
|
+
highlightColor: toDeckColor(this.highlightColor),
|
|
98
|
+
|
|
99
|
+
dashJustified: this.dashed,
|
|
100
|
+
getDashArray: this.dashed ? (nf) => nf.style.dashArray : undefined,
|
|
101
|
+
markerLayerProps:
|
|
102
|
+
this.markerLayerProps ||
|
|
103
|
+
(PathMarkerLayer as Record<string, any>).defaultProps.markerLayerProps,
|
|
104
|
+
|
|
105
|
+
nebulaLayer: this,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TextLayer } from '@deck.gl/layers';
|
|
2
|
+
import NebulaLayer from '../nebula-layer';
|
|
3
|
+
import { toDeckColor } from '../../utils';
|
|
4
|
+
import { PROJECTED_PIXEL_SIZE_MULTIPLIER } from '../constants';
|
|
5
|
+
import DeckCache from '../deck-renderer/deck-cache';
|
|
6
|
+
import { Color } from '../../types';
|
|
7
|
+
|
|
8
|
+
export default class TextsLayer extends NebulaLayer {
|
|
9
|
+
deckCache: DeckCache<any, any>;
|
|
10
|
+
|
|
11
|
+
constructor(config: Record<string, any>) {
|
|
12
|
+
super(config);
|
|
13
|
+
this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
render({ nebula }: Record<string, any>): TextLayer {
|
|
17
|
+
const defaultColor: Color = [0x0, 0x0, 0x0, 0xff];
|
|
18
|
+
const { objects, updateTrigger } = this.deckCache;
|
|
19
|
+
|
|
20
|
+
const { zoom } = nebula.props.viewport;
|
|
21
|
+
|
|
22
|
+
return new TextLayer({
|
|
23
|
+
id: `texts-${this.id}`,
|
|
24
|
+
data: objects,
|
|
25
|
+
opacity: 1,
|
|
26
|
+
fp64: false,
|
|
27
|
+
pickable: false,
|
|
28
|
+
|
|
29
|
+
getText: (nf: any) => nf.style.text,
|
|
30
|
+
getPosition: (nf: any) => nf.geoJson.geometry.coordinates,
|
|
31
|
+
getColor: (nf: { style: { fillColor: Color } }) =>
|
|
32
|
+
toDeckColor(nf.style.fillColor) || defaultColor,
|
|
33
|
+
|
|
34
|
+
// TODO: layer should offer option to scale with zoom
|
|
35
|
+
sizeScale: 1 / Math.pow(2, 20 - zoom),
|
|
36
|
+
getSize: PROJECTED_PIXEL_SIZE_MULTIPLIER,
|
|
37
|
+
|
|
38
|
+
updateTriggers: { all: updateTrigger },
|
|
39
|
+
|
|
40
|
+
nebulaLayer: this,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/lib/math.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Position } from '../geojson-types';
|
|
2
|
+
|
|
3
|
+
export function toDegree(radian: number): number {
|
|
4
|
+
return (radian * 180) / Math.PI;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function toRadian(angle: number): number {
|
|
8
|
+
return (angle * Math.PI) / 180;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Converts an array of latitudes, longitudes in E7 format to a list of points in degrees.
|
|
13
|
+
*
|
|
14
|
+
* @param {[]} array: An E7 array [lat_e7, lng_e7, lat_e7, lng_e7, ...]
|
|
15
|
+
* @return {[]} An array of points in degrees
|
|
16
|
+
* [ [lng_degrees, lat_degrees], [lng_degrees, lat_degrees], ...]
|
|
17
|
+
*/
|
|
18
|
+
export function convertE7Array(array: number[]): Position[] {
|
|
19
|
+
const points: Position[] = [];
|
|
20
|
+
for (let i = 0; i < array.length; i += 2) {
|
|
21
|
+
const lat = array[i] * 1e-7;
|
|
22
|
+
const lng = array[i + 1] * 1e-7;
|
|
23
|
+
points.push([lng, lat]);
|
|
24
|
+
}
|
|
25
|
+
return points;
|
|
26
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import { v4 } from 'uuid';
|
|
3
|
+
|
|
4
|
+
import Feature from './feature';
|
|
5
|
+
|
|
6
|
+
export default class NebulaLayer extends EventEmitter {
|
|
7
|
+
getData: () => Record<string, any>[];
|
|
8
|
+
toNebulaFeature: (data: Record<string, any>) => Feature;
|
|
9
|
+
id: string;
|
|
10
|
+
helperLayers: Record<string, any>[];
|
|
11
|
+
|
|
12
|
+
// flags
|
|
13
|
+
usesMapEvents = false;
|
|
14
|
+
enablePicking = false;
|
|
15
|
+
enableSelection = false;
|
|
16
|
+
//
|
|
17
|
+
|
|
18
|
+
constructor({ getData, on, toNebulaFeature }: Record<string, any>) {
|
|
19
|
+
super();
|
|
20
|
+
this.id = v4();
|
|
21
|
+
this.getData = getData;
|
|
22
|
+
this.toNebulaFeature = toNebulaFeature;
|
|
23
|
+
this.helperLayers = [];
|
|
24
|
+
|
|
25
|
+
if (on) {
|
|
26
|
+
Object.keys(on).forEach((key) => this.on(key, on[key]));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
render(config: Record<string, any>): unknown {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import {EventEmitter} from 'eventemitter3';
|
|
2
|
+
import {WebMercatorViewport} from '@deck.gl/core';
|
|
3
|
+
|
|
4
|
+
import DeckDrawer from './deck-renderer/deck-drawer';
|
|
5
|
+
import LayerMouseEvent from './layer-mouse-event';
|
|
6
|
+
import NebulaLayer from './nebula-layer';
|
|
7
|
+
|
|
8
|
+
const LOGGER_PREFIX = 'Nebula: ';
|
|
9
|
+
|
|
10
|
+
export default class Nebula {
|
|
11
|
+
init(props: Record<string, any>) {
|
|
12
|
+
this.props = props;
|
|
13
|
+
this.wmViewport = new WebMercatorViewport(this.props.viewport);
|
|
14
|
+
|
|
15
|
+
// TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown']
|
|
16
|
+
['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) =>
|
|
17
|
+
document.addEventListener(name, this._onMouseEvent as any, true)
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
detach() {
|
|
22
|
+
// TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown']
|
|
23
|
+
['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) =>
|
|
24
|
+
document.removeEventListener(name, this._onMouseEvent as any, true)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
updateProps(newProps: Record<string, any>) {
|
|
29
|
+
this.props = newProps;
|
|
30
|
+
const {viewport} = this.props;
|
|
31
|
+
|
|
32
|
+
this.wmViewport = new WebMercatorViewport(viewport);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
props: Record<string, any> = null!;
|
|
36
|
+
deckgl: Record<string, any> | null = null;
|
|
37
|
+
mainContainer: Record<string, any> | null = null;
|
|
38
|
+
deckglMouseOverInfo: Record<string, any> | null | undefined = null;
|
|
39
|
+
_deckDrawer: DeckDrawer = null!;
|
|
40
|
+
_mouseWasDown: boolean = null!;
|
|
41
|
+
wmViewport: WebMercatorViewport = null!;
|
|
42
|
+
queryObjectEvents = new EventEmitter();
|
|
43
|
+
forceUpdate: () => any = null!;
|
|
44
|
+
inited: boolean = null!;
|
|
45
|
+
|
|
46
|
+
log(message: string) {
|
|
47
|
+
const {logger} = this.props;
|
|
48
|
+
if (logger && logger.info) {
|
|
49
|
+
logger.info(LOGGER_PREFIX + message);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
updateAllDeckObjects() {
|
|
54
|
+
this.getAllLayers().forEach((layer) => {
|
|
55
|
+
if (layer && layer.deckCache) {
|
|
56
|
+
layer.deckCache.updateAllDeckObjects();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
this.forceUpdate();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
updateDeckObjectsByIds(ids: string[]) {
|
|
63
|
+
this.getAllLayers().forEach((layer) => {
|
|
64
|
+
if (layer && layer.deckCache) {
|
|
65
|
+
layer.deckCache.updateDeckObjectsByIds(ids);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
this.forceUpdate();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
rerenderLayers() {
|
|
72
|
+
this.updateAllDeckObjects();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
_isNebulaEvent({buttons, target, type}: Record<string, any>) {
|
|
76
|
+
const {viewport} = this.props;
|
|
77
|
+
|
|
78
|
+
// allow mouseup event aggressively to cancel drag properly
|
|
79
|
+
// TODO: use pointer capture setPointerCapture() to capture mouseup properly after deckgl
|
|
80
|
+
if (this._mouseWasDown && type === 'mouseup') {
|
|
81
|
+
this._mouseWasDown = false;
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// allow mousemove event while dragging
|
|
86
|
+
if (type === 'mousemove' && buttons > 0) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (!target.getBoundingClientRect) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const rect = target.getBoundingClientRect();
|
|
95
|
+
// Only listen to events coming from the basemap
|
|
96
|
+
// identified by the canvas of the same size as viewport.
|
|
97
|
+
// Need to round the rect dimension as some monitors
|
|
98
|
+
// have some sub-pixel difference with viewport.
|
|
99
|
+
return (
|
|
100
|
+
Math.round(rect.width) === Math.round(viewport.width) &&
|
|
101
|
+
Math.round(rect.height) === Math.round(viewport.height)
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
_onMouseEvent = (event: MouseEvent) => {
|
|
106
|
+
if (!this._isNebulaEvent(event)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (event.type === 'mousedown') {
|
|
111
|
+
this._mouseWasDown = true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// offsetX/Y of the MouseEvent provides the offset in the X/Y coordinate
|
|
115
|
+
// of the mouse pointer between that event and the padding edge of the target node.
|
|
116
|
+
// We set our listener to document so we need to adjust offsetX/Y
|
|
117
|
+
// in case the target is not be our WebGL canvas.
|
|
118
|
+
const {top = 0, left = 0} = this.mainContainer
|
|
119
|
+
? this.mainContainer.getBoundingClientRect()
|
|
120
|
+
: {};
|
|
121
|
+
const proxyEvent = new Proxy(event, {
|
|
122
|
+
get: (original: any, propertyName: string) => {
|
|
123
|
+
if (propertyName === 'offsetX') {
|
|
124
|
+
return original.pageX - left;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (propertyName === 'offsetY') {
|
|
128
|
+
return original.pageY - top;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// TODO: Properly use pointer events
|
|
132
|
+
if (propertyName === 'type') {
|
|
133
|
+
return original.type.replace('pointer', 'mouse');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const result = original[propertyName];
|
|
137
|
+
if (typeof result === 'function') {
|
|
138
|
+
return result.bind(original);
|
|
139
|
+
}
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
this._handleDeckGLEvent(proxyEvent);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
getMouseGroundPosition(event: Record<string, any>) {
|
|
148
|
+
return this.wmViewport.unproject([event.offsetX, event.offsetY]) as [number, number];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
unprojectMousePosition(mousePosition: [number, number]): [number, number] {
|
|
152
|
+
return this.wmViewport.unproject(mousePosition) as [number, number];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// eslint-disable-next-line max-statements, complexity
|
|
156
|
+
_handleDeckGLEvent(event: Record<string, any>) {
|
|
157
|
+
const {
|
|
158
|
+
deckgl,
|
|
159
|
+
props: {onMapMouseEvent, selectionType, eventFilter}
|
|
160
|
+
} = this;
|
|
161
|
+
let sendMapEvent = true;
|
|
162
|
+
let cursor = 'auto';
|
|
163
|
+
|
|
164
|
+
if (event && deckgl && selectionType) {
|
|
165
|
+
if (!this._deckDrawer) this._deckDrawer = new DeckDrawer(this);
|
|
166
|
+
|
|
167
|
+
const lngLat = this.getMouseGroundPosition(event);
|
|
168
|
+
if (eventFilter && !eventFilter(lngLat, event)) return;
|
|
169
|
+
const drawerResult = this._deckDrawer.handleEvent(event, lngLat, selectionType);
|
|
170
|
+
if (drawerResult.redraw) this.forceUpdate();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (event && deckgl && (!event.buttons || event.type !== 'mousemove')) {
|
|
175
|
+
// TODO: sort by mouse priority
|
|
176
|
+
const layerIds = deckgl.props.layers
|
|
177
|
+
.filter(
|
|
178
|
+
(l: any) => l && l.props && l.props.nebulaLayer && l.props.nebulaLayer.enablePicking
|
|
179
|
+
)
|
|
180
|
+
.map((l: any) => l.id);
|
|
181
|
+
|
|
182
|
+
const pickingInfo = deckgl.pickObject({
|
|
183
|
+
x: event.offsetX,
|
|
184
|
+
y: event.offsetY,
|
|
185
|
+
radius: 5,
|
|
186
|
+
layerIds
|
|
187
|
+
});
|
|
188
|
+
this.queryObjectEvents.emit('pick', {event, pickingInfo});
|
|
189
|
+
if (pickingInfo) {
|
|
190
|
+
sendMapEvent = false;
|
|
191
|
+
|
|
192
|
+
const {index, lngLat} = pickingInfo;
|
|
193
|
+
if (eventFilter && !eventFilter(lngLat, event)) return;
|
|
194
|
+
|
|
195
|
+
const {layer: deckLayer, object} = pickingInfo;
|
|
196
|
+
|
|
197
|
+
if (
|
|
198
|
+
deckLayer &&
|
|
199
|
+
deckLayer.props &&
|
|
200
|
+
deckLayer.props.nebulaLayer &&
|
|
201
|
+
deckLayer.props.nebulaLayer.eventHandler
|
|
202
|
+
) {
|
|
203
|
+
deckLayer.props.nebulaLayer.eventHandler(event, pickingInfo);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const original =
|
|
207
|
+
object.original ||
|
|
208
|
+
(deckLayer.props.nebulaLayer &&
|
|
209
|
+
deckLayer.props.nebulaLayer.deckCache &&
|
|
210
|
+
deckLayer.props.nebulaLayer.deckCache.originals[index]);
|
|
211
|
+
|
|
212
|
+
if (original) {
|
|
213
|
+
this.deckglMouseOverInfo = {originalLayer: deckLayer.props.nebulaLayer, index};
|
|
214
|
+
// @ts-expect-error narrow event type
|
|
215
|
+
const nebulaMouseEvent = new LayerMouseEvent(event, {
|
|
216
|
+
data: original,
|
|
217
|
+
metadata: object.metadata,
|
|
218
|
+
groundPoint: lngLat,
|
|
219
|
+
nebula: this
|
|
220
|
+
});
|
|
221
|
+
deckLayer.props.nebulaLayer.emit(event.type, nebulaMouseEvent);
|
|
222
|
+
this.forceUpdate();
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
cursor = 'pointer';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (document.documentElement) {
|
|
230
|
+
document.documentElement.style.cursor = cursor;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (sendMapEvent) {
|
|
234
|
+
this.deckglMouseOverInfo = null;
|
|
235
|
+
|
|
236
|
+
const lngLat = this.getMouseGroundPosition(event);
|
|
237
|
+
if (eventFilter && !eventFilter(lngLat, event)) return;
|
|
238
|
+
|
|
239
|
+
// send to layers first
|
|
240
|
+
// @ts-expect-error narrow event type
|
|
241
|
+
const nebulaMouseEvent = new LayerMouseEvent(event, {
|
|
242
|
+
groundPoint: lngLat,
|
|
243
|
+
nebula: this
|
|
244
|
+
});
|
|
245
|
+
this.getAllLayers()
|
|
246
|
+
.filter((layer) => layer && layer.usesMapEvents)
|
|
247
|
+
.forEach((layer) => layer.emit('mapMouseEvent', nebulaMouseEvent));
|
|
248
|
+
|
|
249
|
+
this.getAllLayers()
|
|
250
|
+
.filter(
|
|
251
|
+
(layer) =>
|
|
252
|
+
layer && layer.props && layer.props.nebulaLayer && layer.props.nebulaLayer.mapMouseEvent
|
|
253
|
+
)
|
|
254
|
+
.forEach((layer) => layer.props.nebulaLayer.mapMouseEvent(nebulaMouseEvent, layer));
|
|
255
|
+
|
|
256
|
+
if (onMapMouseEvent) {
|
|
257
|
+
onMapMouseEvent(event, lngLat);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
getExtraDeckLayers(): Record<string, any>[] {
|
|
263
|
+
const result: Record<string, any>[] = [];
|
|
264
|
+
|
|
265
|
+
if (this._deckDrawer) result.push(...this._deckDrawer.render());
|
|
266
|
+
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
renderDeckLayers() {
|
|
271
|
+
return this.getAllLayers()
|
|
272
|
+
.map((layer) => (layer instanceof NebulaLayer ? layer.render({nebula: this}) : layer))
|
|
273
|
+
.filter(Boolean);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
getAllLayers() {
|
|
277
|
+
const result: Record<string, any>[] = [];
|
|
278
|
+
|
|
279
|
+
this.props.layers.filter(Boolean).forEach((layer) => {
|
|
280
|
+
result.push(layer);
|
|
281
|
+
// Only NebulaLayers have helpers, Deck GL layers don't.
|
|
282
|
+
if (layer instanceof NebulaLayer) {
|
|
283
|
+
result.push(...layer.helperLayers);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
return result.filter(Boolean);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
getRenderedLayers() {
|
|
291
|
+
return [...this.renderDeckLayers(), ...this.getExtraDeckLayers()];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
updateAndGetRenderedLayers(
|
|
295
|
+
layers: Record<string, any>[],
|
|
296
|
+
viewport: WebMercatorViewport,
|
|
297
|
+
container: Record<string, any>
|
|
298
|
+
) {
|
|
299
|
+
if (this.inited) {
|
|
300
|
+
this.updateProps({layers, viewport});
|
|
301
|
+
this.forceUpdate = () => container.forceUpdate();
|
|
302
|
+
} else {
|
|
303
|
+
this.inited = true;
|
|
304
|
+
this.init({layers, viewport});
|
|
305
|
+
this.forceUpdate = () => container.forceUpdate();
|
|
306
|
+
this.updateAllDeckObjects();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return this.getRenderedLayers();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
setDeck(deckgl: Record<string, any> | null) {
|
|
313
|
+
if (deckgl) {
|
|
314
|
+
this.deckgl = deckgl;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
setMainContainer(mainContainer: Record<string, any> | null) {
|
|
319
|
+
if (mainContainer) {
|
|
320
|
+
this.mainContainer = mainContainer;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
package/src/lib/style.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Describes the arrow style of polylines
|
|
2
|
+
export const ArrowStyles = {
|
|
3
|
+
NONE: 0,
|
|
4
|
+
FORWARD: 1,
|
|
5
|
+
BACKWARD: 2,
|
|
6
|
+
BOTH: 3,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const DEFAULT_ARROWS = 1;
|
|
10
|
+
export const MAX_ARROWS = 3;
|
|
11
|
+
|
|
12
|
+
export const DEFAULT_STYLE = {
|
|
13
|
+
arrowColor: [0, 0, 0, 1],
|
|
14
|
+
arrowCount: DEFAULT_ARROWS,
|
|
15
|
+
arrowStyle: ArrowStyles.NONE,
|
|
16
|
+
fillColor: [0, 0, 0, 1],
|
|
17
|
+
lineColor: [0, 0, 0, 1],
|
|
18
|
+
lineWidthMeters: 5,
|
|
19
|
+
outlineRadiusMeters: 0,
|
|
20
|
+
opacity: 1,
|
|
21
|
+
zLevel: 0,
|
|
22
|
+
};
|
package/src/memoize.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// port from @deck.gl/core
|
|
2
|
+
function isEqual(a: any, b: any) {
|
|
3
|
+
if (a === b) {
|
|
4
|
+
return true;
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(a)) {
|
|
7
|
+
// Special treatment for arrays: compare 1-level deep
|
|
8
|
+
// This is to support equality of matrix/coordinate props
|
|
9
|
+
const len = a.length;
|
|
10
|
+
if (!b || b.length !== len) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
for (let i = 0; i < len; i++) {
|
|
15
|
+
if (a[i] !== b[i]) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Speed up consecutive function calls by caching the result of calls with identical input
|
|
26
|
+
* https://en.wikipedia.org/wiki/Memoization
|
|
27
|
+
* @param {function} compute - the function to be memoized
|
|
28
|
+
*/
|
|
29
|
+
export default function memoize(compute: Function) {
|
|
30
|
+
let cachedArgs = {};
|
|
31
|
+
let cachedResult;
|
|
32
|
+
|
|
33
|
+
return (args: any) => {
|
|
34
|
+
for (const key in args) {
|
|
35
|
+
if (!isEqual(args[key], cachedArgs[key])) {
|
|
36
|
+
cachedResult = compute(args);
|
|
37
|
+
cachedArgs = args;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return cachedResult;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { FeatureCollection, Feature, Position } from '../geojson-types';
|
|
2
|
+
import {
|
|
3
|
+
ClickEvent,
|
|
4
|
+
PointerMoveEvent,
|
|
5
|
+
StartDraggingEvent,
|
|
6
|
+
StopDraggingEvent,
|
|
7
|
+
} from '../edit-modes/types';
|
|
8
|
+
import { ModeHandler, EditAction, EditHandle } from './mode-handler';
|
|
9
|
+
|
|
10
|
+
// TODO edit-modes: delete handlers once EditMode fully implemented
|
|
11
|
+
export class CompositeModeHandler extends ModeHandler {
|
|
12
|
+
handlers: Array<ModeHandler>;
|
|
13
|
+
options: Record<string, any>;
|
|
14
|
+
|
|
15
|
+
constructor(handlers: Array<ModeHandler>, options: Record<string, any> = {}) {
|
|
16
|
+
super();
|
|
17
|
+
this.handlers = handlers;
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
_coalesce<T>(
|
|
22
|
+
callback: (arg0: ModeHandler) => T,
|
|
23
|
+
resultEval: ((arg0: T) => boolean | null | undefined) | null = null
|
|
24
|
+
): T | undefined {
|
|
25
|
+
let result: T | undefined;
|
|
26
|
+
|
|
27
|
+
for (let i = 0; i < this.handlers.length; i++) {
|
|
28
|
+
// eslint-disable-next-line callback-return
|
|
29
|
+
result = callback(this.handlers[i]);
|
|
30
|
+
if (resultEval ? resultEval(result) : result) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return result as T;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
setFeatureCollection(featureCollection: FeatureCollection): void {
|
|
39
|
+
this.handlers.forEach((handler) => handler.setFeatureCollection(featureCollection));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
setModeConfig(modeConfig: any): void {
|
|
43
|
+
this.handlers.forEach((handler) => handler.setModeConfig(modeConfig));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
setSelectedFeatureIndexes(indexes: number[]): void {
|
|
47
|
+
this.handlers.forEach((handler) => handler.setSelectedFeatureIndexes(indexes));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
handleClick(event: ClickEvent): EditAction | null | undefined {
|
|
51
|
+
return this._coalesce((handler) => handler.handleClick(event));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
handlePointerMove(event: PointerMoveEvent): {
|
|
55
|
+
editAction: EditAction | null | undefined;
|
|
56
|
+
cancelMapPan: boolean;
|
|
57
|
+
} {
|
|
58
|
+
return this._coalesce(
|
|
59
|
+
(handler) => handler.handlePointerMove(event),
|
|
60
|
+
(result) => result && Boolean(result.editAction)
|
|
61
|
+
) as any; // TODO
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined {
|
|
65
|
+
return this._coalesce((handler) => handler.handleStartDragging(event));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined {
|
|
69
|
+
return this._coalesce((handler) => handler.handleStopDragging(event));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
getTentativeFeature(): Feature | null | undefined {
|
|
73
|
+
return this._coalesce((handler) => handler.getTentativeFeature());
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): EditHandle[] {
|
|
77
|
+
// TODO: Combine the handles *BUT* make sure if none of the results have
|
|
78
|
+
// changed to return the same object so that "editHandles !== this.state.editHandles"
|
|
79
|
+
// in editable-geojson-layer works.
|
|
80
|
+
return this._coalesce(
|
|
81
|
+
(handler) => handler.getEditHandles(picks, mapCoords),
|
|
82
|
+
(handles) => Array.isArray(handles) && handles.length > 0
|
|
83
|
+
) as any; // TODO
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getCursor({ isDragging }: { isDragging: boolean }): string {
|
|
87
|
+
return this._coalesce((handler) => handler.getCursor({ isDragging })) as any; // TODO
|
|
88
|
+
}
|
|
89
|
+
}
|