@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,193 @@
1
+ import nearestPointOnLine from '@turf/nearest-point-on-line';
2
+ import { point, lineString as toLineString } from '@turf/helpers';
3
+ import { recursivelyTraverseNestedArrays, nearestPointOnProjectedLine, } from '../utils';
4
+ import { ModeHandler, getPickedEditHandle, getEditHandlesForGeometry, } from './mode-handler';
5
+ // TODO edit-modes: delete handlers once EditMode fully implemented
6
+ export class ModifyHandler extends ModeHandler {
7
+ _lastPointerMovePicks;
8
+ getEditHandles(picks, mapCoords) {
9
+ let handles = [];
10
+ const { features } = this.featureCollection.getObject();
11
+ for (const index of this.getSelectedFeatureIndexes()) {
12
+ if (index < features.length) {
13
+ const { geometry } = features[index];
14
+ handles.push(...getEditHandlesForGeometry(geometry, index));
15
+ }
16
+ else {
17
+ console.warn(`selectedFeatureIndexes out of range ${index}`); // eslint-disable-line no-console,no-undef
18
+ }
19
+ }
20
+ // intermediate edit handle
21
+ if (picks && picks.length && mapCoords) {
22
+ const existingEditHandle = picks.find((pick) => pick.isEditingHandle && pick.object && pick.object.type === 'existing');
23
+ // don't show intermediate point when too close to an existing edit handle
24
+ const featureAsPick = !existingEditHandle && picks.find((pick) => !pick.isEditingHandle);
25
+ // is the feature in the pick selected
26
+ if (featureAsPick &&
27
+ !featureAsPick.object.geometry.type.includes('Point') &&
28
+ this.getSelectedFeatureIndexes().includes(featureAsPick.index)) {
29
+ let intermediatePoint = null;
30
+ let positionIndexPrefix = [];
31
+ const referencePoint = point(mapCoords);
32
+ // process all lines of the (single) feature
33
+ recursivelyTraverseNestedArrays(featureAsPick.object.geometry.coordinates, [], (lineString, prefix) => {
34
+ const lineStringFeature = toLineString(lineString);
35
+ const candidateIntermediatePoint = this.nearestPointOnLine(
36
+ // @ts-expect-error turf type diff
37
+ lineStringFeature, referencePoint);
38
+ if (!intermediatePoint ||
39
+ candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist) {
40
+ intermediatePoint = candidateIntermediatePoint;
41
+ positionIndexPrefix = prefix;
42
+ }
43
+ });
44
+ // tack on the lone intermediate point to the set of handles
45
+ if (intermediatePoint) {
46
+ const { geometry: { coordinates: position }, properties: { index }, } = intermediatePoint;
47
+ handles = [
48
+ ...handles,
49
+ {
50
+ position,
51
+ positionIndexes: [...positionIndexPrefix, index + 1],
52
+ featureIndex: featureAsPick.index,
53
+ type: 'intermediate',
54
+ },
55
+ ];
56
+ }
57
+ }
58
+ }
59
+ return handles;
60
+ }
61
+ // turf.js does not support elevation for nearestPointOnLine
62
+ nearestPointOnLine(line, inPoint) {
63
+ const { coordinates } = line.geometry;
64
+ if (coordinates.some((coord) => coord.length > 2)) {
65
+ const modeConfig = this.getModeConfig();
66
+ if (modeConfig && modeConfig.viewport) {
67
+ // This line has elevation, we need to use alternative algorithm
68
+ return nearestPointOnProjectedLine(line, inPoint, modeConfig.viewport);
69
+ }
70
+ // eslint-disable-next-line no-console,no-undef
71
+ console.log('Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.');
72
+ }
73
+ // @ts-expect-error geojson types diff
74
+ return nearestPointOnLine(line, inPoint);
75
+ }
76
+ handleClick(event) {
77
+ let editAction = null;
78
+ const clickedEditHandle = getPickedEditHandle(event.picks);
79
+ if (clickedEditHandle && clickedEditHandle.featureIndex >= 0) {
80
+ if (clickedEditHandle.type === 'existing') {
81
+ let updatedData;
82
+ try {
83
+ updatedData = this.getImmutableFeatureCollection()
84
+ .removePosition(clickedEditHandle.featureIndex, clickedEditHandle.positionIndexes)
85
+ .getObject();
86
+ }
87
+ catch (ignored) {
88
+ // This happens if user attempts to remove the last point
89
+ }
90
+ if (updatedData) {
91
+ editAction = {
92
+ updatedData,
93
+ editType: 'removePosition',
94
+ featureIndexes: [clickedEditHandle.featureIndex],
95
+ editContext: {
96
+ positionIndexes: clickedEditHandle.positionIndexes,
97
+ position: clickedEditHandle.position,
98
+ },
99
+ };
100
+ }
101
+ }
102
+ else if (clickedEditHandle.type === 'intermediate') {
103
+ const updatedData = this.getImmutableFeatureCollection()
104
+ .addPosition(clickedEditHandle.featureIndex, clickedEditHandle.positionIndexes, clickedEditHandle.position)
105
+ .getObject();
106
+ if (updatedData) {
107
+ editAction = {
108
+ updatedData,
109
+ editType: 'addPosition',
110
+ featureIndexes: [clickedEditHandle.featureIndex],
111
+ editContext: {
112
+ positionIndexes: clickedEditHandle.positionIndexes,
113
+ position: clickedEditHandle.position,
114
+ },
115
+ };
116
+ }
117
+ }
118
+ }
119
+ return editAction;
120
+ }
121
+ handlePointerMove(event) {
122
+ this._lastPointerMovePicks = event.picks;
123
+ let editAction = null;
124
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
125
+ if (event.isDragging && editHandle) {
126
+ const updatedData = this.getImmutableFeatureCollection()
127
+ .replacePosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
128
+ .getObject();
129
+ editAction = {
130
+ updatedData,
131
+ editType: 'movePosition',
132
+ featureIndexes: [editHandle.featureIndex],
133
+ editContext: {
134
+ positionIndexes: editHandle.positionIndexes,
135
+ position: event.mapCoords,
136
+ },
137
+ };
138
+ }
139
+ // Cancel map panning if pointer went down on an edit handle
140
+ const cancelMapPan = Boolean(editHandle);
141
+ return { editAction, cancelMapPan };
142
+ }
143
+ handleStartDragging(event) {
144
+ let editAction = null;
145
+ const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
146
+ const editHandle = getPickedEditHandle(event.picks);
147
+ if (selectedFeatureIndexes.length && editHandle && editHandle.type === 'intermediate') {
148
+ const updatedData = this.getImmutableFeatureCollection()
149
+ .addPosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
150
+ .getObject();
151
+ editAction = {
152
+ updatedData,
153
+ editType: 'addPosition',
154
+ featureIndexes: [editHandle.featureIndex],
155
+ editContext: {
156
+ positionIndexes: editHandle.positionIndexes,
157
+ position: event.mapCoords,
158
+ },
159
+ };
160
+ }
161
+ return editAction;
162
+ }
163
+ handleStopDragging(event) {
164
+ let editAction = null;
165
+ const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
166
+ const editHandle = getPickedEditHandle(event.picks);
167
+ if (selectedFeatureIndexes.length && editHandle) {
168
+ const updatedData = this.getImmutableFeatureCollection()
169
+ .replacePosition(editHandle.featureIndex, editHandle.positionIndexes, event.mapCoords)
170
+ .getObject();
171
+ editAction = {
172
+ updatedData,
173
+ editType: 'finishMovePosition',
174
+ featureIndexes: [editHandle.featureIndex],
175
+ editContext: {
176
+ positionIndexes: editHandle.positionIndexes,
177
+ position: event.mapCoords,
178
+ },
179
+ };
180
+ }
181
+ return editAction;
182
+ }
183
+ getCursor({ isDragging }) {
184
+ const picks = this._lastPointerMovePicks;
185
+ if (picks && picks.length > 0) {
186
+ const handlePicked = picks.some((pick) => pick.isEditingHandle);
187
+ if (handlePicked) {
188
+ return 'cell';
189
+ }
190
+ }
191
+ return isDragging ? 'grabbing' : 'grab';
192
+ }
193
+ }
@@ -0,0 +1,17 @@
1
+ import { FeatureCollection, Position } from '../geojson-types';
2
+ import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { EditAction, ModeHandler } from './mode-handler';
4
+ export declare class RotateHandler extends ModeHandler {
5
+ _isRotatable: boolean;
6
+ _geometryBeingRotated: FeatureCollection | null | undefined;
7
+ handlePointerMove(event: PointerMoveEvent): {
8
+ editAction: EditAction | null | undefined;
9
+ cancelMapPan: boolean;
10
+ };
11
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
12
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
13
+ getCursor({ isDragging }: {
14
+ isDragging: boolean;
15
+ }): string;
16
+ getRotateAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction;
17
+ }
@@ -0,0 +1,74 @@
1
+ import turfCentroid from '@turf/centroid';
2
+ import turfBearing from '@turf/bearing';
3
+ import turfTransformRotate from '@turf/transform-rotate';
4
+ import { ModeHandler } from './mode-handler';
5
+ // TODO edit-modes: delete handlers once EditMode fully implemented
6
+ export class RotateHandler extends ModeHandler {
7
+ _isRotatable = undefined;
8
+ _geometryBeingRotated;
9
+ handlePointerMove(event) {
10
+ let editAction = null;
11
+ this._isRotatable = Boolean(this._geometryBeingRotated) || this.isSelectionPicked(event.picks);
12
+ if (!this._isRotatable || !event.pointerDownMapCoords) {
13
+ // Nothing to do
14
+ return { editAction: null, cancelMapPan: false };
15
+ }
16
+ if (event.isDragging && this._geometryBeingRotated) {
17
+ // Rotate the geometry
18
+ editAction = this.getRotateAction(event.pointerDownMapCoords, event.mapCoords, 'rotating');
19
+ }
20
+ return { editAction, cancelMapPan: true };
21
+ }
22
+ handleStartDragging(event) {
23
+ if (!this._isRotatable) {
24
+ return null;
25
+ }
26
+ this._geometryBeingRotated = this.getSelectedFeaturesAsFeatureCollection();
27
+ return null;
28
+ }
29
+ handleStopDragging(event) {
30
+ let editAction = null;
31
+ if (this._geometryBeingRotated) {
32
+ // Rotate the geometry
33
+ editAction = this.getRotateAction(event.pointerDownMapCoords, event.mapCoords, 'rotated');
34
+ this._geometryBeingRotated = null;
35
+ }
36
+ return editAction;
37
+ }
38
+ getCursor({ isDragging }) {
39
+ if (this._isRotatable) {
40
+ // TODO: look at doing SVG cursors to get a better "rotate" cursor
41
+ return 'move';
42
+ }
43
+ return isDragging ? 'grabbing' : 'grab';
44
+ }
45
+ getRotateAction(startDragPoint, currentPoint, editType) {
46
+ const startPosition = startDragPoint;
47
+ // @ts-expect-error turf types diff
48
+ const centroid = turfCentroid(this._geometryBeingRotated);
49
+ // @ts-expect-error turf types diff
50
+ const angle = getRotationAngle(centroid, startPosition, currentPoint);
51
+ // @ts-expect-error turf type diff
52
+ const rotatedFeatures = turfTransformRotate(
53
+ // @ts-expect-error turf type diff
54
+ this._geometryBeingRotated, angle);
55
+ let updatedData = this.getImmutableFeatureCollection();
56
+ const selectedIndexes = this.getSelectedFeatureIndexes();
57
+ for (let i = 0; i < selectedIndexes.length; i++) {
58
+ const selectedIndex = selectedIndexes[i];
59
+ const movedFeature = rotatedFeatures.features[i];
60
+ updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);
61
+ }
62
+ return {
63
+ updatedData: updatedData.getObject(),
64
+ editType,
65
+ featureIndexes: selectedIndexes,
66
+ editContext: null,
67
+ };
68
+ }
69
+ }
70
+ function getRotationAngle(centroid, startDragPoint, currentPoint) {
71
+ const bearing1 = turfBearing(centroid, startDragPoint);
72
+ const bearing2 = turfBearing(centroid, currentPoint);
73
+ return bearing2 - bearing1;
74
+ }
@@ -0,0 +1,17 @@
1
+ import { FeatureCollection, Position } from '../geojson-types';
2
+ import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { EditAction, ModeHandler } from './mode-handler';
4
+ export declare class ScaleHandler extends ModeHandler {
5
+ _isScalable: boolean;
6
+ _geometryBeingScaled: FeatureCollection | null | undefined;
7
+ handlePointerMove(event: PointerMoveEvent): {
8
+ editAction: EditAction | null | undefined;
9
+ cancelMapPan: boolean;
10
+ };
11
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
12
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
13
+ getCursor({ isDragging }: {
14
+ isDragging: boolean;
15
+ }): string;
16
+ getScaleAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction;
17
+ }
@@ -0,0 +1,76 @@
1
+ import turfCentroid from '@turf/centroid';
2
+ import turfDistance from '@turf/distance';
3
+ import turfTransformScale from '@turf/transform-scale';
4
+ import { ModeHandler } from './mode-handler';
5
+ // TODO edit-modes: delete handlers once EditMode fully implemented
6
+ export class ScaleHandler extends ModeHandler {
7
+ _isScalable = undefined;
8
+ _geometryBeingScaled;
9
+ handlePointerMove(event) {
10
+ let editAction = null;
11
+ this._isScalable = Boolean(this._geometryBeingScaled) || this.isSelectionPicked(event.picks);
12
+ if (!this._isScalable || !event.pointerDownMapCoords) {
13
+ // Nothing to do
14
+ return { editAction: null, cancelMapPan: false };
15
+ }
16
+ if (event.isDragging && this._geometryBeingScaled) {
17
+ // Scale the geometry
18
+ editAction = this.getScaleAction(event.pointerDownMapCoords, event.mapCoords, 'scaling');
19
+ }
20
+ return { editAction, cancelMapPan: true };
21
+ }
22
+ handleStartDragging(event) {
23
+ if (!this._isScalable) {
24
+ return null;
25
+ }
26
+ this._geometryBeingScaled = this.getSelectedFeaturesAsFeatureCollection();
27
+ return null;
28
+ }
29
+ handleStopDragging(event) {
30
+ let editAction = null;
31
+ if (this._geometryBeingScaled) {
32
+ // Scale the geometry
33
+ editAction = this.getScaleAction(event.pointerDownMapCoords, event.mapCoords, 'scaled');
34
+ this._geometryBeingScaled = null;
35
+ }
36
+ return editAction;
37
+ }
38
+ getCursor({ isDragging }) {
39
+ if (this._isScalable) {
40
+ // TODO: look at doing SVG cursors to get a better "scale" cursor
41
+ return 'move';
42
+ }
43
+ return isDragging ? 'grabbing' : 'grab';
44
+ }
45
+ getScaleAction(startDragPoint, currentPoint, editType) {
46
+ const startPosition = startDragPoint;
47
+ // @ts-expect-error turf types diff
48
+ const centroid = turfCentroid(this._geometryBeingScaled);
49
+ // @ts-expect-error turf types diff
50
+ const factor = getScaleFactor(centroid, startPosition, currentPoint);
51
+ // @ts-expect-error turf type diff
52
+ const scaledFeatures = turfTransformScale(
53
+ // @ts-expect-error turf type diff
54
+ this._geometryBeingScaled, factor, {
55
+ origin: centroid,
56
+ });
57
+ let updatedData = this.getImmutableFeatureCollection();
58
+ const selectedIndexes = this.getSelectedFeatureIndexes();
59
+ for (let i = 0; i < selectedIndexes.length; i++) {
60
+ const selectedIndex = selectedIndexes[i];
61
+ const movedFeature = scaledFeatures.features[i];
62
+ updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);
63
+ }
64
+ return {
65
+ updatedData: updatedData.getObject(),
66
+ editType,
67
+ featureIndexes: selectedIndexes,
68
+ editContext: null,
69
+ };
70
+ }
71
+ }
72
+ function getScaleFactor(centroid, startDragPoint, currentPoint) {
73
+ const startDistance = turfDistance(centroid, startDragPoint);
74
+ const endDistance = turfDistance(centroid, currentPoint);
75
+ return endDistance / startDistance;
76
+ }
@@ -0,0 +1,33 @@
1
+ import { Feature, FeatureCollection, Position } from '../geojson-types';
2
+ import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { EditHandle, EditAction, ModeHandler } from './mode-handler';
4
+ type HandlePicks = {
5
+ pickedHandle?: EditHandle;
6
+ potentialSnapHandle?: EditHandle;
7
+ };
8
+ export declare class SnappableHandler extends ModeHandler {
9
+ _handler: ModeHandler;
10
+ _editHandlePicks: HandlePicks | null | undefined;
11
+ _startDragSnapHandlePosition: Position;
12
+ constructor(handler: ModeHandler);
13
+ setFeatureCollection(featureCollection: FeatureCollection): void;
14
+ setModeConfig(modeConfig: any): void;
15
+ setSelectedFeatureIndexes(indexes: number[]): void;
16
+ _getSnappedMouseEvent(event: Record<string, any>, snapPoint: Position): PointerMoveEvent;
17
+ _getEditHandlePicks(event: PointerMoveEvent): HandlePicks;
18
+ _updatePickedHandlePosition(editAction: EditAction): void;
19
+ _getSnapTargets(): Feature[];
20
+ _getNonPickedIntermediateHandles(): EditHandle[];
21
+ getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): any[];
22
+ _getSnapAwareEvent(event: Record<string, any>): Record<string, any>;
23
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
24
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
25
+ getCursor(event: {
26
+ isDragging: boolean;
27
+ }): string;
28
+ handlePointerMove(event: PointerMoveEvent): {
29
+ editAction: EditAction | null | undefined;
30
+ cancelMapPan: boolean;
31
+ };
32
+ }
33
+ export {};
@@ -0,0 +1,133 @@
1
+ import { ModeHandler, getPickedEditHandle, getEditHandlesForGeometry, } from './mode-handler';
2
+ // TODO edit-modes: delete handlers once EditMode fully implemented
3
+ export class SnappableHandler extends ModeHandler {
4
+ _handler;
5
+ _editHandlePicks;
6
+ _startDragSnapHandlePosition = undefined;
7
+ constructor(handler) {
8
+ super();
9
+ this._handler = handler;
10
+ }
11
+ setFeatureCollection(featureCollection) {
12
+ this._handler.setFeatureCollection(featureCollection);
13
+ }
14
+ setModeConfig(modeConfig) {
15
+ this._modeConfig = modeConfig;
16
+ this._handler.setModeConfig(modeConfig);
17
+ }
18
+ setSelectedFeatureIndexes(indexes) {
19
+ this._handler.setSelectedFeatureIndexes(indexes);
20
+ }
21
+ _getSnappedMouseEvent(event, snapPoint) {
22
+ // @ts-expect-error narrow event type
23
+ return Object.assign({}, event, {
24
+ mapCoords: snapPoint,
25
+ pointerDownMapCoords: this._startDragSnapHandlePosition,
26
+ });
27
+ }
28
+ _getEditHandlePicks(event) {
29
+ const { picks } = event;
30
+ const potentialSnapHandle = picks.find((pick) => pick.object && pick.object.type === 'intermediate');
31
+ const handles = { potentialSnapHandle: potentialSnapHandle && potentialSnapHandle.object };
32
+ const pickedHandle = getPickedEditHandle(event.pointerDownPicks);
33
+ if (pickedHandle) {
34
+ return { ...handles, pickedHandle };
35
+ }
36
+ return handles;
37
+ }
38
+ _updatePickedHandlePosition(editAction) {
39
+ const { pickedHandle = {} } = this._editHandlePicks || {};
40
+ if (pickedHandle && editAction) {
41
+ const { featureIndexes, updatedData } = editAction;
42
+ for (let i = 0; i < featureIndexes.length; i++) {
43
+ const selectedIndex = featureIndexes[i];
44
+ const updatedFeature = updatedData.features[selectedIndex];
45
+ const { positionIndexes, featureIndex } = pickedHandle;
46
+ if (selectedIndex >= 0 && featureIndex === selectedIndex) {
47
+ const { coordinates } = updatedFeature.geometry;
48
+ pickedHandle.position = positionIndexes.reduce((a, b) => a[b], coordinates);
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // If additionalSnapTargets is present in modeConfig and is populated, this
54
+ // method will return those features along with the features
55
+ // that live in the current layer. Otherwise, this method will simply return the
56
+ // features from the current layer
57
+ _getSnapTargets() {
58
+ let { additionalSnapTargets } = this.getModeConfig() || {};
59
+ additionalSnapTargets = additionalSnapTargets || [];
60
+ const features = [
61
+ ...this._handler.featureCollection.getObject().features,
62
+ ...additionalSnapTargets,
63
+ ];
64
+ return features;
65
+ }
66
+ _getNonPickedIntermediateHandles() {
67
+ const handles = [];
68
+ const features = this._getSnapTargets();
69
+ for (let i = 0; i < features.length; i++) {
70
+ // Filter out the currently selected feature(s)
71
+ const isCurrentIndexFeatureNotSelected = i < features.length && !this._handler.getSelectedFeatureIndexes().includes(i);
72
+ if (isCurrentIndexFeatureNotSelected) {
73
+ const { geometry } = features[i];
74
+ handles.push(...getEditHandlesForGeometry(geometry, i, 'intermediate'));
75
+ }
76
+ }
77
+ return handles;
78
+ }
79
+ // If no snap handle has been picked, only display the edit handles of the
80
+ // selected feature. If a snap handle has been picked, display said snap handle
81
+ // along with all snappable points on all non-selected features.
82
+ getEditHandles(picks, mapCoords) {
83
+ const { enableSnapping } = this._modeConfig || {};
84
+ const handles = this._handler.getEditHandles(picks, mapCoords);
85
+ if (!enableSnapping)
86
+ return handles;
87
+ const { pickedHandle } = this._editHandlePicks || {};
88
+ if (pickedHandle) {
89
+ handles.push(...this._getNonPickedIntermediateHandles(), pickedHandle);
90
+ return handles;
91
+ }
92
+ const { features } = this._handler.featureCollection.getObject();
93
+ for (const index of this._handler.getSelectedFeatureIndexes()) {
94
+ if (index < features.length) {
95
+ const { geometry } = features[index];
96
+ handles.push(...getEditHandlesForGeometry(geometry, index, 'snap'));
97
+ }
98
+ }
99
+ return handles.filter(Boolean);
100
+ }
101
+ _getSnapAwareEvent(event) {
102
+ const { potentialSnapHandle } = this._editHandlePicks || {};
103
+ return potentialSnapHandle && potentialSnapHandle.position
104
+ ? this._getSnappedMouseEvent(event, potentialSnapHandle.position)
105
+ : event;
106
+ }
107
+ handleStartDragging(event) {
108
+ this._startDragSnapHandlePosition = (getPickedEditHandle(event.picks) || {}).position;
109
+ return this._handler.handleStartDragging(event);
110
+ }
111
+ handleStopDragging(event) {
112
+ // @ts-expect-error narrow event type
113
+ const modeActionSummary = this._handler.handleStopDragging(this._getSnapAwareEvent(event));
114
+ this._editHandlePicks = null;
115
+ return modeActionSummary;
116
+ }
117
+ getCursor(event) {
118
+ return this._handler.getCursor(event);
119
+ }
120
+ handlePointerMove(event) {
121
+ const { enableSnapping } = this._handler.getModeConfig() || {};
122
+ if (enableSnapping) {
123
+ this._editHandlePicks = this._getEditHandlePicks(event);
124
+ }
125
+ // @ts-expect-error narrow event type
126
+ const modeActionSummary = this._handler.handlePointerMove(this._getSnapAwareEvent(event));
127
+ const { editAction } = modeActionSummary;
128
+ if (editAction) {
129
+ this._updatePickedHandlePosition(editAction);
130
+ }
131
+ return modeActionSummary;
132
+ }
133
+ }
@@ -0,0 +1,11 @@
1
+ import { EditAction, ModeHandler } from './mode-handler';
2
+ import { ClickEvent, PointerMoveEvent } from '../edit-modes/types';
3
+ export declare class SplitPolygonHandler extends ModeHandler {
4
+ calculateMapCoords(clickSequence: any, mapCoords: any): any;
5
+ handleClick(event: ClickEvent): EditAction | null | undefined;
6
+ handlePointerMove({ mapCoords }: PointerMoveEvent): {
7
+ editAction: EditAction | null | undefined;
8
+ cancelMapPan: boolean;
9
+ };
10
+ splitPolygon(): EditAction;
11
+ }