@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.
Files changed (295) hide show
  1. package/README.md +82 -0
  2. package/dist/constants.d.ts +14 -0
  3. package/dist/constants.js +14 -0
  4. package/dist/curve-utils.d.ts +2 -0
  5. package/dist/curve-utils.js +61 -0
  6. package/dist/edit-modes/composite-mode.d.ts +14 -0
  7. package/dist/edit-modes/composite-mode.js +47 -0
  8. package/dist/edit-modes/draw-90degree-polygon-mode.d.ts +11 -0
  9. package/dist/edit-modes/draw-90degree-polygon-mode.js +179 -0
  10. package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts +24 -0
  11. package/dist/edit-modes/draw-circle-by-diameter-mode.js +78 -0
  12. package/dist/edit-modes/draw-circle-from-center-mode.d.ts +22 -0
  13. package/dist/edit-modes/draw-circle-from-center-mode.js +70 -0
  14. package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.d.ts +5 -0
  15. package/dist/edit-modes/draw-ellipse-by-bounding-box-mode.js +20 -0
  16. package/dist/edit-modes/draw-ellipse-using-three-points-mode.d.ts +5 -0
  17. package/dist/edit-modes/draw-ellipse-using-three-points-mode.js +16 -0
  18. package/dist/edit-modes/draw-line-string-mode.d.ts +25 -0
  19. package/dist/edit-modes/draw-line-string-mode.js +170 -0
  20. package/dist/edit-modes/draw-point-mode.d.ts +8 -0
  21. package/dist/edit-modes/draw-point-mode.js +28 -0
  22. package/dist/edit-modes/draw-polygon-by-dragging-mode.d.ts +14 -0
  23. package/dist/edit-modes/draw-polygon-by-dragging-mode.js +87 -0
  24. package/dist/edit-modes/draw-polygon-mode.d.ts +10 -0
  25. package/dist/edit-modes/draw-polygon-mode.js +143 -0
  26. package/dist/edit-modes/draw-rectangle-from-center-mode.d.ts +5 -0
  27. package/dist/edit-modes/draw-rectangle-from-center-mode.js +17 -0
  28. package/dist/edit-modes/draw-rectangle-mode.d.ts +5 -0
  29. package/dist/edit-modes/draw-rectangle-mode.js +11 -0
  30. package/dist/edit-modes/draw-rectangle-using-three-points-mode.d.ts +5 -0
  31. package/dist/edit-modes/draw-rectangle-using-three-points-mode.js +28 -0
  32. package/dist/edit-modes/draw-square-from-center-mode.d.ts +5 -0
  33. package/dist/edit-modes/draw-square-from-center-mode.js +35 -0
  34. package/dist/edit-modes/draw-square-mode.d.ts +5 -0
  35. package/dist/edit-modes/draw-square-mode.js +28 -0
  36. package/dist/edit-modes/duplicate-mode.d.ts +7 -0
  37. package/dist/edit-modes/duplicate-mode.js +17 -0
  38. package/dist/edit-modes/edit-mode.d.ts +11 -0
  39. package/dist/edit-modes/edit-mode.js +2 -0
  40. package/dist/edit-modes/elevation-mode.d.ts +13 -0
  41. package/dist/edit-modes/elevation-mode.js +49 -0
  42. package/dist/edit-modes/extend-line-string-mode.d.ts +9 -0
  43. package/dist/edit-modes/extend-line-string-mode.js +72 -0
  44. package/dist/edit-modes/extrude-mode.d.ts +15 -0
  45. package/dist/edit-modes/extrude-mode.js +186 -0
  46. package/dist/edit-modes/geojson-edit-mode.d.ts +33 -0
  47. package/dist/edit-modes/geojson-edit-mode.js +208 -0
  48. package/dist/edit-modes/immutable-feature-collection.d.ts +43 -0
  49. package/dist/edit-modes/immutable-feature-collection.js +300 -0
  50. package/dist/edit-modes/measure-angle-mode.d.ts +11 -0
  51. package/dist/edit-modes/measure-angle-mode.js +99 -0
  52. package/dist/edit-modes/measure-area-mode.d.ts +8 -0
  53. package/dist/edit-modes/measure-area-mode.js +50 -0
  54. package/dist/edit-modes/measure-distance-mode.d.ts +19 -0
  55. package/dist/edit-modes/measure-distance-mode.js +171 -0
  56. package/dist/edit-modes/modify-mode.d.ts +15 -0
  57. package/dist/edit-modes/modify-mode.js +203 -0
  58. package/dist/edit-modes/resize-circle-mode.d.ts +16 -0
  59. package/dist/edit-modes/resize-circle-mode.js +142 -0
  60. package/dist/edit-modes/rotate-mode.d.ts +17 -0
  61. package/dist/edit-modes/rotate-mode.js +151 -0
  62. package/dist/edit-modes/scale-mode.d.ts +27 -0
  63. package/dist/edit-modes/scale-mode.js +173 -0
  64. package/dist/edit-modes/snappable-mode.d.ts +21 -0
  65. package/dist/edit-modes/snappable-mode.js +109 -0
  66. package/dist/edit-modes/split-polygon-mode.d.ts +10 -0
  67. package/dist/edit-modes/split-polygon-mode.js +164 -0
  68. package/dist/edit-modes/three-click-polygon-mode.d.ts +10 -0
  69. package/dist/edit-modes/three-click-polygon-mode.js +72 -0
  70. package/dist/edit-modes/transform-mode.d.ts +9 -0
  71. package/dist/edit-modes/transform-mode.js +63 -0
  72. package/dist/edit-modes/translate-mode.d.ts +13 -0
  73. package/dist/edit-modes/translate-mode.js +113 -0
  74. package/dist/edit-modes/two-click-polygon-mode.d.ts +13 -0
  75. package/dist/edit-modes/two-click-polygon-mode.js +93 -0
  76. package/dist/edit-modes/types.d.ts +86 -0
  77. package/dist/edit-modes/types.js +1 -0
  78. package/dist/edit-modes/utils.d.ts +36 -0
  79. package/dist/edit-modes/utils.js +381 -0
  80. package/dist/edit-modes/view-mode.d.ts +3 -0
  81. package/dist/edit-modes/view-mode.js +3 -0
  82. package/dist/editable-layers/editable-geojson-layer.d.ts +98 -0
  83. package/dist/editable-layers/editable-geojson-layer.js +450 -0
  84. package/dist/editable-layers/editable-h3-cluster-layer.d.ts +34 -0
  85. package/dist/editable-layers/editable-h3-cluster-layer.js +164 -0
  86. package/dist/editable-layers/editable-layer.d.ts +49 -0
  87. package/dist/editable-layers/editable-layer.js +195 -0
  88. package/dist/editable-layers/editable-path-layer.d.ts +9 -0
  89. package/dist/editable-layers/editable-path-layer.js +34 -0
  90. package/dist/editable-layers/elevated-edit-handle-layer.d.ts +7 -0
  91. package/dist/editable-layers/elevated-edit-handle-layer.js +24 -0
  92. package/dist/editable-layers/junction-scatterplot-layer.d.ts +14 -0
  93. package/dist/editable-layers/junction-scatterplot-layer.js +41 -0
  94. package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.d.ts +4 -0
  95. package/dist/editable-layers/path-marker-layer/arrow-2d-geometry.js +55 -0
  96. package/dist/editable-layers/path-marker-layer/create-path-markers.d.ts +16 -0
  97. package/dist/editable-layers/path-marker-layer/create-path-markers.js +75 -0
  98. package/dist/editable-layers/path-marker-layer/path-marker-layer.d.ts +40 -0
  99. package/dist/editable-layers/path-marker-layer/path-marker-layer.js +121 -0
  100. package/dist/editable-layers/path-marker-layer/polyline.d.ts +18 -0
  101. package/dist/editable-layers/path-marker-layer/polyline.js +37 -0
  102. package/dist/editable-layers/path-outline-layer/path-outline-layer.d.ts +26 -0
  103. package/dist/editable-layers/path-outline-layer/path-outline-layer.js +106 -0
  104. package/dist/editable-layers/selection-layer.d.ts +26 -0
  105. package/dist/editable-layers/selection-layer.js +167 -0
  106. package/dist/geojson-types.d.ts +58 -0
  107. package/dist/geojson-types.js +2 -0
  108. package/dist/index.cjs +5825 -0
  109. package/dist/index.cjs.map +7 -0
  110. package/dist/index.d.ts +60 -0
  111. package/dist/index.js +62 -0
  112. package/dist/lib/constants.d.ts +6 -0
  113. package/dist/lib/constants.js +6 -0
  114. package/dist/lib/deck-renderer/deck-cache.d.ts +14 -0
  115. package/dist/lib/deck-renderer/deck-cache.js +51 -0
  116. package/dist/lib/deck-renderer/deck-drawer.d.ts +63 -0
  117. package/dist/lib/deck-renderer/deck-drawer.js +232 -0
  118. package/dist/lib/feature.d.ts +10 -0
  119. package/dist/lib/feature.js +16 -0
  120. package/dist/lib/layer-mouse-event.d.ts +11 -0
  121. package/dist/lib/layer-mouse-event.js +24 -0
  122. package/dist/lib/layers/junctions-layer.d.ts +8 -0
  123. package/dist/lib/layers/junctions-layer.js +33 -0
  124. package/dist/lib/layers/segments-layer.d.ts +18 -0
  125. package/dist/lib/layers/segments-layer.js +94 -0
  126. package/dist/lib/layers/texts-layer.d.ts +8 -0
  127. package/dist/lib/layers/texts-layer.js +32 -0
  128. package/dist/lib/math.d.ts +11 -0
  129. package/dist/lib/math.js +22 -0
  130. package/dist/lib/nebula-layer.d.ts +13 -0
  131. package/dist/lib/nebula-layer.js +26 -0
  132. package/dist/lib/nebula.d.ts +34 -0
  133. package/dist/lib/nebula.js +254 -0
  134. package/dist/lib/style.d.ts +19 -0
  135. package/dist/lib/style.js +20 -0
  136. package/dist/memoize.d.ts +6 -0
  137. package/dist/memoize.js +40 -0
  138. package/dist/mode-handlers/composite-mode-handler.d.ts +24 -0
  139. package/dist/mode-handlers/composite-mode-handler.js +55 -0
  140. package/dist/mode-handlers/draw-90degree-polygon-handler.d.ts +13 -0
  141. package/dist/mode-handlers/draw-90degree-polygon-handler.js +169 -0
  142. package/dist/mode-handlers/draw-circle-by-bounding-box-handler.d.ts +9 -0
  143. package/dist/mode-handlers/draw-circle-by-bounding-box-handler.js +29 -0
  144. package/dist/mode-handlers/draw-circle-from-center-handler.d.ts +9 -0
  145. package/dist/mode-handlers/draw-circle-from-center-handler.js +27 -0
  146. package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.d.ts +9 -0
  147. package/dist/mode-handlers/draw-ellipse-by-bounding-box-handler.js +30 -0
  148. package/dist/mode-handlers/draw-ellipse-using-three-points-handler.d.ts +9 -0
  149. package/dist/mode-handlers/draw-ellipse-using-three-points-handler.js +37 -0
  150. package/dist/mode-handlers/draw-line-string-handler.d.ts +9 -0
  151. package/dist/mode-handlers/draw-line-string-handler.js +83 -0
  152. package/dist/mode-handlers/draw-point-handler.d.ts +5 -0
  153. package/dist/mode-handlers/draw-point-handler.js +11 -0
  154. package/dist/mode-handlers/draw-polygon-handler.d.ts +11 -0
  155. package/dist/mode-handlers/draw-polygon-handler.js +92 -0
  156. package/dist/mode-handlers/draw-rectangle-handler.d.ts +9 -0
  157. package/dist/mode-handlers/draw-rectangle-handler.js +18 -0
  158. package/dist/mode-handlers/draw-rectangle-using-three-points-handler.d.ts +9 -0
  159. package/dist/mode-handlers/draw-rectangle-using-three-points-handler.js +49 -0
  160. package/dist/mode-handlers/duplicate-handler.d.ts +9 -0
  161. package/dist/mode-handlers/duplicate-handler.js +19 -0
  162. package/dist/mode-handlers/elevation-handler.d.ts +19 -0
  163. package/dist/mode-handlers/elevation-handler.js +48 -0
  164. package/dist/mode-handlers/extrude-handler.d.ts +18 -0
  165. package/dist/mode-handlers/extrude-handler.js +176 -0
  166. package/dist/mode-handlers/mode-handler.d.ts +61 -0
  167. package/dist/mode-handlers/mode-handler.js +286 -0
  168. package/dist/mode-handlers/modify-handler.d.ts +19 -0
  169. package/dist/mode-handlers/modify-handler.js +193 -0
  170. package/dist/mode-handlers/rotate-handler.d.ts +17 -0
  171. package/dist/mode-handlers/rotate-handler.js +74 -0
  172. package/dist/mode-handlers/scale-handler.d.ts +17 -0
  173. package/dist/mode-handlers/scale-handler.js +76 -0
  174. package/dist/mode-handlers/snappable-handler.d.ts +33 -0
  175. package/dist/mode-handlers/snappable-handler.js +133 -0
  176. package/dist/mode-handlers/split-polygon-handler.d.ts +11 -0
  177. package/dist/mode-handlers/split-polygon-handler.js +154 -0
  178. package/dist/mode-handlers/three-click-polygon-handler.d.ts +5 -0
  179. package/dist/mode-handlers/three-click-polygon-handler.js +18 -0
  180. package/dist/mode-handlers/translate-handler.d.ts +17 -0
  181. package/dist/mode-handlers/translate-handler.js +72 -0
  182. package/dist/mode-handlers/two-click-polygon-handler.d.ts +5 -0
  183. package/dist/mode-handlers/two-click-polygon-handler.js +18 -0
  184. package/dist/mode-handlers/view-handler.d.ts +8 -0
  185. package/dist/mode-handlers/view-handler.js +10 -0
  186. package/dist/shaderlib/color/color.d.ts +8 -0
  187. package/dist/shaderlib/color/color.js +51 -0
  188. package/dist/shaderlib/outline/outline.d.ts +8 -0
  189. package/dist/shaderlib/outline/outline.js +97 -0
  190. package/dist/shaderlib/utils/utils.d.ts +8 -0
  191. package/dist/shaderlib/utils/utils.js +28 -0
  192. package/dist/translateFromCenter.d.ts +4 -0
  193. package/dist/translateFromCenter.js +19 -0
  194. package/dist/types.d.ts +35 -0
  195. package/dist/types.js +1 -0
  196. package/dist/utils.d.ts +20 -0
  197. package/dist/utils.js +144 -0
  198. package/package.json +84 -0
  199. package/src/constants.ts +15 -0
  200. package/src/curve-utils.ts +77 -0
  201. package/src/edit-modes/composite-mode.ts +74 -0
  202. package/src/edit-modes/draw-90degree-polygon-mode.ts +220 -0
  203. package/src/edit-modes/draw-circle-by-diameter-mode.ts +88 -0
  204. package/src/edit-modes/draw-circle-from-center-mode.ts +79 -0
  205. package/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts +25 -0
  206. package/src/edit-modes/draw-ellipse-using-three-points-mode.ts +23 -0
  207. package/src/edit-modes/draw-line-string-mode.ts +200 -0
  208. package/src/edit-modes/draw-point-mode.ts +35 -0
  209. package/src/edit-modes/draw-polygon-by-dragging-mode.ts +106 -0
  210. package/src/edit-modes/draw-polygon-mode.ts +171 -0
  211. package/src/edit-modes/draw-rectangle-from-center-mode.ts +23 -0
  212. package/src/edit-modes/draw-rectangle-mode.ts +14 -0
  213. package/src/edit-modes/draw-rectangle-using-three-points-mode.ts +36 -0
  214. package/src/edit-modes/draw-square-from-center-mode.ts +46 -0
  215. package/src/edit-modes/draw-square-mode.ts +36 -0
  216. package/src/edit-modes/duplicate-mode.ts +21 -0
  217. package/src/edit-modes/edit-mode.ts +30 -0
  218. package/src/edit-modes/elevation-mode.ts +86 -0
  219. package/src/edit-modes/extend-line-string-mode.ts +87 -0
  220. package/src/edit-modes/extrude-mode.ts +254 -0
  221. package/src/edit-modes/geojson-edit-mode.ts +283 -0
  222. package/src/edit-modes/immutable-feature-collection.ts +417 -0
  223. package/src/edit-modes/measure-angle-mode.ts +127 -0
  224. package/src/edit-modes/measure-area-mode.ts +62 -0
  225. package/src/edit-modes/measure-distance-mode.ts +215 -0
  226. package/src/edit-modes/modify-mode.ts +293 -0
  227. package/src/edit-modes/resize-circle-mode.ts +202 -0
  228. package/src/edit-modes/rotate-mode.ts +208 -0
  229. package/src/edit-modes/scale-mode.ts +231 -0
  230. package/src/edit-modes/snappable-mode.ts +174 -0
  231. package/src/edit-modes/split-polygon-mode.ts +201 -0
  232. package/src/edit-modes/three-click-polygon-mode.ts +111 -0
  233. package/src/edit-modes/transform-mode.ts +75 -0
  234. package/src/edit-modes/translate-mode.ts +161 -0
  235. package/src/edit-modes/two-click-polygon-mode.ts +132 -0
  236. package/src/edit-modes/types.ts +135 -0
  237. package/src/edit-modes/utils.ts +513 -0
  238. package/src/edit-modes/view-mode.ts +3 -0
  239. package/src/editable-layers/editable-geojson-layer.ts +603 -0
  240. package/src/editable-layers/editable-h3-cluster-layer.ts +226 -0
  241. package/src/editable-layers/editable-layer.ts +252 -0
  242. package/src/editable-layers/editable-path-layer.ts +51 -0
  243. package/src/editable-layers/elevated-edit-handle-layer.ts +33 -0
  244. package/src/editable-layers/junction-scatterplot-layer.ts +53 -0
  245. package/src/editable-layers/path-marker-layer/arrow-2d-geometry.ts +61 -0
  246. package/src/editable-layers/path-marker-layer/create-path-markers.ts +107 -0
  247. package/src/editable-layers/path-marker-layer/path-marker-layer.ts +179 -0
  248. package/src/editable-layers/path-marker-layer/polyline.ts +40 -0
  249. package/src/editable-layers/path-outline-layer/path-outline-layer.ts +147 -0
  250. package/src/editable-layers/selection-layer.ts +209 -0
  251. package/src/geojson-types.ts +89 -0
  252. package/src/index.ts +125 -0
  253. package/src/lib/constants.ts +6 -0
  254. package/src/lib/deck-renderer/deck-cache.ts +61 -0
  255. package/src/lib/deck-renderer/deck-drawer.ts +263 -0
  256. package/src/lib/feature.ts +27 -0
  257. package/src/lib/layer-mouse-event.ts +32 -0
  258. package/src/lib/layers/junctions-layer.ts +40 -0
  259. package/src/lib/layers/segments-layer.ts +108 -0
  260. package/src/lib/layers/texts-layer.ts +43 -0
  261. package/src/lib/math.ts +26 -0
  262. package/src/lib/nebula-layer.ts +33 -0
  263. package/src/lib/nebula.ts +323 -0
  264. package/src/lib/style.ts +22 -0
  265. package/src/memoize.ts +43 -0
  266. package/src/mode-handlers/composite-mode-handler.ts +89 -0
  267. package/src/mode-handlers/draw-90degree-polygon-handler.ts +201 -0
  268. package/src/mode-handlers/draw-circle-by-bounding-box-handler.ts +39 -0
  269. package/src/mode-handlers/draw-circle-from-center-handler.ts +38 -0
  270. package/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts +41 -0
  271. package/src/mode-handlers/draw-ellipse-using-three-points-handler.ts +46 -0
  272. package/src/mode-handlers/draw-line-string-handler.ts +108 -0
  273. package/src/mode-handlers/draw-point-handler.ts +15 -0
  274. package/src/mode-handlers/draw-polygon-handler.ts +121 -0
  275. package/src/mode-handlers/draw-rectangle-handler.ts +28 -0
  276. package/src/mode-handlers/draw-rectangle-using-three-points-handler.ts +60 -0
  277. package/src/mode-handlers/duplicate-handler.ts +25 -0
  278. package/src/mode-handlers/elevation-handler.ts +88 -0
  279. package/src/mode-handlers/extrude-handler.ts +245 -0
  280. package/src/mode-handlers/mode-handler.ts +394 -0
  281. package/src/mode-handlers/modify-handler.ts +263 -0
  282. package/src/mode-handlers/rotate-handler.ts +107 -0
  283. package/src/mode-handlers/scale-handler.ts +105 -0
  284. package/src/mode-handlers/snappable-handler.ts +184 -0
  285. package/src/mode-handlers/split-polygon-handler.ts +177 -0
  286. package/src/mode-handlers/three-click-polygon-handler.ts +25 -0
  287. package/src/mode-handlers/translate-handler.ts +110 -0
  288. package/src/mode-handlers/two-click-polygon-handler.ts +25 -0
  289. package/src/mode-handlers/view-handler.ts +13 -0
  290. package/src/shaderlib/color/color.ts +56 -0
  291. package/src/shaderlib/outline/outline.ts +101 -0
  292. package/src/shaderlib/utils/utils.ts +33 -0
  293. package/src/translateFromCenter.ts +48 -0
  294. package/src/types.ts +39 -0
  295. 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
+ }
@@ -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
+ }
@@ -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
+ }