@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,171 @@
1
+ import turfDistance from '@turf/distance';
2
+ import turfMidpoint from '@turf/midpoint';
3
+ import { getPickedEditHandle } from './utils';
4
+ import { GeoJsonEditMode } from './geojson-edit-mode';
5
+ export class MeasureDistanceMode extends GeoJsonEditMode {
6
+ _isMeasuringSessionFinished = false;
7
+ _currentTooltips = [];
8
+ _currentDistance = 0;
9
+ _calculateDistanceForTooltip = ({ positionA, positionB, modeConfig }) => {
10
+ const { turfOptions, measurementCallback } = modeConfig || {};
11
+ const distance = turfDistance(positionA, positionB, turfOptions);
12
+ if (measurementCallback) {
13
+ measurementCallback(distance);
14
+ }
15
+ return distance;
16
+ };
17
+ _formatTooltip(distance, modeConfig) {
18
+ const { formatTooltip, turfOptions } = modeConfig || {};
19
+ const units = (turfOptions && turfOptions.units) || 'kilometers';
20
+ let text;
21
+ if (formatTooltip) {
22
+ text = formatTooltip(distance);
23
+ }
24
+ else {
25
+ // By default, round to 2 decimal places and append units
26
+ text = `${parseFloat(distance).toFixed(2)} ${units}`;
27
+ }
28
+ return text;
29
+ }
30
+ handleClick(event, props) {
31
+ const { modeConfig, data, onEdit } = props;
32
+ const { centerTooltipsOnLine = false } = modeConfig || {};
33
+ // restart measuring session
34
+ if (this._isMeasuringSessionFinished) {
35
+ this._isMeasuringSessionFinished = false;
36
+ this.resetClickSequence();
37
+ this._currentTooltips = [];
38
+ this._currentDistance = 0;
39
+ }
40
+ const { picks } = event;
41
+ const clickedEditHandle = getPickedEditHandle(picks);
42
+ let positionAdded = false;
43
+ if (!clickedEditHandle) {
44
+ // Don't add another point right next to an existing one
45
+ this.addClickSequence(event);
46
+ positionAdded = true;
47
+ }
48
+ const clickSequence = this.getClickSequence();
49
+ if (clickSequence.length > 1 &&
50
+ clickedEditHandle &&
51
+ Array.isArray(clickedEditHandle.properties.positionIndexes) &&
52
+ clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1) {
53
+ // They clicked the last point (or double-clicked), so add the LineString
54
+ this._isMeasuringSessionFinished = true;
55
+ }
56
+ else if (positionAdded) {
57
+ if (clickSequence.length > 1) {
58
+ this._currentDistance += this._calculateDistanceForTooltip({
59
+ positionA: clickSequence[clickSequence.length - 2],
60
+ positionB: clickSequence[clickSequence.length - 1],
61
+ modeConfig,
62
+ });
63
+ const tooltipPosition = centerTooltipsOnLine
64
+ ? turfMidpoint(clickSequence[clickSequence.length - 2], clickSequence[clickSequence.length - 1]).geometry.coordinates
65
+ : event.mapCoords;
66
+ this._currentTooltips.push({
67
+ position: tooltipPosition,
68
+ text: this._formatTooltip(this._currentDistance, modeConfig),
69
+ });
70
+ }
71
+ // new tentative point
72
+ onEdit({
73
+ // data is the same
74
+ updatedData: data,
75
+ editType: 'addTentativePosition',
76
+ editContext: {
77
+ position: event.mapCoords,
78
+ },
79
+ });
80
+ }
81
+ }
82
+ handleKeyUp(event, props) {
83
+ if (this._isMeasuringSessionFinished)
84
+ return;
85
+ event.stopPropagation();
86
+ const { key } = event;
87
+ const clickSequenceLength = this.getClickSequence().length;
88
+ switch (key) {
89
+ case 'Escape':
90
+ this._isMeasuringSessionFinished = true;
91
+ if (clickSequenceLength === 1) {
92
+ this.resetClickSequence();
93
+ this._currentTooltips = [];
94
+ }
95
+ // force update drawings
96
+ props.onUpdateCursor('cell');
97
+ break;
98
+ case 'Enter':
99
+ this.handleClick(props.lastPointerMoveEvent, props);
100
+ this._isMeasuringSessionFinished = true;
101
+ break;
102
+ default:
103
+ break;
104
+ }
105
+ }
106
+ getGuides(props) {
107
+ const { lastPointerMoveEvent } = props;
108
+ const clickSequence = this.getClickSequence();
109
+ const lastCoords = lastPointerMoveEvent && !this._isMeasuringSessionFinished
110
+ ? [lastPointerMoveEvent.mapCoords]
111
+ : [];
112
+ const guides = {
113
+ type: 'FeatureCollection',
114
+ features: [],
115
+ };
116
+ if (clickSequence.length > 0) {
117
+ guides.features.push({
118
+ type: 'Feature',
119
+ properties: {
120
+ guideType: 'tentative',
121
+ },
122
+ geometry: {
123
+ type: 'LineString',
124
+ coordinates: [...clickSequence, ...lastCoords],
125
+ },
126
+ });
127
+ }
128
+ const editHandles = clickSequence.map((clickedCoord, index) => ({
129
+ type: 'Feature',
130
+ properties: {
131
+ guideType: 'editHandle',
132
+ editHandleType: 'existing',
133
+ featureIndex: -1,
134
+ positionIndexes: [index],
135
+ },
136
+ geometry: {
137
+ type: 'Point',
138
+ coordinates: clickedCoord,
139
+ },
140
+ }));
141
+ guides.features.push(...editHandles);
142
+ return guides;
143
+ }
144
+ handlePointerMove(event, props) {
145
+ props.onUpdateCursor('cell');
146
+ }
147
+ getTooltips(props) {
148
+ const { lastPointerMoveEvent, modeConfig } = props;
149
+ const { centerTooltipsOnLine = false } = modeConfig || {};
150
+ const positions = this.getClickSequence();
151
+ if (positions.length > 0 && lastPointerMoveEvent && !this._isMeasuringSessionFinished) {
152
+ const distance = this._calculateDistanceForTooltip({
153
+ positionA: positions[positions.length - 1],
154
+ positionB: lastPointerMoveEvent.mapCoords,
155
+ modeConfig: props.modeConfig,
156
+ });
157
+ const tooltipPosition = centerTooltipsOnLine
158
+ ? turfMidpoint(positions[positions.length - 1], lastPointerMoveEvent.mapCoords).geometry
159
+ .coordinates
160
+ : lastPointerMoveEvent.mapCoords;
161
+ return [
162
+ ...this._currentTooltips,
163
+ {
164
+ position: tooltipPosition,
165
+ text: this._formatTooltip(this._currentDistance + distance, modeConfig),
166
+ },
167
+ ];
168
+ }
169
+ return this._currentTooltips;
170
+ }
171
+ }
@@ -0,0 +1,15 @@
1
+ import { NearestPointType } from './utils';
2
+ import { LineString, Point, FeatureCollection, FeatureOf } from '../geojson-types';
3
+ import { ModeProps, ClickEvent, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, Viewport, GuideFeatureCollection, EditHandleFeature } from './types';
4
+ import { GeoJsonEditMode } from './geojson-edit-mode';
5
+ export declare class ModifyMode extends GeoJsonEditMode {
6
+ getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection;
7
+ getNearestPoint(line: FeatureOf<LineString>, inPoint: FeatureOf<Point>, viewport: Viewport | null | undefined): NearestPointType;
8
+ handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void;
9
+ handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void;
10
+ _dragEditHandle(editType: string, props: ModeProps<FeatureCollection>, editHandle: EditHandleFeature, event: StopDraggingEvent | DraggingEvent): void;
11
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
12
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
13
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
14
+ getCursor(event: PointerMoveEvent): string | null | undefined;
15
+ }
@@ -0,0 +1,203 @@
1
+ import { point, lineString as toLineString } from '@turf/helpers';
2
+ import { recursivelyTraverseNestedArrays, nearestPointOnProjectedLine, nearestPointOnLine, getEditHandlesForGeometry, getPickedEditHandles, getPickedEditHandle, getPickedExistingEditHandle, getPickedIntermediateEditHandle, updateRectanglePosition, } from './utils';
3
+ import { GeoJsonEditMode } from './geojson-edit-mode';
4
+ import { ImmutableFeatureCollection } from './immutable-feature-collection';
5
+ export class ModifyMode extends GeoJsonEditMode {
6
+ // eslint-disable-next-line complexity
7
+ getGuides(props) {
8
+ const handles = [];
9
+ const { data, lastPointerMoveEvent } = props;
10
+ const { features } = data;
11
+ const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;
12
+ const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;
13
+ for (const index of props.selectedIndexes) {
14
+ if (index < features.length) {
15
+ const { geometry } = features[index];
16
+ handles.push(...getEditHandlesForGeometry(geometry, index));
17
+ }
18
+ else {
19
+ console.warn(`selectedFeatureIndexes out of range ${index}`); // eslint-disable-line no-console,no-undef
20
+ }
21
+ }
22
+ // intermediate edit handle
23
+ if (picks && picks.length && mapCoords) {
24
+ const existingEditHandle = getPickedExistingEditHandle(picks);
25
+ // don't show intermediate point when too close to an existing edit handle
26
+ const featureAsPick = !existingEditHandle && picks.find((pick) => !pick.isGuide);
27
+ // is the feature in the pick selected
28
+ if (featureAsPick &&
29
+ !featureAsPick.object.geometry.type.includes('Point') &&
30
+ !(props.modeConfig?.lockRectangles && featureAsPick.object.properties.shape === 'Rectangle') &&
31
+ props.selectedIndexes.includes(featureAsPick.index)) {
32
+ let intermediatePoint = null;
33
+ let positionIndexPrefix = [];
34
+ const referencePoint = point(mapCoords);
35
+ // process all lines of the (single) feature
36
+ recursivelyTraverseNestedArrays(featureAsPick.object.geometry.coordinates, [], (lineString, prefix) => {
37
+ const lineStringFeature = toLineString(lineString);
38
+ const candidateIntermediatePoint = this.getNearestPoint(
39
+ // @ts-expect-error turf types too wide
40
+ lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport);
41
+ if (!intermediatePoint ||
42
+ candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist) {
43
+ intermediatePoint = candidateIntermediatePoint;
44
+ positionIndexPrefix = prefix;
45
+ }
46
+ });
47
+ // tack on the lone intermediate point to the set of handles
48
+ if (intermediatePoint) {
49
+ const { geometry: { coordinates: position }, properties: { index }, } = intermediatePoint;
50
+ handles.push({
51
+ type: 'Feature',
52
+ properties: {
53
+ guideType: 'editHandle',
54
+ editHandleType: 'intermediate',
55
+ featureIndex: featureAsPick.index,
56
+ positionIndexes: [...positionIndexPrefix, index + 1],
57
+ },
58
+ geometry: {
59
+ type: 'Point',
60
+ coordinates: position,
61
+ },
62
+ });
63
+ }
64
+ }
65
+ }
66
+ return {
67
+ type: 'FeatureCollection',
68
+ features: handles,
69
+ };
70
+ }
71
+ // turf.js does not support elevation for nearestPointOnLine
72
+ getNearestPoint(line, inPoint, viewport) {
73
+ const { coordinates } = line.geometry;
74
+ if (coordinates.some((coord) => coord.length > 2)) {
75
+ if (viewport) {
76
+ // This line has elevation, we need to use alternative algorithm
77
+ return nearestPointOnProjectedLine(line, inPoint, viewport);
78
+ }
79
+ // eslint-disable-next-line no-console,no-undef
80
+ console.log('Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.');
81
+ }
82
+ return nearestPointOnLine(line, inPoint, viewport);
83
+ }
84
+ handleClick(event, props) {
85
+ const pickedExistingHandle = getPickedExistingEditHandle(event.picks);
86
+ const pickedIntermediateHandle = getPickedIntermediateEditHandle(event.picks);
87
+ if (pickedExistingHandle) {
88
+ const { featureIndex, positionIndexes } = pickedExistingHandle.properties;
89
+ let updatedData;
90
+ try {
91
+ updatedData = new ImmutableFeatureCollection(props.data)
92
+ .removePosition(featureIndex, positionIndexes)
93
+ .getObject();
94
+ }
95
+ catch (ignored) {
96
+ // This happens if user attempts to remove the last point
97
+ }
98
+ if (updatedData) {
99
+ props.onEdit({
100
+ updatedData,
101
+ editType: 'removePosition',
102
+ editContext: {
103
+ featureIndexes: [featureIndex],
104
+ positionIndexes,
105
+ position: pickedExistingHandle.geometry.coordinates,
106
+ },
107
+ });
108
+ }
109
+ }
110
+ else if (pickedIntermediateHandle) {
111
+ const { featureIndex, positionIndexes } = pickedIntermediateHandle.properties;
112
+ const feature = props.data.features[featureIndex];
113
+ const canAddPosition = !(props.modeConfig?.lockRectangles && feature?.properties.shape === 'Rectangle');
114
+ if (canAddPosition) {
115
+ const updatedData = new ImmutableFeatureCollection(props.data)
116
+ .addPosition(featureIndex, positionIndexes, pickedIntermediateHandle.geometry.coordinates)
117
+ .getObject();
118
+ if (updatedData) {
119
+ props.onEdit({
120
+ updatedData,
121
+ editType: 'addPosition',
122
+ editContext: {
123
+ featureIndexes: [featureIndex],
124
+ positionIndexes,
125
+ position: pickedIntermediateHandle.geometry.coordinates,
126
+ },
127
+ });
128
+ }
129
+ }
130
+ }
131
+ }
132
+ handleDragging(event, props) {
133
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
134
+ if (editHandle) {
135
+ // Cancel map panning if pointer went down on an edit handle
136
+ event.cancelPan();
137
+ this._dragEditHandle('movePosition', props, editHandle, event);
138
+ }
139
+ }
140
+ _dragEditHandle(editType, props, editHandle, event) {
141
+ const editHandleProperties = editHandle.properties;
142
+ const editedFeature = props.data.features[editHandleProperties.featureIndex];
143
+ let updatedData;
144
+ if (props.modeConfig?.lockRectangles && editedFeature.properties.shape === 'Rectangle') {
145
+ const coordinates = updateRectanglePosition(editedFeature, editHandleProperties.positionIndexes[1], event.mapCoords); // TODO
146
+ updatedData = new ImmutableFeatureCollection(props.data)
147
+ .replaceGeometry(editHandleProperties.featureIndex, { coordinates, type: 'Polygon' })
148
+ .getObject();
149
+ }
150
+ else {
151
+ updatedData = new ImmutableFeatureCollection(props.data)
152
+ .replacePosition(editHandleProperties.featureIndex, editHandleProperties.positionIndexes, event.mapCoords)
153
+ .getObject();
154
+ }
155
+ props.onEdit({
156
+ updatedData,
157
+ editType,
158
+ editContext: {
159
+ featureIndexes: [editHandleProperties.featureIndex],
160
+ positionIndexes: editHandleProperties.positionIndexes,
161
+ position: event.mapCoords,
162
+ },
163
+ });
164
+ }
165
+ handlePointerMove(event, props) {
166
+ const cursor = this.getCursor(event);
167
+ props.onUpdateCursor(cursor);
168
+ }
169
+ handleStartDragging(event, props) {
170
+ const selectedFeatureIndexes = props.selectedIndexes;
171
+ const editHandle = getPickedIntermediateEditHandle(event.picks);
172
+ if (selectedFeatureIndexes.length && editHandle) {
173
+ const editHandleProperties = editHandle.properties;
174
+ const updatedData = new ImmutableFeatureCollection(props.data)
175
+ .addPosition(editHandleProperties.featureIndex, editHandleProperties.positionIndexes, event.mapCoords)
176
+ .getObject();
177
+ props.onEdit({
178
+ updatedData,
179
+ editType: 'addPosition',
180
+ editContext: {
181
+ featureIndexes: [editHandleProperties.featureIndex],
182
+ positionIndexes: editHandleProperties.positionIndexes,
183
+ position: event.mapCoords,
184
+ },
185
+ });
186
+ }
187
+ }
188
+ handleStopDragging(event, props) {
189
+ const selectedFeatureIndexes = props.selectedIndexes;
190
+ const editHandle = getPickedEditHandle(event.picks);
191
+ if (selectedFeatureIndexes.length && editHandle) {
192
+ this._dragEditHandle('finishMovePosition', props, editHandle, event);
193
+ }
194
+ }
195
+ getCursor(event) {
196
+ const picks = (event && event.picks) || [];
197
+ const handlesPicked = getPickedEditHandles(picks);
198
+ if (handlesPicked.length) {
199
+ return 'cell';
200
+ }
201
+ return null;
202
+ }
203
+ }
@@ -0,0 +1,16 @@
1
+ import { NearestPointType } from './utils';
2
+ import { LineString, Point, FeatureCollection, FeatureOf } from '../geojson-types';
3
+ import { Viewport } from '../types';
4
+ import { ModeProps, PointerMoveEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, EditHandleFeature, GuideFeatureCollection } from './types';
5
+ import { GeoJsonEditMode } from './geojson-edit-mode';
6
+ export declare class ResizeCircleMode extends GeoJsonEditMode {
7
+ _selectedEditHandle: EditHandleFeature | null | undefined;
8
+ _isResizing: boolean;
9
+ getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection;
10
+ getNearestPoint(line: FeatureOf<LineString>, inPoint: FeatureOf<Point>, viewport: Viewport | null | undefined): NearestPointType;
11
+ handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void;
12
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
13
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
14
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
15
+ getCursor(event: PointerMoveEvent): string | null | undefined;
16
+ }
@@ -0,0 +1,142 @@
1
+ import nearestPointOnLine from '@turf/nearest-point-on-line';
2
+ import { point, lineString as toLineString } from '@turf/helpers';
3
+ import circle from '@turf/circle';
4
+ import distance from '@turf/distance';
5
+ import turfCenter from '@turf/center';
6
+ import { recursivelyTraverseNestedArrays, nearestPointOnProjectedLine, getPickedEditHandles, getPickedEditHandle } from './utils';
7
+ import { GeoJsonEditMode } from './geojson-edit-mode';
8
+ import { ImmutableFeatureCollection } from './immutable-feature-collection';
9
+ export class ResizeCircleMode extends GeoJsonEditMode {
10
+ _selectedEditHandle;
11
+ _isResizing = false;
12
+ // eslint-disable-next-line complexity
13
+ getGuides(props) {
14
+ const handles = [];
15
+ const selectedFeatureIndexes = props.selectedIndexes;
16
+ const { lastPointerMoveEvent } = props;
17
+ const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;
18
+ const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;
19
+ // intermediate edit handle
20
+ if (picks &&
21
+ picks.length &&
22
+ mapCoords &&
23
+ selectedFeatureIndexes.length === 1 &&
24
+ !this._isResizing) {
25
+ const featureAsPick = picks.find((pick) => !pick.isGuide);
26
+ // is the feature in the pick selected
27
+ if (featureAsPick &&
28
+ featureAsPick.object.properties.shape &&
29
+ featureAsPick.object.properties.shape.includes('Circle') &&
30
+ props.selectedIndexes.includes(featureAsPick.index)) {
31
+ let intermediatePoint = null;
32
+ let positionIndexPrefix = [];
33
+ const referencePoint = point(mapCoords);
34
+ // process all lines of the (single) feature
35
+ recursivelyTraverseNestedArrays(featureAsPick.object.geometry.coordinates, [], (lineString, prefix) => {
36
+ const lineStringFeature = toLineString(lineString);
37
+ const candidateIntermediatePoint = this.getNearestPoint(
38
+ // @ts-expect-error turf types too wide
39
+ lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport);
40
+ if (!intermediatePoint ||
41
+ candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist) {
42
+ intermediatePoint = candidateIntermediatePoint;
43
+ positionIndexPrefix = prefix;
44
+ }
45
+ });
46
+ // tack on the lone intermediate point to the set of handles
47
+ if (intermediatePoint) {
48
+ const { geometry: { coordinates: position }, properties: { index } } = intermediatePoint;
49
+ handles.push({
50
+ type: 'Feature',
51
+ properties: {
52
+ guideType: 'editHandle',
53
+ editHandleType: 'intermediate',
54
+ featureIndex: featureAsPick.index,
55
+ positionIndexes: [...positionIndexPrefix, index + 1]
56
+ },
57
+ geometry: {
58
+ type: 'Point',
59
+ coordinates: position
60
+ }
61
+ });
62
+ }
63
+ }
64
+ }
65
+ return {
66
+ type: 'FeatureCollection',
67
+ features: handles
68
+ };
69
+ }
70
+ // turf.js does not support elevation for nearestPointOnLine
71
+ getNearestPoint(line, inPoint, viewport) {
72
+ const { coordinates } = line.geometry;
73
+ if (coordinates.some((coord) => coord.length > 2)) {
74
+ if (viewport) {
75
+ // This line has elevation, we need to use alternative algorithm
76
+ return nearestPointOnProjectedLine(line, inPoint, viewport);
77
+ }
78
+ // eslint-disable-next-line no-console,no-undef
79
+ console.log('Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.');
80
+ }
81
+ // @ts-expect-error turf types diff
82
+ return nearestPointOnLine(line, inPoint);
83
+ }
84
+ handleDragging(event, props) {
85
+ const editHandle = getPickedEditHandle(event.pointerDownPicks);
86
+ if (editHandle) {
87
+ // Cancel map panning if pointer went down on an edit handle
88
+ event.cancelPan();
89
+ const editHandleProperties = editHandle.properties;
90
+ const feature = this.getSelectedFeature(props);
91
+ // @ts-expect-error turf types diff
92
+ const center = turfCenter(feature).geometry.coordinates;
93
+ const numberOfSteps = Object.entries(feature.geometry.coordinates[0]).length - 1;
94
+ const radius = Math.max(distance(center, event.mapCoords), 0.001);
95
+ const { steps = numberOfSteps } = {};
96
+ const options = { steps };
97
+ const updatedFeature = circle(center, radius, options);
98
+ const geometry = updatedFeature.geometry;
99
+ const updatedData = new ImmutableFeatureCollection(props.data)
100
+ // @ts-expect-error turf types diff
101
+ .replaceGeometry(editHandleProperties.featureIndex, geometry)
102
+ .getObject();
103
+ props.onEdit({
104
+ updatedData,
105
+ editType: 'unionGeometry',
106
+ editContext: {
107
+ featureIndexes: [editHandleProperties.featureIndex]
108
+ }
109
+ });
110
+ }
111
+ }
112
+ handlePointerMove(event, props) {
113
+ if (!this._isResizing) {
114
+ const selectedEditHandle = getPickedEditHandle(event.picks);
115
+ this._selectedEditHandle =
116
+ selectedEditHandle && selectedEditHandle.properties.editHandleType === 'intermediate'
117
+ ? selectedEditHandle
118
+ : null;
119
+ }
120
+ const cursor = this.getCursor(event);
121
+ props.onUpdateCursor(cursor);
122
+ }
123
+ handleStartDragging(event, props) {
124
+ if (this._selectedEditHandle) {
125
+ this._isResizing = true;
126
+ }
127
+ }
128
+ handleStopDragging(event, props) {
129
+ if (this._isResizing) {
130
+ this._selectedEditHandle = null;
131
+ this._isResizing = false;
132
+ }
133
+ }
134
+ getCursor(event) {
135
+ const picks = (event && event.picks) || [];
136
+ const handlesPicked = getPickedEditHandles(picks);
137
+ if (handlesPicked.length) {
138
+ return 'cell';
139
+ }
140
+ return null;
141
+ }
142
+ }
@@ -0,0 +1,17 @@
1
+ import { PointerMoveEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, ModeProps, EditHandleFeature, GuideFeatureCollection } from './types';
2
+ import { FeatureCollection, Position } from '../geojson-types';
3
+ import { GeoJsonEditMode, GeoJsonEditAction } from './geojson-edit-mode';
4
+ export declare class RotateMode extends GeoJsonEditMode {
5
+ _selectedEditHandle: EditHandleFeature | null | undefined;
6
+ _geometryBeingRotated: FeatureCollection | null | undefined;
7
+ _isRotating: boolean;
8
+ _isSinglePointGeometrySelected: (geometry: FeatureCollection | null | undefined) => boolean;
9
+ getIsRotating: () => boolean;
10
+ getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection;
11
+ handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void;
12
+ handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void;
13
+ handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void;
14
+ handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void;
15
+ updateCursor(props: ModeProps<FeatureCollection>): void;
16
+ getRotateAction(startDragPoint: Position, currentPoint: Position, editType: string, props: ModeProps<FeatureCollection>): GeoJsonEditAction | null | undefined;
17
+ }