@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,226 @@
1
+ /* eslint-env browser */
2
+
3
+ import {H3ClusterLayer} from '@deck.gl/geo-layers';
4
+ import {DefaultProps} from '@deck.gl/core';
5
+ // TODO: Fix H3 support.
6
+ // import { polyfill, geoToH3 } from 'h3-js';
7
+ import {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants';
8
+ import EditableGeoJsonLayer from './editable-geojson-layer';
9
+ import EditableLayer, {EditableLayerProps} from './editable-layer';
10
+ import {ViewMode} from '../edit-modes/view-mode';
11
+
12
+ const DEFAULT_EDIT_MODE = ViewMode;
13
+ const DEFAULT_H3_RESOLUTION = 9;
14
+ const EMPTY_FEATURE_COLLECTION = {
15
+ type: 'FeatureCollection',
16
+ features: []
17
+ };
18
+
19
+ export type EditableH3ClusterLayerProps<DataT> = EditableLayerProps & {
20
+ data: DataT;
21
+ resolution?: number;
22
+ mode?: any;
23
+ modeConfig?: any;
24
+ selectedIndexes?: number[];
25
+ getEditedCluster?: (updatedHexagons: any[], existingCluster: any) => any;
26
+ getHexagons?: (d) => number[];
27
+ onEdit?: (updatedData?, editType?: string, featureIndexes?: number[], editContext?) => void;
28
+ filled?: boolean;
29
+ stroked?: boolean;
30
+ lineWidthScale?: number;
31
+ lineWidthMinPixels?: number;
32
+ lineWidthMaxPixels?: number;
33
+ lineWidthUnits?: string;
34
+ };
35
+
36
+ const defaultProps: DefaultProps<EditableH3ClusterLayerProps<any>> = {
37
+ mode: DEFAULT_EDIT_MODE,
38
+
39
+ ...EditableGeoJsonLayer.defaultProps,
40
+
41
+ // h3 layer
42
+ data: [],
43
+ selectedIndexes: [],
44
+ filled: false,
45
+ stroked: true,
46
+ lineWidthScale: PROJECTED_PIXEL_SIZE_MULTIPLIER,
47
+ lineWidthMinPixels: 1,
48
+ lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,
49
+ lineWidthUnits: 'pixels',
50
+ getHexagons: (d) => d.hexIds,
51
+ getEditedCluster: (updatedHexagons, existingCluster) => {
52
+ if (existingCluster) {
53
+ return {
54
+ ...existingCluster,
55
+ hexIds: updatedHexagons
56
+ };
57
+ }
58
+ return {
59
+ hexIds: updatedHexagons
60
+ };
61
+ },
62
+ resolution: DEFAULT_H3_RESOLUTION
63
+ };
64
+
65
+ export default class EditableH3ClusterLayer extends EditableLayer<
66
+ any,
67
+ EditableH3ClusterLayerProps<any>
68
+ > {
69
+ static layerName = 'EditableH3ClusterLayer';
70
+ static defaultProps = defaultProps;
71
+
72
+ state: EditableLayer['state'] & {
73
+ cursor?: 'grabbing' | 'grab' | null;
74
+ tentativeHexagonIDs: string[];
75
+ } = undefined!;
76
+
77
+ initializeState() {
78
+ super.initializeState();
79
+
80
+ this.setState({
81
+ tentativeHexagonIDs: []
82
+ });
83
+ }
84
+
85
+ // convert array of (lng, lat) coords to cluster of hexes
86
+ getDerivedHexagonIDs(coords) {
87
+ throw new Error('not implemented'); // TODO
88
+ // return polyfill(coords, this.props.resolution, true);
89
+ }
90
+
91
+ // convert pair of (lng, lat) coords into single hex
92
+ getDerivedHexagonID(coords) {
93
+ throw new Error('not implemented'); // TODO
94
+ // return geoToH3(coords[1], coords[0], this.props.resolution);
95
+ }
96
+
97
+ renderLayers() {
98
+ const layers: any = [
99
+ new EditableGeoJsonLayer(
100
+ this.getSubLayerProps({
101
+ id: 'editable-geojson',
102
+
103
+ mode: this.props.mode,
104
+ data: EMPTY_FEATURE_COLLECTION,
105
+ selectedFeatureIndexes: [],
106
+
107
+ onEdit: (editAction) => {
108
+ const {editType, editContext} = editAction;
109
+
110
+ switch (editType) {
111
+ case 'updateTentativeFeature':
112
+ // tentative feature updates, updated on every pointer move
113
+ if (editContext.feature.geometry.type === 'Polygon') {
114
+ const coords = editContext.feature.geometry.coordinates;
115
+ const hexIDs = this.getDerivedHexagonIDs(coords);
116
+
117
+ this.setState({tentativeHexagonIDs: hexIDs});
118
+ } else if (editContext.feature.geometry.type === 'Point') {
119
+ const coords = editContext.feature.geometry.coordinates;
120
+ const hexID = this.getDerivedHexagonID(coords);
121
+
122
+ this.setState({tentativeHexagonIDs: [hexID]});
123
+ }
124
+ break;
125
+ case 'addFeature':
126
+ const updatedData = [...this.props.data];
127
+ const {modeConfig} = this.props;
128
+
129
+ if (!modeConfig || !modeConfig.booleanOperation) {
130
+ // add new h3 cluster
131
+ updatedData.push(
132
+ this.props.getEditedCluster!(this.state.tentativeHexagonIDs, null)
133
+ );
134
+ } else if (this.props.selectedIndexes!.length !== 1) {
135
+ // eslint-disable-next-line no-console,no-undef
136
+ console.warn('booleanOperation only supported for single cluster selection');
137
+ } else {
138
+ // they're affecting a selected cluster
139
+ let finalHexagonIDs: (string | number)[];
140
+ const committedHexagonIDs = new Set<string | number>(this.getSelectedHexIDs());
141
+ const tentativeHexagonIDs = new Set<string | number>(this.state.tentativeHexagonIDs);
142
+
143
+ switch (modeConfig.booleanOperation) {
144
+ case 'union':
145
+ default:
146
+ finalHexagonIDs = [
147
+ ...new Set([...committedHexagonIDs, ...tentativeHexagonIDs])
148
+ ];
149
+ break;
150
+ case 'intersection':
151
+ finalHexagonIDs = [...committedHexagonIDs].filter((hexID: string | number) =>
152
+ tentativeHexagonIDs.has(hexID)
153
+ );
154
+ break;
155
+ case 'difference':
156
+ finalHexagonIDs = [...committedHexagonIDs].filter(
157
+ (hexID: string | number) => !tentativeHexagonIDs.has(hexID)
158
+ );
159
+ break;
160
+ }
161
+
162
+ const selectedIndex = this.props.selectedIndexes![0];
163
+ const existingCluster = this.props.data[selectedIndex];
164
+ updatedData[selectedIndex] = this.props.getEditedCluster!(
165
+ finalHexagonIDs,
166
+ existingCluster
167
+ );
168
+ }
169
+
170
+ this.setState({
171
+ tentativeHexagonIDs: []
172
+ });
173
+
174
+ this.props.onEdit!({updatedData});
175
+
176
+ break;
177
+ default:
178
+ break;
179
+ }
180
+ }
181
+ })
182
+ ),
183
+
184
+ new H3ClusterLayer(
185
+ this.getSubLayerProps({
186
+ id: 'hexagons',
187
+ data: this.props.data,
188
+ getHexagons: this.props.getHexagons
189
+ })
190
+ ),
191
+ new H3ClusterLayer(
192
+ this.getSubLayerProps({
193
+ id: 'tentative-hexagons',
194
+ data: [
195
+ {
196
+ hexIds: this.state.tentativeHexagonIDs
197
+ }
198
+ ],
199
+ getHexagons: (d) => d.hexIds
200
+ })
201
+ )
202
+ ];
203
+ return layers;
204
+ }
205
+
206
+ // because data is an array of hexagon data, we take the cumulative of all selected indexes,
207
+ // using props.getHexagons to support multiple data types
208
+ getSelectedHexIDs() {
209
+ let cumulativeHexIDs: number[] = [];
210
+ this.props.selectedIndexes!.forEach((index) => {
211
+ const selectedCluster = this.props.data[index];
212
+ const hexIDs = this.props.getHexagons!(selectedCluster);
213
+ cumulativeHexIDs = cumulativeHexIDs.concat(hexIDs);
214
+ });
215
+ return cumulativeHexIDs;
216
+ }
217
+
218
+ getCursor({isDragging}: {isDragging: boolean}): 'grabbing' | 'grab' {
219
+ let {cursor} = this.state || {};
220
+ if (!cursor) {
221
+ // default cursor
222
+ cursor = isDragging ? 'grabbing' : 'grab';
223
+ }
224
+ return cursor;
225
+ }
226
+ }
@@ -0,0 +1,252 @@
1
+ /* eslint-env browser */
2
+
3
+ import { CompositeLayer, CompositeLayerProps } from '@deck.gl/core';
4
+ import { DraggingEvent, ClickEvent, StartDraggingEvent, StopDraggingEvent, PointerMoveEvent } from '../edit-modes/types';
5
+ import { Position } from '../geojson-types';
6
+
7
+ const EVENT_TYPES = ['anyclick', 'pointermove', 'panstart', 'panmove', 'panend', 'keyup'];
8
+
9
+ // TODO(v9): remove generic layer
10
+ export type EditableLayerProps<DataType = any> = CompositeLayerProps & {
11
+ pickingRadius?: number;
12
+ pickingDepth?: number;
13
+ };
14
+
15
+ export default abstract class EditableLayer<
16
+ DataT = any,
17
+ ExtraPropsT = Record<string, unknown>
18
+ > extends CompositeLayer<ExtraPropsT & Required<EditableLayerProps<DataT>>> {
19
+ static layerName = 'EditableLayer';
20
+
21
+ state: {_editableLayerState: any} = undefined!;
22
+
23
+ // Overridable interaction event handlers
24
+ onLayerClick(event: ClickEvent): void {
25
+ // default implementation - do nothing
26
+ }
27
+
28
+ onStartDragging(event: StartDraggingEvent): void {
29
+ // default implementation - do nothing
30
+ }
31
+
32
+ onStopDragging(event: StopDraggingEvent): void {
33
+ // default implementation - do nothing
34
+ }
35
+
36
+ onDragging(event: DraggingEvent): void {
37
+ // default implementation - do nothing
38
+ }
39
+
40
+ onPointerMove(event: PointerMoveEvent): void {
41
+ // default implementation - do nothing
42
+ }
43
+
44
+ onLayerKeyUp(event: KeyboardEvent): void {
45
+ // default implementation - do nothing;
46
+ }
47
+ // TODO: implement onCancelDragging (e.g. drag off screen)
48
+
49
+ initializeState() {
50
+ this.setState({
51
+ _editableLayerState: {
52
+ // Picked objects at the time the pointer went down
53
+ pointerDownPicks: null,
54
+ // Screen coordinates where the pointer went down
55
+ pointerDownScreenCoords: null,
56
+ // Ground coordinates where the pointer went down
57
+ pointerDownMapCoords: null,
58
+
59
+ // Keep track of the mjolnir.js event handler so it can be deregistered
60
+ eventHandler: this._forwardEventToCurrentLayer.bind(this),
61
+ },
62
+ });
63
+
64
+ this._addEventHandlers();
65
+ }
66
+
67
+ finalizeState() {
68
+ this._removeEventHandlers();
69
+ }
70
+
71
+ _addEventHandlers() {
72
+ // @ts-expect-error accessing protected props
73
+ const { eventManager } = this.context.deck;
74
+ const { eventHandler } = this.state._editableLayerState;
75
+
76
+ for (const eventType of EVENT_TYPES) {
77
+ eventManager.on(eventType as any, eventHandler, {
78
+ // give nebula a higher priority so that it can stop propagation to deck.gl's map panning handlers
79
+ priority: 100,
80
+ });
81
+ }
82
+ }
83
+
84
+ _removeEventHandlers() {
85
+ // @ts-expect-error accessing protected props
86
+ const { eventManager } = this.context.deck;
87
+ const { eventHandler } = this.state._editableLayerState;
88
+
89
+ for (const eventType of EVENT_TYPES) {
90
+ eventManager.off(eventType as any, eventHandler);
91
+ }
92
+ }
93
+
94
+ // A new layer instance is created on every render, so forward the event to the current layer
95
+ // This means that the first layer instance will stick around to be the event listener, but will forward the event
96
+ // to the latest layer instance.
97
+ _forwardEventToCurrentLayer(event: any) {
98
+ const currentLayer = this.getCurrentLayer()!;
99
+
100
+ // Use a naming convention to find the event handling function for this event type
101
+ const func = currentLayer[`_on${event.type}`].bind(currentLayer);
102
+ if (!func) {
103
+ console.warn(`no handler for mjolnir.js event ${event.type}`); // eslint-disable-line
104
+ return;
105
+ }
106
+ func(event);
107
+ }
108
+
109
+ _onanyclick({ srcEvent }: any) {
110
+ const screenCoords = this.getScreenCoords(srcEvent) as [number, number];
111
+ const mapCoords = this.getMapCoords(screenCoords);
112
+
113
+ const picks = this.getPicks(screenCoords);
114
+
115
+ this.onLayerClick({
116
+ mapCoords,
117
+ screenCoords,
118
+ picks,
119
+ sourceEvent: srcEvent,
120
+ });
121
+ }
122
+
123
+ _onkeyup({ srcEvent }: { srcEvent: KeyboardEvent }) {
124
+ this.onLayerKeyUp(srcEvent);
125
+ }
126
+
127
+ _onpanstart(event: any) {
128
+ const screenCoords = this.getScreenCoords(event.srcEvent) as [number, number];
129
+ const mapCoords = this.getMapCoords(screenCoords);
130
+ const picks = this.getPicks(screenCoords);
131
+
132
+ this.setState({
133
+ _editableLayerState: {
134
+ ...this.state._editableLayerState,
135
+ pointerDownScreenCoords: screenCoords,
136
+ pointerDownMapCoords: mapCoords,
137
+ pointerDownPicks: picks,
138
+ },
139
+ });
140
+
141
+ this.onStartDragging({
142
+ picks,
143
+ screenCoords,
144
+ mapCoords,
145
+ pointerDownScreenCoords: screenCoords,
146
+ pointerDownMapCoords: mapCoords,
147
+ cancelPan: event.stopImmediatePropagation,
148
+ sourceEvent: event.srcEvent,
149
+ });
150
+ }
151
+
152
+ _onpanmove(event: any) {
153
+ const { srcEvent } = event;
154
+ const screenCoords = this.getScreenCoords(srcEvent) as [number, number];
155
+ const mapCoords = this.getMapCoords(screenCoords);
156
+
157
+ const { pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords } =
158
+ this.state._editableLayerState;
159
+
160
+ const picks = this.getPicks(screenCoords);
161
+
162
+ this.onDragging({
163
+ screenCoords,
164
+ mapCoords,
165
+ picks,
166
+ pointerDownPicks,
167
+ pointerDownScreenCoords,
168
+ pointerDownMapCoords,
169
+ sourceEvent: srcEvent,
170
+ cancelPan: event.stopImmediatePropagation,
171
+ // another (hacky) approach for cancelling map panning
172
+ // const controller = this.context.deck.viewManager.controllers[
173
+ // Object.keys(this.context.deck.viewManager.controllers)[0]
174
+ // ];
175
+ // controller._state.isDragging = false;
176
+ });
177
+ }
178
+
179
+ _onpanend({ srcEvent }: any) {
180
+ const screenCoords = this.getScreenCoords(srcEvent) as [number, number];
181
+ const mapCoords = this.getMapCoords(screenCoords);
182
+
183
+ const { pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords } =
184
+ this.state._editableLayerState;
185
+
186
+ const picks = this.getPicks(screenCoords);
187
+
188
+ this.onStopDragging({
189
+ picks,
190
+ screenCoords,
191
+ mapCoords,
192
+ pointerDownPicks,
193
+ pointerDownScreenCoords,
194
+ pointerDownMapCoords,
195
+ sourceEvent: srcEvent,
196
+ });
197
+
198
+ this.setState({
199
+ _editableLayerState: {
200
+ ...this.state._editableLayerState,
201
+ pointerDownScreenCoords: null,
202
+ pointerDownMapCoords: null,
203
+ pointerDownPicks: null,
204
+ },
205
+ });
206
+ }
207
+
208
+ _onpointermove(event: any) {
209
+ const { srcEvent } = event;
210
+ const screenCoords = this.getScreenCoords(srcEvent) as [number, number];
211
+ const mapCoords = this.getMapCoords(screenCoords);
212
+
213
+ const { pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords } =
214
+ this.state._editableLayerState;
215
+
216
+ const picks = this.getPicks(screenCoords);
217
+
218
+ this.onPointerMove({
219
+ screenCoords,
220
+ mapCoords,
221
+ picks,
222
+ pointerDownPicks,
223
+ pointerDownScreenCoords,
224
+ pointerDownMapCoords,
225
+ sourceEvent: srcEvent,
226
+ cancelPan: event.stopImmediatePropagation,
227
+ });
228
+ }
229
+
230
+ getPicks(screenCoords: [number, number]) {
231
+ return this.context.deck!.pickMultipleObjects({
232
+ x: screenCoords[0],
233
+ y: screenCoords[1],
234
+ layerIds: [this.props.id],
235
+ radius: this.props.pickingRadius,
236
+ depth: this.props.pickingDepth,
237
+ });
238
+ }
239
+
240
+ getScreenCoords(pointerEvent: any): Position {
241
+ return [
242
+ pointerEvent.clientX -
243
+ (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().left,
244
+ pointerEvent.clientY -
245
+ (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().top,
246
+ ];
247
+ }
248
+
249
+ getMapCoords(screenCoords: Position): Position {
250
+ return this.context.viewport.unproject([screenCoords[0], screenCoords[1]]) as Position;
251
+ }
252
+ }
@@ -0,0 +1,51 @@
1
+ import { PathLayer, PathLayerProps } from '@deck.gl/layers';
2
+
3
+ import { insertBefore } from '../utils';
4
+
5
+ interface EditablePathLayerProps extends PathLayerProps<any> {
6
+ pickingLineWidthExtraPixels?: number;
7
+ }
8
+
9
+ const defaultProps = {
10
+ ...PathLayer.defaultProps,
11
+ pickingLineWidthExtraPixels: { type: 'number', min: 0, value: Number.MAX_SAFE_INTEGER },
12
+ };
13
+
14
+ export default class EditablePathLayer extends PathLayer<any, EditablePathLayerProps> {
15
+ getShaders() {
16
+ const shaders = super.getShaders();
17
+
18
+ shaders.vs = insertBefore(
19
+ shaders.vs,
20
+ 'vec3 width;',
21
+ `
22
+ if(bool(picking.isActive)){
23
+ widthPixels.xy += pickingLineWidthExtraPixels;
24
+ }
25
+ `
26
+ );
27
+
28
+ return {
29
+ ...shaders,
30
+ inject: {
31
+ ...(shaders.inject || {}),
32
+ 'vs:#decl': (shaders.inject?.['vs:#decl'] || '').concat(
33
+ 'uniform float pickingLineWidthExtraPixels;'
34
+ ),
35
+ },
36
+ };
37
+ }
38
+
39
+ draw(props) {
40
+ super.draw({
41
+ ...props,
42
+ uniforms: {
43
+ ...props.uniforms,
44
+ pickingLineWidthExtraPixels: this.props.pickingLineWidthExtraPixels,
45
+ },
46
+ });
47
+ }
48
+ }
49
+
50
+ EditablePathLayer.defaultProps = defaultProps;
51
+ EditablePathLayer.layerName = 'EditablePathLayer';
@@ -0,0 +1,33 @@
1
+ /* eslint-env browser */
2
+
3
+ import { CompositeLayer } from '@deck.gl/core';
4
+ import { ScatterplotLayer, LineLayer } from '@deck.gl/layers';
5
+
6
+ const defaultProps = {};
7
+
8
+ export default class ElevatedEditHandleLayer extends CompositeLayer<any> {
9
+ static layerName = 'ElevatedEditHandleLayer';
10
+ static defaultProps = defaultProps;
11
+ renderLayers() {
12
+ const handles = new ScatterplotLayer(
13
+ Object.assign({}, this.props, {
14
+ id: `${this.props.id}-ScatterplotLayer`,
15
+ data: this.props.data,
16
+ })
17
+ );
18
+
19
+ const lines = new LineLayer(
20
+ Object.assign({}, this.props, {
21
+ id: `${this.props.id}-LineLayer`,
22
+ data: this.props.data,
23
+ pickable: false,
24
+ getSourcePosition: ({ position }) => [position[0], position[1], 0],
25
+ getTargetPosition: ({ position }) => [position[0], position[1], position[2] || 0],
26
+ getColor: [150, 150, 150, 200],
27
+ getStrokeWidth: 3,
28
+ })
29
+ );
30
+
31
+ return [handles, lines];
32
+ }
33
+ }
@@ -0,0 +1,53 @@
1
+ import { CompositeLayer, CompositeLayerProps, DefaultProps } from '@deck.gl/core';
2
+ import { ScatterplotLayer, ScatterplotLayerProps } from '@deck.gl/layers';
3
+
4
+ import { Color } from '../types';
5
+
6
+ type JunctionScatterplotLayerProps = CompositeLayerProps &
7
+ Omit<ScatterplotLayerProps, 'getFillColor'> & {
8
+ getFillColor?: Color | ((d) => Color);
9
+ getStrokeColor?: Color | ((d) => Color);
10
+ getInnerRadius?: number | ((d) => number);
11
+ };
12
+
13
+ export default class JunctionScatterplotLayer extends CompositeLayer<JunctionScatterplotLayerProps> {
14
+ static layerName = 'JunctionScatterplotLayer';
15
+ static defaultProps: DefaultProps<JunctionScatterplotLayerProps> = {
16
+ ...ScatterplotLayer.defaultProps,
17
+ getFillColor: (d) => [0, 0, 0, 255],
18
+ getStrokeColor: (d) => [255, 255, 255, 255],
19
+ getInnerRadius: (d) => 1,
20
+ };
21
+
22
+ renderLayers() {
23
+ const { id, getFillColor, getStrokeColor, getInnerRadius, updateTriggers } = this.props;
24
+
25
+ // data needs to be passed explicitly after deck.gl 5.3
26
+ return [
27
+ // the full circles
28
+ new ScatterplotLayer<any>({
29
+ ...this.props,
30
+ id: `${id}-full`,
31
+ data: this.props.data as any,
32
+ getLineColor: getStrokeColor,
33
+ updateTriggers: {
34
+ ...updateTriggers,
35
+ getStrokeColor: updateTriggers.getStrokeColor,
36
+ },
37
+ }), // the inner part
38
+ new ScatterplotLayer<any>({
39
+ ...this.props,
40
+ id: `${id}-inner`,
41
+ data: this.props.data as any,
42
+ getFillColor,
43
+ getRadius: getInnerRadius,
44
+ pickable: false,
45
+ updateTriggers: {
46
+ ...updateTriggers,
47
+ getFillColor: updateTriggers.getFillColor,
48
+ getRadius: updateTriggers.getInnerRadius,
49
+ },
50
+ }),
51
+ ];
52
+ }
53
+ }
@@ -0,0 +1,61 @@
1
+ import { Geometry } from '@luma.gl/engine';
2
+
3
+ export default class Arrow2DGeometry extends Geometry {
4
+ constructor(opts = {}) {
5
+ super(
6
+ Object.assign({}, opts, {
7
+ attributes: getArrowAttributes(opts),
8
+ topology: 'triangle-list' as const
9
+ })
10
+ );
11
+ }
12
+ }
13
+
14
+ function getArrowAttributes({ length = 1, headSize = 0.2, tailWidth = 0.05, tailStart = 0.05 }) {
15
+ const texCoords = [
16
+ // HEAD
17
+ 0.5,
18
+ 1.0,
19
+ 0,
20
+ 0.5 - headSize / 2,
21
+ 1.0 - headSize,
22
+ 0,
23
+ 0.5 + headSize / 2,
24
+ 1.0 - headSize,
25
+ 0,
26
+ 0.5 - tailWidth / 2,
27
+ tailStart,
28
+ 0,
29
+ 0.5 + tailWidth / 2,
30
+ 1.0 - headSize,
31
+ 0,
32
+ 0.5 + tailWidth / 2,
33
+ tailStart,
34
+ 0,
35
+ 0.5 - tailWidth / 2,
36
+ tailStart,
37
+ 0,
38
+ 0.5 - tailWidth / 2,
39
+ 1.0 - headSize,
40
+ 0,
41
+ 0.5 + tailWidth / 2,
42
+ 1.0 - headSize,
43
+ 0,
44
+ ];
45
+
46
+ const normals = [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1];
47
+
48
+ // Center and scale
49
+ const positions = new Array(texCoords.length);
50
+ for (let i = 0; i < texCoords.length / 3; i++) {
51
+ const i3 = i * 3;
52
+ positions[i3 + 0] = (texCoords[i3 + 0] - 0.5) * length;
53
+ positions[i3 + 1] = (texCoords[i3 + 1] - 0.5) * length;
54
+ positions[i3 + 2] = 0;
55
+ }
56
+ return {
57
+ positions: {size: 3, value: new Float32Array(positions)},
58
+ normals: {size: 3, value: new Float32Array(normals)},
59
+ texCoords: {size: 2, value: new Float32Array(texCoords)},
60
+ };
61
+ }