@deck.gl-community/editable-layers 9.3.0-beta.2 → 9.3.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 (67) hide show
  1. package/dist/edit-modes/coordinate-system.d.ts +94 -0
  2. package/dist/edit-modes/coordinate-system.d.ts.map +1 -0
  3. package/dist/edit-modes/coordinate-system.js +105 -0
  4. package/dist/edit-modes/coordinate-system.js.map +1 -0
  5. package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts +1 -1
  6. package/dist/edit-modes/draw-circle-by-diameter-mode.d.ts.map +1 -1
  7. package/dist/edit-modes/draw-circle-from-center-mode.d.ts +1 -1
  8. package/dist/edit-modes/draw-circle-from-center-mode.d.ts.map +1 -1
  9. package/dist/edit-modes/draw-line-string-mode.d.ts +5 -4
  10. package/dist/edit-modes/draw-line-string-mode.d.ts.map +1 -1
  11. package/dist/edit-modes/draw-line-string-mode.js +15 -9
  12. package/dist/edit-modes/draw-line-string-mode.js.map +1 -1
  13. package/dist/edit-modes/geojson-edit-mode.d.ts +9 -9
  14. package/dist/edit-modes/geojson-edit-mode.d.ts.map +1 -1
  15. package/dist/edit-modes/geojson-edit-mode.js +9 -9
  16. package/dist/edit-modes/geojson-edit-mode.js.map +1 -1
  17. package/dist/edit-modes/measure-angle-mode.d.ts +6 -1
  18. package/dist/edit-modes/measure-angle-mode.d.ts.map +1 -1
  19. package/dist/edit-modes/measure-angle-mode.js.map +1 -1
  20. package/dist/edit-modes/measure-distance-mode.d.ts +2 -1
  21. package/dist/edit-modes/measure-distance-mode.d.ts.map +1 -1
  22. package/dist/edit-modes/measure-distance-mode.js +12 -10
  23. package/dist/edit-modes/measure-distance-mode.js.map +1 -1
  24. package/dist/edit-modes/modify-mode.d.ts +2 -1
  25. package/dist/edit-modes/modify-mode.d.ts.map +1 -1
  26. package/dist/edit-modes/modify-mode.js +4 -4
  27. package/dist/edit-modes/modify-mode.js.map +1 -1
  28. package/dist/edit-modes/translate-mode.d.ts.map +1 -1
  29. package/dist/edit-modes/translate-mode.js +5 -8
  30. package/dist/edit-modes/translate-mode.js.map +1 -1
  31. package/dist/edit-modes/types.d.ts +7 -0
  32. package/dist/edit-modes/types.d.ts.map +1 -1
  33. package/dist/edit-modes/utils.d.ts +5 -3
  34. package/dist/edit-modes/utils.d.ts.map +1 -1
  35. package/dist/edit-modes/utils.js +41 -43
  36. package/dist/edit-modes/utils.js.map +1 -1
  37. package/dist/editable-layers/editable-geojson-layer.d.ts.map +1 -1
  38. package/dist/editable-layers/editable-geojson-layer.js +5 -0
  39. package/dist/editable-layers/editable-geojson-layer.js.map +1 -1
  40. package/dist/index.cjs +224 -152
  41. package/dist/index.cjs.map +4 -4
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/utils/memoize.d.ts +1 -1
  47. package/dist/utils/memoize.d.ts.map +1 -1
  48. package/dist/utils/memoize.js +8 -2
  49. package/dist/utils/memoize.js.map +1 -1
  50. package/dist/utils/translate-from-center.d.ts +2 -1
  51. package/dist/utils/translate-from-center.d.ts.map +1 -1
  52. package/dist/utils/translate-from-center.js +7 -10
  53. package/dist/utils/translate-from-center.js.map +1 -1
  54. package/package.json +2 -2
  55. package/src/edit-modes/coordinate-system.ts +164 -0
  56. package/src/edit-modes/draw-line-string-mode.ts +25 -12
  57. package/src/edit-modes/geojson-edit-mode.ts +12 -11
  58. package/src/edit-modes/measure-angle-mode.ts +1 -1
  59. package/src/edit-modes/measure-distance-mode.ts +13 -11
  60. package/src/edit-modes/modify-mode.ts +7 -4
  61. package/src/edit-modes/translate-mode.ts +5 -8
  62. package/src/edit-modes/types.ts +10 -0
  63. package/src/edit-modes/utils.ts +85 -51
  64. package/src/editable-layers/editable-geojson-layer.ts +5 -0
  65. package/src/index.ts +9 -0
  66. package/src/utils/memoize.ts +10 -4
  67. package/src/utils/translate-from-center.ts +13 -15
