@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,9 @@
1
+ import { StartDraggingEvent } from '../edit-modes/types';
2
+ import { EditAction } from './mode-handler';
3
+ import { TranslateHandler } from './translate-handler';
4
+ export declare class DuplicateHandler extends TranslateHandler {
5
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
6
+ getCursor({ isDragging }: {
7
+ isDragging: boolean;
8
+ }): string;
9
+ }
@@ -0,0 +1,19 @@
1
+ import { TranslateHandler } from './translate-handler';
2
+ // TODO edit-modes: delete handlers once EditMode fully implemented
3
+ export class DuplicateHandler extends TranslateHandler {
4
+ handleStartDragging(event) {
5
+ if (!this._isTranslatable) {
6
+ return null;
7
+ }
8
+ this._geometryBeforeTranslate = this.getSelectedFeaturesAsFeatureCollection();
9
+ return this._geometryBeforeTranslate
10
+ ? this.getAddManyFeaturesAction(this._geometryBeforeTranslate)
11
+ : null;
12
+ }
13
+ getCursor({ isDragging }) {
14
+ if (this._isTranslatable) {
15
+ return 'copy';
16
+ }
17
+ return isDragging ? 'grabbing' : 'grab';
18
+ }
19
+ }
@@ -0,0 +1,19 @@
1
+ import { Position } from '../geojson-types';
2
+ import { PointerMoveEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { EditAction } from './mode-handler';
4
+ import { ModifyHandler } from './modify-handler';
5
+ export declare class ElevationHandler extends ModifyHandler {
6
+ makeElevatedEvent<T extends PointerMoveEvent | StopDraggingEvent>(event: T, position: Position): T;
7
+ handlePointerMove(event: PointerMoveEvent): {
8
+ editAction: EditAction | null | undefined;
9
+ cancelMapPan: boolean;
10
+ };
11
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
12
+ getCursor(params: {
13
+ isDragging: boolean;
14
+ }): string;
15
+ static calculateElevationChangeWithViewport(viewport: any, { pointerDownScreenCoords, screenCoords, }: {
16
+ pointerDownScreenCoords: Position;
17
+ screenCoords: Position;
18
+ }): number;
19
+ }
@@ -0,0 +1,48 @@
1
+ import { getPickedEditHandle } from './mode-handler';
2
+ import { ModifyHandler } from './modify-handler';
3
+ function defaultCalculateElevationChange({ pointerDownScreenCoords, screenCoords, }) {
4
+ return 10 * (pointerDownScreenCoords[1] - screenCoords[1]);
5
+ }
6
+ // TODO edit-modes: delete handlers once EditMode fully implemented
7
+ export class ElevationHandler extends ModifyHandler {
8
+ makeElevatedEvent(event, position) {
9
+ if (!event.pointerDownScreenCoords) {
10
+ return event;
11
+ }
12
+ const { minElevation = 0, maxElevation = 20000, calculateElevationChange = defaultCalculateElevationChange, } = this._modeConfig || {};
13
+ // $FlowFixMe - really, I know it has something at index 2
14
+ let elevation = position.length === 3 ? position[2] : 0;
15
+ // calculateElevationChange is configurable becase (at this time) modes are not aware of the viewport
16
+ elevation += calculateElevationChange({
17
+ pointerDownScreenCoords: event.pointerDownScreenCoords,
18
+ screenCoords: event.screenCoords,
19
+ });
20
+ elevation = Math.min(elevation, maxElevation);
21
+ elevation = Math.max(elevation, minElevation);
22
+ return Object.assign({}, event, {
23
+ mapCoords: [position[0], position[1], elevation],
24
+ });
25
+ }
26
+ handlePointerMove(event) {
27
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
28
+ const position = editHandle ? editHandle.position : event.mapCoords;
29
+ return super.handlePointerMove(this.makeElevatedEvent(event, position));
30
+ }
31
+ handleStopDragging(event) {
32
+ const editHandle = getPickedEditHandle(event.picks);
33
+ const position = editHandle ? editHandle.position : event.mapCoords;
34
+ return super.handleStopDragging(this.makeElevatedEvent(event, position));
35
+ }
36
+ getCursor(params) {
37
+ let cursor = super.getCursor(params);
38
+ if (cursor === 'cell') {
39
+ cursor = 'ns-resize';
40
+ }
41
+ return cursor;
42
+ }
43
+ static calculateElevationChangeWithViewport(viewport, { pointerDownScreenCoords, screenCoords, }) {
44
+ // Source: https://gis.stackexchange.com/a/127949/111804
45
+ const metersPerPixel = (156543.03392 * Math.cos((viewport.latitude * Math.PI) / 180)) / Math.pow(2, viewport.zoom);
46
+ return (metersPerPixel * (pointerDownScreenCoords[1] - screenCoords[1])) / 2;
47
+ }
48
+ }
@@ -0,0 +1,18 @@
1
+ import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
2
+ import { EditAction } from './mode-handler';
3
+ import { ModifyHandler } from './modify-handler';
4
+ export declare class ExtrudeHandler extends ModifyHandler {
5
+ isPointAdded: boolean;
6
+ handlePointerMove(event: PointerMoveEvent): {
7
+ editAction: EditAction | null | undefined;
8
+ cancelMapPan: boolean;
9
+ };
10
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
11
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
12
+ coordinatesSize(positionIndexes: number[], featureIndex: number): number;
13
+ getBearing(p1: any, p2: any): number;
14
+ isOrthogonal(positionIndexes: number[], featureIndex: number, size: number): boolean;
15
+ nextPositionIndexes(positionIndexes: number[], size: number): number[];
16
+ prevPositionIndexes(positionIndexes: number[], size: number): number[];
17
+ getPointForPositionIndexes(positionIndexes: number[], featureIndex: number): any;
18
+ }
@@ -0,0 +1,176 @@
1
+ import bearing from '@turf/bearing';
2
+ import { generatePointsParallelToLinePoints } from '../utils';
3
+ import { getPickedEditHandle } from './mode-handler';
4
+ import { ModifyHandler } from './modify-handler';
5
+ // TODO edit-modes: delete handlers once EditMode fully implemented
6
+ export class ExtrudeHandler extends ModifyHandler {
7
+ isPointAdded = false;
8
+ handlePointerMove(event) {
9
+ this._lastPointerMovePicks = event.picks;
10
+ let editAction = null;
11
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
12
+ if (event.isDragging && editHandle) {
13
+ const size = this.coordinatesSize(editHandle.positionIndexes, editHandle.featureIndex);
14
+ const positionIndexes = this.isPointAdded
15
+ ? this.nextPositionIndexes(editHandle.positionIndexes, size)
16
+ : editHandle.positionIndexes;
17
+ // p1 and p1 are end points for edge
18
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), editHandle.featureIndex);
19
+ const p2 = this.getPointForPositionIndexes(positionIndexes, editHandle.featureIndex);
20
+ if (p1 && p2) {
21
+ // p3 and p4 are end points for moving (extruding) edge
22
+ const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);
23
+ const updatedData = this.getImmutableFeatureCollection()
24
+ .replacePosition(editHandle.featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)
25
+ .replacePosition(editHandle.featureIndex, positionIndexes, p3)
26
+ .getObject();
27
+ editAction = {
28
+ updatedData,
29
+ editType: 'extruding',
30
+ featureIndexes: [editHandle.featureIndex],
31
+ editContext: {
32
+ positionIndexes: this.nextPositionIndexes(editHandle.positionIndexes, size),
33
+ position: p3,
34
+ },
35
+ };
36
+ }
37
+ }
38
+ // Cancel map panning if pointer went down on an edit handle
39
+ const cancelMapPan = Boolean(editHandle);
40
+ return { editAction, cancelMapPan };
41
+ }
42
+ handleStartDragging(event) {
43
+ let editAction = null;
44
+ const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
45
+ const editHandle = getPickedEditHandle(event.picks);
46
+ if (selectedFeatureIndexes.length && editHandle && editHandle.type === 'intermediate') {
47
+ const size = this.coordinatesSize(editHandle.positionIndexes, editHandle.featureIndex);
48
+ // p1 and p1 are end points for edge
49
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(editHandle.positionIndexes, size), editHandle.featureIndex);
50
+ const p2 = this.getPointForPositionIndexes(editHandle.positionIndexes, editHandle.featureIndex);
51
+ if (p1 && p2) {
52
+ let updatedData = this.getImmutableFeatureCollection();
53
+ if (!this.isOrthogonal(editHandle.positionIndexes, editHandle.featureIndex, size)) {
54
+ updatedData = updatedData.addPosition(editHandle.featureIndex, editHandle.positionIndexes, p2);
55
+ }
56
+ if (!this.isOrthogonal(this.prevPositionIndexes(editHandle.positionIndexes, size), editHandle.featureIndex, size)) {
57
+ updatedData = updatedData.addPosition(editHandle.featureIndex, editHandle.positionIndexes, p1);
58
+ this.isPointAdded = true;
59
+ }
60
+ editAction = {
61
+ updatedData: updatedData.getObject(),
62
+ editType: 'startExtruding',
63
+ featureIndexes: [editHandle.featureIndex],
64
+ editContext: {
65
+ positionIndexes: editHandle.positionIndexes,
66
+ position: p1,
67
+ },
68
+ };
69
+ }
70
+ }
71
+ return editAction;
72
+ }
73
+ handleStopDragging(event) {
74
+ let editAction = null;
75
+ const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
76
+ const editHandle = getPickedEditHandle(event.picks);
77
+ if (selectedFeatureIndexes.length && editHandle) {
78
+ const size = this.coordinatesSize(editHandle.positionIndexes, editHandle.featureIndex);
79
+ const positionIndexes = this.isPointAdded
80
+ ? this.nextPositionIndexes(editHandle.positionIndexes, size)
81
+ : editHandle.positionIndexes;
82
+ // p1 and p1 are end points for edge
83
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), editHandle.featureIndex);
84
+ const p2 = this.getPointForPositionIndexes(positionIndexes, editHandle.featureIndex);
85
+ if (p1 && p2) {
86
+ // p3 and p4 are end points for new moved (extruded) edge
87
+ const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);
88
+ const updatedData = this.getImmutableFeatureCollection()
89
+ .replacePosition(editHandle.featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)
90
+ .replacePosition(editHandle.featureIndex, positionIndexes, p3)
91
+ .getObject();
92
+ editAction = {
93
+ updatedData,
94
+ editType: 'extruded',
95
+ featureIndexes: [editHandle.featureIndex],
96
+ editContext: {
97
+ positionIndexes: editHandle.positionIndexes,
98
+ position: p3,
99
+ },
100
+ };
101
+ }
102
+ }
103
+ this.isPointAdded = false;
104
+ return editAction;
105
+ }
106
+ coordinatesSize(positionIndexes, featureIndex) {
107
+ let size = 0;
108
+ const feature = this.getImmutableFeatureCollection().getObject().features[featureIndex];
109
+ const coordinates = feature.geometry.coordinates;
110
+ // for Multi polygons, length will be 3
111
+ if (positionIndexes.length === 3) {
112
+ const [a, b] = positionIndexes;
113
+ if (coordinates.length && coordinates[a].length) {
114
+ size = coordinates[a][b].length;
115
+ }
116
+ }
117
+ else {
118
+ const [b] = positionIndexes;
119
+ if (coordinates.length && coordinates[b].length) {
120
+ size = coordinates[b].length;
121
+ }
122
+ }
123
+ return size;
124
+ }
125
+ getBearing(p1, p2) {
126
+ const angle = bearing(p1, p2);
127
+ if (angle < 0) {
128
+ return Math.floor(360 + angle);
129
+ }
130
+ return Math.floor(angle);
131
+ }
132
+ isOrthogonal(positionIndexes, featureIndex, size) {
133
+ if (positionIndexes[positionIndexes.length - 1] === size - 1) {
134
+ positionIndexes[positionIndexes.length - 1] = 0;
135
+ }
136
+ const prevPoint = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), featureIndex);
137
+ const nextPoint = this.getPointForPositionIndexes(this.nextPositionIndexes(positionIndexes, size), featureIndex);
138
+ const currentPoint = this.getPointForPositionIndexes(positionIndexes, featureIndex);
139
+ const prevAngle = this.getBearing(currentPoint, prevPoint);
140
+ const nextAngle = this.getBearing(currentPoint, nextPoint);
141
+ return [89, 90, 91, 269, 270, 271].includes(Math.abs(prevAngle - nextAngle));
142
+ }
143
+ nextPositionIndexes(positionIndexes, size) {
144
+ const next = [...positionIndexes];
145
+ if (next.length) {
146
+ next[next.length - 1] = next[next.length - 1] === size - 1 ? 0 : next[next.length - 1] + 1;
147
+ }
148
+ return next;
149
+ }
150
+ prevPositionIndexes(positionIndexes, size) {
151
+ const prev = [...positionIndexes];
152
+ if (prev.length) {
153
+ prev[prev.length - 1] = prev[prev.length - 1] === 0 ? size - 2 : prev[prev.length - 1] - 1;
154
+ }
155
+ return prev;
156
+ }
157
+ getPointForPositionIndexes(positionIndexes, featureIndex) {
158
+ let p1;
159
+ const feature = this.getImmutableFeatureCollection().getObject().features[featureIndex];
160
+ const coordinates = feature.geometry.coordinates;
161
+ // for Multi polygons, length will be 3
162
+ if (positionIndexes.length === 3) {
163
+ const [a, b, c] = positionIndexes;
164
+ if (coordinates.length && coordinates[a].length) {
165
+ p1 = coordinates[a][b][c];
166
+ }
167
+ }
168
+ else {
169
+ const [b, c] = positionIndexes;
170
+ if (coordinates.length && coordinates[b].length) {
171
+ p1 = coordinates[b][c];
172
+ }
173
+ }
174
+ return p1;
175
+ }
176
+ }
@@ -0,0 +1,61 @@
1
+ import { FeatureCollection, Feature, Polygon, Geometry, Position } from '../geojson-types';
2
+ import { ClickEvent, Pick, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
3
+ import { ImmutableFeatureCollection } from '../edit-modes/immutable-feature-collection';
4
+ export type EditHandleType = 'existing' | 'intermediate' | 'snap';
5
+ export type EditHandle = {
6
+ position: Position;
7
+ positionIndexes: number[];
8
+ featureIndex: number;
9
+ type: EditHandleType;
10
+ };
11
+ export type EditAction = {
12
+ updatedData: FeatureCollection;
13
+ editType: string;
14
+ featureIndexes: number[];
15
+ editContext: any;
16
+ };
17
+ export declare class ModeHandler {
18
+ featureCollection: ImmutableFeatureCollection;
19
+ _tentativeFeature: Feature | null | undefined;
20
+ _modeConfig: any;
21
+ _selectedFeatureIndexes: number[];
22
+ _clickSequence: Position[];
23
+ constructor(featureCollection?: FeatureCollection);
24
+ getFeatureCollection(): FeatureCollection;
25
+ getImmutableFeatureCollection(): ImmutableFeatureCollection;
26
+ getSelectedFeature(): Feature | null | undefined;
27
+ getSelectedGeometry(): Geometry | null | undefined;
28
+ getSelectedFeaturesAsFeatureCollection(): FeatureCollection;
29
+ setFeatureCollection(featureCollection: FeatureCollection): void;
30
+ getModeConfig(): any;
31
+ setModeConfig(modeConfig: any): void;
32
+ getSelectedFeatureIndexes(): number[];
33
+ setSelectedFeatureIndexes(indexes: number[]): void;
34
+ getClickSequence(): Position[];
35
+ resetClickSequence(): void;
36
+ getTentativeFeature(): Feature | null | undefined;
37
+ _setTentativeFeature(tentativeFeature: Feature | null | undefined): void;
38
+ /**
39
+ * Returns a flat array of positions for the given feature along with their indexes into the feature's geometry's coordinates.
40
+ *
41
+ * @param featureIndex The index of the feature to get edit handles
42
+ */
43
+ getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): EditHandle[];
44
+ getCursor({ isDragging }: {
45
+ isDragging: boolean;
46
+ }): string;
47
+ isSelectionPicked(picks: Pick[]): boolean;
48
+ getAddFeatureAction(geometry: Geometry): EditAction;
49
+ getAddManyFeaturesAction(featureCollection: FeatureCollection): EditAction;
50
+ getAddFeatureOrBooleanPolygonAction(geometry: Polygon): EditAction | null | undefined;
51
+ handleClick(event: ClickEvent): EditAction | null | undefined;
52
+ handlePointerMove(event: PointerMoveEvent): {
53
+ editAction: EditAction | null | undefined;
54
+ cancelMapPan: boolean;
55
+ };
56
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
57
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
58
+ }
59
+ export declare function getPickedEditHandle(picks: any[] | null | undefined): EditHandle | null | undefined;
60
+ export declare function getIntermediatePosition(position1: Position, position2: Position): Position;
61
+ export declare function getEditHandlesForGeometry(geometry: Geometry, featureIndex: number, editHandleType?: EditHandleType): EditHandle[];
@@ -0,0 +1,286 @@
1
+ // TODO edit-modes: delete handlers once EditMode fully implemented
2
+ import turfUnion from '@turf/union';
3
+ import turfDifference from '@turf/difference';
4
+ import turfIntersect from '@turf/intersect';
5
+ import { ImmutableFeatureCollection } from '../edit-modes/immutable-feature-collection';
6
+ export class ModeHandler {
7
+ // TODO: add underscore
8
+ featureCollection = undefined;
9
+ _tentativeFeature;
10
+ _modeConfig = null;
11
+ _selectedFeatureIndexes = [];
12
+ _clickSequence = [];
13
+ constructor(featureCollection) {
14
+ if (featureCollection) {
15
+ this.setFeatureCollection(featureCollection);
16
+ }
17
+ }
18
+ getFeatureCollection() {
19
+ return this.featureCollection.getObject();
20
+ }
21
+ getImmutableFeatureCollection() {
22
+ return this.featureCollection;
23
+ }
24
+ getSelectedFeature() {
25
+ if (this._selectedFeatureIndexes.length === 1) {
26
+ return this.featureCollection.getObject().features[this._selectedFeatureIndexes[0]];
27
+ }
28
+ return null;
29
+ }
30
+ getSelectedGeometry() {
31
+ const feature = this.getSelectedFeature();
32
+ if (feature) {
33
+ return feature.geometry;
34
+ }
35
+ return null;
36
+ }
37
+ getSelectedFeaturesAsFeatureCollection() {
38
+ const { features } = this.featureCollection.getObject();
39
+ const selectedFeatures = this.getSelectedFeatureIndexes().map((selectedIndex) => features[selectedIndex]);
40
+ return {
41
+ type: 'FeatureCollection',
42
+ features: selectedFeatures,
43
+ };
44
+ }
45
+ setFeatureCollection(featureCollection) {
46
+ this.featureCollection = new ImmutableFeatureCollection(featureCollection);
47
+ }
48
+ getModeConfig() {
49
+ return this._modeConfig;
50
+ }
51
+ setModeConfig(modeConfig) {
52
+ if (this._modeConfig === modeConfig) {
53
+ return;
54
+ }
55
+ this._modeConfig = modeConfig;
56
+ this._setTentativeFeature(null);
57
+ }
58
+ getSelectedFeatureIndexes() {
59
+ return this._selectedFeatureIndexes;
60
+ }
61
+ setSelectedFeatureIndexes(indexes) {
62
+ if (this._selectedFeatureIndexes === indexes) {
63
+ return;
64
+ }
65
+ this._selectedFeatureIndexes = indexes;
66
+ this._setTentativeFeature(null);
67
+ }
68
+ getClickSequence() {
69
+ return this._clickSequence;
70
+ }
71
+ resetClickSequence() {
72
+ this._clickSequence = [];
73
+ }
74
+ getTentativeFeature() {
75
+ return this._tentativeFeature;
76
+ }
77
+ // TODO: remove the underscore
78
+ _setTentativeFeature(tentativeFeature) {
79
+ this._tentativeFeature = tentativeFeature;
80
+ if (!tentativeFeature) {
81
+ // Reset the click sequence
82
+ this._clickSequence = [];
83
+ }
84
+ }
85
+ /**
86
+ * Returns a flat array of positions for the given feature along with their indexes into the feature's geometry's coordinates.
87
+ *
88
+ * @param featureIndex The index of the feature to get edit handles
89
+ */
90
+ getEditHandles(picks, mapCoords) {
91
+ return [];
92
+ }
93
+ getCursor({ isDragging }) {
94
+ return 'cell';
95
+ }
96
+ isSelectionPicked(picks) {
97
+ if (!picks.length)
98
+ return false;
99
+ const pickedIndexes = picks.map(({ index }) => index);
100
+ const selectedFeatureIndexes = this.getSelectedFeatureIndexes();
101
+ return selectedFeatureIndexes.some((index) => pickedIndexes.includes(index));
102
+ }
103
+ getAddFeatureAction(geometry) {
104
+ // Unsure why flow can't deal with Geometry type, but there I fixed it
105
+ const geometryAsAny = geometry;
106
+ const updatedData = this.getImmutableFeatureCollection()
107
+ .addFeature({
108
+ type: 'Feature',
109
+ properties: {},
110
+ geometry: geometryAsAny,
111
+ })
112
+ .getObject();
113
+ return {
114
+ updatedData,
115
+ editType: 'addFeature',
116
+ featureIndexes: [updatedData.features.length - 1],
117
+ editContext: {
118
+ featureIndexes: [updatedData.features.length - 1],
119
+ },
120
+ };
121
+ }
122
+ getAddManyFeaturesAction(featureCollection) {
123
+ const features = featureCollection.features;
124
+ let updatedData = this.getImmutableFeatureCollection();
125
+ const initialIndex = updatedData.getObject().features.length;
126
+ const updatedIndexes = [];
127
+ for (const feature of features) {
128
+ const { properties, geometry } = feature;
129
+ const geometryAsAny = geometry;
130
+ updatedData = updatedData.addFeature({
131
+ type: 'Feature',
132
+ properties,
133
+ geometry: geometryAsAny,
134
+ });
135
+ updatedIndexes.push(initialIndex + updatedIndexes.length);
136
+ }
137
+ return {
138
+ updatedData: updatedData.getObject(),
139
+ editType: 'addFeature',
140
+ featureIndexes: updatedIndexes,
141
+ editContext: {
142
+ featureIndexes: updatedIndexes,
143
+ },
144
+ };
145
+ }
146
+ getAddFeatureOrBooleanPolygonAction(geometry) {
147
+ const selectedFeature = this.getSelectedFeature();
148
+ const modeConfig = this.getModeConfig();
149
+ if (modeConfig && modeConfig.booleanOperation) {
150
+ if (!selectedFeature ||
151
+ (selectedFeature.geometry.type !== 'Polygon' &&
152
+ selectedFeature.geometry.type !== 'MultiPolygon')) {
153
+ // eslint-disable-next-line no-console,no-undef
154
+ console.warn('booleanOperation only supported for single Polygon or MultiPolygon selection');
155
+ return null;
156
+ }
157
+ const feature = {
158
+ type: 'Feature',
159
+ geometry,
160
+ };
161
+ let updatedGeometry;
162
+ if (modeConfig.booleanOperation === 'union') {
163
+ // @ts-expect-error turf types diff
164
+ updatedGeometry = turfUnion(selectedFeature, feature);
165
+ }
166
+ else if (modeConfig.booleanOperation === 'difference') {
167
+ // @ts-expect-error turf type diff
168
+ updatedGeometry = turfDifference(selectedFeature, feature);
169
+ }
170
+ else if (modeConfig.booleanOperation === 'intersection') {
171
+ // @ts-expect-error turf type diff
172
+ updatedGeometry = turfIntersect(selectedFeature, feature);
173
+ }
174
+ else {
175
+ // eslint-disable-next-line no-console,no-undef
176
+ console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`);
177
+ return null;
178
+ }
179
+ if (!updatedGeometry) {
180
+ // eslint-disable-next-line no-console,no-undef
181
+ console.warn('Canceling edit. Boolean operation erased entire polygon.');
182
+ return null;
183
+ }
184
+ const featureIndex = this.getSelectedFeatureIndexes()[0];
185
+ const updatedData = this.getImmutableFeatureCollection()
186
+ .replaceGeometry(featureIndex, updatedGeometry.geometry)
187
+ .getObject();
188
+ const editAction = {
189
+ updatedData,
190
+ editType: 'unionGeometry',
191
+ featureIndexes: [featureIndex],
192
+ editContext: {
193
+ featureIndexes: [featureIndex],
194
+ },
195
+ };
196
+ return editAction;
197
+ }
198
+ return this.getAddFeatureAction(geometry);
199
+ }
200
+ handleClick(event) {
201
+ this._clickSequence.push(event.mapCoords);
202
+ return null;
203
+ }
204
+ handlePointerMove(event) {
205
+ return { editAction: null, cancelMapPan: false };
206
+ }
207
+ handleStartDragging(event) {
208
+ return null;
209
+ }
210
+ handleStopDragging(event) {
211
+ return null;
212
+ }
213
+ }
214
+ export function getPickedEditHandle(picks) {
215
+ const info = picks && picks.find((pick) => pick.isEditingHandle);
216
+ if (info) {
217
+ return info.object;
218
+ }
219
+ return null;
220
+ }
221
+ export function getIntermediatePosition(position1, position2) {
222
+ const intermediatePosition = [
223
+ (position1[0] + position2[0]) / 2.0,
224
+ (position1[1] + position2[1]) / 2.0,
225
+ ];
226
+ return intermediatePosition;
227
+ }
228
+ export function getEditHandlesForGeometry(geometry, featureIndex, editHandleType = 'existing') {
229
+ let handles = [];
230
+ switch (geometry.type) {
231
+ case 'Point':
232
+ // positions are not nested
233
+ handles = [
234
+ {
235
+ position: geometry.coordinates,
236
+ positionIndexes: [],
237
+ featureIndex,
238
+ type: editHandleType,
239
+ },
240
+ ];
241
+ break;
242
+ case 'MultiPoint':
243
+ case 'LineString':
244
+ // positions are nested 1 level
245
+ handles = handles.concat(getEditHandlesForCoordinates(geometry.coordinates, [], featureIndex, editHandleType));
246
+ break;
247
+ case 'Polygon':
248
+ case 'MultiLineString':
249
+ // positions are nested 2 levels
250
+ for (let a = 0; a < geometry.coordinates.length; a++) {
251
+ handles = handles.concat(getEditHandlesForCoordinates(geometry.coordinates[a], [a], featureIndex, editHandleType));
252
+ if (geometry.type === 'Polygon') {
253
+ // Don't repeat the first/last handle for Polygons
254
+ handles = handles.slice(0, -1);
255
+ }
256
+ }
257
+ break;
258
+ case 'MultiPolygon':
259
+ // positions are nested 3 levels
260
+ for (let a = 0; a < geometry.coordinates.length; a++) {
261
+ for (let b = 0; b < geometry.coordinates[a].length; b++) {
262
+ handles = handles.concat(getEditHandlesForCoordinates(geometry.coordinates[a][b], [a, b], featureIndex, editHandleType));
263
+ // Don't repeat the first/last handle for Polygons
264
+ handles = handles.slice(0, -1);
265
+ }
266
+ }
267
+ break;
268
+ default:
269
+ // @ts-expect-error unexpected case
270
+ throw Error(`Unhandled geometry type: ${geometry.type}`);
271
+ }
272
+ return handles;
273
+ }
274
+ function getEditHandlesForCoordinates(coordinates, positionIndexPrefix, featureIndex, editHandleType = 'existing') {
275
+ const editHandles = [];
276
+ for (let i = 0; i < coordinates.length; i++) {
277
+ const position = coordinates[i];
278
+ editHandles.push({
279
+ position,
280
+ positionIndexes: [...positionIndexPrefix, i],
281
+ featureIndex,
282
+ type: editHandleType,
283
+ });
284
+ }
285
+ return editHandles;
286
+ }
@@ -0,0 +1,19 @@
1
+ import { Position, FeatureOf, Point, LineString } from '../geojson-types';
2
+ import { NearestPointType } from '../utils';
3
+ import { ClickEvent, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent } from '../edit-modes/types';
4
+ import { EditAction, EditHandle, ModeHandler } from './mode-handler';
5
+ export declare class ModifyHandler extends ModeHandler {
6
+ _lastPointerMovePicks: any;
7
+ getEditHandles(picks?: Array<Record<string, any>>, mapCoords?: Position): EditHandle[];
8
+ nearestPointOnLine(line: FeatureOf<LineString>, inPoint: FeatureOf<Point>): NearestPointType;
9
+ handleClick(event: ClickEvent): EditAction | null | undefined;
10
+ handlePointerMove(event: PointerMoveEvent): {
11
+ editAction: EditAction | null | undefined;
12
+ cancelMapPan: boolean;
13
+ };
14
+ handleStartDragging(event: StartDraggingEvent): EditAction | null | undefined;
15
+ handleStopDragging(event: StopDraggingEvent): EditAction | null | undefined;
16
+ getCursor({ isDragging }: {
17
+ isDragging: boolean;
18
+ }): string;
19
+ }