@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,7 @@
1
+ import { StartDraggingEvent, ModeProps } from './types';
2
+ import { FeatureCollection } from '../geojson-types';
3
+ import { TranslateMode } from './translate-mode';
4
+ export declare class DuplicateMode extends TranslateMode {
5
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
6
+ updateCursor(props: ModeProps<FeatureCollection>): void;
7
+ }
@@ -0,0 +1,17 @@
1
+ import { TranslateMode } from './translate-mode';
2
+ export class DuplicateMode extends TranslateMode {
3
+ handleStartDragging(event, props) {
4
+ super.handleStartDragging(event, props);
5
+ if (this._geometryBeforeTranslate) {
6
+ props.onEdit(this.getAddManyFeaturesAction(this._geometryBeforeTranslate, props.data));
7
+ }
8
+ }
9
+ updateCursor(props) {
10
+ if (this._isTranslatable) {
11
+ props.onUpdateCursor('copy');
12
+ }
13
+ else {
14
+ props.onUpdateCursor(null);
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,11 @@
1
+ import { ClickEvent, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, Tooltip, ModeProps } from './types';
2
+ export interface EditMode<TData, TGuides> {
3
+ handleClick(event: ClickEvent, props: ModeProps<TData>): void;
4
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<TData>): void;
5
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<TData>): void;
6
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<TData>): void;
7
+ handleDragging(event: DraggingEvent, props: ModeProps<TData>): void;
8
+ handleKeyUp(event: KeyboardEvent, props: ModeProps<TData>): void;
9
+ getGuides(props: ModeProps<TData>): TGuides | undefined;
10
+ getTooltips(props: ModeProps<TData>): Tooltip[];
11
+ }
@@ -0,0 +1,2 @@
1
+ /* istanbul ignore file */
2
+ export {};
@@ -0,0 +1,13 @@
1
+ import { ModeProps, PointerMoveEvent, StopDraggingEvent } from './types';
2
+ import { Position, FeatureCollection } from '../geojson-types';
3
+ import { ModifyMode } from './modify-mode';
4
+ export declare class ElevationMode extends ModifyMode {
5
+ makeElevatedEvent(event: PointerMoveEvent | StopDraggingEvent, position: Position, props: ModeProps<FeatureCollection>): Record<string, any>;
6
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
7
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
8
+ getCursor(event: PointerMoveEvent): string | null | undefined;
9
+ static calculateElevationChangeWithViewport(viewport: any, { pointerDownScreenCoords, screenCoords, }: {
10
+ pointerDownScreenCoords: Position;
11
+ screenCoords: Position;
12
+ }): number;
13
+ }
@@ -0,0 +1,49 @@
1
+ import { getPickedEditHandle } from './utils';
2
+ import { ModifyMode } from './modify-mode';
3
+ function defaultCalculateElevationChange({ pointerDownScreenCoords, screenCoords, }) {
4
+ return 10 * (pointerDownScreenCoords[1] - screenCoords[1]);
5
+ }
6
+ export class ElevationMode extends ModifyMode {
7
+ makeElevatedEvent(event, position, props) {
8
+ const { minElevation = 0, maxElevation = 20000, calculateElevationChange = defaultCalculateElevationChange, } = props.modeConfig || {};
9
+ if (!event.pointerDownScreenCoords) {
10
+ return event;
11
+ }
12
+ // $FlowFixMe - really, I know it has something at index 2
13
+ let elevation = position.length === 3 ? position[2] : 0;
14
+ // calculateElevationChange is configurable because (at this time) modes are not aware of the viewport
15
+ elevation += calculateElevationChange({
16
+ pointerDownScreenCoords: event.pointerDownScreenCoords,
17
+ screenCoords: event.screenCoords,
18
+ });
19
+ elevation = Math.min(elevation, maxElevation);
20
+ elevation = Math.max(elevation, minElevation);
21
+ return Object.assign({}, event, {
22
+ mapCoords: [position[0], position[1], elevation],
23
+ });
24
+ }
25
+ handlePointerMove(event, props) {
26
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
27
+ const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;
28
+ // @ts-expect-error return type too wide
29
+ super.handlePointerMove(this.makeElevatedEvent(event, position, props), props);
30
+ }
31
+ handleStopDragging(event, props) {
32
+ const editHandle = getPickedEditHandle(event.picks);
33
+ const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;
34
+ // @ts-expect-error return type too wide
35
+ super.handleStopDragging(this.makeElevatedEvent(event, position, props), props);
36
+ }
37
+ getCursor(event) {
38
+ let cursor = super.getCursor(event);
39
+ if (cursor === 'cell') {
40
+ cursor = 'ns-resize';
41
+ }
42
+ return cursor;
43
+ }
44
+ static calculateElevationChangeWithViewport(viewport, { pointerDownScreenCoords, screenCoords, }) {
45
+ // Source: https://gis.stackexchange.com/a/127949/111804
46
+ const metersPerPixel = (156543.03392 * Math.cos((viewport.latitude * Math.PI) / 180)) / Math.pow(2, viewport.zoom);
47
+ return (metersPerPixel * (pointerDownScreenCoords[1] - screenCoords[1])) / 2;
48
+ }
49
+ }
@@ -0,0 +1,9 @@
1
+ import { LineString, FeatureCollection } from '../geojson-types';
2
+ import { ClickEvent, PointerMoveEvent, ModeProps, GuideFeatureCollection } from './types';
3
+ import { GeoJsonEditMode } from './geojson-edit-mode';
4
+ export declare class ExtendLineStringMode extends GeoJsonEditMode {
5
+ getSingleSelectedLineString(props: ModeProps<FeatureCollection>): LineString | null | undefined;
6
+ handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void;
7
+ getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection;
8
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
9
+ }
@@ -0,0 +1,72 @@
1
+ import { GeoJsonEditMode } from './geojson-edit-mode';
2
+ import { ImmutableFeatureCollection } from './immutable-feature-collection';
3
+ export class ExtendLineStringMode extends GeoJsonEditMode {
4
+ getSingleSelectedLineString(props) {
5
+ const selectedGeometry = this.getSelectedGeometry(props);
6
+ if (selectedGeometry && selectedGeometry.type === 'LineString') {
7
+ return selectedGeometry;
8
+ }
9
+ return null;
10
+ }
11
+ handleClick(event, props) {
12
+ const { selectedIndexes } = props;
13
+ const selectedLineString = this.getSingleSelectedLineString(props);
14
+ if (!selectedLineString) {
15
+ console.warn(`ExtendLineStringMode only supported for single LineString selection`); // eslint-disable-line
16
+ return;
17
+ }
18
+ // Extend the LineString
19
+ let positionIndexes = [selectedLineString.coordinates.length];
20
+ const modeConfig = props.modeConfig;
21
+ if (modeConfig && modeConfig.drawAtFront) {
22
+ positionIndexes = [0];
23
+ }
24
+ const featureIndex = selectedIndexes[0];
25
+ const updatedData = new ImmutableFeatureCollection(props.data)
26
+ .addPosition(featureIndex, positionIndexes, event.mapCoords)
27
+ .getObject();
28
+ props.onEdit({
29
+ updatedData,
30
+ editType: 'addPosition',
31
+ editContext: {
32
+ featureIndexes: [featureIndex],
33
+ positionIndexes,
34
+ position: event.mapCoords,
35
+ },
36
+ });
37
+ }
38
+ getGuides(props) {
39
+ const guides = {
40
+ type: 'FeatureCollection',
41
+ features: [],
42
+ };
43
+ const selectedLineString = this.getSingleSelectedLineString(props);
44
+ if (!selectedLineString) {
45
+ return guides;
46
+ }
47
+ const mapCoords = props.lastPointerMoveEvent && props.lastPointerMoveEvent.mapCoords;
48
+ // Draw an extension line starting from one end of the selected LineString to the cursor
49
+ let startPosition = null;
50
+ const { modeConfig } = props;
51
+ if (modeConfig && modeConfig.drawAtFront) {
52
+ startPosition = selectedLineString.coordinates[0];
53
+ }
54
+ else {
55
+ startPosition = selectedLineString.coordinates[selectedLineString.coordinates.length - 1];
56
+ }
57
+ guides.features.push({
58
+ type: 'Feature',
59
+ properties: {
60
+ guideType: 'tentative',
61
+ },
62
+ geometry: {
63
+ type: 'LineString',
64
+ coordinates: [startPosition, mapCoords],
65
+ },
66
+ });
67
+ return guides;
68
+ }
69
+ handlePointerMove(event, props) {
70
+ props.onUpdateCursor('cell');
71
+ }
72
+ }
@@ -0,0 +1,15 @@
1
+ import { FeatureCollection } from '../geojson-types';
2
+ import { ModeProps, StartDraggingEvent, StopDraggingEvent, DraggingEvent } from './types';
3
+ import { ModifyMode } from './modify-mode';
4
+ export declare class ExtrudeMode extends ModifyMode {
5
+ isPointAdded: boolean;
6
+ handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void;
7
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
8
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
9
+ coordinatesSize(positionIndexes: number[] | null | undefined, featureIndex: number, { features }: FeatureCollection): number;
10
+ getBearing(p1: any, p2: any): number;
11
+ isOrthogonal(positionIndexes: number[] | null | undefined, featureIndex: number, size: number, features: FeatureCollection): boolean;
12
+ nextPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[];
13
+ prevPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[];
14
+ getPointForPositionIndexes(positionIndexes: number[] | null | undefined, featureIndex: number, { features }: FeatureCollection): any;
15
+ }
@@ -0,0 +1,186 @@
1
+ import bearing from '@turf/bearing';
2
+ import { generatePointsParallelToLinePoints, getPickedEditHandle, getPickedIntermediateEditHandle, } from './utils';
3
+ import { ModifyMode } from './modify-mode';
4
+ import { ImmutableFeatureCollection } from './immutable-feature-collection';
5
+ export class ExtrudeMode extends ModifyMode {
6
+ // this mode is busted =(
7
+ isPointAdded = false;
8
+ handleDragging(event, props) {
9
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
10
+ if (editHandle) {
11
+ const { featureIndex } = editHandle.properties;
12
+ let { positionIndexes } = editHandle.properties;
13
+ const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);
14
+ positionIndexes = this.isPointAdded
15
+ ? this.nextPositionIndexes(positionIndexes, size)
16
+ : positionIndexes;
17
+ // p1 and p1 are end points for edge
18
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), featureIndex, props.data);
19
+ const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);
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 = new ImmutableFeatureCollection(props.data)
24
+ .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)
25
+ .replacePosition(featureIndex, positionIndexes, p3)
26
+ .getObject();
27
+ props.onEdit({
28
+ updatedData,
29
+ editType: 'extruding',
30
+ editContext: {
31
+ featureIndexes: [featureIndex],
32
+ positionIndexes: this.nextPositionIndexes(positionIndexes, size),
33
+ position: p3,
34
+ },
35
+ });
36
+ event.cancelPan();
37
+ }
38
+ }
39
+ }
40
+ handleStartDragging(event, props) {
41
+ const selectedFeatureIndexes = props.selectedIndexes;
42
+ const editHandle = getPickedIntermediateEditHandle(event.picks);
43
+ if (selectedFeatureIndexes.length && editHandle) {
44
+ const { positionIndexes, featureIndex } = editHandle.properties;
45
+ const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);
46
+ // p1 and p1 are end points for edge
47
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), featureIndex, props.data);
48
+ const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);
49
+ if (p1 && p2) {
50
+ let updatedData = new ImmutableFeatureCollection(props.data);
51
+ if (!this.isOrthogonal(positionIndexes, featureIndex, size, props.data)) {
52
+ updatedData = updatedData.addPosition(featureIndex, positionIndexes, p2);
53
+ }
54
+ if (!this.isOrthogonal(this.prevPositionIndexes(positionIndexes, size), featureIndex, size, props.data)) {
55
+ updatedData = updatedData.addPosition(featureIndex, positionIndexes, p1);
56
+ this.isPointAdded = true;
57
+ }
58
+ props.onEdit({
59
+ updatedData: updatedData.getObject(),
60
+ editType: 'startExtruding',
61
+ editContext: {
62
+ featureIndexes: [featureIndex],
63
+ positionIndexes,
64
+ position: p1,
65
+ },
66
+ });
67
+ }
68
+ }
69
+ }
70
+ handleStopDragging(event, props) {
71
+ const selectedFeatureIndexes = props.selectedIndexes;
72
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
73
+ if (selectedFeatureIndexes.length && editHandle) {
74
+ const { featureIndex } = editHandle.properties;
75
+ let { positionIndexes } = editHandle.properties;
76
+ const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);
77
+ positionIndexes = this.isPointAdded
78
+ ? this.nextPositionIndexes(positionIndexes, size)
79
+ : positionIndexes;
80
+ // p1 and p1 are end points for edge
81
+ const p1 = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), featureIndex, props.data);
82
+ const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);
83
+ if (p1 && p2) {
84
+ // p3 and p4 are end points for new moved (extruded) edge
85
+ const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);
86
+ const updatedData = new ImmutableFeatureCollection(props.data)
87
+ .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)
88
+ .replacePosition(featureIndex, positionIndexes, p3)
89
+ .getObject();
90
+ props.onEdit({
91
+ updatedData,
92
+ editType: 'extruded',
93
+ editContext: {
94
+ featureIndexes: [featureIndex],
95
+ positionIndexes,
96
+ position: p3,
97
+ },
98
+ });
99
+ }
100
+ }
101
+ this.isPointAdded = false;
102
+ }
103
+ coordinatesSize(positionIndexes, featureIndex, { features }) {
104
+ let size = 0;
105
+ if (Array.isArray(positionIndexes)) {
106
+ const feature = features[featureIndex];
107
+ const coordinates = feature.geometry.coordinates;
108
+ // for Multi polygons, length will be 3
109
+ if (positionIndexes.length === 3) {
110
+ const [a, b] = positionIndexes;
111
+ if (coordinates.length && coordinates[a].length) {
112
+ size = coordinates[a][b].length;
113
+ }
114
+ }
115
+ else {
116
+ const [b] = positionIndexes;
117
+ if (coordinates.length && coordinates[b].length) {
118
+ size = coordinates[b].length;
119
+ }
120
+ }
121
+ }
122
+ return size;
123
+ }
124
+ getBearing(p1, p2) {
125
+ const angle = bearing(p1, p2);
126
+ if (angle < 0) {
127
+ return Math.floor(360 + angle);
128
+ }
129
+ return Math.floor(angle);
130
+ }
131
+ isOrthogonal(positionIndexes, featureIndex, size, features) {
132
+ if (!Array.isArray(positionIndexes)) {
133
+ return false;
134
+ }
135
+ if (positionIndexes[positionIndexes.length - 1] === size - 1) {
136
+ positionIndexes[positionIndexes.length - 1] = 0;
137
+ }
138
+ const prevPoint = this.getPointForPositionIndexes(this.prevPositionIndexes(positionIndexes, size), featureIndex, features);
139
+ const nextPoint = this.getPointForPositionIndexes(this.nextPositionIndexes(positionIndexes, size), featureIndex, features);
140
+ const currentPoint = this.getPointForPositionIndexes(positionIndexes, featureIndex, features);
141
+ const prevAngle = this.getBearing(currentPoint, prevPoint);
142
+ const nextAngle = this.getBearing(currentPoint, nextPoint);
143
+ return [89, 90, 91, 269, 270, 271].includes(Math.abs(prevAngle - nextAngle));
144
+ }
145
+ nextPositionIndexes(positionIndexes, size) {
146
+ if (!Array.isArray(positionIndexes)) {
147
+ return [];
148
+ }
149
+ const next = [...positionIndexes];
150
+ if (next.length) {
151
+ next[next.length - 1] = next[next.length - 1] === size - 1 ? 0 : next[next.length - 1] + 1;
152
+ }
153
+ return next;
154
+ }
155
+ prevPositionIndexes(positionIndexes, size) {
156
+ if (!Array.isArray(positionIndexes)) {
157
+ return [];
158
+ }
159
+ const prev = [...positionIndexes];
160
+ if (prev.length) {
161
+ prev[prev.length - 1] = prev[prev.length - 1] === 0 ? size - 2 : prev[prev.length - 1] - 1;
162
+ }
163
+ return prev;
164
+ }
165
+ getPointForPositionIndexes(positionIndexes, featureIndex, { features }) {
166
+ let p1;
167
+ if (Array.isArray(positionIndexes)) {
168
+ const feature = features[featureIndex];
169
+ const coordinates = feature.geometry.coordinates;
170
+ // for Multi polygons, length will be 3
171
+ if (positionIndexes.length === 3) {
172
+ const [a, b, c] = positionIndexes;
173
+ if (coordinates.length && coordinates[a].length) {
174
+ p1 = coordinates[a][b][c];
175
+ }
176
+ }
177
+ else {
178
+ const [b, c] = positionIndexes;
179
+ if (coordinates.length && coordinates[b].length) {
180
+ p1 = coordinates[b][c];
181
+ }
182
+ }
183
+ }
184
+ return p1;
185
+ }
186
+ }
@@ -0,0 +1,33 @@
1
+ import { EditAction, ClickEvent, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, Pick, Tooltip, ModeProps, GuideFeatureCollection, TentativeFeature } from './types';
2
+ import { FeatureCollection, Feature, Polygon, Geometry, Position } from '../geojson-types';
3
+ import { EditMode } from './edit-mode';
4
+ export type GeoJsonEditAction = EditAction<FeatureCollection>;
5
+ export type GeoJsonEditModeType = EditMode<FeatureCollection, FeatureCollection>;
6
+ export interface GeoJsonEditModeConstructor {
7
+ new (): GeoJsonEditModeType;
8
+ }
9
+ export declare class GeoJsonEditMode implements EditMode<FeatureCollection, GuideFeatureCollection> {
10
+ _clickSequence: Position[];
11
+ getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection;
12
+ getTooltips(props: ModeProps<FeatureCollection>): Tooltip[];
13
+ getSelectedFeature(props: ModeProps<FeatureCollection>): Feature | null | undefined;
14
+ getSelectedGeometry(props: ModeProps<FeatureCollection>): Geometry | null | undefined;
15
+ getSelectedFeaturesAsFeatureCollection(props: ModeProps<FeatureCollection>): FeatureCollection;
16
+ getClickSequence(): Position[];
17
+ addClickSequence({ mapCoords }: ClickEvent): void;
18
+ resetClickSequence(): void;
19
+ getTentativeGuide(props: ModeProps<FeatureCollection>): TentativeFeature | null | undefined;
20
+ isSelectionPicked(picks: Pick[], props: ModeProps<FeatureCollection>): boolean;
21
+ rewindPolygon(feature: Feature): Feature;
22
+ getAddFeatureAction(featureOrGeometry: Geometry | Feature, features: FeatureCollection): GeoJsonEditAction;
23
+ getAddManyFeaturesAction({ features: featuresToAdd }: FeatureCollection, features: FeatureCollection): GeoJsonEditAction;
24
+ getAddFeatureOrBooleanPolygonAction(featureOrGeometry: Polygon | Feature, props: ModeProps<FeatureCollection>): GeoJsonEditAction | null | undefined;
25
+ createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature | null;
26
+ handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void;
27
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
28
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
29
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
30
+ handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void;
31
+ handleKeyUp(event: KeyboardEvent, props: ModeProps<FeatureCollection>): void;
32
+ }
33
+ export declare function getIntermediatePosition(position1: Position, position2: Position): Position;
@@ -0,0 +1,208 @@
1
+ import turfUnion from '@turf/union';
2
+ import turfDifference from '@turf/difference';
3
+ import turfIntersect from '@turf/intersect';
4
+ import rewind from '@turf/rewind';
5
+ import { getPickedEditHandles, getNonGuidePicks } from './utils';
6
+ import { ImmutableFeatureCollection } from './immutable-feature-collection';
7
+ const DEFAULT_GUIDES = {
8
+ type: 'FeatureCollection',
9
+ features: [],
10
+ };
11
+ const DEFAULT_TOOLTIPS = [];
12
+ export class GeoJsonEditMode {
13
+ _clickSequence = [];
14
+ getGuides(props) {
15
+ return DEFAULT_GUIDES;
16
+ }
17
+ getTooltips(props) {
18
+ return DEFAULT_TOOLTIPS;
19
+ }
20
+ getSelectedFeature(props) {
21
+ if (props.selectedIndexes.length === 1) {
22
+ return props.data.features[props.selectedIndexes[0]];
23
+ }
24
+ return null;
25
+ }
26
+ getSelectedGeometry(props) {
27
+ const feature = this.getSelectedFeature(props);
28
+ if (feature) {
29
+ return feature.geometry;
30
+ }
31
+ return null;
32
+ }
33
+ getSelectedFeaturesAsFeatureCollection(props) {
34
+ const { features } = props.data;
35
+ const selectedFeatures = props.selectedIndexes.map((selectedIndex) => features[selectedIndex]);
36
+ return {
37
+ type: 'FeatureCollection',
38
+ features: selectedFeatures,
39
+ };
40
+ }
41
+ getClickSequence() {
42
+ return this._clickSequence;
43
+ }
44
+ addClickSequence({ mapCoords }) {
45
+ this._clickSequence.push(mapCoords);
46
+ }
47
+ resetClickSequence() {
48
+ this._clickSequence = [];
49
+ }
50
+ getTentativeGuide(props) {
51
+ const guides = this.getGuides(props);
52
+ return guides.features.find((f) => f.properties && f.properties.guideType === 'tentative');
53
+ }
54
+ isSelectionPicked(picks, props) {
55
+ if (!picks.length)
56
+ return false;
57
+ const pickedFeatures = getNonGuidePicks(picks).map(({ index }) => index);
58
+ const pickedHandles = getPickedEditHandles(picks).map(({ properties }) => properties.featureIndex);
59
+ const pickedIndexes = new Set([...pickedFeatures, ...pickedHandles]);
60
+ return props.selectedIndexes.some((index) => pickedIndexes.has(index));
61
+ }
62
+ rewindPolygon(feature) {
63
+ const { geometry } = feature;
64
+ const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';
65
+ if (isPolygonal) {
66
+ // @ts-expect-error turf type too wide
67
+ return rewind(feature);
68
+ }
69
+ return feature;
70
+ }
71
+ getAddFeatureAction(featureOrGeometry, features) {
72
+ // Unsure why flow can't deal with Geometry type, but there I fixed it
73
+ const featureOrGeometryAsAny = featureOrGeometry;
74
+ const feature = featureOrGeometryAsAny.type === 'Feature'
75
+ ? featureOrGeometryAsAny
76
+ : {
77
+ type: 'Feature',
78
+ properties: {},
79
+ geometry: featureOrGeometryAsAny,
80
+ };
81
+ const rewindFeature = this.rewindPolygon(feature);
82
+ const updatedData = new ImmutableFeatureCollection(features)
83
+ .addFeature(rewindFeature)
84
+ .getObject();
85
+ return {
86
+ updatedData,
87
+ editType: 'addFeature',
88
+ editContext: {
89
+ featureIndexes: [updatedData.features.length - 1],
90
+ },
91
+ };
92
+ }
93
+ getAddManyFeaturesAction({ features: featuresToAdd }, features) {
94
+ let updatedData = new ImmutableFeatureCollection(features);
95
+ const initialIndex = updatedData.getObject().features.length;
96
+ const updatedIndexes = [];
97
+ for (const feature of featuresToAdd) {
98
+ const { properties, geometry } = feature;
99
+ const geometryAsAny = geometry;
100
+ updatedData = updatedData.addFeature({
101
+ type: 'Feature',
102
+ properties,
103
+ geometry: geometryAsAny,
104
+ });
105
+ updatedIndexes.push(initialIndex + updatedIndexes.length);
106
+ }
107
+ return {
108
+ updatedData: updatedData.getObject(),
109
+ editType: 'addFeature',
110
+ editContext: {
111
+ featureIndexes: updatedIndexes,
112
+ },
113
+ };
114
+ }
115
+ getAddFeatureOrBooleanPolygonAction(featureOrGeometry, props) {
116
+ const featureOrGeometryAsAny = featureOrGeometry;
117
+ const selectedFeature = this.getSelectedFeature(props);
118
+ const { modeConfig } = props;
119
+ if (modeConfig && modeConfig.booleanOperation) {
120
+ if (!selectedFeature ||
121
+ (selectedFeature.geometry.type !== 'Polygon' &&
122
+ selectedFeature.geometry.type !== 'MultiPolygon')) {
123
+ // eslint-disable-next-line no-console,no-undef
124
+ console.warn('booleanOperation only supported for single Polygon or MultiPolygon selection');
125
+ return null;
126
+ }
127
+ const feature = featureOrGeometryAsAny.type === 'Feature'
128
+ ? featureOrGeometryAsAny
129
+ : {
130
+ type: 'Feature',
131
+ geometry: featureOrGeometryAsAny,
132
+ };
133
+ let updatedGeometry;
134
+ if (modeConfig.booleanOperation === 'union') {
135
+ // @ts-expect-error selectedFeature type too wide
136
+ updatedGeometry = turfUnion(selectedFeature, feature);
137
+ }
138
+ else if (modeConfig.booleanOperation === 'difference') {
139
+ // @ts-expect-error selectedFeature type too wide
140
+ updatedGeometry = turfDifference(selectedFeature, feature);
141
+ }
142
+ else if (modeConfig.booleanOperation === 'intersection') {
143
+ // @ts-expect-error selectedFeature type too wide
144
+ updatedGeometry = turfIntersect(selectedFeature, feature);
145
+ }
146
+ else {
147
+ // eslint-disable-next-line no-console,no-undef
148
+ console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`);
149
+ return null;
150
+ }
151
+ if (!updatedGeometry) {
152
+ // eslint-disable-next-line no-console,no-undef
153
+ console.warn('Canceling edit. Boolean operation erased entire polygon.');
154
+ return null;
155
+ }
156
+ const featureIndex = props.selectedIndexes[0];
157
+ const updatedData = new ImmutableFeatureCollection(props.data)
158
+ .replaceGeometry(featureIndex, updatedGeometry.geometry)
159
+ .getObject();
160
+ const editAction = {
161
+ updatedData,
162
+ editType: 'unionGeometry',
163
+ editContext: {
164
+ featureIndexes: [featureIndex],
165
+ },
166
+ };
167
+ return editAction;
168
+ }
169
+ return this.getAddFeatureAction(featureOrGeometry, props.data);
170
+ }
171
+ createTentativeFeature(props) {
172
+ return null;
173
+ }
174
+ handleClick(event, props) { }
175
+ handlePointerMove(event, props) {
176
+ const tentativeFeature = this.createTentativeFeature(props);
177
+ if (tentativeFeature) {
178
+ props.onEdit({
179
+ updatedData: props.data,
180
+ editType: 'updateTentativeFeature',
181
+ editContext: {
182
+ feature: tentativeFeature,
183
+ },
184
+ });
185
+ }
186
+ }
187
+ handleStartDragging(event, props) { }
188
+ handleStopDragging(event, props) { }
189
+ handleDragging(event, props) { }
190
+ handleKeyUp(event, props) {
191
+ if (event.key === 'Escape') {
192
+ this.resetClickSequence();
193
+ props.onEdit({
194
+ // Because the new drawing feature is dropped, so the data will keep as the same.
195
+ updatedData: props.data,
196
+ editType: 'cancelFeature',
197
+ editContext: {},
198
+ });
199
+ }
200
+ }
201
+ }
202
+ export function getIntermediatePosition(position1, position2) {
203
+ const intermediatePosition = [
204
+ (position1[0] + position2[0]) / 2.0,
205
+ (position1[1] + position2[1]) / 2.0,
206
+ ];
207
+ return intermediatePosition;
208
+ }