package/dist/index.cjs CHANGED
@@ -34,6 +34,7 @@ var __publicField = (obj, key, value) => {
34
34
  // dist/index.js
35
35
  var dist_exports = {};
36
36
  __export(dist_exports, {
37
+ CartesianCoordinateSystem: () => CartesianCoordinateSystem,
37
38
  CompositeMode: () => CompositeMode,
38
39
  DeleteMode: () => DeleteMode,
39
40
  Draw90DegreePolygonMode: () => Draw90DegreePolygonMode,
@@ -59,6 +60,7 @@ __export(dist_exports, {
59
60
  ElevationMode: () => ElevationMode,
60
61
  ExtendLineStringMode: () => ExtendLineStringMode,
61
62
  ExtrudeMode: () => ExtrudeMode,
63
+ GeoCoordinateSystem: () => GeoCoordinateSystem,
62
64
  GeoJsonEditMode: () => GeoJsonEditMode,
63
65
  ImmutableFeatureCollection: () => ImmutableFeatureCollection,
64
66
  JunctionScatterplotLayer: () => JunctionScatterplotLayer,
@@ -76,7 +78,11 @@ __export(dist_exports, {
76
78
  TranslateMode: () => TranslateMode,
77
79
  ViewMode: () => ViewMode,
78
80
  _memoize: () => memoize,
81
+ cartesianCoordinateSystem: () => cartesianCoordinateSystem,
82
+ fromDeckCoordinateSystem: () => fromDeckCoordinateSystem,
83
+ geoCoordinateSystem: () => geoCoordinateSystem,
79
84
  getEditHandlesForGeometry: () => getEditHandlesForGeometry,
85
+ getEditModeCoordinateSystem: () => getEditModeCoordinateSystem,
80
86
  getPickedEditHandle: () => getPickedEditHandle,
81
87
  toDeckColor: () => toDeckColor,
82
88
  utils: () => utils_exports
@@ -155,9 +161,9 @@ function nearestPointOnProjectedLine(line, inPoint, viewport) {
155
161
  const B = x22 - x12;
156
162
  const C = x12 * y22 - x22 * y12;
157
163
  const div = A * A + B * B;
158
- const distance7 = Math.abs(A * x + B * y + C) / Math.sqrt(div);
159
- if (distance7 < minDistance) {
160
- minDistance = distance7;
164
+ const distance6 = Math.abs(A * x + B * y + C) / Math.sqrt(div);
165
+ if (distance6 < minDistance) {
166
+ minDistance = distance6;
161
167
  minPointInfo = {
162
168
  index: index2,
163
169
  x0: (B * (B * x - A * y) - A * C) / div,
@@ -196,19 +202,81 @@ function insertBefore(base, insertBeforeText, toInsert) {
196
202
  // dist/editable-layers/editable-geojson-layer.js
197
203
  var import_layers2 = require("@deck.gl/layers");
198
204
 
205
+ // dist/edit-modes/coordinate-system.js
206
+ var import_bearing2 = __toESM(require("@turf/bearing"), 1);
207
+ var import_distance = __toESM(require("@turf/distance"), 1);
208
+ var import_destination2 = __toESM(require("@turf/destination"), 1);
209
+ var import_midpoint = __toESM(require("@turf/midpoint"), 1);
210
+ var import_helpers2 = require("@turf/helpers");
211
+ var import_core = require("@deck.gl/core");
212
+ var GeoCoordinateSystem = class {
213
+ distance(a, b) {
214
+ return (0, import_distance.default)((0, import_helpers2.point)(a), (0, import_helpers2.point)(b));
215
+ }
216
+ bearing(a, b) {
217
+ return (0, import_bearing2.default)((0, import_helpers2.point)(a), (0, import_helpers2.point)(b));
218
+ }
219
+ destination(origin, distance6, bearing6) {
220
+ return (0, import_destination2.default)((0, import_helpers2.point)(origin), distance6, bearing6).geometry.coordinates;
221
+ }
222
+ midpoint(a, b) {
223
+ return (0, import_midpoint.default)((0, import_helpers2.point)(a), (0, import_helpers2.point)(b)).geometry.coordinates;
224
+ }
225
+ };
226
+ var CartesianCoordinateSystem = class {
227
+ distance(a, b) {
228
+ const dx = b[0] - a[0];
229
+ const dy = b[1] - a[1];
230
+ return Math.sqrt(dx * dx + dy * dy);
231
+ }
232
+ bearing(a, b) {
233
+ const dx = b[0] - a[0];
234
+ const dy = b[1] - a[1];
235
+ const angle = Math.atan2(dx, dy) * (180 / Math.PI);
236
+ return angle > 180 ? angle - 360 : angle <= -180 ? angle + 360 : angle;
237
+ }
238
+ destination(origin, distance6, bearing6) {
239
+ const bearingRad = bearing6 * (Math.PI / 180);
240
+ return [
241
+ origin[0] + distance6 * Math.sin(bearingRad),
242
+ origin[1] + distance6 * Math.cos(bearingRad)
243
+ ];
244
+ }
245
+ midpoint(a, b) {
246
+ return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
247
+ }
248
+ };
249
+ var geoCoordinateSystem = new GeoCoordinateSystem();
250
+ var cartesianCoordinateSystem = new CartesianCoordinateSystem();
251
+ function getEditModeCoordinateSystem(coordinateSystem) {
252
+ return coordinateSystem ?? geoCoordinateSystem;
253
+ }
254
+ function fromDeckCoordinateSystem(deckCoordSystem) {
255
+ switch (deckCoordSystem) {
256
+ case import_core.COORDINATE_SYSTEM.CARTESIAN:
257
+ case import_core.COORDINATE_SYSTEM.METER_OFFSETS:
258
+ return cartesianCoordinateSystem;
259
+ case import_core.COORDINATE_SYSTEM.LNGLAT:
260
+ case import_core.COORDINATE_SYSTEM.LNGLAT_OFFSETS:
261
+ case import_core.COORDINATE_SYSTEM.DEFAULT:
262
+ default:
263
+ return geoCoordinateSystem;
264
+ }
265
+ }
266
+
199
267
  // dist/edit-modes/geojson-edit-mode.js
200
- var import_helpers3 = require("@turf/helpers");
268
+ var import_helpers4 = require("@turf/helpers");
201
269
  var import_union = __toESM(require("@turf/union"), 1);
202
270
  var import_difference = __toESM(require("@turf/difference"), 1);
203
271
  var import_intersect = __toESM(require("@turf/intersect"), 1);
204
272
  var import_rewind = __toESM(require("@turf/rewind"), 1);
205
273
 
206
274
  // dist/edit-modes/utils.js
207
- var import_destination2 = __toESM(require("@turf/destination"), 1);
208
- var import_bearing2 = __toESM(require("@turf/bearing"), 1);
209
- var import_point_to_line_distance2 = __toESM(require("@turf/point-to-line-distance"), 1);
275
+ var import_destination3 = require("@turf/destination");
276
+ var import_bearing3 = require("@turf/bearing");
277
+ var import_point_to_line_distance2 = require("@turf/point-to-line-distance");
210
278
  var import_meta = require("@turf/meta");
211
- var import_helpers2 = require("@turf/helpers");
279
+ var import_helpers3 = require("@turf/helpers");
212
280
  var import_invariant = require("@turf/invariant");
213
281
  var import_web_mercator2 = require("@math.gl/web-mercator");
214
282
  function recursivelyTraverseNestedArrays2(array, prefix, fn) {
@@ -228,13 +296,13 @@ function generatePointsParallelToLinePoints2(p1, p2, coords) {
228
296
  type: "LineString",
229
297
  coordinates: [p1, p2]
230
298
  };
231
- const pt = (0, import_helpers2.point)(coords);
232
- const ddistance = (0, import_point_to_line_distance2.default)(pt, lineString3);
233
- const lineBearing = (0, import_bearing2.default)(p1, p2);
299
+ const pt = (0, import_helpers3.point)(coords);
300
+ const ddistance = (0, import_point_to_line_distance2.pointToLineDistance)(pt, lineString3);
301
+ const lineBearing = (0, import_bearing3.bearing)(p1, p2);
234
302
  const isPointToLeftOfLine = (coords[0] - p1[0]) * (p2[1] - p1[1]) - (coords[1] - p1[1]) * (p2[0] - p1[0]);
235
303
  const orthogonalBearing = isPointToLeftOfLine < 0 ? lineBearing - 90 : lineBearing - 270;
236
- const p3 = (0, import_destination2.default)(p2, ddistance, orthogonalBearing);
237
- const p4 = (0, import_destination2.default)(p1, ddistance, orthogonalBearing);
304
+ const p3 = (0, import_destination3.destination)(p2, ddistance, orthogonalBearing);
305
+ const p4 = (0, import_destination3.destination)(p1, ddistance, orthogonalBearing);
238
306
  return [p3.geometry.coordinates, p4.geometry.coordinates];
239
307
  }
240
308
  function distance2d2(x1, y1, x2, y2) {
@@ -245,13 +313,27 @@ function distance2d2(x1, y1, x2, y2) {
245
313
  function mix2(a, b, ratio) {
246
314
  return b * ratio + a * (1 - ratio);
247
315
  }
248
- function nearestPointOnProjectedLine2(line, inPoint, viewport) {
249
- const wmViewport = new import_web_mercator2.WebMercatorViewport(viewport);
250
- const coordinates = line.geometry.coordinates;
251
- const projectedCoords = coordinates.map(([x3, y3, z = 0]) => wmViewport.project([x3, y3, z]));
252
- const [x, y] = wmViewport.project(inPoint.geometry.coordinates);
316
+ function projectOrUnprojectPoints(inputPoints, coordinateSystem, project, wmViewport) {
317
+ if (coordinateSystem === void 0 || wmViewport === void 0)
318
+ return [...inputPoints];
319
+ else if (coordinateSystem instanceof CartesianCoordinateSystem)
320
+ return [...inputPoints];
321
+ return project === "PROJECT" ? wmViewport.project([...inputPoints]) : wmViewport.unproject([...inputPoints]);
322
+ }
323
+ function nearestPointOnProjectedLine2(line, inPoint, viewport, coordinateSystem) {
324
+ var _a;
253
325
  let minDistance = Infinity;
254
- let minPointInfo = {};
326
+ const coordinates = (_a = line == null ? void 0 : line.geometry) == null ? void 0 : _a.coordinates;
327
+ if (!coordinates)
328
+ return {
329
+ type: "Feature",
330
+ geometry: { type: "Point", coordinates: [0, 0, 0] },
331
+ properties: { dist: minDistance, index: -1 }
332
+ };
333
+ const wmViewport = new import_web_mercator2.WebMercatorViewport(viewport);
334
+ const [x, y] = projectOrUnprojectPoints(inPoint.geometry.coordinates, coordinateSystem, "PROJECT", wmViewport);
335
+ const projectedCoords = coordinates.map(([px, py, pz = 0]) => projectOrUnprojectPoints([px, py, pz], coordinateSystem, "PROJECT", wmViewport));
336
+ let minPointInfo = { index: 0, x0: 0, y0: 0 };
255
337
  projectedCoords.forEach(([x22, y22], index2) => {
256
338
  if (index2 === 0) {
257
339
  return;
@@ -261,9 +343,9 @@ function nearestPointOnProjectedLine2(line, inPoint, viewport) {
261
343
  const B = x22 - x12;
262
344
  const C = x12 * y22 - x22 * y12;
263
345
  const div = A * A + B * B;
264
- const distance7 = Math.abs(A * x + B * y + C) / Math.sqrt(div);
265
- if (distance7 < minDistance) {
266
- minDistance = distance7;
346
+ const distance6 = Math.abs(A * x + B * y + C) / Math.sqrt(div);
347
+ if (distance6 < minDistance) {
348
+ minDistance = distance6;
267
349
  minPointInfo = {
268
350
  index: index2,
269
351
  x0: (B * (B * x - A * y) - A * C) / div,
@@ -282,7 +364,7 @@ function nearestPointOnProjectedLine2(line, inPoint, viewport) {
282
364
  type: "Feature",
283
365
  geometry: {
284
366
  type: "Point",
285
- coordinates: wmViewport.unproject([x0, y0, z0])
367
+ coordinates: projectOrUnprojectPoints([x0, y0, z0], coordinateSystem, "UNPROJECT", wmViewport)
286
368
  },
287
369
  properties: {
288
370
  // TODO: calculate the distance in proper units
@@ -291,15 +373,10 @@ function nearestPointOnProjectedLine2(line, inPoint, viewport) {
291
373
  }
292
374
  };
293
375
  }
294
- function nearestPointOnLine(lines, inPoint, viewport) {
376
+ function nearestPointOnLine(lines, inPoint, viewport, coordinateSystem) {
295
377
  var _a, _b;
296
- let mercator;
297
- if (viewport) {
298
- mercator = new import_web_mercator2.WebMercatorViewport(viewport);
299
- }
300
- let closestPoint = (0, import_helpers2.point)([Infinity, Infinity], {
301
- dist: Infinity
302
- });
378
+ const wmViewport = viewport ? new import_web_mercator2.WebMercatorViewport(viewport) : void 0;
379
+ let closestPoint = (0, import_helpers3.point)([Infinity, Infinity], { dist: Infinity });
303
380
  if (!((_a = lines.geometry) == null ? void 0 : _a.coordinates.length) || ((_b = lines.geometry) == null ? void 0 : _b.coordinates.length) < 2) {
304
381
  return closestPoint;
305
382
  }
@@ -314,15 +391,8 @@ function nearestPointOnLine(lines, inPoint, viewport) {
314
391
  let segmentIdx;
315
392
  let dist;
316
393
  if (coords.length > 1 && pointCoords.length) {
317
- let lineCoordinates;
318
- let pointCoordinate;
319
- if (mercator) {
320
- lineCoordinates = coords.map((lineCoordinate) => mercator.project(lineCoordinate));
321
- pointCoordinate = mercator.project(pointCoords);
322
- } else {
323
- lineCoordinates = coords;
324
- pointCoordinate = pointCoords;
325
- }
394
+ const pointCoordinate = projectOrUnprojectPoints(pointCoords, coordinateSystem, "PROJECT", wmViewport);
395
+ const lineCoordinates = coords.map(([px, py, pz = 0]) => projectOrUnprojectPoints([px, py, pz], coordinateSystem, "PROJECT", wmViewport));
326
396
  for (let n = 1; n < lineCoordinates.length; n++) {
327
397
  if (lineCoordinates[n][0] !== lineCoordinates[n - 1][0]) {
328
398
  const slope = (lineCoordinates[n][1] - lineCoordinates[n - 1][1]) / (lineCoordinates[n][0] - lineCoordinates[n - 1][0]);
@@ -361,17 +431,15 @@ function nearestPointOnLine(lines, inPoint, viewport) {
361
431
  y = lineCoordinates[segmentIdx - 1][1] - dy * to;
362
432
  }
363
433
  let snapPoint = { x, y, idx: segmentIdx - 1, to, from };
364
- if (mercator) {
365
- const pixelToLatLong = mercator.unproject([snapPoint.x, snapPoint.y]);
366
- snapPoint = {
367
- x: pixelToLatLong[0],
368
- y: pixelToLatLong[1],
369
- idx: segmentIdx - 1,
370
- to,
371
- from
372
- };
373
- }
374
- closestPoint = (0, import_helpers2.point)([snapPoint.x, snapPoint.y], {
434
+ const pixelToLatLong = projectOrUnprojectPoints([snapPoint.x, snapPoint.y], coordinateSystem, "UNPROJECT", wmViewport);
435
+ snapPoint = {
436
+ x: pixelToLatLong[0],
437
+ y: pixelToLatLong[1],
438
+ idx: segmentIdx - 1,
439
+ to,
440
+ from
441
+ };
442
+ closestPoint = (0, import_helpers3.point)([snapPoint.x, snapPoint.y], {
375
443
  dist: Math.abs(snapPoint.from - snapPoint.to),
376
444
  index: snapPoint.idx
377
445
  });
@@ -782,10 +850,10 @@ var DEFAULT_GUIDES = {
782
850
  var DEFAULT_TOOLTIPS = [];
783
851
  var GeoJsonEditMode = class {
784
852
  _clickSequence = [];
785
- getGuides(props) {
853
+ getGuides(_props) {
786
854
  return DEFAULT_GUIDES;
787
855
  }
788
- getTooltips(props) {
856
+ getTooltips(_props) {
789
857
  return DEFAULT_TOOLTIPS;
790
858
  }
791
859
  getSelectedFeature(props) {
@@ -895,11 +963,11 @@ var GeoJsonEditMode = class {
895
963
  };
896
964
  let updatedGeometry;
897
965
  if (modeConfig.booleanOperation === "union") {
898
- updatedGeometry = (0, import_union.default)((0, import_helpers3.featureCollection)([selectedFeature, feature]));
966
+ updatedGeometry = (0, import_union.default)((0, import_helpers4.featureCollection)([selectedFeature, feature]));
899
967
  } else if (modeConfig.booleanOperation === "difference") {
900
- updatedGeometry = (0, import_difference.default)((0, import_helpers3.featureCollection)([selectedFeature, feature]));
968
+ updatedGeometry = (0, import_difference.default)((0, import_helpers4.featureCollection)([selectedFeature, feature]));
901
969
  } else if (modeConfig.booleanOperation === "intersection") {
902
- updatedGeometry = (0, import_intersect.default)((0, import_helpers3.featureCollection)([selectedFeature, feature]));
970
+ updatedGeometry = (0, import_intersect.default)((0, import_helpers4.featureCollection)([selectedFeature, feature]));
903
971
  } else {
904
972
  console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`);
905
973
  return null;
@@ -921,14 +989,14 @@ var GeoJsonEditMode = class {
921
989
  }
922
990
  return this.getAddFeatureAction(featureOrGeometry, props.data, featureProperties);
923
991
  }
924
- createTentativeFeature(props) {
992
+ createTentativeFeature(_props) {
925
993
  return null;
926
994
  }
927
- handleClick(event, props) {
995
+ handleClick(_event, _props) {
928
996
  }
929
- handleDoubleClick(event, props) {
997
+ handleDoubleClick(_event, _props) {
930
998
  }
931
- handlePointerMove(event, props) {
999
+ handlePointerMove(_event, props) {
932
1000
  const tentativeFeature = this.createTentativeFeature(props);
933
1001
  if (tentativeFeature) {
934
1002
  props.onEdit({
@@ -940,11 +1008,11 @@ var GeoJsonEditMode = class {
940
1008
  });
941
1009
  }
942
1010
  }
943
- handleStartDragging(event, props) {
1011
+ handleStartDragging(_event, _props) {
944
1012
  }
945
- handleStopDragging(event, props) {
1013
+ handleStopDragging(_event, _props) {
946
1014
  }
947
- handleDragging(event, props) {
1015
+ handleDragging(_event, _props) {
948
1016
  }
949
1017
  handleKeyUp(event, props) {
950
1018
  if (event.key === "Escape") {
@@ -971,25 +1039,18 @@ var ViewMode = class extends GeoJsonEditMode {
971
1039
  };
972
1040
 
973
1041
  // dist/edit-modes/translate-mode.js
974
- var import_bearing3 = __toESM(require("@turf/bearing"), 1);
975
- var import_distance = __toESM(require("@turf/distance"), 1);
976
1042
  var import_clone = __toESM(require("@turf/clone"), 1);
977
- var import_helpers4 = require("@turf/helpers");
978
1043
  var import_web_mercator3 = require("@math.gl/web-mercator");
979
1044
 
980
1045
  // dist/utils/translate-from-center.js
981
1046
  var import_center = __toESM(require("@turf/center"), 1);
982
- var import_rhumb_bearing = __toESM(require("@turf/rhumb-bearing"), 1);
983
- var import_rhumb_distance = __toESM(require("@turf/rhumb-distance"), 1);
984
- var import_rhumb_destination = __toESM(require("@turf/rhumb-destination"), 1);
985
- function translateFromCenter(feature, distance7, direction) {
986
- const initialCenterPoint = (0, import_center.default)(feature);
987
- const movedCenterPoint = (0, import_rhumb_destination.default)(initialCenterPoint, distance7, direction);
1047
+ function translateFromCenter(feature, distance6, direction, coordinateSystem = geoCoordinateSystem) {
1048
+ const initialCenter = (0, import_center.default)(feature).geometry.coordinates;
1049
+ const movedCenter = coordinateSystem.destination(initialCenter, distance6, direction);
988
1050
  const movedCoordinates = mapCoords(feature.geometry.coordinates, (coordinate) => {
989
- const rhumbDistance = (0, import_rhumb_distance.default)(initialCenterPoint.geometry.coordinates, coordinate);
990
- const rhumbDirection = (0, import_rhumb_bearing.default)(initialCenterPoint.geometry.coordinates, coordinate);
991
- const movedPosition = (0, import_rhumb_destination.default)(movedCenterPoint.geometry.coordinates, rhumbDistance, rhumbDirection).geometry.coordinates;
992
- return movedPosition;
1051
+ const dist = coordinateSystem.distance(initialCenter, coordinate);
1052
+ const dir = coordinateSystem.bearing(initialCenter, coordinate);
1053
+ return coordinateSystem.destination(movedCenter, dist, dir);
993
1054
  });
994
1055
  feature.geometry.coordinates = movedCoordinates;
995
1056
  return feature;
@@ -1073,11 +1134,10 @@ var TranslateMode = class extends GeoJsonEditMode {
1073
1134
  }
1074
1135
  }
1075
1136
  } else {
1076
- const p1 = (0, import_helpers4.point)(startDragPoint);
1077
- const p2 = (0, import_helpers4.point)(currentPoint);
1078
- const distanceMoved = (0, import_distance.default)(p1, p2);
1079
- const direction = (0, import_bearing3.default)(p1, p2);
1080
- const movedFeatures = this._geometryBeforeTranslate.features.map((feature) => translateFromCenter((0, import_clone.default)(feature), distanceMoved, direction));
1137
+ const coordinateSystem = getEditModeCoordinateSystem(props.coordinateSystem);
1138
+ const distanceMoved = coordinateSystem.distance(startDragPoint, currentPoint);
1139
+ const direction = coordinateSystem.bearing(startDragPoint, currentPoint);
1140
+ const movedFeatures = this._geometryBeforeTranslate.features.map((feature) => translateFromCenter((0, import_clone.default)(feature), distanceMoved, direction, coordinateSystem));
1081
1141
  for (let i = 0; i < selectedIndexes.length; i++) {
1082
1142
  const selectedIndex = selectedIndexes[i];
1083
1143
  const movedFeature = movedFeatures[i];
@@ -1122,7 +1182,7 @@ var ModifyMode = class extends GeoJsonEditMode {
1122
1182
  const referencePoint = (0, import_helpers5.point)(mapCoords2);
1123
1183
  recursivelyTraverseNestedArrays2(featureAsPick.object.geometry.coordinates, [], (lineString3, prefix) => {
1124
1184
  const lineStringFeature = (0, import_helpers5.lineString)(lineString3);
1125
- const candidateIntermediatePoint = this.getNearestPoint(lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport);
1185
+ const candidateIntermediatePoint = this.getNearestPoint(lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport, props.coordinateSystem);
1126
1186
  if (!intermediatePoint || candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist) {
1127
1187
  intermediatePoint = candidateIntermediatePoint;
1128
1188
  positionIndexPrefix = prefix;
@@ -1152,15 +1212,15 @@ var ModifyMode = class extends GeoJsonEditMode {
1152
1212
  };
1153
1213
  }
1154
1214
  // turf.js does not support elevation for nearestPointOnLine
1155
- getNearestPoint(line, inPoint, viewport) {
1215
+ getNearestPoint(line, inPoint, viewport, coordinateSystem) {
1156
1216
  const { coordinates } = line.geometry;
1157
1217
  if (coordinates.some((coord) => coord.length > 2)) {
1158
1218
  if (viewport) {
1159
- return nearestPointOnProjectedLine2(line, inPoint, viewport);
1219
+ return nearestPointOnProjectedLine2(line, inPoint, viewport, coordinateSystem);
1160
1220
  }
1161
1221
  console.log("Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.");
1162
1222
  }
1163
- return nearestPointOnLine(line, inPoint, viewport);
1223
+ return nearestPointOnLine(line, inPoint, viewport, coordinateSystem);
1164
1224
  }
1165
1225
  handleClick(event, props) {
1166
1226
  var _a, _b;
@@ -1588,7 +1648,7 @@ var import_line_intersect = __toESM(require("@turf/line-intersect"), 1);
1588
1648
  var import_helpers8 = require("@turf/helpers");
1589
1649
  var import_bearing6 = __toESM(require("@turf/bearing"), 1);
1590
1650
  var import_distance4 = __toESM(require("@turf/distance"), 1);
1591
- var import_destination3 = __toESM(require("@turf/destination"), 1);
1651
+ var import_destination4 = __toESM(require("@turf/destination"), 1);
1592
1652
  var import_polygon_to_line3 = __toESM(require("@turf/polygon-to-line"), 1);
1593
1653
  var import_nearest_point_on_line = __toESM(require("@turf/nearest-point-on-line"), 1);
1594
1654
  var SplitPolygonMode = class extends GeoJsonEditMode {
@@ -1615,7 +1675,7 @@ var SplitPolygonMode = class extends GeoJsonEditMode {
1615
1675
  if (closestPoint) {
1616
1676
  const lastBearing = (0, import_bearing6.default)(firstPoint, closestPoint);
1617
1677
  const currentDistance = (0, import_distance4.default)(firstPoint, mapCoords2, { units: "meters" });
1618
- return (0, import_destination3.default)(firstPoint, currentDistance, lastBearing, {
1678
+ return (0, import_destination4.default)(firstPoint, currentDistance, lastBearing, {
1619
1679
  units: "meters"
1620
1680
  }).geometry.coordinates;
1621
1681
  }
@@ -1965,9 +2025,6 @@ var DrawPointMode = class extends GeoJsonEditMode {
1965
2025
  }
1966
2026
  };
1967
2027
 
1968
- // dist/edit-modes/draw-line-string-mode.js
1969
- var import_distance5 = __toESM(require("@turf/distance"), 1);
1970
-
1971
2028
  // dist/utils/memoize.js
1972
2029
  function isEqual(a, b) {
1973
2030
  if (a === b) {
@@ -1988,9 +2045,14 @@ function isEqual(a, b) {
1988
2045
  return false;
1989
2046
  }
1990
2047
  function memoize(compute) {
1991
- let cachedArgs = {};
1992
- let cachedResult;
2048
+ let cachedArgs = null;
2049
+ let cachedResult = null;
1993
2050
  return (args) => {
2051
+ if (!cachedArgs) {
2052
+ cachedResult = compute(args);
2053
+ cachedArgs = args;
2054
+ return cachedResult;
2055
+ }
1994
2056
  for (const key in args) {
1995
2057
  if (!isEqual(args[key], cachedArgs[key])) {
1996
2058
  cachedResult = compute(args);
@@ -2018,7 +2080,7 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2018
2080
  }
2019
2081
  const clickSequence = this.getClickSequence();
2020
2082
  if (!clickedEditHandle) {
2021
- this.calculateInfoDraw(clickSequence);
2083
+ this.calculateInfoDraw(clickSequence, props == null ? void 0 : props.coordinateSystem);
2022
2084
  }
2023
2085
  if (clickSequence.length > 1 && clickedEditHandle && Array.isArray(clickedEditHandle.properties.positionIndexes) && clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1) {
2024
2086
  this.dist = 0;
@@ -2034,7 +2096,7 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2034
2096
  });
2035
2097
  }
2036
2098
  }
2037
- handleDoubleClick(event, props) {
2099
+ handleDoubleClick(_event, props) {
2038
2100
  this.finishDrawing(props);
2039
2101
  }
2040
2102
  finishDrawing(props) {
@@ -2105,7 +2167,7 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2105
2167
  guides.features.push(...editHandles);
2106
2168
  return guides;
2107
2169
  }
2108
- handlePointerMove(event, props) {
2170
+ handlePointerMove(_event, props) {
2109
2171
  props.onUpdateCursor("cell");
2110
2172
  }
2111
2173
  /**
@@ -2116,14 +2178,16 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2116
2178
  getTooltips(props) {
2117
2179
  return this._getTooltips({
2118
2180
  modeConfig: props.modeConfig,
2119
- dist: this.dist
2181
+ dist: this.dist,
2182
+ coordinateSystem: props == null ? void 0 : props.coordinateSystem
2120
2183
  });
2121
2184
  }
2122
2185
  // utility function
2123
- calculateInfoDraw(clickSequence) {
2186
+ calculateInfoDraw(clickSequence, coordinateSystem = new GeoCoordinateSystem()) {
2124
2187
  if (clickSequence.length > 1) {
2125
2188
  this.position = clickSequence[clickSequence.length - 1];
2126
- this.dist += (0, import_distance5.default)(clickSequence[clickSequence.length - 2], clickSequence[clickSequence.length - 1]);
2189
+ const coordSys = getEditModeCoordinateSystem(coordinateSystem);
2190
+ this.dist += coordSys.distance(clickSequence[clickSequence.length - 2], clickSequence[clickSequence.length - 1]);
2127
2191
  }
2128
2192
  }
2129
2193
  /**
@@ -2131,7 +2195,7 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2131
2195
  * @param modeConfig
2132
2196
  * @param dist
2133
2197
  */
2134
- _getTooltips = memoize(({ modeConfig, dist }) => {
2198
+ _getTooltips = memoize(({ modeConfig, dist, coordinateSystem }) => {
2135
2199
  let tooltips = [];
2136
2200
  const { formatTooltip } = modeConfig || {};
2137
2201
  let text;
@@ -2139,7 +2203,9 @@ var DrawLineStringMode = class extends GeoJsonEditMode {
2139
2203
  if (formatTooltip) {
2140
2204
  text = formatTooltip(dist);
2141
2205
  } else {
2142
- text = `Distance: ${parseFloat(dist).toFixed(2)} kilometers`;
2206
+ const coordSys = coordinateSystem ? getEditModeCoordinateSystem(coordinateSystem) : new GeoCoordinateSystem();
2207
+ const labelUnits = coordSys instanceof GeoCoordinateSystem ? "kilometers" : "pixels";
2208
+ text = `Distance: ${parseFloat(dist).toFixed(2)} ${labelUnits}`;
2143
2209
  }
2144
2210
  tooltips = [
2145
2211
  {
@@ -2509,15 +2575,15 @@ var DrawRectangleMode = class extends TwoClickPolygonMode {
2509
2575
 
2510
2576
  // dist/edit-modes/draw-square-mode.js
2511
2577
  var import_bbox_polygon4 = __toESM(require("@turf/bbox-polygon"), 1);
2512
- var import_distance6 = __toESM(require("@turf/distance"), 1);
2578
+ var import_distance5 = __toESM(require("@turf/distance"), 1);
2513
2579
  var import_along = __toESM(require("@turf/along"), 1);
2514
2580
  var import_helpers10 = require("@turf/helpers");
2515
2581
  var DrawSquareMode = class extends TwoClickPolygonMode {
2516
2582
  getTwoClickPolygon(coord1, coord2, modeConfig) {
2517
2583
  const coord3 = [coord2[0], coord1[1]];
2518
2584
  const coord4 = [coord1[0], coord2[1]];
2519
- const distance1 = (0, import_distance6.default)((0, import_helpers10.point)(coord3), (0, import_helpers10.point)(coord1));
2520
- const distance22 = (0, import_distance6.default)((0, import_helpers10.point)(coord4), (0, import_helpers10.point)(coord1));
2585
+ const distance1 = (0, import_distance5.default)((0, import_helpers10.point)(coord3), (0, import_helpers10.point)(coord1));
2586
+ const distance22 = (0, import_distance5.default)((0, import_helpers10.point)(coord4), (0, import_helpers10.point)(coord1));
2521
2587
  const shortestDistance = distance1 <= distance22 ? distance1 : distance22;
2522
2588
  const closestPoint = distance1 <= distance22 ? coord3 : coord4;
2523
2589
  const line = (0, import_helpers10.lineString)([closestPoint, coord2]);
@@ -2545,15 +2611,15 @@ var DrawRectangleFromCenterMode = class extends TwoClickPolygonMode {
2545
2611
 
2546
2612
  // dist/edit-modes/draw-square-from-center-mode.js
2547
2613
  var import_bbox_polygon6 = __toESM(require("@turf/bbox-polygon"), 1);
2548
- var import_distance7 = __toESM(require("@turf/distance"), 1);
2614
+ var import_distance6 = __toESM(require("@turf/distance"), 1);
2549
2615
  var import_along2 = __toESM(require("@turf/along"), 1);
2550
2616
  var import_helpers11 = require("@turf/helpers");
2551
2617
  var DrawSquareFromCenterMode = class extends TwoClickPolygonMode {
2552
2618
  getTwoClickPolygon(coord1, coord2, modeConfig) {
2553
2619
  const coord3 = [coord2[0], coord1[1]];
2554
2620
  const coord4 = [coord1[0], coord2[1]];
2555
- const distance1 = (0, import_distance7.default)((0, import_helpers11.point)(coord3), (0, import_helpers11.point)(coord1));
2556
- const distance22 = (0, import_distance7.default)((0, import_helpers11.point)(coord4), (0, import_helpers11.point)(coord1));
2621
+ const distance1 = (0, import_distance6.default)((0, import_helpers11.point)(coord3), (0, import_helpers11.point)(coord1));
2622
+ const distance22 = (0, import_distance6.default)((0, import_helpers11.point)(coord4), (0, import_helpers11.point)(coord1));
2557
2623
  const shortestDistance = distance1 <= distance22 ? distance1 : distance22;
2558
2624
  const closestPoint = distance1 <= distance22 ? coord3 : coord4;
2559
2625
  const line = (0, import_helpers11.lineString)([closestPoint, coord2]);
@@ -2570,7 +2636,7 @@ var DrawSquareFromCenterMode = class extends TwoClickPolygonMode {
2570
2636
 
2571
2637
  // dist/edit-modes/draw-circle-from-center-mode.js
2572
2638
  var import_circle = __toESM(require("@turf/circle"), 1);
2573
- var import_distance8 = __toESM(require("@turf/distance"), 1);
2639
+ var import_distance7 = __toESM(require("@turf/distance"), 1);
2574
2640
  var import_area = __toESM(require("@turf/area"), 1);
2575
2641
  var DrawCircleFromCenterMode = class extends TwoClickPolygonMode {
2576
2642
  radius = null;
@@ -2584,7 +2650,7 @@ var DrawCircleFromCenterMode = class extends TwoClickPolygonMode {
2584
2650
  console.warn("Minimum steps to draw a circle is 4 ");
2585
2651
  options.steps = 4;
2586
2652
  }
2587
- this.radius = Math.max((0, import_distance8.default)(coord1, coord2), 1e-3);
2653
+ this.radius = Math.max((0, import_distance7.default)(coord1, coord2), 1e-3);
2588
2654
  const geometry = (0, import_circle.default)(coord1, this.radius, options);
2589
2655
  geometry.properties = geometry.properties || {};
2590
2656
  geometry.properties.shape = "Circle";
@@ -2638,7 +2704,7 @@ var DrawCircleFromCenterMode = class extends TwoClickPolygonMode {
2638
2704
 
2639
2705
  // dist/edit-modes/draw-circle-by-diameter-mode.js
2640
2706
  var import_circle2 = __toESM(require("@turf/circle"), 1);
2641
- var import_distance9 = __toESM(require("@turf/distance"), 1);
2707
+ var import_distance8 = __toESM(require("@turf/distance"), 1);
2642
2708
  var import_area2 = __toESM(require("@turf/area"), 1);
2643
2709
  var DrawCircleByDiameterMode = class extends TwoClickPolygonMode {
2644
2710
  radius = null;
@@ -2653,8 +2719,8 @@ var DrawCircleByDiameterMode = class extends TwoClickPolygonMode {
2653
2719
  options.steps = 4;
2654
2720
  }
2655
2721
  const centerCoordinates = getIntermediatePosition(coord1, coord2);
2656
- this.radius = Math.max((0, import_distance9.default)(coord1, centerCoordinates), 1e-3);
2657
- this.diameter = Math.max((0, import_distance9.default)(coord1, coord2), 1e-3);
2722
+ this.radius = Math.max((0, import_distance8.default)(coord1, centerCoordinates), 1e-3);
2723
+ this.diameter = Math.max((0, import_distance8.default)(coord1, coord2), 1e-3);
2658
2724
  this.position = centerCoordinates;
2659
2725
  const geometry = (0, import_circle2.default)(centerCoordinates, this.radius, options);
2660
2726
  geometry.properties = geometry.properties || {};
@@ -2713,7 +2779,7 @@ var DrawCircleByDiameterMode = class extends TwoClickPolygonMode {
2713
2779
 
2714
2780
  // dist/edit-modes/draw-ellipse-by-bounding-box-mode.js
2715
2781
  var import_bbox_polygon7 = __toESM(require("@turf/bbox-polygon"), 1);
2716
- var import_distance10 = __toESM(require("@turf/distance"), 1);
2782
+ var import_distance9 = __toESM(require("@turf/distance"), 1);
2717
2783
  var import_ellipse = __toESM(require("@turf/ellipse"), 1);
2718
2784
  var import_helpers12 = require("@turf/helpers");
2719
2785
  var DrawEllipseByBoundingBoxMode = class extends TwoClickPolygonMode {
@@ -2724,8 +2790,8 @@ var DrawEllipseByBoundingBoxMode = class extends TwoClickPolygonMode {
2724
2790
  const maxY = Math.max(coord1[1], coord2[1]);
2725
2791
  const polygonPoints = (0, import_bbox_polygon7.default)([minX, minY, maxX, maxY]).geometry.coordinates[0];
2726
2792
  const centerCoordinates = getIntermediatePosition(coord1, coord2);
2727
- const xSemiAxis = Math.max((0, import_distance10.default)((0, import_helpers12.point)(polygonPoints[0]), (0, import_helpers12.point)(polygonPoints[1])), 1e-3);
2728
- const ySemiAxis = Math.max((0, import_distance10.default)((0, import_helpers12.point)(polygonPoints[0]), (0, import_helpers12.point)(polygonPoints[3])), 1e-3);
2793
+ const xSemiAxis = Math.max((0, import_distance9.default)((0, import_helpers12.point)(polygonPoints[0]), (0, import_helpers12.point)(polygonPoints[1])), 1e-3);
2794
+ const ySemiAxis = Math.max((0, import_distance9.default)((0, import_helpers12.point)(polygonPoints[0]), (0, import_helpers12.point)(polygonPoints[3])), 1e-3);
2729
2795
  const geometry = (0, import_ellipse.default)(centerCoordinates, xSemiAxis, ySemiAxis, {});
2730
2796
  geometry.properties = geometry.properties || {};
2731
2797
  geometry.properties.editProperties = geometry.properties.editProperties || {};
@@ -2837,15 +2903,15 @@ var DrawRectangleUsingThreePointsMode = class extends ThreeClickPolygonMode {
2837
2903
  };
2838
2904
 
2839
2905
  // dist/edit-modes/draw-ellipse-using-three-points-mode.js
2840
- var import_distance11 = __toESM(require("@turf/distance"), 1);
2906
+ var import_distance10 = __toESM(require("@turf/distance"), 1);
2841
2907
  var import_ellipse2 = __toESM(require("@turf/ellipse"), 1);
2842
2908
  var import_bearing8 = __toESM(require("@turf/bearing"), 1);
2843
2909
  var import_helpers13 = require("@turf/helpers");
2844
2910
  var DrawEllipseUsingThreePointsMode = class extends ThreeClickPolygonMode {
2845
2911
  getThreeClickPolygon(coord1, coord2, coord3, modeConfig) {
2846
2912
  const centerCoordinates = getIntermediatePosition(coord1, coord2);
2847
- const xSemiAxis = Math.max((0, import_distance11.default)(centerCoordinates, (0, import_helpers13.point)(coord3)), 1e-3);
2848
- const ySemiAxis = Math.max((0, import_distance11.default)(coord1, coord2), 1e-3) / 2;
2913
+ const xSemiAxis = Math.max((0, import_distance10.default)(centerCoordinates, (0, import_helpers13.point)(coord3)), 1e-3);
2914
+ const ySemiAxis = Math.max((0, import_distance10.default)(coord1, coord2), 1e-3) / 2;
2849
2915
  const options = { angle: (0, import_bearing8.default)(coord1, coord2) };
2850
2916
  const geometry = (0, import_ellipse2.default)(centerCoordinates, xSemiAxis, ySemiAxis, options);
2851
2917
  geometry.properties = geometry.properties || {};
@@ -2860,10 +2926,10 @@ var DrawEllipseUsingThreePointsMode = class extends ThreeClickPolygonMode {
2860
2926
  };
2861
2927
 
2862
2928
  // dist/edit-modes/draw-90degree-polygon-mode.js
2863
- var import_destination4 = __toESM(require("@turf/destination"), 1);
2929
+ var import_destination5 = __toESM(require("@turf/destination"), 1);
2864
2930
  var import_bearing9 = __toESM(require("@turf/bearing"), 1);
2865
2931
  var import_line_intersect3 = __toESM(require("@turf/line-intersect"), 1);
2866
- var import_distance12 = __toESM(require("@turf/distance"), 1);
2932
+ var import_distance11 = __toESM(require("@turf/distance"), 1);
2867
2933
  var import_helpers14 = require("@turf/helpers");
2868
2934
  var Draw90DegreePolygonMode = class extends GeoJsonEditMode {
2869
2935
  createTentativeFeature(props) {
@@ -2993,16 +3059,16 @@ var Draw90DegreePolygonMode = class extends GeoJsonEditMode {
2993
3059
  const newAngle2 = angle2 + factor * 90;
2994
3060
  angles.second.push(newAngle2 > 180 ? newAngle2 - 360 : newAngle2);
2995
3061
  });
2996
- const distance7 = (0, import_distance12.default)((0, import_helpers14.point)(p1), (0, import_helpers14.point)(p3));
3062
+ const distance6 = (0, import_distance11.default)((0, import_helpers14.point)(p1), (0, import_helpers14.point)(p3));
2997
3063
  [0, 1, 2].forEach((indexFirst) => {
2998
3064
  const line1 = (0, import_helpers14.lineString)([
2999
3065
  p1,
3000
- (0, import_destination4.default)(p1, distance7, angles.first[indexFirst]).geometry.coordinates
3066
+ (0, import_destination5.default)(p1, distance6, angles.first[indexFirst]).geometry.coordinates
3001
3067
  ]);
3002
3068
  [0, 1, 2].forEach((indexSecond) => {
3003
3069
  const line2 = (0, import_helpers14.lineString)([
3004
3070
  p3,
3005
- (0, import_destination4.default)(p3, distance7, angles.second[indexSecond]).geometry.coordinates
3071
+ (0, import_destination5.default)(p3, distance6, angles.second[indexSecond]).geometry.coordinates
3006
3072
  ]);
3007
3073
  const fc = (0, import_line_intersect3.default)(line1, line2);
3008
3074
  if (fc && fc.features.length) {
@@ -3326,7 +3392,7 @@ var DeleteMode = class extends GeoJsonEditMode {
3326
3392
  var PROJECTED_PIXEL_SIZE_MULTIPLIER = 2 / 3;
3327
3393
 
3328
3394
  // dist/editable-layers/editable-layer.js
3329
- var import_core = require("@deck.gl/core");
3395
+ var import_core2 = require("@deck.gl/core");
3330
3396
  var EVENT_TYPES = [
3331
3397
  "click",
3332
3398
  "pointermove",
@@ -3336,7 +3402,7 @@ var EVENT_TYPES = [
3336
3402
  "keyup",
3337
3403
  "dblclick"
3338
3404
  ];
3339
- var EditableLayer = class extends import_core.CompositeLayer {
3405
+ var EditableLayer = class extends import_core2.CompositeLayer {
3340
3406
  state = void 0;
3341
3407
  // Overridable interaction event handlers
3342
3408
  onLayerClick(event) {
@@ -3823,6 +3889,10 @@ var EditableGeoJsonLayer = class extends EditableLayer {
3823
3889
  selectedIndexes: props.selectedFeatureIndexes,
3824
3890
  lastPointerMoveEvent: this.state.lastPointerMoveEvent,
3825
3891
  cursor: this.state.cursor,
3892
+ // Derive edit-mode math from deck.gl's coordinateSystem layer prop.
3893
+ // This ensures that when the layer is configured for Cartesian or other
3894
+ // non-geographic rendering, edit modes automatically use the correct geometry math.
3895
+ coordinateSystem: fromDeckCoordinateSystem(this.props.coordinateSystem),
3826
3896
  onEdit: (editAction) => {
3827
3897
  this.setNeedsUpdate();
3828
3898
  props.onEdit(editAction);
@@ -4142,7 +4212,7 @@ __publicField(EditableH3ClusterLayer, "layerName", "EditableH3ClusterLayer");
4142
4212
  __publicField(EditableH3ClusterLayer, "defaultProps", defaultProps3);
4143
4213
 
4144
4214
  // dist/editable-layers/selection-layer.js
4145
- var import_core2 = require("@deck.gl/core");
4215
+ var import_core3 = require("@deck.gl/core");
4146
4216
  var import_layers3 = require("@deck.gl/layers");
4147
4217
  var import_helpers16 = require("@turf/helpers");
4148
4218
  var import_buffer2 = __toESM(require("@turf/buffer"), 1);
@@ -4194,7 +4264,7 @@ var PASS_THROUGH_PROPS = [
4194
4264
  "getTentativeFillColor",
4195
4265
  "getTentativeLineWidth"
4196
4266
  ];
4197
- var SelectionLayer = class extends import_core2.CompositeLayer {
4267
+ var SelectionLayer = class extends import_core3.CompositeLayer {
4198
4268
  state = void 0;
4199
4269
  _selectRectangleObjects(coordinates) {
4200
4270
  const { layerIds, onSelect } = this.props;
@@ -4299,10 +4369,10 @@ __publicField(SelectionLayer, "layerName", "SelectionLayer");
4299
4369
  __publicField(SelectionLayer, "defaultProps", defaultProps4);
4300
4370
 
4301
4371
  // dist/editable-layers/elevated-edit-handle-layer.js
4302
- var import_core3 = require("@deck.gl/core");
4372
+ var import_core4 = require("@deck.gl/core");
4303
4373
  var import_layers4 = require("@deck.gl/layers");
4304
4374
  var defaultProps5 = {};
4305
- var ElevatedEditHandleLayer = class extends import_core3.CompositeLayer {
4375
+ var ElevatedEditHandleLayer = class extends import_core4.CompositeLayer {
4306
4376
  renderLayers() {
4307
4377
  const handles = new import_layers4.ScatterplotLayer(Object.assign({}, this.props, {
4308
4378
  id: `${this.props.id}-ScatterplotLayer`,
@@ -4326,7 +4396,7 @@ __publicField(ElevatedEditHandleLayer, "defaultProps", defaultProps5);
4326
4396
  // dist/widgets/edit-mode-tray-widget.js
4327
4397
  var import_jsx_runtime = require("preact/jsx-runtime");
4328
4398
  var import_preact = require("preact");
4329
- var import_core4 = require("@deck.gl/core");
4399
+ var import_core5 = require("@deck.gl/core");
4330
4400
  var ROOT_STYLE = {
4331
4401
  position: "absolute",
4332
4402
  display: "flex",
@@ -4370,7 +4440,7 @@ var BUTTON_LABEL_STYLE = {
4370
4440
  marginTop: "2px",
4371
4441
  lineHeight: "12px"
4372
4442
  };
4373
- var _EditModeTrayWidget = class extends import_core4.Widget {
4443
+ var _EditModeTrayWidget = class extends import_core5.Widget {
4374
4444
  placement = "top-left";
4375
4445
  className = "deck-widget-edit-mode-tray";
4376
4446
  layout = "vertical";
@@ -4545,7 +4615,7 @@ __publicField(EditModeTrayWidget, "defaultProps", {
4545
4615
  // dist/widgets/editor-toolbar-widget.js
4546
4616
  var import_jsx_runtime2 = require("preact/jsx-runtime");
4547
4617
  var import_preact2 = require("preact");
4548
- var import_core5 = require("@deck.gl/core");
4618
+ var import_core6 = require("@deck.gl/core");
4549
4619
  var ROOT_STYLE2 = {
4550
4620
  position: "absolute",
4551
4621
  display: "flex",
@@ -4627,7 +4697,7 @@ var BOOLEAN_OPS = [
4627
4697
  { op: "union", icon: UnionIcon, label: "Union", title: "Union with selection" },
4628
4698
  { op: "intersection", icon: IntersectIcon, label: "Sect", title: "Intersect with selection" }
4629
4699
  ];
4630
- var _EditorToolbarWidget = class extends import_core5.Widget {
4700
+ var _EditorToolbarWidget = class extends import_core6.Widget {
4631
4701
  placement = "bottom-left";
4632
4702
  className = "deck-widget-editor-toolbar";
4633
4703
  deck = null;
@@ -4712,9 +4782,9 @@ __publicField(EditorToolbarWidget, "defaultProps", {
4712
4782
  });
4713
4783
 
4714
4784
  // dist/editable-layers/junction-scatterplot-layer.js
4715
- var import_core6 = require("@deck.gl/core");
4785
+ var import_core7 = require("@deck.gl/core");
4716
4786
  var import_layers5 = require("@deck.gl/layers");
4717
- var JunctionScatterplotLayer = class extends import_core6.CompositeLayer {
4787
+ var JunctionScatterplotLayer = class extends import_core7.CompositeLayer {
4718
4788
  renderLayers() {
4719
4789
  const { id, getFillColor, getStrokeColor, getInnerRadius, updateTriggers } = this.props;
4720
4790
  return [
@@ -4758,7 +4828,7 @@ __publicField(JunctionScatterplotLayer, "defaultProps", {
4758
4828
  var import_nearest_point_on_line2 = __toESM(require("@turf/nearest-point-on-line"), 1);
4759
4829
  var import_helpers17 = require("@turf/helpers");
4760
4830
  var import_circle3 = __toESM(require("@turf/circle"), 1);
4761
- var import_distance13 = __toESM(require("@turf/distance"), 1);
4831
+ var import_distance12 = __toESM(require("@turf/distance"), 1);
4762
4832
  var import_center2 = __toESM(require("@turf/center"), 1);
4763
4833
  var ResizeCircleMode = class extends GeoJsonEditMode {
4764
4834
  _selectedEditHandle;
@@ -4826,7 +4896,7 @@ var ResizeCircleMode = class extends GeoJsonEditMode {
4826
4896
  const feature = this.getSelectedFeature(props);
4827
4897
  const center = (0, import_center2.default)(feature).geometry.coordinates;
4828
4898
  const numberOfSteps = Object.entries(feature.geometry.coordinates[0]).length - 1;
4829
- const radius = Math.max((0, import_distance13.default)(center, event.mapCoords), 1e-3);
4899
+ const radius = Math.max((0, import_distance12.default)(center, event.mapCoords), 1e-3);
4830
4900
  const { steps = numberOfSteps } = {};
4831
4901
  const options = { steps };
4832
4902
  const updatedFeature = (0, import_circle3.default)(center, radius, options);
@@ -4942,34 +5012,33 @@ var ExtendLineStringMode = class extends GeoJsonEditMode {
4942
5012
  };
4943
5013
 
4944
5014
  // dist/edit-modes/measure-distance-mode.js
4945
- var import_distance14 = __toESM(require("@turf/distance"), 1);
4946
- var import_midpoint = __toESM(require("@turf/midpoint"), 1);
4947
5015
  var MeasureDistanceMode = class extends GeoJsonEditMode {
4948
5016
  _isMeasuringSessionFinished = false;
4949
5017
  _currentTooltips = [];
4950
5018
  _currentDistance = 0;
4951
- _calculateDistanceForTooltip = ({ positionA, positionB, modeConfig }) => {
4952
- const { turfOptions, measurementCallback } = modeConfig || {};
4953
- const distance7 = (0, import_distance14.default)(positionA, positionB, turfOptions);
5019
+ _calculateDistanceForTooltip = ({ positionA, positionB, modeConfig, coordinateSystem }) => {
5020
+ const { measurementCallback } = modeConfig || {};
5021
+ const distance6 = getEditModeCoordinateSystem(coordinateSystem).distance(positionA, positionB);
4954
5022
  if (measurementCallback) {
4955
- measurementCallback(distance7);
5023
+ measurementCallback(distance6);
4956
5024
  }
4957
- return distance7;
5025
+ return distance6;
4958
5026
  };
4959
- _formatTooltip(distance7, modeConfig) {
5027
+ _formatTooltip(distance6, modeConfig) {
4960
5028
  const { formatTooltip, turfOptions } = modeConfig || {};
4961
5029
  const units = turfOptions && turfOptions.units || "kilometers";
4962
5030
  let text;
4963
5031
  if (formatTooltip) {
4964
- text = formatTooltip(distance7);
5032
+ text = formatTooltip(distance6);
4965
5033
  } else {
4966
- text = `${parseFloat(distance7).toFixed(2)} ${units}`;
5034
+ text = `${parseFloat(distance6).toFixed(2)} ${units}`;
4967
5035
  }
4968
5036
  return text;
4969
5037
  }
4970
5038
  handleClick(event, props) {
4971
5039
  const { modeConfig, data, onEdit } = props;
4972
5040
  const { centerTooltipsOnLine = false } = modeConfig || {};
5041
+ const coordSys = getEditModeCoordinateSystem(props.coordinateSystem);
4973
5042
  if (this._isMeasuringSessionFinished) {
4974
5043
  this._isMeasuringSessionFinished = false;
4975
5044
  this.resetClickSequence();
@@ -4991,9 +5060,10 @@ var MeasureDistanceMode = class extends GeoJsonEditMode {
4991
5060
  this._currentDistance += this._calculateDistanceForTooltip({
4992
5061
  positionA: clickSequence[clickSequence.length - 2],
4993
5062
  positionB: clickSequence[clickSequence.length - 1],
4994
- modeConfig
5063
+ modeConfig,
5064
+ coordinateSystem: coordSys
4995
5065
  });
4996
- const tooltipPosition = centerTooltipsOnLine ? (0, import_midpoint.default)(clickSequence[clickSequence.length - 2], clickSequence[clickSequence.length - 1]).geometry.coordinates : event.mapCoords;
5066
+ const tooltipPosition = centerTooltipsOnLine ? coordSys.midpoint(clickSequence[clickSequence.length - 2], clickSequence[clickSequence.length - 1]) : event.mapCoords;
4997
5067
  this._currentTooltips.push({
4998
5068
  position: tooltipPosition,
4999
5069
  text: this._formatTooltip(this._currentDistance, modeConfig)
@@ -5075,18 +5145,20 @@ var MeasureDistanceMode = class extends GeoJsonEditMode {
5075
5145
  const { lastPointerMoveEvent, modeConfig } = props;
5076
5146
  const { centerTooltipsOnLine = false } = modeConfig || {};
5077
5147
  const positions = this.getClickSequence();
5148
+ const coordSys = getEditModeCoordinateSystem(props.coordinateSystem);
5078
5149
  if (positions.length > 0 && lastPointerMoveEvent && !this._isMeasuringSessionFinished) {
5079
- const distance7 = this._calculateDistanceForTooltip({
5150
+ const distance6 = this._calculateDistanceForTooltip({
5080
5151
  positionA: positions[positions.length - 1],
5081
5152
  positionB: lastPointerMoveEvent.mapCoords,
5082
- modeConfig: props.modeConfig
5153
+ modeConfig: props.modeConfig,
5154
+ coordinateSystem: coordSys
5083
5155
  });
5084
- const tooltipPosition = centerTooltipsOnLine ? (0, import_midpoint.default)(positions[positions.length - 1], lastPointerMoveEvent.mapCoords).geometry.coordinates : lastPointerMoveEvent.mapCoords;
5156
+ const tooltipPosition = centerTooltipsOnLine ? coordSys.midpoint(positions[positions.length - 1], lastPointerMoveEvent.mapCoords) : lastPointerMoveEvent.mapCoords;
5085
5157
  return [
5086
5158
  ...this._currentTooltips,
5087
5159
  {
5088
5160
  position: tooltipPosition,
5089
- text: this._formatTooltip(this._currentDistance + distance7, modeConfig)
5161
+ text: this._formatTooltip(this._currentDistance + distance6, modeConfig)
5090
5162
  }
5091
5163
  ];
5092
5164
  }