@deck.gl-community/editable-layers 9.2.0-beta.8 → 9.2.8
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.
- package/README.md +3 -0
- package/dist/edit-modes/draw-90degree-polygon-mode.d.ts.map +1 -1
- package/dist/edit-modes/draw-90degree-polygon-mode.js.map +1 -1
- package/dist/edit-modes/draw-line-string-mode.d.ts.map +1 -1
- package/dist/edit-modes/draw-line-string-mode.js.map +1 -1
- package/dist/edit-modes/draw-polygon-mode.d.ts.map +1 -1
- package/dist/edit-modes/draw-polygon-mode.js +48 -52
- package/dist/edit-modes/draw-polygon-mode.js.map +1 -1
- package/dist/edit-modes/draw-square-mode.d.ts.map +1 -1
- package/dist/edit-modes/draw-square-mode.js.map +1 -1
- package/dist/edit-modes/extend-line-string-mode.d.ts.map +1 -1
- package/dist/edit-modes/extend-line-string-mode.js.map +1 -1
- package/dist/edit-modes/geojson-edit-mode.d.ts.map +1 -1
- package/dist/edit-modes/geojson-edit-mode.js.map +1 -1
- package/dist/edit-modes/modify-mode.d.ts.map +1 -1
- package/dist/edit-modes/modify-mode.js +23 -19
- package/dist/edit-modes/modify-mode.js.map +1 -1
- package/dist/edit-modes/resize-circle-mode.d.ts.map +1 -1
- package/dist/edit-modes/resize-circle-mode.js.map +1 -1
- package/dist/edit-modes/rotate-mode.d.ts.map +1 -1
- package/dist/edit-modes/rotate-mode.js.map +1 -1
- package/dist/edit-modes/scale-mode.d.ts.map +1 -1
- package/dist/edit-modes/scale-mode.js.map +1 -1
- package/dist/edit-modes/snappable-mode.d.ts.map +1 -1
- package/dist/edit-modes/snappable-mode.js.map +1 -1
- package/dist/edit-modes/split-polygon-mode.d.ts.map +1 -1
- package/dist/edit-modes/split-polygon-mode.js.map +1 -1
- package/dist/edit-modes/three-click-polygon-mode.d.ts.map +1 -1
- package/dist/edit-modes/three-click-polygon-mode.js +14 -18
- package/dist/edit-modes/three-click-polygon-mode.js.map +1 -1
- package/dist/edit-modes/translate-mode.d.ts.map +1 -1
- package/dist/edit-modes/translate-mode.js +2 -2
- package/dist/edit-modes/translate-mode.js.map +1 -1
- package/dist/edit-modes/two-click-polygon-mode.d.ts.map +1 -1
- package/dist/edit-modes/two-click-polygon-mode.js.map +1 -1
- package/dist/edit-modes/utils.js +1 -1
- package/dist/edit-modes/utils.js.map +1 -1
- package/dist/editable-layers/editable-geojson-layer.d.ts.map +1 -1
- package/dist/editable-layers/editable-geojson-layer.js +20 -4
- package/dist/editable-layers/editable-geojson-layer.js.map +1 -1
- package/dist/index.cjs +246 -55
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mode-handlers/mode-handler.d.ts.map +1 -1
- package/dist/mode-handlers/mode-handler.js +1 -1
- package/dist/mode-handlers/mode-handler.js.map +1 -1
- package/dist/mode-handlers/rotate-handler.d.ts.map +1 -1
- package/dist/mode-handlers/rotate-handler.js.map +1 -1
- package/dist/mode-handlers/scale-handler.d.ts.map +1 -1
- package/dist/mode-handlers/scale-handler.js.map +1 -1
- package/dist/mode-handlers/split-polygon-handler.d.ts.map +1 -1
- package/dist/mode-handlers/split-polygon-handler.js.map +1 -1
- package/dist/utils/geojson-types.d.ts.map +1 -1
- package/dist/utils/translate-from-center.d.ts.map +1 -1
- package/dist/utils/translate-from-center.js.map +1 -1
- package/dist/utils/utils.js +1 -1
- package/dist/utils/utils.js.map +1 -1
- package/dist/widgets/edit-mode-tray-widget.d.ts +1 -0
- package/dist/widgets/edit-mode-tray-widget.d.ts.map +1 -1
- package/dist/widgets/edit-mode-tray-widget.js +1 -0
- package/dist/widgets/edit-mode-tray-widget.js.map +1 -1
- package/dist/widgets/editor-toolbar-widget.d.ts +40 -0
- package/dist/widgets/editor-toolbar-widget.d.ts.map +1 -0
- package/dist/widgets/editor-toolbar-widget.js +170 -0
- package/dist/widgets/editor-toolbar-widget.js.map +1 -0
- package/package.json +16 -12
- package/src/edit-modes/draw-90degree-polygon-mode.ts +7 -1
- package/src/edit-modes/draw-line-string-mode.ts +6 -1
- package/src/edit-modes/draw-polygon-mode.ts +96 -117
- package/src/edit-modes/draw-square-mode.ts +0 -1
- package/src/edit-modes/extend-line-string-mode.ts +9 -2
- package/src/edit-modes/geojson-edit-mode.ts +15 -3
- package/src/edit-modes/immutable-feature-collection.ts +1 -1
- package/src/edit-modes/modify-mode.ts +33 -21
- package/src/edit-modes/resize-circle-mode.ts +8 -3
- package/src/edit-modes/rotate-mode.ts +3 -8
- package/src/edit-modes/scale-mode.ts +5 -6
- package/src/edit-modes/snappable-mode.ts +6 -1
- package/src/edit-modes/split-polygon-mode.ts +9 -3
- package/src/edit-modes/three-click-polygon-mode.ts +28 -31
- package/src/edit-modes/translate-mode.ts +8 -3
- package/src/edit-modes/two-click-polygon-mode.ts +7 -1
- package/src/edit-modes/utils.ts +1 -1
- package/src/editable-layers/editable-geojson-layer.ts +20 -4
- package/src/index.ts +3 -0
- package/src/mode-handlers/mode-handler.ts +21 -6
- package/src/mode-handlers/rotate-handler.ts +1 -4
- package/src/mode-handlers/scale-handler.ts +3 -7
- package/src/mode-handlers/split-polygon-handler.ts +3 -1
- package/src/utils/geojson-types.ts +22 -6
- package/src/utils/translate-from-center.ts +11 -24
- package/src/utils/utils.ts +1 -1
- package/src/widgets/edit-mode-tray-widget.tsx +2 -6
- package/src/widgets/editor-toolbar-widget.tsx +348 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/utils/utils.ts", "../src/editable-layers/editable-geojson-layer.ts", "../src/edit-modes/geojson-edit-mode.ts", "../src/edit-modes/utils.ts", "../src/edit-modes/immutable-feature-collection.ts", "../src/edit-modes/view-mode.ts", "../src/edit-modes/translate-mode.ts", "../src/utils/translate-from-center.ts", "../src/edit-modes/modify-mode.ts", "../src/edit-modes/scale-mode.ts", "../src/edit-modes/rotate-mode.ts", "../src/edit-modes/duplicate-mode.ts", "../src/edit-modes/split-polygon-mode.ts", "../src/edit-modes/extrude-mode.ts", "../src/edit-modes/elevation-mode.ts", "../src/edit-modes/draw-point-mode.ts", "../src/edit-modes/draw-line-string-mode.ts", "../src/utils/memoize.ts", "../src/edit-modes/draw-polygon-mode.ts", "../src/edit-modes/draw-rectangle-mode.ts", "../src/edit-modes/two-click-polygon-mode.ts", "../src/edit-modes/draw-square-mode.ts", "../src/edit-modes/draw-rectangle-from-center-mode.ts", "../src/edit-modes/draw-square-from-center-mode.ts", "../src/edit-modes/draw-circle-from-center-mode.ts", "../src/edit-modes/draw-circle-by-diameter-mode.ts", "../src/edit-modes/draw-ellipse-by-bounding-box-mode.ts", "../src/edit-modes/three-click-polygon-mode.ts", "../src/edit-modes/draw-rectangle-using-three-points-mode.ts", "../src/edit-modes/draw-ellipse-using-three-points-mode.ts", "../src/edit-modes/draw-90degree-polygon-mode.ts", "../src/edit-modes/draw-polygon-by-dragging-mode.ts", "../src/edit-modes/snappable-mode.ts", "../src/edit-modes/transform-mode.ts", "../src/edit-modes/composite-mode.ts", "../src/edit-modes/delete-mode.ts", "../src/constants.ts", "../src/editable-layers/editable-layer.ts", "../src/editable-layers/editable-path-layer.ts", "../src/editable-layers/editable-h3-cluster-layer.ts", "../src/editable-layers/selection-layer.ts", "../src/editable-layers/elevated-edit-handle-layer.ts", "../src/widgets/edit-mode-tray-widget.tsx", "../src/editable-layers/junction-scatterplot-layer.ts", "../src/edit-modes/resize-circle-mode.ts", "../src/edit-modes/extend-line-string-mode.ts", "../src/edit-modes/measure-distance-mode.ts", "../src/edit-modes/measure-area-mode.ts", "../src/edit-modes/measure-angle-mode.ts"],
|
|
4
|
-
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Utils\nexport {toDeckColor} from './utils/utils';\n\n// Types\nexport type {Color, Style, Viewport} from './utils/types';\n\n// Layers\nexport {EditableGeoJsonLayer} from './editable-layers/editable-geojson-layer';\nexport {EditableH3ClusterLayer} from './editable-layers/editable-h3-cluster-layer';\nexport {SelectionLayer} from './editable-layers/selection-layer';\nexport {ElevatedEditHandleLayer} from './editable-layers/elevated-edit-handle-layer';\n\n// Widgets\nexport {EditModeTrayWidget} from './widgets/edit-mode-tray-widget';\nexport type {\n EditModeTrayWidgetProps,\n EditModeTrayWidgetModeOption,\n EditModeTrayWidgetSelectEvent\n} from './widgets/edit-mode-tray-widget';\n\n// Layers move to deck.gl-community/layers?\nexport {JunctionScatterplotLayer} from './editable-layers/junction-scatterplot-layer';\n\n// Types\n\nimport * as utils from './utils/utils';\n\nexport {utils};\n\nexport {getPickedEditHandle, getEditHandlesForGeometry} from './edit-modes/utils';\n\nexport type {EditMode} from './edit-modes/edit-mode';\nexport type {GeoJsonEditModeType} from './edit-modes/geojson-edit-mode';\nexport type {GeoJsonEditModeConstructor} from './edit-modes/geojson-edit-mode';\n\nexport type {EditableGeoJsonLayerProps} from './editable-layers/editable-geojson-layer';\nexport type {SelectionLayerProps} from './editable-layers/selection-layer';\n\nexport {GeoJsonEditMode} from './edit-modes/geojson-edit-mode';\n\n// Alter modes\nexport {DeleteMode} from './edit-modes/delete-mode';\nexport {ModifyMode} from './edit-modes/modify-mode';\nexport {ResizeCircleMode} from './edit-modes/resize-circle-mode';\nexport {TranslateMode} from './edit-modes/translate-mode';\nexport {ScaleMode} from './edit-modes/scale-mode';\nexport {RotateMode} from './edit-modes/rotate-mode';\nexport {DuplicateMode} from './edit-modes/duplicate-mode';\nexport {ExtendLineStringMode} from './edit-modes/extend-line-string-mode';\nexport {SplitPolygonMode} from './edit-modes/split-polygon-mode';\nexport {ExtrudeMode} from './edit-modes/extrude-mode';\nexport {ElevationMode} from './edit-modes/elevation-mode';\nexport {TransformMode} from './edit-modes/transform-mode';\n\n// Draw modes\nexport {DrawPointMode} from './edit-modes/draw-point-mode';\nexport {DrawLineStringMode} from './edit-modes/draw-line-string-mode';\nexport {DrawPolygonMode} from './edit-modes/draw-polygon-mode';\nexport {DrawRectangleMode} from './edit-modes/draw-rectangle-mode';\nexport {DrawSquareMode} from './edit-modes/draw-square-mode';\nexport {DrawRectangleFromCenterMode} from './edit-modes/draw-rectangle-from-center-mode';\nexport {DrawSquareFromCenterMode} from './edit-modes/draw-square-from-center-mode';\nexport {DrawCircleByDiameterMode} from './edit-modes/draw-circle-by-diameter-mode';\nexport {DrawCircleFromCenterMode} from './edit-modes/draw-circle-from-center-mode';\nexport {DrawEllipseByBoundingBoxMode} from './edit-modes/draw-ellipse-by-bounding-box-mode';\nexport {DrawEllipseUsingThreePointsMode} from './edit-modes/draw-ellipse-using-three-points-mode';\nexport {DrawRectangleUsingThreePointsMode} from './edit-modes/draw-rectangle-using-three-points-mode';\nexport {Draw90DegreePolygonMode} from './edit-modes/draw-90degree-polygon-mode';\nexport {DrawPolygonByDraggingMode} from './edit-modes/draw-polygon-by-dragging-mode';\nexport {ImmutableFeatureCollection} from './edit-modes/immutable-feature-collection';\n\n// Other modes\nexport {ViewMode} from './edit-modes/view-mode';\nexport {MeasureDistanceMode} from './edit-modes/measure-distance-mode';\nexport {MeasureAreaMode} from './edit-modes/measure-area-mode';\nexport {MeasureAngleMode} from './edit-modes/measure-angle-mode';\nexport {CompositeMode} from './edit-modes/composite-mode';\nexport {SnappableMode} from './edit-modes/snappable-mode';\n\nexport type {\n ScreenCoordinates,\n EditAction,\n Pick,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n GuideFeatureCollection,\n // Viewport,\n Tooltip\n} from './edit-modes/types';\n\nexport type {\n Position,\n SimpleFeature,\n SimpleFeatureCollection,\n SimpleGeometry,\n SimpleGeometryCoordinates,\n Point,\n LineString,\n Polygon,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n PolygonGeometry,\n Feature,\n FeatureCollection,\n AnyGeoJson\n} from './utils/geojson-types';\n\n// Experimental\nexport {memoize as _memoize} from './utils/memoize';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport pointToLineDistance from '@turf/point-to-line-distance';\nimport {point} from '@turf/helpers';\nimport {WebMercatorViewport} from 'viewport-mercator-project';\nimport {Feature, LineString, Point, Position} from './geojson-types';\nimport {Viewport} from './types';\n\n// TODO edit-modes: delete and use edit-modes/utils instead\n\nexport type NearestPointType = Feature<Point, {dist: number; index: number}>;\n\nexport function toDeckColor(\n color?: [number, number, number, number] | number,\n defaultColor: [number, number, number, number] = [255, 0, 0, 255]\n): [number, number, number, number] {\n if (!Array.isArray(color)) {\n return defaultColor;\n }\n return [color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255];\n}\n\n//\n// a GeoJSON helper function that calls the provided function with\n// an argument that is the most deeply-nested array having elements\n// that are arrays of primitives as an argument, e.g.\n//\n// {\n// \"type\": \"MultiPolygon\",\n// \"coordinates\": [\n// [\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n// ],\n// [\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n// ]\n// ]\n// }\n//\n// the function would be called on:\n//\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n//\n// and\n//\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n//\nexport function recursivelyTraverseNestedArrays(\n array: Array<any>,\n prefix: Array<number>,\n fn: Function\n) {\n if (!Array.isArray(array[0])) {\n return true;\n }\n for (let i = 0; i < array.length; i++) {\n if (recursivelyTraverseNestedArrays(array[i], [...prefix, i], fn)) {\n fn(array, prefix);\n break;\n }\n }\n return false;\n}\n\nexport function generatePointsParallelToLinePoints(\n p1: Position,\n p2: Position,\n mapCoords: Position\n): Position[] {\n const lineString: LineString = {\n type: 'LineString',\n coordinates: [p1, p2]\n };\n const pt = point(mapCoords);\n const ddistance = pointToLineDistance(pt, lineString);\n const lineBearing = bearing(p1, p2);\n\n // Check if current point is to the left or right of line\n // Line from A=(x1,y1) to B=(x2,y2) a point P=(x,y)\n // then (x\u2212x1)(y2\u2212y1)\u2212(y\u2212y1)(x2\u2212x1)\n const isPointToLeftOfLine =\n (mapCoords[0] - p1[0]) * (p2[1] - p1[1]) - (mapCoords[1] - p1[1]) * (p2[0] - p1[0]);\n\n // Bearing to draw perpendicular to the line string\n const orthogonalBearing = isPointToLeftOfLine < 0 ? lineBearing - 90 : lineBearing - 270;\n\n // Get coordinates for the point p3 and p4 which are perpendicular to the lineString\n // Add the distance as the current position moves away from the lineString\n const p3 = destination(p2, ddistance, orthogonalBearing);\n const p4 = destination(p1, ddistance, orthogonalBearing);\n return [p3.geometry.coordinates, p4.geometry.coordinates] as [Position, Position];\n}\n\nexport function distance2d(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function mix(a: number, b: number, ratio: number): number {\n return b * ratio + a * (1 - ratio);\n}\n\nexport function nearestPointOnProjectedLine(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport\n): NearestPointType {\n const wmViewport = new WebMercatorViewport(viewport);\n // Project the line to viewport, then find the nearest point\n const coordinates: Array<Array<number>> = line.geometry.coordinates as any;\n const projectedCoords = coordinates.map(([x, y, z = 0]) => wmViewport.project([x, y, z]));\n const [x, y] = wmViewport.project(inPoint.geometry.coordinates);\n // console.log('projectedCoords', JSON.stringify(projectedCoords));\n\n let minDistance = Infinity;\n let minPointInfo = {};\n\n projectedCoords.forEach(([x2, y2], index) => {\n if (index === 0) {\n return;\n }\n\n const [x1, y1] = projectedCoords[index - 1];\n\n // line from projectedCoords[index - 1] to projectedCoords[index]\n // convert to Ax + By + C = 0\n const A = y1 - y2;\n const B = x2 - x1;\n const C = x1 * y2 - x2 * y1;\n\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n const div = A * A + B * B;\n const distance = Math.abs(A * x + B * y + C) / Math.sqrt(div);\n\n // TODO: Check if inside bounds\n\n if (distance < minDistance) {\n minDistance = distance;\n minPointInfo = {\n index,\n x0: (B * (B * x - A * y) - A * C) / div,\n y0: (A * (-B * x + A * y) - B * C) / div\n };\n }\n });\n const {index, x0, y0} = minPointInfo as any;\n const [x1, y1, z1 = 0] = projectedCoords[index - 1];\n const [x2, y2, z2 = 0] = projectedCoords[index];\n\n // calculate what ratio of the line we are on to find the proper z\n const lineLength = distance2d(x1, y1, x2, y2);\n const startToPointLength = distance2d(x1, y1, x0, y0);\n const ratio = startToPointLength / lineLength;\n const z0 = mix(z1, z2, ratio);\n\n return {\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: wmViewport.unproject([x0, y0, z0])\n },\n properties: {\n // TODO: calculate the distance in proper units\n dist: minDistance,\n index: index - 1\n }\n };\n}\n\n/**\n * Inserts toInsert string into base string before insertBefore string.\n * @param base A string to insert into.\n * @param insertBeforeText A sub string in `base` string to insert before.\n * @param toInsert A string to insert.\n * @returns Combined string. `base` string if `insertBefore` string isn't found.\n */\nexport function insertBefore(base: string, insertBeforeText: string, toInsert: string): string {\n const at = base.indexOf(insertBeforeText);\n if (at < 0) {\n return base;\n }\n return base.slice(0, at) + toInsert + base.slice(at);\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {UpdateParameters, DefaultProps} from '@deck.gl/core';\nimport {GeoJsonLayer, ScatterplotLayer, IconLayer, TextLayer} from '@deck.gl/layers';\nimport {\n EditAction,\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n PointerMoveEvent,\n DoubleClickEvent,\n ModeProps\n} from '../edit-modes/types';\n\nimport {ViewMode} from '../edit-modes/view-mode';\nimport {TranslateMode} from '../edit-modes/translate-mode';\nimport {ModifyMode} from '../edit-modes/modify-mode';\nimport {ScaleMode} from '../edit-modes/scale-mode';\nimport {RotateMode} from '../edit-modes/rotate-mode';\nimport {DuplicateMode} from '../edit-modes/duplicate-mode';\nimport {SplitPolygonMode} from '../edit-modes/split-polygon-mode';\nimport {ExtrudeMode} from '../edit-modes/extrude-mode';\nimport {ElevationMode} from '../edit-modes/elevation-mode';\nimport {DrawPointMode} from '../edit-modes/draw-point-mode';\nimport {DrawLineStringMode} from '../edit-modes/draw-line-string-mode';\nimport {DrawPolygonMode} from '../edit-modes/draw-polygon-mode';\nimport {DrawRectangleMode} from '../edit-modes/draw-rectangle-mode';\nimport {DrawSquareMode} from '../edit-modes/draw-square-mode';\nimport {DrawRectangleFromCenterMode} from '../edit-modes/draw-rectangle-from-center-mode';\nimport {DrawSquareFromCenterMode} from '../edit-modes/draw-square-from-center-mode';\nimport {DrawCircleFromCenterMode} from '../edit-modes/draw-circle-from-center-mode';\nimport {DrawCircleByDiameterMode} from '../edit-modes/draw-circle-by-diameter-mode';\nimport {DrawEllipseByBoundingBoxMode} from '../edit-modes/draw-ellipse-by-bounding-box-mode';\nimport {DrawRectangleUsingThreePointsMode} from '../edit-modes/draw-rectangle-using-three-points-mode';\nimport {DrawEllipseUsingThreePointsMode} from '../edit-modes/draw-ellipse-using-three-points-mode';\nimport {Draw90DegreePolygonMode} from '../edit-modes/draw-90degree-polygon-mode';\nimport {DrawPolygonByDraggingMode} from '../edit-modes/draw-polygon-by-dragging-mode';\nimport {SnappableMode} from '../edit-modes/snappable-mode';\nimport {TransformMode} from '../edit-modes/transform-mode';\nimport {DeleteMode} from '../edit-modes/delete-mode';\nimport {GeoJsonEditModeType} from '../edit-modes/geojson-edit-mode';\n\nimport {Color} from '../utils/types';\nimport {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants';\n\nimport {EditableLayer, EditableLayerProps} from './editable-layer';\nimport {EditablePathLayer} from './editable-path-layer';\nimport {Feature, FeatureCollection} from '../utils/geojson-types';\n\nconst DEFAULT_LINE_COLOR: Color = [0x0, 0x0, 0x0, 0x99];\nconst DEFAULT_FILL_COLOR: Color = [0x0, 0x0, 0x0, 0x90];\nconst DEFAULT_SELECTED_LINE_COLOR: Color = [0x0, 0x0, 0x0, 0xff];\nconst DEFAULT_SELECTED_FILL_COLOR: Color = [0x0, 0x0, 0x90, 0x90];\nconst DEFAULT_TENTATIVE_LINE_COLOR: Color = [0x90, 0x90, 0x90, 0xff];\nconst DEFAULT_TENTATIVE_FILL_COLOR: Color = [0x90, 0x90, 0x90, 0x90];\nconst DEFAULT_EDITING_EXISTING_POINT_COLOR: Color = [0xc0, 0x0, 0x0, 0xff];\nconst DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR: Color = [0x0, 0x0, 0x0, 0x80];\nconst DEFAULT_EDITING_SNAP_POINT_COLOR: Color = [0x7c, 0x00, 0xc0, 0xff];\nconst DEFAULT_EDITING_POINT_OUTLINE_COLOR: Color = [0xff, 0xff, 0xff, 0xff];\nconst DEFAULT_EDITING_EXISTING_POINT_RADIUS = 5;\nconst DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS = 3;\nconst DEFAULT_EDITING_SNAP_POINT_RADIUS = 7;\nconst DEFAULT_TOOLTIP_FONT_SIZE = 32 * PROJECTED_PIXEL_SIZE_MULTIPLIER;\n\nconst DEFAULT_EDIT_MODE = DrawPolygonMode;\n\nfunction guideAccessor(accessor) {\n if (!accessor || typeof accessor !== 'function') {\n return accessor;\n }\n return (guideMaybeWrapped) => accessor(unwrapGuide(guideMaybeWrapped));\n}\n\n// The object handed to us from deck.gl is different depending on the version of deck.gl used, unwrap as necessary\nfunction unwrapGuide(guideMaybeWrapped) {\n if (guideMaybeWrapped.__source) {\n return guideMaybeWrapped.__source.object;\n } else if (guideMaybeWrapped.sourceFeature) {\n return guideMaybeWrapped.sourceFeature.feature;\n }\n // It is not wrapped, return as is\n return guideMaybeWrapped;\n}\n\nfunction getEditHandleColor(handle) {\n switch (handle.properties.editHandleType) {\n case 'existing':\n return DEFAULT_EDITING_EXISTING_POINT_COLOR;\n case 'snap-source':\n return DEFAULT_EDITING_SNAP_POINT_COLOR;\n case 'intermediate':\n default:\n return DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR;\n }\n}\n\nfunction getEditHandleOutlineColor(handle) {\n return DEFAULT_EDITING_POINT_OUTLINE_COLOR;\n}\n\nfunction getEditHandleRadius(handle) {\n switch (handle.properties.editHandleType) {\n case 'existing':\n return DEFAULT_EDITING_EXISTING_POINT_RADIUS;\n case 'snap':\n return DEFAULT_EDITING_SNAP_POINT_RADIUS;\n case 'intermediate':\n default:\n return DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS;\n }\n}\n\nexport type EditableGeoJsonLayerProps<DataT = any> = EditableLayerProps & {\n data: DataT;\n mode?: any;\n modeConfig?: any;\n selectedFeatureIndexes?: number[];\n onEdit?: (editAction: EditAction<DataT>) => void;\n\n pickable?: boolean;\n pickingRadius?: number;\n pickingDepth?: number;\n fp64?: boolean;\n filled?: boolean;\n stroked?: boolean;\n lineWidthScale?: number;\n lineWidthMinPixels?: number;\n lineWidthMaxPixels?: number;\n pickingLineWidthExtraPixels?: number;\n lineWidthUnits?: string;\n lineJointRounded?: boolean;\n lineCapRounded?: boolean;\n lineMiterLimit?: number;\n pointRadiusScale?: number;\n pointRadiusMinPixels?: number;\n pointRadiusMaxPixels?: number;\n\n getLineColor?: Color | ((feature, isSelected, mode) => Color);\n getFillColor?: Color | ((feature, isSelected, mode) => Color);\n getRadius?: number | ((feature, isSelected, mode) => number);\n getLineWidth?: number | ((feature, isSelected, mode) => number);\n\n getTentativeLineColor?: Color | ((feature, isSelected, mode) => Color);\n getTentativeFillColor?: Color | ((feature, isSelected, mode) => Color);\n getTentativeLineWidth?: number | ((f) => number);\n\n editHandleType?: string;\n\n editHandlePointRadiusScale?: number;\n editHandlePointOutline?: boolean;\n editHandlePointStrokeWidth?: number;\n editHandlePointRadiusUnits?: string;\n editHandlePointRadiusMinPixels?: number;\n editHandlePointRadiusMaxPixels?: number;\n getEditHandlePointColor?: Color | ((handle) => Color);\n getEditHandlePointOutlineColor?: Color | ((handle) => Color);\n getEditHandlePointRadius?: number | ((handle) => number);\n\n // icon handles\n editHandleIconAtlas?: any;\n editHandleIconMapping?: any;\n editHandleIconSizeScale?: number;\n editHandleIconSizeUnits?: string;\n getEditHandleIcon?: (handle) => string;\n getEditHandleIconSize?: number;\n getEditHandleIconColor?: Color | ((handle) => Color);\n getEditHandleIconAngle?: number | ((handle) => number);\n\n // misc\n billboard?: boolean;\n};\n\nconst defaultProps: DefaultProps<EditableGeoJsonLayerProps<any>> = {\n mode: DEFAULT_EDIT_MODE,\n\n // Edit and interaction events\n onEdit: () => {},\n\n pickable: true,\n pickingRadius: 10,\n pickingDepth: 5,\n fp64: false,\n filled: true,\n stroked: true,\n lineWidthScale: PROJECTED_PIXEL_SIZE_MULTIPLIER,\n lineWidthMinPixels: 1,\n lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n pickingLineWidthExtraPixels: 0,\n lineWidthUnits: 'pixels',\n lineJointRounded: false,\n lineCapRounded: false,\n lineMiterLimit: 4,\n pointRadiusScale: 1,\n pointRadiusMinPixels: 2,\n pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,\n getLineColor: (feature, isSelected, mode) =>\n isSelected ? DEFAULT_SELECTED_LINE_COLOR : DEFAULT_LINE_COLOR,\n getFillColor: (feature, isSelected, mode) =>\n isSelected ? DEFAULT_SELECTED_FILL_COLOR : DEFAULT_FILL_COLOR,\n getRadius: (f) =>\n (f && f.properties && f.properties.radius) || (f && f.properties && f.properties.size) || 1,\n getLineWidth: (f) => (f && f.properties && f.properties.lineWidth) || 3,\n\n // Tentative feature rendering\n getTentativeLineColor: (f) => DEFAULT_TENTATIVE_LINE_COLOR,\n getTentativeFillColor: (f) => DEFAULT_TENTATIVE_FILL_COLOR,\n getTentativeLineWidth: (f) => (f && f.properties && f.properties.lineWidth) || 3,\n\n editHandleType: 'point',\n\n // point handles\n editHandlePointRadiusScale: 1,\n editHandlePointOutline: true,\n editHandlePointStrokeWidth: 2,\n editHandlePointRadiusUnits: 'pixels',\n editHandlePointRadiusMinPixels: 4,\n editHandlePointRadiusMaxPixels: 8,\n getEditHandlePointColor: getEditHandleColor,\n getEditHandlePointOutlineColor: getEditHandleOutlineColor,\n getEditHandlePointRadius: getEditHandleRadius,\n\n // icon handles\n editHandleIconAtlas: null,\n editHandleIconMapping: null,\n editHandleIconSizeScale: 1,\n editHandleIconSizeUnits: 'pixels',\n getEditHandleIcon: (handle) => handle.properties.editHandleType,\n getEditHandleIconSize: 10,\n getEditHandleIconColor: getEditHandleColor,\n getEditHandleIconAngle: 0,\n\n // misc\n billboard: true\n};\n\n// Mapping of mode name to mode class (for legacy purposes)\nconst modeNameMapping = {\n view: ViewMode,\n\n // Alter modes\n modify: ModifyMode,\n translate: new SnappableMode(new TranslateMode()),\n\n transform: new SnappableMode(new TransformMode()),\n scale: ScaleMode,\n rotate: RotateMode,\n duplicate: DuplicateMode,\n split: SplitPolygonMode,\n extrude: ExtrudeMode,\n elevation: ElevationMode,\n delete: DeleteMode,\n\n // Draw modes\n drawPoint: DrawPointMode,\n drawLineString: DrawLineStringMode,\n drawPolygon: DrawPolygonMode,\n drawRectangle: DrawRectangleMode,\n drawSquare: DrawSquareMode,\n drawRectangleFromCenter: DrawRectangleFromCenterMode,\n drawSquareFromCenter: DrawSquareFromCenterMode,\n drawCircleFromCenter: DrawCircleFromCenterMode,\n drawCircleByBoundingBox: DrawCircleByDiameterMode,\n drawEllipseByBoundingBox: DrawEllipseByBoundingBoxMode,\n drawRectangleUsing3Points: DrawRectangleUsingThreePointsMode,\n drawEllipseUsing3Points: DrawEllipseUsingThreePointsMode,\n draw90DegreePolygon: Draw90DegreePolygonMode,\n drawPolygonByDragging: DrawPolygonByDraggingMode\n};\n\nexport class EditableGeoJsonLayer extends EditableLayer<\n FeatureCollection,\n EditableGeoJsonLayerProps<FeatureCollection>\n> {\n static layerName = 'EditableGeoJsonLayer';\n static defaultProps = defaultProps;\n\n state: EditableLayer['state'] & {\n cursor?: 'grabbing' | 'grab' | null;\n mode: GeoJsonEditModeType;\n lastPointerMoveEvent: PointerMoveEvent;\n tentativeFeature?: Feature;\n editHandles: any[];\n selectedFeatures: Feature[];\n } = undefined!;\n\n // setState: ($Shape<State>) => void;\n renderLayers() {\n const subLayerProps = this.getSubLayerProps({\n id: 'geojson',\n\n // Proxy most GeoJsonLayer props as-is\n data: this.props.data,\n fp64: this.props.fp64,\n filled: this.props.filled,\n stroked: this.props.stroked,\n lineWidthScale: this.props.lineWidthScale,\n lineWidthMinPixels: this.props.lineWidthMinPixels,\n lineWidthMaxPixels: this.props.lineWidthMaxPixels,\n lineWidthUnits: this.props.lineWidthUnits,\n lineJointRounded: this.props.lineJointRounded,\n lineCapRounded: this.props.lineCapRounded,\n lineMiterLimit: this.props.lineMiterLimit,\n pointRadiusScale: this.props.pointRadiusScale,\n pointRadiusMinPixels: this.props.pointRadiusMinPixels,\n pointRadiusMaxPixels: this.props.pointRadiusMaxPixels,\n getLineColor: this.selectionAwareAccessor(this.props.getLineColor),\n getFillColor: this.selectionAwareAccessor(this.props.getFillColor),\n getPointRadius: this.selectionAwareAccessor(this.props.getRadius),\n getLineWidth: this.selectionAwareAccessor(this.props.getLineWidth),\n\n _subLayerProps: {\n linestrings: {\n billboard: this.props.billboard,\n updateTriggers: {\n // required to update dashed array attribute\n all: [this.props.selectedFeatureIndexes, this.props.mode]\n }\n },\n 'polygons-stroke': {\n billboard: this.props.billboard,\n pickingLineWidthExtraPixels: this.props.pickingLineWidthExtraPixels,\n type: EditablePathLayer,\n updateTriggers: {\n // required to update dashed array attribute\n all: [this.props.selectedFeatureIndexes, this.props.mode]\n }\n }\n },\n\n updateTriggers: {\n getLineColor: [this.props.updateTriggers.getLineColor, this.props.selectedFeatureIndexes, this.props.mode],\n getFillColor: [this.props.updateTriggers.getFillColor, this.props.selectedFeatureIndexes, this.props.mode],\n getPointRadius: [this.props.updateTriggers.getPointRadius, this.props.selectedFeatureIndexes, this.props.mode],\n getLineWidth: [this.props.updateTriggers.getLineWidth, this.props.selectedFeatureIndexes, this.props.mode]\n }\n });\n\n let layers: any = [new GeoJsonLayer(subLayerProps)];\n\n layers = layers.concat(this.createGuidesLayers(), this.createTooltipsLayers());\n\n return layers;\n }\n\n initializeState() {\n super.initializeState();\n\n this.setState({\n selectedFeatures: [],\n editHandles: []\n });\n }\n\n // TODO: is this the best way to properly update state from an outside event handler?\n shouldUpdateState(opts: any) {\n // console.log(\n // 'shouldUpdateState',\n // opts.changeFlags.propsOrDataChanged,\n // opts.changeFlags.stateChanged\n // );\n return super.shouldUpdateState(opts) || opts.changeFlags.stateChanged;\n }\n\n updateState({props, oldProps, changeFlags, context}: UpdateParameters<this>) {\n super.updateState({oldProps, props, changeFlags, context});\n\n if (changeFlags.propsOrDataChanged) {\n const modePropChanged = Object.keys(oldProps).length === 0 || props.mode !== oldProps.mode;\n if (modePropChanged) {\n let mode: DrawPolygonMode;\n if (typeof props.mode === 'function') {\n // They passed a constructor/class, so new it up\n const ModeConstructor = props.mode;\n mode = new ModeConstructor();\n } else if (typeof props.mode === 'string') {\n // Lookup the mode based on its name (for backwards compatibility)\n mode = modeNameMapping[props.mode];\n // eslint-disable-next-line no-console\n console.warn(\n \"Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead.\"\n );\n } else {\n // Should be an instance of EditMode in this case\n mode = props.mode;\n }\n\n if (!mode) {\n console.warn(`No mode configured for ${String(props.mode)}`); // eslint-disable-line no-console,no-undef\n // Use default mode\n mode = new DEFAULT_EDIT_MODE();\n }\n\n if (mode !== this.state.mode) {\n this.setState({mode, cursor: null});\n }\n }\n }\n\n let selectedFeatures = [];\n if (\n Array.isArray(props.selectedFeatureIndexes) &&\n typeof props.data === 'object' &&\n 'features' in props.data\n ) {\n // TODO: needs improved testing, i.e. checking for duplicates, NaNs, out of range numbers, ...\n const propsData = props.data;\n selectedFeatures = props.selectedFeatureIndexes.map((elem) => propsData.features[elem]);\n }\n\n this.setState({selectedFeatures});\n }\n\n getModeProps<DataT>(props: EditableGeoJsonLayerProps<DataT>): ModeProps<DataT> {\n return {\n modeConfig: props.modeConfig,\n data: props.data,\n selectedIndexes: props.selectedFeatureIndexes,\n lastPointerMoveEvent: this.state.lastPointerMoveEvent,\n cursor: this.state.cursor,\n onEdit: (editAction) => {\n // Force a re-render\n // This supports double-click where we need to ensure that there's a re-render between the two clicks\n // even though the data wasn't changed, just the internal tentative feature.\n this.setNeedsUpdate();\n props.onEdit(editAction);\n },\n onUpdateCursor: (cursor: string | null | undefined) => {\n this.setState({cursor});\n }\n };\n }\n\n selectionAwareAccessor(accessor: any) {\n if (typeof accessor !== 'function') {\n return accessor;\n }\n return (feature: Feature) =>\n accessor(feature, this.isFeatureSelected(feature), this.props.mode);\n }\n\n isFeatureSelected(feature: Feature) {\n if (!this.props.data || !this.props.selectedFeatureIndexes) {\n return false;\n }\n if (!this.props.selectedFeatureIndexes.length) {\n return false;\n }\n\n return this.state.selectedFeatures.includes(feature);\n }\n\n getPickingInfo({info, sourceLayer}: Record<string, any>) {\n if (sourceLayer.id.endsWith('guides')) {\n // If user is picking an editing handle, add additional data to the info\n info.isGuide = true;\n }\n\n return info;\n }\n\n _updateAutoHighlight(info) {\n // Extra handling for guides\n if (info?.sourceLayer) {\n if (info.isGuide) {\n for (const layer of info.sourceLayer.getSubLayers()) {\n layer.updateAutoHighlight(info);\n }\n } else {\n info.sourceLayer.updateAutoHighlight(info);\n }\n }\n }\n\n createGuidesLayers() {\n const mode = this.getActiveMode();\n const guides: FeatureCollection = mode.getGuides(this.getModeProps(this.props));\n\n if (!guides || !guides.features.length) {\n return [];\n }\n\n const subLayerProps = {\n linestrings: {\n billboard: this.props.billboard,\n autoHighlight: false\n },\n 'polygons-fill': {\n autoHighlight: false\n },\n 'polygons-stroke': {\n billboard: this.props.billboard\n }\n };\n\n if (this.props.editHandleType === 'icon') {\n subLayerProps['points-icon'] = {\n type: IconLayer,\n iconAtlas: this.props.editHandleIconAtlas,\n iconMapping: this.props.editHandleIconMapping,\n sizeUnits: this.props.editHandleIconSizeUnits,\n sizeScale: this.props.editHandleIconSizeScale,\n getIcon: guideAccessor(this.props.getEditHandleIcon),\n getSize: guideAccessor(this.props.getEditHandleIconSize),\n getColor: guideAccessor(this.props.getEditHandleIconColor),\n getAngle: guideAccessor(this.props.getEditHandleIconAngle),\n billboard: this.props.billboard\n };\n } else {\n subLayerProps['points-circle'] = {\n type: ScatterplotLayer,\n radiusScale: this.props.editHandlePointRadiusScale,\n stroked: this.props.editHandlePointOutline,\n getLineWidth: this.props.editHandlePointStrokeWidth,\n radiusUnits: this.props.editHandlePointRadiusUnits,\n radiusMinPixels: this.props.editHandlePointRadiusMinPixels,\n radiusMaxPixels: this.props.editHandlePointRadiusMaxPixels,\n getRadius: guideAccessor(this.props.getEditHandlePointRadius),\n getFillColor: guideAccessor(this.props.getEditHandlePointColor),\n getLineColor: guideAccessor(this.props.getEditHandlePointOutlineColor),\n billboard: this.props.billboard\n };\n }\n\n const layer = new GeoJsonLayer(\n this.getSubLayerProps({\n id: 'guides',\n data: guides,\n fp64: this.props.fp64,\n _subLayerProps: subLayerProps,\n lineWidthScale: this.props.lineWidthScale,\n lineWidthMinPixels: this.props.lineWidthMinPixels,\n lineWidthMaxPixels: this.props.lineWidthMaxPixels,\n lineWidthUnits: this.props.lineWidthUnits,\n lineJointRounded: this.props.lineJointRounded,\n lineCapRounded: this.props.lineCapRounded,\n lineMiterLimit: this.props.lineMiterLimit,\n getLineColor: guideAccessor(this.props.getTentativeLineColor),\n getLineWidth: guideAccessor(this.props.getTentativeLineWidth),\n getFillColor: guideAccessor(this.props.getTentativeFillColor),\n pointType: this.props.editHandleType === 'icon' ? 'icon' : 'circle',\n iconAtlas: this.props.editHandleIconAtlas\n })\n );\n\n return [layer];\n }\n\n createTooltipsLayers() {\n const mode = this.getActiveMode();\n const tooltips = mode.getTooltips(this.getModeProps(this.props));\n\n const layer = new TextLayer({\n getSize: DEFAULT_TOOLTIP_FONT_SIZE,\n ...this.getSubLayerProps({\n id: 'tooltips',\n data: tooltips\n })\n });\n\n return [layer];\n }\n\n onLayerClick(event: ClickEvent): void {\n this.getActiveMode().handleClick(event, this.getModeProps(this.props));\n }\n\n onLayerDoubleClick(event: DoubleClickEvent): void {\n if (this.getActiveMode().handleDoubleClick) {\n this.getActiveMode().handleDoubleClick(event, this.getModeProps(this.props));\n }\n }\n\n onLayerKeyUp(event: KeyboardEvent): void {\n this.getActiveMode().handleKeyUp(event, this.getModeProps(this.props));\n }\n\n onStartDragging(event: StartDraggingEvent): void {\n this.getActiveMode().handleStartDragging(event, this.getModeProps(this.props));\n }\n\n onDragging(event: DraggingEvent): void {\n this.getActiveMode().handleDragging(event, this.getModeProps(this.props));\n }\n\n onStopDragging(event: StopDraggingEvent): void {\n this.getActiveMode().handleStopDragging(event, this.getModeProps(this.props));\n }\n\n onPointerMove(event: PointerMoveEvent): void {\n this.setState({lastPointerMoveEvent: event});\n this.getActiveMode().handlePointerMove(event, this.getModeProps(this.props));\n }\n\n getCursor({isDragging}: {isDragging: boolean}): null | 'grabbing' | 'grab' {\n if (this.state === null || this.state === undefined) {\n // Layer in 'Awaiting state'\n return null;\n }\n\n let {cursor} = this.state;\n if (!cursor) {\n // default cursor\n cursor = isDragging ? 'grabbing' : 'grab';\n }\n return cursor;\n }\n\n getActiveMode(): GeoJsonEditModeType {\n return this.state.mode;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {featureCollection} from '@turf/helpers';\nimport turfUnion from '@turf/union';\nimport turfDifference from '@turf/difference';\nimport turfIntersect from '@turf/intersect';\nimport rewind from '@turf/rewind';\n\nimport {\n EditAction,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n Pick,\n Tooltip,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {FeatureCollection, Feature, Polygon, SimpleGeometry, Position, SimpleFeatureCollection, SimpleFeature} from '../utils/geojson-types';\nimport {getPickedEditHandles, getNonGuidePicks} from './utils';\nimport {EditMode} from './edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport type GeoJsonEditAction = EditAction<SimpleFeatureCollection>;\n\nconst DEFAULT_GUIDES: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n};\nconst DEFAULT_TOOLTIPS: Tooltip[] = [];\n\n// Main interface for `EditMode`s that edit GeoJSON\nexport type GeoJsonEditModeType = EditMode<FeatureCollection, FeatureCollection>;\n\nexport interface GeoJsonEditModeConstructor {\n new (): GeoJsonEditModeType;\n}\n\nexport class GeoJsonEditMode implements EditMode<FeatureCollection, GuideFeatureCollection> {\n _clickSequence: Position[] = [];\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n return DEFAULT_GUIDES;\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return DEFAULT_TOOLTIPS;\n }\n\n getSelectedFeature(props: ModeProps<SimpleFeatureCollection>): SimpleFeature | null | undefined {\n if (props.selectedIndexes.length === 1) {\n return props.data.features[props.selectedIndexes[0]];\n }\n return null;\n }\n\n getSelectedGeometry(props: ModeProps<SimpleFeatureCollection>): SimpleGeometry | null | undefined {\n const feature = this.getSelectedFeature(props);\n if (feature) {\n return feature.geometry;\n }\n return null;\n }\n\n getSelectedFeaturesAsFeatureCollection(props: ModeProps<SimpleFeatureCollection>): SimpleFeatureCollection {\n const {features} = props.data;\n const selectedFeatures = props.selectedIndexes.map((selectedIndex) => features[selectedIndex]);\n return {\n type: 'FeatureCollection',\n features: selectedFeatures\n };\n }\n\n getClickSequence(): Position[] {\n return this._clickSequence;\n }\n\n addClickSequence({mapCoords}: ClickEvent): void {\n this._clickSequence.push(mapCoords);\n }\n\n resetClickSequence(): void {\n this._clickSequence = [];\n }\n\n getTentativeGuide(props: ModeProps<FeatureCollection>): TentativeFeature | null | undefined {\n const guides = this.getGuides(props);\n return guides.features.find(\n (f) => f.properties && f.properties.guideType === 'tentative'\n ) as TentativeFeature;\n }\n\n isSelectionPicked(picks: Pick[], props: ModeProps<FeatureCollection>): boolean {\n if (!picks.length) return false;\n const pickedFeatures = getNonGuidePicks(picks).map(({index}) => index);\n const pickedHandles = getPickedEditHandles(picks).map(\n ({properties}) => properties.featureIndex\n );\n const pickedIndexes = new Set([...pickedFeatures, ...pickedHandles]);\n return props.selectedIndexes.some((index) => pickedIndexes.has(index));\n }\n\n rewindPolygon(feature: SimpleFeature): SimpleFeature {\n const {geometry} = feature;\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n if (isPolygonal) {\n return rewind(feature) as SimpleFeature;\n }\n\n return feature;\n }\n\n getAddFeatureAction(\n featureOrGeometry: SimpleGeometry | Feature,\n features: SimpleFeatureCollection,\n featureProperties?: {}\n ): GeoJsonEditAction {\n // Unsure why flow can't deal with Geometry type, but there I fixed it\n const featureOrGeometryAsAny: any = featureOrGeometry;\n featureProperties = featureProperties || {};\n\n const feature: any =\n featureOrGeometryAsAny.type === 'Feature'\n ? featureOrGeometryAsAny\n : {\n type: 'Feature',\n properties: featureProperties,\n geometry: featureOrGeometryAsAny\n };\n\n const rewindFeature = this.rewindPolygon(feature);\n const updatedData = new ImmutableFeatureCollection(features)\n .addFeature(rewindFeature)\n .getObject();\n\n return {\n updatedData,\n editType: 'addFeature',\n editContext: {\n featureIndexes: [updatedData.features.length - 1]\n }\n };\n }\n\n getAddManyFeaturesAction(\n {features: featuresToAdd}: SimpleFeatureCollection,\n features: SimpleFeatureCollection\n ): GeoJsonEditAction {\n let updatedData = new ImmutableFeatureCollection(features);\n const initialIndex = updatedData.getObject().features.length;\n const updatedIndexes: number[] = [];\n for (const feature of featuresToAdd) {\n const {properties, geometry} = feature;\n const geometryAsAny: any = geometry;\n updatedData = updatedData.addFeature({\n type: 'Feature',\n properties,\n geometry: geometryAsAny\n });\n updatedIndexes.push(initialIndex + updatedIndexes.length);\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType: 'addFeature',\n editContext: {\n featureIndexes: updatedIndexes\n }\n };\n }\n\n // eslint-disable-next-line complexity\n getAddFeatureOrBooleanPolygonAction(\n featureOrGeometry: Polygon | Feature,\n props: ModeProps<SimpleFeatureCollection>,\n featureProperties?: {}\n ): GeoJsonEditAction | null | undefined {\n const featureOrGeometryAsAny: any = featureOrGeometry;\n featureProperties = featureProperties || {};\n\n const selectedFeature = this.getSelectedFeature(props);\n const {modeConfig} = props;\n if (modeConfig && modeConfig.booleanOperation) {\n if (\n !selectedFeature ||\n (selectedFeature.geometry.type !== 'Polygon' &&\n selectedFeature.geometry.type !== 'MultiPolygon')\n ) {\n // eslint-disable-next-line no-console,no-undef\n console.warn(\n 'booleanOperation only supported for single Polygon or MultiPolygon selection'\n );\n return null;\n }\n\n const feature =\n featureOrGeometryAsAny.type === 'Feature'\n ? featureOrGeometryAsAny\n : {\n type: 'Feature',\n geometry: featureOrGeometryAsAny\n };\n\n let updatedGeometry;\n if (modeConfig.booleanOperation === 'union') {\n updatedGeometry = turfUnion(featureCollection([selectedFeature, feature]));\n } else if (modeConfig.booleanOperation === 'difference') {\n updatedGeometry = turfDifference(featureCollection([selectedFeature, feature]));\n } else if (modeConfig.booleanOperation === 'intersection') {\n updatedGeometry = turfIntersect(featureCollection([selectedFeature, feature]));\n } else {\n // eslint-disable-next-line no-console,no-undef\n console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`);\n return null;\n }\n\n if (!updatedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('Canceling edit. Boolean operation erased entire polygon.');\n return null;\n }\n\n const featureIndex = props.selectedIndexes[0];\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(featureIndex, updatedGeometry.geometry)\n .getObject();\n\n const editAction: GeoJsonEditAction = {\n updatedData,\n editType: 'unionGeometry',\n editContext: {\n featureIndexes: [featureIndex]\n }\n };\n\n return editAction;\n }\n return this.getAddFeatureAction(featureOrGeometry, props.data, featureProperties);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature | null {\n return null;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {}\n handleDoubleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {}\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n const tentativeFeature = this.createTentativeFeature(props);\n if (tentativeFeature) {\n props.onEdit({\n updatedData: props.data,\n editType: 'updateTentativeFeature',\n editContext: {\n feature: tentativeFeature\n }\n });\n }\n }\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void {}\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void {}\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void {}\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<FeatureCollection>): void {\n if (event.key === 'Escape') {\n this.resetClickSequence();\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n}\n\nexport function getIntermediatePosition(position1: Position, position2: Position): Position {\n const intermediatePosition: Position = [\n (position1[0] + position2[0]) / 2.0,\n (position1[1] + position2[1]) / 2.0\n ];\n\n return intermediatePosition;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport pointToLineDistance from '@turf/point-to-line-distance';\nimport {flattenEach} from '@turf/meta';\nimport {point} from '@turf/helpers';\nimport {getCoords} from '@turf/invariant';\nimport {WebMercatorViewport} from 'viewport-mercator-project';\nimport {Viewport, Pick, EditHandleFeature, EditHandleType, StartDraggingEvent} from './types';\nimport {\n SimpleGeometry,\n Position,\n Point,\n LineString,\n Polygon,\n Feature,\n SimpleGeometryCoordinates\n} from '../utils/geojson-types';\n\nexport type NearestPointType = Feature<Point, {dist: number; index: number}>;\n\nexport function toDeckColor(\n color?: [number, number, number, number] | number,\n defaultColor: [number, number, number, number] = [255, 0, 0, 255]\n): [number, number, number, number] {\n if (!Array.isArray(color)) {\n return defaultColor;\n }\n return [color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255];\n}\n\n//\n// a GeoJSON helper function that calls the provided function with\n// an argument that is the most deeply-nested array having elements\n// that are arrays of primitives as an argument, e.g.\n//\n// {\n// \"type\": \"MultiPolygon\",\n// \"coordinates\": [\n// [\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n// ],\n// [\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n// ]\n// ]\n// }\n//\n// the function would be called on:\n//\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n//\n// and\n//\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n//\nexport function recursivelyTraverseNestedArrays(\n array: Array<any>,\n prefix: Array<number>,\n fn: (array: Array<any>, prefix: number[]) => void\n) {\n if (!Array.isArray(array[0])) {\n return true;\n }\n for (let i = 0; i < array.length; i++) {\n if (recursivelyTraverseNestedArrays(array[i], [...prefix, i], fn)) {\n fn(array, prefix);\n break;\n }\n }\n return false;\n}\n\nexport function generatePointsParallelToLinePoints(\n p1: Position,\n p2: Position,\n coords: Position\n): Position[] {\n const lineString: LineString = {\n type: 'LineString',\n coordinates: [p1, p2]\n };\n const pt = point(coords);\n const ddistance = pointToLineDistance(pt, lineString);\n const lineBearing = bearing(p1, p2);\n\n // Check if current point is to the left or right of line\n // Line from A=(x1,y1) to B=(x2,y2) a point P=(x,y)\n // then (x\u2212x1)(y2\u2212y1)\u2212(y\u2212y1)(x2\u2212x1)\n const isPointToLeftOfLine =\n (coords[0] - p1[0]) * (p2[1] - p1[1]) - (coords[1] - p1[1]) * (p2[0] - p1[0]);\n\n // Bearing to draw perpendicular to the line string\n const orthogonalBearing = isPointToLeftOfLine < 0 ? lineBearing - 90 : lineBearing - 270;\n\n // Get coordinates for the point p3 and p4 which are perpendicular to the lineString\n // Add the distance as the current position moves away from the lineString\n const p3 = destination(p2, ddistance, orthogonalBearing);\n const p4 = destination(p1, ddistance, orthogonalBearing);\n\n return [p3.geometry.coordinates, p4.geometry.coordinates] as Position[];\n}\n\nexport function distance2d(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function mix(a: number, b: number, ratio: number): number {\n return b * ratio + a * (1 - ratio);\n}\n\nexport function nearestPointOnProjectedLine(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport\n): NearestPointType {\n const wmViewport = new WebMercatorViewport(viewport);\n // Project the line to viewport, then find the nearest point\n const coordinates: Array<Array<number>> = line.geometry.coordinates as any;\n const projectedCoords = coordinates.map(([x, y, z = 0]) => wmViewport.project([x, y, z]));\n const [x, y] = wmViewport.project(inPoint.geometry.coordinates);\n // console.log('projectedCoords', JSON.stringify(projectedCoords));\n\n let minDistance = Infinity;\n let minPointInfo = {};\n\n projectedCoords.forEach(([x2, y2], index) => {\n if (index === 0) {\n return;\n }\n\n const [x1, y1] = projectedCoords[index - 1];\n\n // line from projectedCoords[index - 1] to projectedCoords[index]\n // convert to Ax + By + C = 0\n const A = y1 - y2;\n const B = x2 - x1;\n const C = x1 * y2 - x2 * y1;\n\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n const div = A * A + B * B;\n const distance = Math.abs(A * x + B * y + C) / Math.sqrt(div);\n\n // TODO: Check if inside bounds\n\n if (distance < minDistance) {\n minDistance = distance;\n minPointInfo = {\n index,\n x0: (B * (B * x - A * y) - A * C) / div,\n y0: (A * (-B * x + A * y) - B * C) / div\n };\n }\n });\n // @ts-expect-error TODO\n const {index, x0, y0} = minPointInfo;\n const [x1, y1, z1 = 0] = projectedCoords[index - 1];\n const [x2, y2, z2 = 0] = projectedCoords[index];\n\n // calculate what ratio of the line we are on to find the proper z\n const lineLength = distance2d(x1, y1, x2, y2);\n const startToPointLength = distance2d(x1, y1, x0, y0);\n const ratio = startToPointLength / lineLength;\n const z0 = mix(z1, z2, ratio);\n\n return {\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: wmViewport.unproject([x0, y0, z0])\n },\n properties: {\n // TODO: calculate the distance in proper units\n dist: minDistance,\n index: index - 1\n }\n };\n}\n\nexport function nearestPointOnLine( // <G extends LineString | MultiLineString>(\n lines: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport?: Viewport\n): NearestPointType {\n let mercator;\n\n if (viewport) {\n mercator = new WebMercatorViewport(viewport);\n }\n let closestPoint: any = point([Infinity, Infinity], {\n dist: Infinity\n });\n\n if (!lines.geometry?.coordinates.length || lines.geometry?.coordinates.length < 2) {\n return closestPoint;\n }\n\n // eslint-disable-next-line max-statements, complexity\n flattenEach(lines, (line: any) => {\n const coords: any = getCoords(line);\n const pointCoords: any = getCoords(inPoint);\n\n let minDist;\n let to;\n let from;\n let x;\n let y;\n let segmentIdx;\n let dist;\n\n if (coords.length > 1 && pointCoords.length) {\n let lineCoordinates;\n let pointCoordinate;\n\n // If viewport is given, then translate these coordinates to pixels to increase precision\n if (mercator) {\n lineCoordinates = coords.map((lineCoordinate) => mercator.project(lineCoordinate));\n pointCoordinate = mercator.project(pointCoords);\n } else {\n lineCoordinates = coords;\n pointCoordinate = pointCoords;\n }\n\n for (let n = 1; n < lineCoordinates.length; n++) {\n if (lineCoordinates[n][0] !== lineCoordinates[n - 1][0]) {\n const slope =\n (lineCoordinates[n][1] - lineCoordinates[n - 1][1]) /\n (lineCoordinates[n][0] - lineCoordinates[n - 1][0]);\n const inverseSlope = lineCoordinates[n][1] - slope * lineCoordinates[n][0];\n\n dist =\n Math.abs(slope * pointCoordinate[0] + inverseSlope - pointCoordinate[1]) /\n Math.sqrt(slope * slope + 1);\n } else dist = Math.abs(pointCoordinate[0] - lineCoordinates[n][0]);\n\n // length^2 of line segment\n const rl2 =\n Math.pow(lineCoordinates[n][1] - lineCoordinates[n - 1][1], 2) +\n Math.pow(lineCoordinates[n][0] - lineCoordinates[n - 1][0], 2);\n\n // distance^2 of pt to end line segment\n const ln2 =\n Math.pow(lineCoordinates[n][1] - pointCoordinate[1], 2) +\n Math.pow(lineCoordinates[n][0] - pointCoordinate[0], 2);\n\n // distance^2 of pt to begin line segment\n const lnm12 =\n Math.pow(lineCoordinates[n - 1][1] - pointCoordinate[1], 2) +\n Math.pow(lineCoordinates[n - 1][0] - pointCoordinate[0], 2);\n\n // minimum distance^2 of pt to infinite line\n const dist2 = Math.pow(dist, 2);\n\n // calculated length^2 of line segment\n const calcrl2 = ln2 - dist2 + lnm12 - dist2;\n\n // redefine minimum distance to line segment (not infinite line) if necessary\n if (calcrl2 > rl2) {\n dist = Math.sqrt(Math.min(ln2, lnm12));\n }\n\n if (minDist === null || minDist === undefined || minDist > dist) {\n // eslint-disable-next-line max-depth\n if (calcrl2 > rl2) {\n // eslint-disable-next-line max-depth\n if (lnm12 < ln2) {\n to = 0; // nearer to previous point\n from = 1;\n } else {\n from = 0; // nearer to current point\n to = 1;\n }\n } else {\n // perpendicular from point intersects line segment\n to = Math.sqrt(lnm12 - dist2) / Math.sqrt(rl2);\n from = Math.sqrt(ln2 - dist2) / Math.sqrt(rl2);\n }\n minDist = dist;\n segmentIdx = n;\n }\n }\n\n const dx = lineCoordinates[segmentIdx - 1][0] - lineCoordinates[segmentIdx][0];\n const dy = lineCoordinates[segmentIdx - 1][1] - lineCoordinates[segmentIdx][1];\n\n x = lineCoordinates[segmentIdx - 1][0] - dx * to;\n y = lineCoordinates[segmentIdx - 1][1] - dy * to;\n }\n\n // index needs to be -1 because we have to account for the shift from initial backscan\n let snapPoint = {x, y, idx: segmentIdx - 1, to, from};\n\n if (mercator) {\n const pixelToLatLong = mercator.unproject([snapPoint.x, snapPoint.y]);\n snapPoint = {\n x: pixelToLatLong[0],\n y: pixelToLatLong[1],\n idx: segmentIdx - 1,\n to,\n from\n };\n }\n\n closestPoint = point([snapPoint.x, snapPoint.y], {\n dist: Math.abs(snapPoint.from - snapPoint.to),\n index: snapPoint.idx\n });\n });\n\n return closestPoint;\n}\n\nexport function getPickedEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.length ? handles[0] : null;\n}\n\nexport function getPickedSnapSourceEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find((handle) => handle.properties.editHandleType === 'snap-source');\n}\n\nexport function getNonGuidePicks(picks: Pick[]): Pick[] {\n return picks && picks.filter((pick) => !pick.isGuide);\n}\n\nexport function getPickedExistingEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find(\n ({properties}) => properties.featureIndex >= 0 && properties.editHandleType === 'existing'\n );\n}\n\nexport function getPickedIntermediateEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find(\n ({properties}) => properties.featureIndex >= 0 && properties.editHandleType === 'intermediate'\n );\n}\n\nexport function getPickedEditHandles(picks: Pick[] | null | undefined): EditHandleFeature[] {\n const handles =\n (picks &&\n picks\n .filter((pick) => pick.isGuide && pick.object.properties.guideType === 'editHandle')\n .map((pick) => pick.object)) ||\n [];\n\n return handles;\n}\n\nexport function getEditHandlesForGeometry(\n geometry: SimpleGeometry,\n featureIndex: number,\n editHandleType: EditHandleType = 'existing'\n): EditHandleFeature[] {\n let handles: EditHandleFeature[] = [];\n\n switch (geometry.type) {\n case 'Point':\n // positions are not nested\n handles = [\n {\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType,\n positionIndexes: [],\n featureIndex\n },\n geometry: {\n type: 'Point',\n coordinates: geometry.coordinates\n }\n }\n ];\n break;\n case 'MultiPoint':\n case 'LineString':\n // positions are nested 1 level\n handles = handles.concat(\n getEditHandlesForCoordinates(geometry.coordinates, [], featureIndex, editHandleType)\n );\n break;\n case 'Polygon':\n case 'MultiLineString':\n // positions are nested 2 levels\n for (let a = 0; a < geometry.coordinates.length; a++) {\n handles = handles.concat(\n getEditHandlesForCoordinates(geometry.coordinates[a], [a], featureIndex, editHandleType)\n );\n if (geometry.type === 'Polygon') {\n // Don't repeat the first/last handle for Polygons\n handles = handles.slice(0, -1);\n }\n }\n\n break;\n case 'MultiPolygon':\n // positions are nested 3 levels\n for (let a = 0; a < geometry.coordinates.length; a++) {\n for (let b = 0; b < geometry.coordinates[a].length; b++) {\n handles = handles.concat(\n getEditHandlesForCoordinates(\n geometry.coordinates[a][b],\n [a, b],\n featureIndex,\n editHandleType\n )\n );\n // Don't repeat the first/last handle for Polygons\n handles = handles.slice(0, -1);\n }\n }\n\n break;\n default:\n throw Error(`Unhandled geometry type: ${(geometry as {type: string}).type}`);\n }\n\n return handles;\n}\n\nfunction getEditHandlesForCoordinates(\n coordinates: any[],\n positionIndexPrefix: number[],\n featureIndex: number,\n editHandleType: EditHandleType = 'existing'\n): EditHandleFeature[] {\n const editHandles: EditHandleFeature[] = [];\n for (let i = 0; i < coordinates.length; i++) {\n const position = coordinates[i] as Position;\n editHandles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n positionIndexes: [...positionIndexPrefix, i],\n featureIndex,\n editHandleType\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n return editHandles;\n}\n\n/**\n * Calculates coordinates for a feature preserving rectangular shape.\n * @param feature Feature before modification.\n * @param editHandleIndex Index of the point to modify.\n * @param coords New position for the point.\n * @returns Updated coordinates.\n */\nexport function updateRectanglePosition(\n feature: Feature<Polygon>,\n editHandleIndex: number,\n coords: Position\n): Position[][] | null {\n const coordinates = feature.geometry.coordinates;\n if (!coordinates) {\n return null;\n }\n\n const points = coordinates[0].slice(0, 4);\n points[editHandleIndex % 4] = coords;\n\n const p0 = points[(editHandleIndex + 2) % 4];\n const p2 = points[editHandleIndex % 4];\n points[(editHandleIndex + 1) % 4] = [p2[0], p0[1]];\n points[(editHandleIndex + 3) % 4] = [p0[0], p2[1]];\n\n return [[...points, points[0]]];\n}\n\n/** Creates a copy of feature's coordinates.\n * Each position in coordinates is transformed by calling the provided function.\n * @param coords Coordinates of a feature.\n * @param callback A function to transform each coordinate.\n * @retuns Transformed coordinates.\n */\nexport function mapCoords(\n coords: SimpleGeometryCoordinates,\n callback: (coords: Position) => Position\n): SimpleGeometryCoordinates {\n if (typeof coords[0] === 'number') {\n if (!isNaN(coords[0]) && isFinite(coords[0])) {\n return callback(coords as Position);\n }\n return coords;\n }\n\n return (coords as Position[])\n .map((coord) => {\n return mapCoords(coord, callback) as Position;\n })\n .filter(Boolean);\n}\n\nexport function shouldCancelPan(event: StartDraggingEvent) {\n return event.picks.length && event.picks.find((p) => p.featureType === 'points');\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n SimpleFeatureCollection,\n SimpleGeometry,\n Polygon,\n MultiLineString,\n MultiPolygon,\n Position,\n SimpleFeature,\n} from '../utils/geojson-types';\n\nexport class ImmutableFeatureCollection {\n featureCollection: Readonly<SimpleFeatureCollection>;\n\n constructor(featureCollection: SimpleFeatureCollection) {\n this.featureCollection = featureCollection;\n }\n\n getObject() {\n return this.featureCollection;\n }\n\n /**\n * Replaces the position deeply nested withing the given feature's geometry.\n * Works with Point, MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the position to replace\n * @param updatedPosition The updated position to place in the result (i.e. [lng, lat])\n *\n * @returns A new `ImmutableFeatureCollection` with the given position replaced. Does not modify this `ImmutableFeatureCollection`.\n */\n replacePosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined,\n updatedPosition: Position\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyReplacePosition(\n geometry.coordinates,\n positionIndexes,\n updatedPosition,\n isPolygonal\n )\n };\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n /**\n * Removes a position deeply nested in a GeoJSON geometry coordinates array.\n * Works with MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the postion to remove\n *\n * @returns A new `ImmutableFeatureCollection` with the given coordinate removed. Does not modify this `ImmutableFeatureCollection`.\n *\n */\n // eslint-disable-next-line complexity\n removePosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n if (geometry.type === 'Point') {\n throw Error(\"Can't remove a position from a Point or there'd be nothing left\");\n }\n if (\n geometry.type === 'MultiPoint' && // only 1 point left\n geometry.coordinates.length < 2\n ) {\n throw Error(\"Can't remove the last point of a MultiPoint or there'd be nothing left\");\n }\n if (\n geometry.type === 'LineString' && // only 2 positions\n geometry.coordinates.length < 3\n ) {\n throw Error(\"Can't remove position. LineString must have at least two positions\");\n }\n if (\n geometry.type === 'Polygon' && // outer ring is a triangle\n geometry.coordinates[0].length < 5 &&\n Array.isArray(positionIndexes) && // trying to remove from outer ring\n positionIndexes[0] === 0\n ) {\n throw Error(\"Can't remove position. Polygon's outer ring must have at least four positions\");\n }\n if (\n geometry.type === 'MultiLineString' && // only 1 LineString left\n geometry.coordinates.length === 1 && // only 2 positions\n geometry.coordinates[0].length < 3\n ) {\n throw Error(\"Can't remove position. MultiLineString must have at least two positions\");\n }\n if (\n geometry.type === 'MultiPolygon' && // only 1 polygon left\n geometry.coordinates.length === 1 && // outer ring is a triangle\n geometry.coordinates[0][0].length < 5 &&\n Array.isArray(positionIndexes) && // trying to remove from first polygon\n positionIndexes[0] === 0 && // trying to remove from outer ring\n positionIndexes[1] === 0\n ) {\n throw Error(\n \"Can't remove position. MultiPolygon's outer ring must have at least four positions\"\n );\n }\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyRemovePosition(geometry.coordinates, positionIndexes, isPolygonal)\n };\n\n // Handle cases where incomplete geometries need pruned (e.g. holes that were triangles)\n pruneGeometryIfNecessary(updatedGeometry);\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n /**\n * Adds a position deeply nested in a GeoJSON geometry coordinates array.\n * Works with MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the position that will proceed the new position\n * @param positionToAdd The new position to place in the result (i.e. [lng, lat])\n *\n * @returns A new `ImmutableFeatureCollection` with the given coordinate removed. Does not modify this `ImmutableFeatureCollection`.\n */\n addPosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined,\n positionToAdd: Position\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n if (geometry.type === 'Point') {\n throw new Error('Unable to add a position to a Point feature');\n }\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyAddPosition(\n geometry.coordinates,\n positionIndexes,\n positionToAdd,\n isPolygonal\n )\n };\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n replaceGeometry(featureIndex: number, geometry: SimpleGeometry): ImmutableFeatureCollection {\n const updatedFeature: any = {\n ...this.featureCollection.features[featureIndex],\n geometry\n };\n\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features: [\n ...this.featureCollection.features.slice(0, featureIndex),\n updatedFeature,\n ...this.featureCollection.features.slice(featureIndex + 1)\n ]\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n\n addFeature(feature: SimpleFeature): ImmutableFeatureCollection {\n return this.addFeatures([feature]);\n }\n\n addFeatures(features: SimpleFeature[]): ImmutableFeatureCollection {\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features: [...this.featureCollection.features, ...features]\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n\n deleteFeature(featureIndex: number) {\n return this.deleteFeatures([featureIndex]);\n }\n\n deleteFeatures(featureIndexes: number[]) {\n const features = [...this.featureCollection.features];\n featureIndexes.sort();\n for (let i = featureIndexes.length - 1; i >= 0; i--) {\n const featureIndex = featureIndexes[i];\n if (featureIndex >= 0 && featureIndex < features.length) {\n features.splice(featureIndex, 1);\n }\n }\n\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n}\n\nfunction getUpdatedPosition(updatedPosition: Position, previousPosition: Position): Position {\n // This function checks if the updatedPosition is missing elevation\n // and copies it from previousPosition\n if (updatedPosition.length === 2 && previousPosition.length === 3) {\n const elevation = (previousPosition as any)[2];\n return [updatedPosition[0], updatedPosition[1], elevation];\n }\n\n return updatedPosition;\n}\n\nfunction immutablyReplacePosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n updatedPosition: Position,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n return getUpdatedPosition(updatedPosition, coordinates);\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n getUpdatedPosition(updatedPosition, coordinates[positionIndexes[0]]),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n\n if (\n isPolygonal &&\n (positionIndexes[0] === 0 || positionIndexes[0] === coordinates.length - 1)\n ) {\n // for polygons, the first point is repeated at the end of the array\n // so, update it on both ends of the array\n updated[0] = getUpdatedPosition(updatedPosition, coordinates[0]);\n updated[coordinates.length - 1] = getUpdatedPosition(updatedPosition, coordinates[0]);\n }\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyReplacePosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n updatedPosition,\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction immutablyRemovePosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n throw Error('Must specify the index of the position to remove');\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n\n if (\n isPolygonal &&\n (positionIndexes[0] === 0 || positionIndexes[0] === coordinates.length - 1)\n ) {\n // for polygons, the first point is repeated at the end of the array\n // so, if the first/last coordinate is to be removed, coordinates[1] will be the new first/last coordinate\n if (positionIndexes[0] === 0) {\n // change the last to be the same as the first\n updated[updated.length - 1] = updated[0];\n } else if (positionIndexes[0] === coordinates.length - 1) {\n // change the first to be the same as the last\n updated[0] = updated[updated.length - 1];\n }\n }\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyRemovePosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction immutablyAddPosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n positionToAdd: Position,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n throw Error('Must specify the index of the position to remove');\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n positionToAdd,\n ...coordinates.slice(positionIndexes[0])\n ];\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyAddPosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n positionToAdd,\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction pruneGeometryIfNecessary(geometry: SimpleGeometry) {\n switch (geometry.type) {\n case 'Polygon':\n prunePolygonIfNecessary(geometry);\n break;\n case 'MultiLineString':\n pruneMultiLineStringIfNecessary(geometry);\n break;\n case 'MultiPolygon':\n pruneMultiPolygonIfNecessary(geometry);\n break;\n default:\n // Not downgradable\n break;\n }\n}\n\nfunction prunePolygonIfNecessary(geometry: Polygon) {\n const polygon = geometry.coordinates;\n\n // If any hole is no longer a polygon, remove the hole entirely\n for (let holeIndex = 1; holeIndex < polygon.length; holeIndex++) {\n if (removeHoleIfNecessary(polygon, holeIndex)) {\n // It was removed, so keep the index the same\n holeIndex--;\n }\n }\n}\n\nfunction pruneMultiLineStringIfNecessary(geometry: MultiLineString) {\n for (let lineStringIndex = 0; lineStringIndex < geometry.coordinates.length; lineStringIndex++) {\n const lineString = geometry.coordinates[lineStringIndex];\n if (lineString.length === 1) {\n // Only a single position left on this LineString, so remove it (can't have Point in MultiLineString)\n geometry.coordinates.splice(lineStringIndex, 1);\n // Keep the index the same\n lineStringIndex--;\n }\n }\n}\n\nfunction pruneMultiPolygonIfNecessary(geometry: MultiPolygon) {\n for (let polygonIndex = 0; polygonIndex < geometry.coordinates.length; polygonIndex++) {\n const polygon = geometry.coordinates[polygonIndex];\n const outerRing = polygon[0];\n\n // If the outer ring is no longer a polygon, remove the whole polygon\n if (outerRing.length <= 3) {\n geometry.coordinates.splice(polygonIndex, 1);\n // It was removed, so keep the index the same\n polygonIndex--;\n }\n\n for (let holeIndex = 1; holeIndex < polygon.length; holeIndex++) {\n if (removeHoleIfNecessary(polygon, holeIndex)) {\n // It was removed, so keep the index the same\n holeIndex--;\n }\n }\n }\n}\n\nfunction removeHoleIfNecessary(polygon: Polygon['coordinates'], holeIndex: number) {\n const hole = polygon[holeIndex];\n if (hole.length <= 3) {\n polygon.splice(holeIndex, 1);\n return true;\n }\n return false;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class ViewMode extends GeoJsonEditMode {}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfBearing from '@turf/bearing';\nimport turfDistance from '@turf/distance';\nimport clone from '@turf/clone';\nimport {point} from '@turf/helpers';\nimport {WebMercatorViewport} from 'viewport-mercator-project';\nimport {FeatureCollection, Position, SimpleGeometry, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps\n} from './types';\nimport {mapCoords} from './utils';\nimport {translateFromCenter} from '../utils/translate-from-center';\nimport {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class TranslateMode extends GeoJsonEditMode {\n _geometryBeforeTranslate: SimpleFeatureCollection | null | undefined;\n _isTranslatable: boolean = undefined!;\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isTranslatable) {\n // Nothing to do\n return;\n }\n\n if (this._geometryBeforeTranslate) {\n // Translate the geometry\n const editAction = this.getTranslateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'translating',\n props\n );\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n\n // cancel map panning\n event.cancelPan();\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n this._isTranslatable = this.isSelectionPicked(event.pointerDownPicks || event.picks, props);\n\n this.updateCursor(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isTranslatable) {\n return;\n }\n\n event.cancelPan();\n this._geometryBeforeTranslate = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._geometryBeforeTranslate) {\n // Translate the geometry\n const editAction = this.getTranslateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'translated',\n props\n );\n\n if (editAction) {\n props.onEdit(editAction);\n }\n\n this._geometryBeforeTranslate = null;\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._isTranslatable) {\n props.onUpdateCursor('move');\n } else {\n props.onUpdateCursor(null);\n }\n }\n\n // eslint-disable-next-line max-statements\n getTranslateAction(\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ): GeoJsonEditAction | null | undefined {\n if (!this._geometryBeforeTranslate) {\n return null;\n }\n\n let updatedData = new ImmutableFeatureCollection(props.data);\n const selectedIndexes = props.selectedIndexes;\n\n const {viewport: viewportDesc, screenSpace} = props.modeConfig || {};\n\n // move features without adapting to mercator projection\n if (viewportDesc && screenSpace) {\n const viewport = viewportDesc.project ? viewportDesc : new WebMercatorViewport(viewportDesc);\n\n const from = viewport.project(startDragPoint);\n const to = viewport.project(currentPoint);\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const feature = this._geometryBeforeTranslate.features[i];\n\n let coordinates = feature.geometry.coordinates;\n if (coordinates) {\n coordinates = mapCoords(coordinates, (coord) => {\n const pixels = viewport.project(coord);\n if (pixels) {\n pixels[0] += dx;\n pixels[1] += dy;\n return viewport.unproject(pixels);\n }\n return null;\n });\n\n updatedData = updatedData.replaceGeometry(selectedIndex, {\n type: feature.geometry.type,\n coordinates,\n } as SimpleGeometry);\n }\n }\n } else {\n const p1 = point(startDragPoint);\n const p2 = point(currentPoint);\n\n const distanceMoved = turfDistance(p1, p2);\n const direction = turfBearing(p1, p2);\n\n const movedFeatures = this._geometryBeforeTranslate.features.map((feature) =>\n translateFromCenter(clone(feature), distanceMoved, direction)\n );\n\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = movedFeatures[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType,\n editContext: {\n featureIndexes: selectedIndexes\n }\n };\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfCenter from '@turf/center';\nimport turfRhumbBearing from '@turf/rhumb-bearing';\nimport turfRhumbDistance from '@turf/rhumb-distance';\nimport turfRhumbDestination from '@turf/rhumb-destination';\nimport {mapCoords} from '../edit-modes/utils';\nimport type {SimpleFeature} from './geojson-types';\n\n// This function takes feature's center, moves it,\n// and builds new feature around it keeping the proportions\nexport function translateFromCenter(\n feature: SimpleFeature,\n distance: number,\n direction: number\n) {\n const initialCenterPoint = turfCenter(feature);\n\n const movedCenterPoint = turfRhumbDestination(initialCenterPoint, distance, direction);\n\n const movedCoordinates = mapCoords(\n feature.geometry.coordinates,\n (coordinate) => {\n const rhumbDistance = turfRhumbDistance(\n initialCenterPoint.geometry.coordinates,\n coordinate\n );\n const rhumbDirection = turfRhumbBearing(\n initialCenterPoint.geometry.coordinates,\n coordinate\n );\n\n const movedPosition = turfRhumbDestination(\n movedCenterPoint.geometry.coordinates,\n rhumbDistance,\n rhumbDirection\n ).geometry.coordinates;\n return movedPosition;\n }\n );\n\n feature.geometry.coordinates = movedCoordinates;\n\n return feature;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {point, lineString as toLineString} from '@turf/helpers';\nimport {\n recursivelyTraverseNestedArrays,\n nearestPointOnProjectedLine,\n nearestPointOnLine,\n getEditHandlesForGeometry,\n getPickedEditHandles,\n getPickedEditHandle,\n getPickedExistingEditHandle,\n getPickedIntermediateEditHandle,\n updateRectanglePosition,\n NearestPointType,\n shouldCancelPan\n} from './utils';\nimport {LineString, Point, Polygon, FeatureCollection, Feature, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ModeProps,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n Viewport,\n GuideFeatureCollection,\n EditHandleFeature,\n GuideFeature\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ModifyMode extends GeoJsonEditMode {\n // eslint-disable-next-line complexity\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const handles: GuideFeature[] = [];\n\n const {data, lastPointerMoveEvent} = props;\n const {features} = data;\n const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;\n const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;\n\n for (const index of props.selectedIndexes) {\n if (index < features.length) {\n const {geometry} = features[index];\n handles.push(...getEditHandlesForGeometry(geometry, index));\n } else {\n console.warn(`selectedFeatureIndexes out of range ${index}`); // eslint-disable-line no-console,no-undef\n }\n }\n\n // intermediate edit handle\n if (picks && picks.length && mapCoords) {\n const existingEditHandle = getPickedExistingEditHandle(picks);\n // don't show intermediate point when too close to an existing edit handle\n const featureAsPick = !existingEditHandle && picks.find((pick) => !pick.isGuide);\n\n // is the feature in the pick selected\n if (\n featureAsPick &&\n !featureAsPick.object.geometry.type.includes('Point') &&\n !(\n props.modeConfig?.lockRectangles && featureAsPick.object.properties.shape === 'Rectangle'\n ) &&\n props.selectedIndexes.includes(featureAsPick.index)\n ) {\n let intermediatePoint: NearestPointType | null | undefined = null;\n let positionIndexPrefix: number[] = [];\n const referencePoint = point(mapCoords);\n // process all lines of the (single) feature\n recursivelyTraverseNestedArrays(\n featureAsPick.object.geometry.coordinates,\n [],\n (lineString, prefix) => {\n const lineStringFeature = toLineString(lineString);\n const candidateIntermediatePoint = this.getNearestPoint(\n\n lineStringFeature,\n referencePoint,\n props.modeConfig && props.modeConfig.viewport\n );\n if (\n !intermediatePoint ||\n candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist\n ) {\n intermediatePoint = candidateIntermediatePoint;\n positionIndexPrefix = prefix;\n }\n }\n );\n // tack on the lone intermediate point to the set of handles\n if (intermediatePoint) {\n const {\n geometry: {coordinates: position},\n properties: {index}\n } = intermediatePoint;\n handles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'intermediate',\n featureIndex: featureAsPick.index,\n positionIndexes: [...positionIndexPrefix, index + 1]\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n }\n }\n\n return {\n type: 'FeatureCollection',\n features: handles\n };\n }\n\n // turf.js does not support elevation for nearestPointOnLine\n getNearestPoint(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport | null | undefined\n ): NearestPointType {\n const {coordinates} = line.geometry;\n if (coordinates.some((coord) => coord.length > 2)) {\n if (viewport) {\n // This line has elevation, we need to use alternative algorithm\n return nearestPointOnProjectedLine(line, inPoint, viewport);\n }\n // eslint-disable-next-line no-console,no-undef\n console.log(\n 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.'\n );\n }\n return nearestPointOnLine(line, inPoint, viewport);\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const pickedExistingHandle = getPickedExistingEditHandle(event.picks);\n const pickedIntermediateHandle = getPickedIntermediateEditHandle(event.picks);\n\n if (pickedExistingHandle) {\n const { featureIndex, positionIndexes } = pickedExistingHandle.properties;\n\n let updatedData;\n try {\n updatedData = new ImmutableFeatureCollection(props.data)\n .removePosition(featureIndex, positionIndexes)\n .getObject();\n } catch (ignored) {\n // This happens if user attempts to remove the last point\n }\n\n if (updatedData) {\n props.onEdit({\n updatedData,\n editType: 'removePosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: pickedExistingHandle.geometry.coordinates\n }\n });\n }\n } else if (pickedIntermediateHandle) {\n const {featureIndex, positionIndexes} = pickedIntermediateHandle.properties;\n\n const feature = props.data.features[featureIndex];\n const canAddPosition = !(\n props.modeConfig?.lockRectangles && feature?.properties.shape === 'Rectangle'\n );\n\n if (canAddPosition) {\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(featureIndex, positionIndexes, pickedIntermediateHandle.geometry.coordinates)\n .getObject();\n\n if (updatedData) {\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: pickedIntermediateHandle.geometry.coordinates\n }\n });\n }\n }\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n // Cancel map panning if pointer went down on an edit handle\n event.cancelPan();\n\n this._dragEditHandle('movePosition', props, editHandle, event);\n }\n }\n\n _dragEditHandle(\n editType: string,\n props: ModeProps<SimpleFeatureCollection>,\n editHandle: EditHandleFeature,\n event: StopDraggingEvent | DraggingEvent\n ) {\n const editHandleProperties = editHandle.properties;\n const editedFeature = props.data.features[editHandleProperties.featureIndex];\n\n let updatedData;\n if (props.modeConfig?.lockRectangles && editedFeature.properties.shape === 'Rectangle') {\n const coordinates = updateRectanglePosition(\n editedFeature as Feature<Polygon>,\n editHandleProperties.positionIndexes[1],\n event.mapCoords\n ) as any; // TODO\n\n updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(editHandleProperties.featureIndex, {coordinates, type: 'Polygon'})\n .getObject();\n } else {\n updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(\n editHandleProperties.featureIndex,\n editHandleProperties.positionIndexes,\n event.mapCoords\n )\n .getObject();\n }\n\n props.onEdit({\n updatedData,\n editType,\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex],\n positionIndexes: editHandleProperties.positionIndexes,\n position: event.mapCoords\n }\n });\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n const cursor = this.getCursor(event);\n props.onUpdateCursor(cursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (shouldCancelPan(event)) {\n event.cancelPan();\n }\n\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const editHandle = getPickedIntermediateEditHandle(event.picks);\n if (selectedFeatureIndexes.length && editHandle) {\n const editHandleProperties = editHandle.properties;\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(\n editHandleProperties.featureIndex,\n editHandleProperties.positionIndexes,\n event.mapCoords\n )\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex],\n positionIndexes: editHandleProperties.positionIndexes,\n position: event.mapCoords\n }\n });\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const selectedFeatureIndexes = props.selectedIndexes;\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n if (selectedFeatureIndexes.length && editHandle) {\n this._dragEditHandle('finishMovePosition', props, editHandle, event);\n }\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n const picks = (event && event.picks) || [];\n\n const handlesPicked = getPickedEditHandles(picks);\n if (handlesPicked.length) {\n return 'cell';\n }\n return null;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bbox from '@turf/bbox';\nimport turfCentroid from '@turf/centroid';\nimport turfBearing from '@turf/bearing';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {point, featureCollection} from '@turf/helpers';\nimport {polygonToLine} from '@turf/polygon-to-line';\nimport {coordEach} from '@turf/meta';\nimport turfDistance from '@turf/distance';\nimport turfTransformScale from '@turf/transform-scale';\nimport {getCoord, getGeom} from '@turf/invariant';\nimport {FeatureCollection, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ModeProps,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n EditHandleFeature,\n GuideFeatureCollection\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ScaleMode extends GeoJsonEditMode {\n _geometryBeingScaled: SimpleFeatureCollection | null | undefined;\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _cornerGuidePoints: Array<EditHandleFeature> = [];\n _cursor: string | null | undefined;\n _isScaling = false;\n\n _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => {\n const {features} = geometry || {};\n if (Array.isArray(features) && features.length === 1) {\n const {type}: {type: string} = getGeom(features[0]);\n return type === 'Point';\n }\n return false;\n };\n\n _getOppositeScaleHandle = (selectedHandle: EditHandleFeature): EditHandleFeature | null => {\n const selectedHandleIndex =\n selectedHandle &&\n selectedHandle.properties &&\n Array.isArray(selectedHandle.properties.positionIndexes) &&\n selectedHandle.properties.positionIndexes[0];\n\n if (typeof selectedHandleIndex !== 'number') {\n return null;\n }\n const guidePointCount = this._cornerGuidePoints.length;\n const oppositeIndex = (selectedHandleIndex + guidePointCount / 2) % guidePointCount;\n return (\n this._cornerGuidePoints.find((p) => {\n if (!Array.isArray(p.properties.positionIndexes)) {\n return false;\n }\n return p.properties.positionIndexes[0] === oppositeIndex;\n }) || null\n );\n };\n\n _getUpdatedData = (props: ModeProps<SimpleFeatureCollection>, editedData: SimpleFeatureCollection) => {\n let updatedData = new ImmutableFeatureCollection(props.data);\n const selectedIndexes = props.selectedIndexes;\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = editedData.features[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n return updatedData.getObject();\n };\n\n isEditHandleSelected = (): boolean => Boolean(this._selectedEditHandle);\n\n getScaleAction = (\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ) => {\n if (!this._selectedEditHandle) {\n return null;\n }\n\n const oppositeHandle = this._getOppositeScaleHandle(this._selectedEditHandle);\n const origin = getCoord(oppositeHandle) as Position;\n\n const scaleFactor = getScaleFactor(origin, startDragPoint, currentPoint);\n\n const scaledFeatures = turfTransformScale(\n this._geometryBeingScaled,\n scaleFactor,\n {origin}\n );\n\n return {\n updatedData: this._getUpdatedData(props, scaledFeatures),\n editType,\n editContext: {\n featureIndexes: props.selectedIndexes\n }\n };\n };\n\n updateCursor = (props: ModeProps<SimpleFeatureCollection>) => {\n if (this._selectedEditHandle) {\n if (this._cursor) {\n props.onUpdateCursor(this._cursor);\n }\n const cursorGeometry = this.getSelectedFeaturesAsFeatureCollection(props);\n\n // Get resize cursor direction from the hovered scale editHandle (e.g. nesw or nwse)\n const centroid = turfCentroid(cursorGeometry);\n const bearing = turfBearing(centroid, this._selectedEditHandle);\n const positiveBearing = bearing < 0 ? bearing + 180 : bearing;\n if (\n (positiveBearing >= 0 && positiveBearing <= 90) ||\n (positiveBearing >= 180 && positiveBearing <= 270)\n ) {\n this._cursor = 'nesw-resize';\n props.onUpdateCursor('nesw-resize');\n } else {\n this._cursor = 'nwse-resize';\n props.onUpdateCursor('nwse-resize');\n }\n } else {\n props.onUpdateCursor(null);\n this._cursor = null;\n }\n };\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isScaling) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'scale'\n ? selectedEditHandle\n : null;\n\n this.updateCursor(props);\n }\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isScaling = true;\n this._geometryBeingScaled = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isScaling) {\n return;\n }\n\n props.onUpdateCursor(this._cursor);\n\n const scaleAction = this.getScaleAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'scaling',\n props\n );\n if (scaleAction) {\n props.onEdit(scaleAction);\n }\n\n event.cancelPan();\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._isScaling) {\n // Scale the geometry\n const scaleAction = this.getScaleAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'scaled',\n props\n );\n if (scaleAction) {\n props.onEdit(scaleAction);\n }\n\n props.onUpdateCursor(null);\n\n this._geometryBeingScaled = null;\n this._selectedEditHandle = null;\n this._cursor = null;\n this._isScaling = false;\n }\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n this._cornerGuidePoints = [];\n const selectedGeometry = this.getSelectedFeaturesAsFeatureCollection(props);\n\n // Add buffer to the enveloping box if a single Point feature is selected\n if (this._isSinglePointGeometrySelected(selectedGeometry)) {\n return {type: 'FeatureCollection', features: []};\n }\n\n const boundingBox = bboxPolygon(bbox(selectedGeometry));\n boundingBox.properties.mode = 'scale';\n const cornerGuidePoints: EditHandleFeature[] = [];\n\n coordEach(boundingBox, (coord, coordIndex) => {\n if (coordIndex < 4) {\n // Get corner midpoint guides from the enveloping box\n const cornerPoint = point(coord, {\n guideType: 'editHandle',\n editHandleType: 'scale',\n positionIndexes: [coordIndex]\n });\n cornerGuidePoints.push(cornerPoint as EditHandleFeature);\n }\n });\n\n this._cornerGuidePoints = cornerGuidePoints;\n // @ts-expect-error turf types diff\n return featureCollection([polygonToLine(boundingBox), ...this._cornerGuidePoints]);\n }\n}\n\nfunction getScaleFactor(centroid: Position, startDragPoint: Position, currentPoint: Position) {\n const startDistance = turfDistance(centroid, startDragPoint);\n const endDistance = turfDistance(centroid, currentPoint);\n return endDistance / startDistance;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bbox from '@turf/bbox';\nimport turfCentroid from '@turf/centroid';\nimport turfBearing from '@turf/bearing';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport {coordEach} from '@turf/meta';\nimport {getGeom} from '@turf/invariant';\nimport {point, featureCollection, lineString} from '@turf/helpers';\nimport turfTransformRotate from '@turf/transform-rotate';\nimport {polygonToLine} from '@turf/polygon-to-line';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n EditHandleFeature,\n GuideFeatureCollection\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {FeatureCollection, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {GeoJsonEditMode, GeoJsonEditAction, getIntermediatePosition} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class RotateMode extends GeoJsonEditMode {\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _geometryBeingRotated: SimpleFeatureCollection | null | undefined;\n _isRotating = false;\n\n _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => {\n const {features} = geometry || {};\n if (Array.isArray(features) && features.length === 1) {\n const {type}: {type: string} = getGeom(features[0]);\n return type === 'Point';\n }\n return false;\n };\n\n getIsRotating = () => this._isRotating;\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const selectedGeometry =\n this._geometryBeingRotated || this.getSelectedFeaturesAsFeatureCollection(props);\n\n if (this._isSinglePointGeometrySelected(selectedGeometry)) {\n return {type: 'FeatureCollection', features: []};\n }\n\n if (this._isRotating) {\n // Display rotate pivot\n return featureCollection([turfCentroid(selectedGeometry)]) as GuideFeatureCollection;\n }\n\n const boundingBox = bboxPolygon(bbox(selectedGeometry));\n\n let previousCoord: Position | null = null;\n let topEdgeMidpointCoords: Position | null = null;\n let longestEdgeLength = 0;\n\n coordEach(boundingBox, (coord: any) => {\n if (previousCoord) {\n const edgeMidpoint = getIntermediatePosition(coord, previousCoord);\n if (!topEdgeMidpointCoords || edgeMidpoint[1] > topEdgeMidpointCoords[1]) {\n // Get the top edge midpoint of the enveloping box\n topEdgeMidpointCoords = edgeMidpoint;\n }\n // Get the length of the longest edge of the enveloping box\n const edgeDistance = turfDistance(coord, previousCoord);\n longestEdgeLength = Math.max(longestEdgeLength, edgeDistance);\n }\n previousCoord = coord;\n });\n\n // Scale the length of the line between the rotate handler and the enveloping box\n // relative to the length of the longest edge of the enveloping box\n const rotateHandleCoords = topEdgeMidpointCoords && [\n topEdgeMidpointCoords[0],\n topEdgeMidpointCoords[1] + longestEdgeLength / 1000\n ];\n\n const lineFromEnvelopeToRotateHandle = lineString([topEdgeMidpointCoords, rotateHandleCoords]);\n const rotateHandle = point(rotateHandleCoords, {\n guideType: 'editHandle',\n editHandleType: 'rotate'\n });\n\n const outFeatures = [polygonToLine(boundingBox), rotateHandle, lineFromEnvelopeToRotateHandle];\n\n // @ts-expect-error turf type diff\n return featureCollection(outFeatures);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isRotating) {\n return;\n }\n\n const rotateAction = this.getRotateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'rotating',\n props\n );\n if (rotateAction) {\n props.onEdit(rotateAction);\n }\n\n event.cancelPan();\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n if (!this._isRotating) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'rotate'\n ? selectedEditHandle\n : null;\n }\n\n this.updateCursor(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isRotating = true;\n this._geometryBeingRotated = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._isRotating) {\n // Rotate the geometry\n const rotateAction = this.getRotateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'rotated',\n props\n );\n\n if (rotateAction) {\n props.onEdit(rotateAction);\n }\n\n this._geometryBeingRotated = null;\n this._selectedEditHandle = null;\n this._isRotating = false;\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._selectedEditHandle) {\n // TODO: look at doing SVG cursors to get a better \"rotate\" cursor\n props.onUpdateCursor('crosshair');\n } else {\n props.onUpdateCursor(null);\n }\n }\n\n getRotateAction(\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ): GeoJsonEditAction | null | undefined {\n if (!this._geometryBeingRotated) {\n return null;\n }\n const centroid = turfCentroid(this._geometryBeingRotated);\n const angle = getRotationAngle(centroid.geometry.coordinates, startDragPoint, currentPoint);\n const rotatedFeatures = turfTransformRotate(\n\n this._geometryBeingRotated,\n angle,\n {\n pivot: centroid\n }\n );\n\n let updatedData = new ImmutableFeatureCollection(props.data);\n\n const selectedIndexes = props.selectedIndexes;\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = rotatedFeatures.features[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType,\n editContext: {\n featureIndexes: selectedIndexes\n }\n };\n }\n}\n\nfunction getRotationAngle(centroid: Position, startDragPoint: Position, currentPoint: Position) {\n const bearing1 = turfBearing(centroid, startDragPoint);\n const bearing2 = turfBearing(centroid, currentPoint);\n return bearing2 - bearing1;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {StartDraggingEvent, ModeProps} from './types';\nimport {FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {TranslateMode} from './translate-mode';\n\nexport class DuplicateMode extends TranslateMode {\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n super.handleStartDragging(event, props);\n\n if (this._geometryBeforeTranslate) {\n props.onEdit(this.getAddManyFeaturesAction(this._geometryBeforeTranslate, props.data));\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._isTranslatable) {\n props.onUpdateCursor('copy');\n } else {\n props.onUpdateCursor(null);\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport booleanPointInPolygon from '@turf/boolean-point-in-polygon';\nimport turfDifference from '@turf/difference';\nimport turfBuffer from '@turf/buffer';\nimport lineIntersect from '@turf/line-intersect';\nimport type {Point} from 'geojson';\nimport {feature as turfFeature, featureCollection, lineString} from '@turf/helpers';\nimport turfBearing from '@turf/bearing';\nimport turfDistance from '@turf/distance';\nimport turfDestination from '@turf/destination';\nimport turfPolygonToLine from '@turf/polygon-to-line';\nimport nearestPointOnLine from '@turf/nearest-point-on-line';\nimport {generatePointsParallelToLinePoints} from './utils';\nimport {FeatureCollection, PolygonGeometry, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class SplitPolygonMode extends GeoJsonEditMode {\n calculateMapCoords(clickSequence: any, mapCoords: any, props: ModeProps<SimpleFeatureCollection>) {\n const modeConfig = props.modeConfig;\n if (!modeConfig || !modeConfig.lock90Degree || !clickSequence.length) {\n return mapCoords;\n }\n if (clickSequence.length === 1) {\n // if first point is clicked, then find closest polygon point and build ~90deg vector\n const firstPoint = clickSequence[0];\n const selectedGeometry = this.getSelectedGeometry(props);\n const feature = turfPolygonToLine(selectedGeometry as PolygonGeometry);\n\n const lines = feature.type === 'FeatureCollection' ? feature.features : [feature];\n let minDistance = Number.MAX_SAFE_INTEGER;\n let closestPoint: ReturnType<typeof nearestPointOnLine> | null = null;\n // If Multipolygon, then we should find nearest polygon line and stick split to it.\n lines.forEach((line) => {\n const snapPoint = nearestPointOnLine(line, firstPoint);\n const distanceFromOrigin = turfDistance(snapPoint, firstPoint);\n if (minDistance > distanceFromOrigin) {\n minDistance = distanceFromOrigin;\n closestPoint = snapPoint;\n }\n });\n\n if (closestPoint) {\n // closest point is used as 90degree entry to the polygon\n const lastBearing = turfBearing(firstPoint, closestPoint);\n const currentDistance = turfDistance(firstPoint, mapCoords, { units: 'meters' });\n return turfDestination(firstPoint, currentDistance, lastBearing, {\n units: 'meters'\n }).geometry.coordinates;\n }\n return mapCoords;\n }\n // Allow only 90 degree turns\n const lastPoint = clickSequence[clickSequence.length - 1];\n const [approximatePoint] = generatePointsParallelToLinePoints(\n clickSequence[clickSequence.length - 2],\n lastPoint,\n mapCoords\n );\n // align point with current ground\n const nearestPt = nearestPointOnLine(lineString([lastPoint, approximatePoint]), mapCoords)\n .geometry.coordinates;\n return nearestPt;\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length === 0 || !props.lastPointerMoveEvent) {\n // nothing to do yet\n return guides;\n }\n\n const {mapCoords} = props.lastPointerMoveEvent;\n\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, this.calculateMapCoords(clickSequence, mapCoords, props)]\n }\n });\n\n return guides;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const tentativeFeature = this.getTentativeGuide(props);\n\n const selectedGeometry = this.getSelectedGeometry(props);\n\n if (!selectedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('A polygon must be selected for splitting');\n return;\n }\n\n const clickSequence = this.getClickSequence();\n if (tentativeFeature && tentativeFeature.geometry.type === 'LineString') {\n clickSequence.push(\n tentativeFeature.geometry.coordinates[tentativeFeature.geometry.coordinates.length - 1]\n );\n } else {\n this.addClickSequence(event);\n }\n\n const pt: Point = {\n type: 'Point',\n coordinates: clickSequence[clickSequence.length - 1]\n };\n\n const isPointInPolygon = booleanPointInPolygon(pt, selectedGeometry as PolygonGeometry);\n if (clickSequence.length > 1 && tentativeFeature && !isPointInPolygon) {\n this.resetClickSequence();\n // @ts-expect-error narrow type\n const isLineInterectingWithPolygon = lineIntersect(tentativeFeature, selectedGeometry);\n if (isLineInterectingWithPolygon.features.length === 0) {\n return;\n }\n\n const editAction = this.splitPolygon(tentativeFeature, props);\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n splitPolygon(tentativeFeature: TentativeFeature, props: ModeProps<SimpleFeatureCollection>) {\n const selectedGeometry = this.getSelectedGeometry(props);\n const featureIndex = props.selectedIndexes[0];\n const modeConfig = props.modeConfig || {};\n\n // Default gap in between the polygon\n let {gap = 0.1, units = 'centimeters'} = modeConfig;\n if (gap === 0) {\n gap = 0.1;\n units = 'centimeters';\n }\n\n const buffer = turfBuffer(tentativeFeature, gap, {units});\n const updatedGeometry = turfDifference(featureCollection([turfFeature(selectedGeometry as PolygonGeometry), buffer]));\n if (!updatedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('Canceling edit. Split Polygon erased');\n return null;\n }\n\n const {type, coordinates} = updatedGeometry.geometry;\n let updatedCoordinates: any[] = []; // TODO\n if (type === 'Polygon') {\n // Update the coordinates as per Multipolygon\n updatedCoordinates = coordinates.map((c) => [c]);\n } else {\n // Handle Case when Multipolygon has holes\n updatedCoordinates = coordinates.reduce((agg, prev) => {\n prev.forEach((p) => {\n // @ts-expect-error revisit coordinates type here\n agg.push([p]);\n });\n return agg;\n }, []);\n }\n\n // Update the type to Mulitpolygon\n const updatedData = new ImmutableFeatureCollection(props.data).replaceGeometry(featureIndex, {\n type: 'MultiPolygon',\n coordinates: updatedCoordinates\n });\n\n const editAction: GeoJsonEditAction = {\n updatedData: updatedData.getObject(),\n editType: 'split',\n editContext: {\n featureIndexes: [featureIndex]\n }\n };\n\n return editAction;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bearing from '@turf/bearing';\nimport {\n generatePointsParallelToLinePoints,\n getPickedEditHandle,\n getPickedIntermediateEditHandle,\n shouldCancelPan\n} from './utils';\nimport {SimpleFeatureCollection} from '../utils/geojson-types';\nimport {ModeProps, StartDraggingEvent, StopDraggingEvent, DraggingEvent} from './types';\nimport {ModifyMode} from './modify-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ExtrudeMode extends ModifyMode {\n // this mode is busted =(\n\n isPointAdded = false;\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n const {featureIndex} = editHandle.properties;\n let {positionIndexes} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n positionIndexes = this.isPointAdded\n ? this.nextPositionIndexes(positionIndexes, size)\n : positionIndexes;\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n if (p1 && p2) {\n // p3 and p4 are end points for moving (extruding) edge\n const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)\n .replacePosition(featureIndex, positionIndexes, p3)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'extruding',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes: this.nextPositionIndexes(positionIndexes, size),\n position: p3\n }\n });\n\n event.cancelPan();\n }\n }\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (shouldCancelPan(event)) {\n event.cancelPan();\n }\n\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const editHandle = getPickedIntermediateEditHandle(event.picks);\n if (selectedFeatureIndexes.length && editHandle) {\n const {positionIndexes, featureIndex} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n\n if (p1 && p2) {\n let updatedData = new ImmutableFeatureCollection(props.data);\n if (!this.isOrthogonal(positionIndexes, featureIndex, size, props.data)) {\n updatedData = updatedData.addPosition(featureIndex, positionIndexes, p2);\n }\n if (\n !this.isOrthogonal(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n size,\n props.data\n )\n ) {\n updatedData = updatedData.addPosition(featureIndex, positionIndexes, p1);\n this.isPointAdded = true;\n }\n\n props.onEdit({\n updatedData: updatedData.getObject(),\n editType: 'startExtruding',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: p1\n }\n });\n }\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const selectedFeatureIndexes = props.selectedIndexes;\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n if (selectedFeatureIndexes.length && editHandle) {\n const {featureIndex} = editHandle.properties;\n let {positionIndexes} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n positionIndexes = this.isPointAdded\n ? this.nextPositionIndexes(positionIndexes, size)\n : positionIndexes;\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n\n if (p1 && p2) {\n // p3 and p4 are end points for new moved (extruded) edge\n const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)\n .replacePosition(featureIndex, positionIndexes, p3)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'extruded',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: p3\n }\n });\n }\n }\n this.isPointAdded = false;\n }\n\n coordinatesSize(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n {features}: SimpleFeatureCollection\n ) {\n let size = 0;\n if (Array.isArray(positionIndexes)) {\n const feature = features[featureIndex];\n const coordinates: any = feature.geometry.coordinates;\n // for Multi polygons, length will be 3\n if (positionIndexes.length === 3) {\n const [a, b] = positionIndexes;\n if (coordinates.length && coordinates[a].length) {\n size = coordinates[a][b].length;\n }\n } else {\n const [b] = positionIndexes;\n if (coordinates.length && coordinates[b].length) {\n size = coordinates[b].length;\n }\n }\n }\n return size;\n }\n\n getBearing(p1: any, p2: any) {\n const angle = bearing(p1, p2);\n if (angle < 0) {\n return Math.floor(360 + angle);\n }\n return Math.floor(angle);\n }\n\n isOrthogonal(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n size: number,\n features: SimpleFeatureCollection\n ) {\n if (!Array.isArray(positionIndexes)) {\n return false;\n }\n if (positionIndexes[positionIndexes.length - 1] === size - 1) {\n positionIndexes[positionIndexes.length - 1] = 0;\n }\n const prevPoint = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n features\n );\n const nextPoint = this.getPointForPositionIndexes(\n this.nextPositionIndexes(positionIndexes, size),\n featureIndex,\n features\n );\n const currentPoint = this.getPointForPositionIndexes(positionIndexes, featureIndex, features);\n const prevAngle = this.getBearing(currentPoint, prevPoint);\n const nextAngle = this.getBearing(currentPoint, nextPoint);\n return [89, 90, 91, 269, 270, 271].includes(Math.abs(prevAngle - nextAngle));\n }\n\n nextPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[] {\n if (!Array.isArray(positionIndexes)) {\n return [];\n }\n const next = [...positionIndexes];\n if (next.length) {\n next[next.length - 1] = next[next.length - 1] === size - 1 ? 0 : next[next.length - 1] + 1;\n }\n return next;\n }\n\n prevPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[] {\n if (!Array.isArray(positionIndexes)) {\n return [];\n }\n const prev = [...positionIndexes];\n if (prev.length) {\n prev[prev.length - 1] = prev[prev.length - 1] === 0 ? size - 2 : prev[prev.length - 1] - 1;\n }\n return prev;\n }\n\n getPointForPositionIndexes(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n {features}: SimpleFeatureCollection\n ) {\n let p1;\n if (Array.isArray(positionIndexes)) {\n const feature = features[featureIndex];\n const coordinates: any = feature.geometry.coordinates;\n // for Multi polygons, length will be 3\n if (positionIndexes.length === 3) {\n const [a, b, c] = positionIndexes;\n if (coordinates.length && coordinates[a].length) {\n p1 = coordinates[a][b][c];\n }\n } else {\n const [b, c] = positionIndexes;\n if (coordinates.length && coordinates[b].length) {\n p1 = coordinates[b][c];\n }\n }\n }\n return p1;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ModeProps, PointerMoveEvent, StopDraggingEvent} from './types';\nimport {Position, FeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {ModifyMode} from './modify-mode';\n\nfunction defaultCalculateElevationChange({\n pointerDownScreenCoords,\n screenCoords\n}: {\n pointerDownScreenCoords: Position;\n screenCoords: Position;\n}) {\n return 10 * (pointerDownScreenCoords[1] - screenCoords[1]);\n}\n\nexport class ElevationMode extends ModifyMode {\n makeElevatedEvent(\n event: PointerMoveEvent | StopDraggingEvent,\n position: Position,\n props: ModeProps<FeatureCollection>\n ): Record<string, any> {\n const {\n minElevation = 0,\n maxElevation = 20000,\n calculateElevationChange = defaultCalculateElevationChange\n } = props.modeConfig || {};\n\n if (!event.pointerDownScreenCoords) {\n return event;\n }\n\n // $FlowFixMe - really, I know it has something at index 2\n let elevation = position.length === 3 ? position[2] : 0;\n\n // calculateElevationChange is configurable because (at this time) modes are not aware of the viewport\n elevation += calculateElevationChange({\n pointerDownScreenCoords: event.pointerDownScreenCoords,\n screenCoords: event.screenCoords\n });\n elevation = Math.min(elevation, maxElevation);\n elevation = Math.max(elevation, minElevation);\n\n return Object.assign({}, event, {\n mapCoords: [position[0], position[1], elevation]\n });\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;\n // @ts-expect-error return type too wide\n super.handlePointerMove(this.makeElevatedEvent(event, position, props), props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n const editHandle = getPickedEditHandle(event.picks);\n const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;\n // @ts-expect-error return type too wide\n super.handleStopDragging(this.makeElevatedEvent(event, position, props), props);\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n let cursor = super.getCursor(event);\n if (cursor === 'cell') {\n cursor = 'ns-resize';\n }\n return cursor;\n }\n\n static calculateElevationChangeWithViewport(\n viewport: any,\n {\n pointerDownScreenCoords,\n screenCoords\n }: {\n pointerDownScreenCoords: Position;\n screenCoords: Position;\n }\n ): number {\n // Source: https://gis.stackexchange.com/a/127949/111804\n const metersPerPixel =\n (156543.03392 * Math.cos((viewport.latitude * Math.PI) / 180)) / Math.pow(2, viewport.zoom);\n\n return (metersPerPixel * (pointerDownScreenCoords[1] - screenCoords[1])) / 2;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ClickEvent, PointerMoveEvent, ModeProps, TentativeFeature} from './types';\nimport {FeatureCollection, SimpleFeatureCollection, Point} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class DrawPointMode extends GeoJsonEditMode {\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n return {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'Point',\n coordinates: lastCoords[0]\n }\n };\n }\n\n handleClick({mapCoords}: ClickEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const geometry: Point = {\n type: 'Point',\n coordinates: mapCoords\n };\n\n props.onEdit(this.getAddFeatureAction(geometry, props.data));\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport distance from '@turf/distance';\nimport {memoize} from '../utils/memoize';\nimport {LineString, FeatureCollection, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n GuideFeature,\n Tooltip,\n DoubleClickEvent\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class DrawLineStringMode extends GeoJsonEditMode {\n // declaration of variables for the calculation of the distance of linestring\n dist = 0;\n position: Position = null!;\n elems: Position[] = [];\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n let positionAdded = false;\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one\n this.addClickSequence(event);\n positionAdded = true;\n }\n const clickSequence = this.getClickSequence();\n\n // check if the pointer is on editable state calculate the distance of new point\n if (!clickedEditHandle) {\n this.calculateInfoDraw(clickSequence);\n }\n\n if (\n clickSequence.length > 1 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1\n ) {\n // They clicked the last point (or double-clicked), so add the LineString\n // reset distance to new calculate\n this.dist = 0;\n this.finishDrawing(props);\n } else if (positionAdded) {\n // new tentative point\n props.onEdit({\n // data is the same\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDoubleClick(event: DoubleClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.finishDrawing(props);\n }\n\n finishDrawing(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n if (clickSequence.length > 1) {\n const lineStringToAdd: LineString = {\n type: 'LineString',\n coordinates: [...clickSequence]\n };\n this.resetClickSequence();\n const editAction = this.getAddFeatureAction(lineStringToAdd, props.data);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {key} = event;\n if (key === 'Enter') {\n this.finishDrawing(props);\n } else if (key === 'Escape') {\n this.resetClickSequence();\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n let tentativeFeature;\n if (clickSequence.length > 0) {\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, ...lastCoords]\n }\n };\n }\n\n if (tentativeFeature) {\n guides.features.push(tentativeFeature);\n }\n\n const editHandles: GuideFeature[] = clickSequence.map((clickedCoord, index) => ({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'existing',\n featureIndex: -1,\n positionIndexes: [index]\n },\n geometry: {\n type: 'Point',\n coordinates: clickedCoord\n }\n }));\n\n guides.features.push(...editHandles);\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props.modeConfig,\n dist: this.dist\n });\n }\n\n // utility function\n calculateInfoDraw(clickSequence) {\n // check if the selected points are at least 2\n if (clickSequence.length > 1) {\n // setting the last point\n this.position = clickSequence[clickSequence.length - 1];\n // calculate the new distance by adding the\n // distance of the new drawn linestring\n this.dist += distance(\n clickSequence[clickSequence.length - 2],\n clickSequence[clickSequence.length - 1]\n );\n }\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param dist\n */\n _getTooltips = memoize(({modeConfig, dist}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text;\n if (dist) {\n if (formatTooltip) {\n text = formatTooltip(dist);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Distance: ${parseFloat(dist).toFixed(2)} kilometers`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// port from @deck.gl/core\nfunction isEqual(a: any, b: any) {\n if (a === b) {\n return true;\n }\n if (Array.isArray(a)) {\n // Special treatment for arrays: compare 1-level deep\n // This is to support equality of matrix/coordinate props\n const len = a.length;\n if (!b || b.length !== len) {\n return false;\n }\n\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/**\n * Speed up consecutive function calls by caching the result of calls with identical input\n * https://en.wikipedia.org/wiki/Memoization\n * @param {function} compute - the function to be memoized\n */\nexport function memoize(compute: Function) {\n let cachedArgs = {};\n let cachedResult;\n\n return (args: any) => {\n for (const key in args) {\n if (!isEqual(args[key], cachedArgs[key])) {\n cachedResult = compute(args);\n cachedArgs = args;\n break;\n }\n }\n return cachedResult;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport lineIntersect from '@turf/line-intersect';\nimport { polygon as turfPolygon} from '@turf/helpers';\nimport booleanWithin from \"@turf/boolean-within\";\nimport type {Geometry} from 'geojson'\n\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature,\n GuideFeature,\n DoubleClickEvent\n} from './types';\nimport {Position, FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport { ImmutableFeatureCollection } from './immutable-feature-collection';\n\n\nexport class DrawPolygonMode extends GeoJsonEditMode {\n\n holeSequence: Position[] = []; \n isDrawingHole = false;\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const { lastPointerMoveEvent } = props;\n const clickSequence = this.getClickSequence();\n const holeSequence = this.holeSequence;\n const lastCoords = lastPointerMoveEvent\n ? [lastPointerMoveEvent.mapCoords]\n : [];\n\n let geometry: Geometry;\n\n if (this.isDrawingHole && holeSequence.length > 1) {\n geometry = {\n type: \"Polygon\",\n coordinates: [\n [...clickSequence, clickSequence[0]],\n [...holeSequence, ...lastCoords, holeSequence[0]],\n ],\n };\n } else if (clickSequence.length > 2) {\n geometry = {\n type: \"Polygon\",\n coordinates: [[...clickSequence, ...lastCoords, clickSequence[0]]],\n };\n } else {\n geometry = {\n type: \"LineString\",\n coordinates: [...clickSequence, ...lastCoords],\n };\n }\n\n return {\n type: \"Feature\",\n properties: {\n guideType: \"tentative\",\n },\n geometry,\n };\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: \"FeatureCollection\",\n features: [],\n };\n \n const tentative = this.createTentativeFeature(props);\n if (tentative) guides.features.push(tentative);\n \n const sequence = this.isDrawingHole\n ? this.holeSequence\n : this.getClickSequence();\n \n const handles: GuideFeature[] = sequence.map((coord, index) => ({\n type: \"Feature\",\n properties: {\n guideType: \"editHandle\",\n editHandleType: \"existing\",\n featureIndex: -1,\n positionIndexes: [index],\n },\n geometry: {\n type: \"Point\",\n coordinates: coord,\n },\n }));\n \n guides.features.push(...handles);\n return guides;\n }\n\n // eslint-disable-next-line complexity, max-statements\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n const clickSequence = this.getClickSequence();\n const coords = event.mapCoords;\n \n // Check if they clicked on an edit handle to complete the polygon\n if (\n !this.isDrawingHole &&\n clickSequence.length > 2 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n (clickedEditHandle.properties.positionIndexes[0] === 0 ||\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1)\n ) {\n // They clicked the first or last point, so complete the polygon\n this.finishDrawing(props);\n return;\n }\n \n // Check if they clicked near the first point to complete the polygon\n if (!this.isDrawingHole && clickSequence.length > 2) {\n if (isNearFirstPoint(coords, clickSequence[0])) {\n this.finishDrawing(props);\n this.resetClickSequence();\n return;\n }\n }\n \n if (this.isDrawingHole) {\n const current = this.holeSequence;\n current.push(coords);\n\n if (current.length > 2) {\n const poly: Geometry = {\n type: \"Polygon\",\n coordinates: [\n [...clickSequence, clickSequence[0]],\n [...current, current[0]],\n ],\n };\n\n this.resetClickSequence();\n this.holeSequence = [];\n this.isDrawingHole = false;\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(\n poly,\n props,\n );\n if (editAction) props.onEdit(editAction);\n }\n return;\n }\n\n // Add the click if we didn't click on a handle\n let positionAdded = false;\n if (!clickedEditHandle) {\n this.addClickSequence(event);\n positionAdded = true;\n }\n\n if (positionAdded) {\n // new tentative point\n props.onEdit({\n // data is the same\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDoubleClick(_event: DoubleClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.finishDrawing(props);\n this.resetClickSequence();\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (event.key === \"Enter\") {\n this.finishDrawing(props);\n this.resetClickSequence();\n } else if (event.key === \"Escape\") {\n this.resetClickSequence();\n this.holeSequence = [];\n this.isDrawingHole = false;\n\n props.onEdit({\n updatedData: props.data,\n editType: \"cancelFeature\",\n editContext: {},\n });\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n // eslint-disable-next-line max-statements, complexity\n finishDrawing(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n const polygon = [...clickSequence, clickSequence[0]];\n\n const newPolygon = turfPolygon([polygon]);\n\n const canAddHole = canAddHoleToPolygon(props);\n const canOverlap = canPolygonOverlap(props);\n\n\n // Check if the polygon intersects itself (excluding shared start/end point)\n if (!canOverlap) {\n const overlapping = lineIntersect(\n newPolygon,\n newPolygon,\n ).features.filter(\n (intersection) =>\n !newPolygon.geometry.coordinates[0].some(\n (coord) =>\n coord[0] === intersection.geometry.coordinates[0] &&\n coord[1] === intersection.geometry.coordinates[1],\n ),\n );\n \n if (overlapping.length > 0) {\n // \u274C Invalid polygon: overlaps\n props.onEdit({\n updatedData: props.data,\n editType: \"invalidPolygon\",\n editContext: { reason: \"overlaps\" },\n });\n this.resetClickSequence();\n return;\n }\n }\n\n if (canAddHole) {\n const holeResult = this.tryAddHoleToExistingPolygon(newPolygon, polygon, props);\n if (holeResult.handled) {\n this.resetClickSequence();\n return;\n }\n }\n \n // If no valid hole was found, add the polygon as a new feature\n const editAction = this.getAddFeatureOrBooleanPolygonAction(\n {\n type: \"Polygon\",\n coordinates: [[...this.getClickSequence(), this.getClickSequence()[0]]],\n },\n props,\n );\n if (editAction) props.onEdit(editAction);\n this.resetClickSequence();\n return;\n }\n\n private tryAddHoleToExistingPolygon(\n newPolygon: any,\n polygon: Position[],\n props: ModeProps<SimpleFeatureCollection>\n ): { handled: boolean } {\n for (const [featureIndex, feature] of props.data.features.entries()) {\n if (feature.geometry.type === \"Polygon\") {\n const result = this.validateAndCreateHole(feature, featureIndex, newPolygon, polygon, props);\n if (result.handled) {\n return result;\n }\n }\n }\n \n return { handled: false };\n }\n\n private validateAndCreateHole(\n feature: any,\n featureIndex: number,\n newPolygon: any,\n polygon: Position[],\n props: ModeProps<SimpleFeatureCollection>\n ): { handled: boolean } {\n const outer = turfPolygon(feature.geometry.coordinates);\n\n // Check existing holes for conflicts\n for (let i = 1; i < feature.geometry.coordinates.length; i++) {\n const hole = turfPolygon([feature.geometry.coordinates[i]]);\n const intersection = lineIntersect(hole, newPolygon);\n \n if (intersection.features.length > 0) {\n props.onEdit({\n updatedData: props.data,\n editType: \"invalidHole\",\n editContext: { reason: \"intersects-existing-hole\" },\n });\n return { handled: true };\n }\n\n if (booleanWithin(hole, newPolygon) || booleanWithin(newPolygon, hole)) {\n props.onEdit({\n updatedData: props.data,\n editType: \"invalidHole\",\n editContext: { reason: \"contains-or-contained-by-existing-hole\" },\n });\n return { handled: true };\n }\n }\n\n // Check outer polygon conflicts\n const intersectionWithOuter = lineIntersect(outer, newPolygon);\n if (intersectionWithOuter.features.length > 0) {\n props.onEdit({\n updatedData: props.data,\n editType: \"invalidPolygon\",\n editContext: { reason: \"intersects-existing-polygon\" },\n });\n return { handled: true };\n }\n\n if (booleanWithin(outer, newPolygon)) {\n props.onEdit({\n updatedData: props.data,\n editType: \"invalidPolygon\",\n editContext: { reason: \"contains-existing-polygon\" },\n });\n return { handled: true };\n }\n\n // Check if new polygon is within outer polygon (valid hole)\n if (booleanWithin(newPolygon, outer)) {\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(featureIndex, {\n ...feature.geometry,\n coordinates: [...feature.geometry.coordinates, polygon],\n })\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: \"addHole\",\n editContext: { hole: newPolygon.geometry },\n });\n return { handled: true };\n }\n return { handled: false };\n }\n}\n\n// Helper function to check if a point is near the first point in the sequence\nfunction isNearFirstPoint(\n click: Position,\n first: Position,\n threshold = 1e-4,\n): boolean {\n const dx = click[0] - first[0];\n const dy = click[1] - first[1];\n return dx * dx + dy * dy < threshold * threshold;\n}\n\n// Helper function to determine if a hole can be added to a polygon\nfunction canAddHoleToPolygon(\n props: ModeProps<FeatureCollection>\n): boolean {\n // For simplicity, always return true in this example.\n // Implement your own logic based on application requirements.\n return props.modeConfig?.allowHoles ?? false;\n}\n\n// Helper function to determine if a polygon can intersect itself\nfunction canPolygonOverlap(\n props: ModeProps<FeatureCollection>\n): boolean {\n // Return the value of allowSelfIntersection (defaults to false for safety)\n return props.modeConfig?.allowSelfIntersection ?? false;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawRectangleMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const rectangle = bboxPolygon([coord1[0], coord1[1], coord2[0], coord2[1]]);\n rectangle.properties = rectangle.properties || {};\n rectangle.properties.shape = 'Rectangle';\n\n return rectangle;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {Polygon, FeatureCollection, Feature, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport omit from 'lodash.omit';\n\nexport class TwoClickPolygonMode extends GeoJsonEditMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (props.modeConfig && props.modeConfig.dragToDraw) {\n // handled in drag handlers\n return;\n }\n\n this.addClickSequence(event);\n\n this.checkAndFinishPolygon(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n if (!props.modeConfig || !props.modeConfig.dragToDraw) {\n // handled in click handlers\n return;\n }\n\n this.addClickSequence(event);\n event.cancelPan();\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n if (!props.modeConfig || !props.modeConfig.dragToDraw) {\n // handled in click handlers\n return;\n }\n this.addClickSequence(event);\n\n this.checkAndFinishPolygon(props);\n }\n\n checkAndFinishPolygon(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n const tentativeFeature = this.getTentativeGuide(props);\n\n if (\n clickSequence.length > 1 &&\n tentativeFeature &&\n tentativeFeature.geometry.type === 'Polygon'\n ) {\n const feature: Feature<Polygon> = {\n type: 'Feature',\n properties: omit(tentativeFeature.properties, 'guideType'),\n geometry: {\n type: 'Polygon',\n coordinates: tentativeFeature.geometry.coordinates\n }\n };\n const editAction = this.getAddFeatureOrBooleanPolygonAction(feature, props);\n\n this.resetClickSequence();\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent, modeConfig} = props;\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length === 0 || !lastPointerMoveEvent) {\n // nothing to do yet\n return guides;\n }\n\n const corner1 = clickSequence[0];\n const corner2 = lastPointerMoveEvent.mapCoords;\n\n const polygon = this.getTwoClickPolygon(corner1, corner2, modeConfig);\n if (polygon) {\n guides.features.push({\n type: 'Feature',\n properties: {\n ...polygon.properties,\n guideType: 'tentative'\n },\n geometry: polygon.geometry\n });\n }\n\n return guides;\n }\n\n getTwoClickPolygon(\n coord1: Position,\n coord2: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n return null;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n let tentativeFeature;\n if (clickSequence.length === 1) {\n tentativeFeature = this.getTwoClickPolygon(clickSequence[0], lastCoords[0], props.modeConfig);\n }\n\n return tentativeFeature;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport turfAlong from '@turf/along';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawSquareMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // get the coordinates of the other two rectangle vertices\n const coord3 = [coord2[0], coord1[1]];\n const coord4 = [coord1[0], coord2[1]];\n\n // determine the shortest distance to the origin, which will be the length of each square side\n const distance1 = turfDistance(point(coord3), point(coord1));\n const distance2 = turfDistance(point(coord4), point(coord1));\n const shortestDistance = distance1 <= distance2 ? distance1 : distance2;\n\n // determine which coordinate pair of the two is closest to the origin\n const closestPoint = distance1 <= distance2 ? coord3 : coord4;\n\n // create a linestring which will used to locate the second square vertex\n const line = turfLineString([closestPoint, coord2]);\n\n // get the coordinates of the second square vertex\n const newPoint = turfAlong(line, shortestDistance);\n const corner = newPoint.geometry.coordinates;\n\n const square = bboxPolygon([coord1[0], coord1[1], corner[0], corner[1]]);\n square.properties = square.properties || {};\n square.properties.shape = 'Square';\n\n\n return square;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawRectangleFromCenterMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const longitude =\n coord1[0] > coord2[0]\n ? coord1[0] + Math.abs(coord1[0] - coord2[0])\n : coord1[0] - Math.abs(coord1[0] - coord2[0]);\n const latitude =\n coord1[1] > coord2[1]\n ? coord1[1] + Math.abs(coord1[1] - coord2[1])\n : coord1[1] - Math.abs(coord1[1] - coord2[1]);\n\n const rectangle = bboxPolygon([longitude, latitude, coord2[0], coord2[1]]);\n rectangle.properties = rectangle.properties || {};\n rectangle.properties.shape = 'Rectangle';\n\n return rectangle;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport turfAlong from '@turf/along';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawSquareFromCenterMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // get the coordinates of the other two rectangle vertices\n const coord3 = [coord2[0], coord1[1]];\n const coord4 = [coord1[0], coord2[1]];\n\n // determine the shortest distance to the origin, which will be the length of each square side\n const distance1 = turfDistance(point(coord3), point(coord1));\n const distance2 = turfDistance(point(coord4), point(coord1));\n const shortestDistance = distance1 <= distance2 ? distance1 : distance2;\n\n // determine which coordinate pair of the two is closest to the origin\n const closestPoint = distance1 <= distance2 ? coord3 : coord4;\n\n // create a linestring which will used to locate the second square vertex\n const line = turfLineString([closestPoint, coord2]);\n\n // get the coordinates of the second square vertex\n const newPoint = turfAlong(line, shortestDistance);\n const corner = newPoint.geometry.coordinates;\n\n // determine the longitude and latitude values of the opposite corner\n const longitude =\n coord1[0] > corner[0]\n ? coord1[0] + Math.abs(coord1[0] - corner[0])\n : coord1[0] - Math.abs(coord1[0] - corner[0]);\n const latitude =\n coord1[1] > corner[1]\n ? coord1[1] + Math.abs(coord1[1] - corner[1])\n : coord1[1] - Math.abs(coord1[1] - corner[1]);\n\n const square = bboxPolygon([longitude, latitude, corner[0], corner[1]]);\n square.properties = square.properties || {};\n square.properties.shape = 'Square';\n\n return square;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport area from '@turf/area';\nimport {memoize} from '../utils/memoize';\nimport {ModeProps, Tooltip} from './types';\nimport {Position, Polygon, Feature, FeatureCollection} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawCircleFromCenterMode extends TwoClickPolygonMode {\n radius: number | null | undefined = null;\n position: Position = null!;\n areaCircle: number | null | undefined = null;\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // Default turf value for circle is 64\n const {steps = 64} = modeConfig || {};\n const options = {steps};\n // setting with position of center of circle\n this.position = coord2;\n\n if (steps < 4) {\n console.warn('Minimum steps to draw a circle is 4 '); // eslint-disable-line no-console,no-undef\n options.steps = 4;\n }\n\n // setting value of radius as distance of center and other point\n this.radius = Math.max(distance(coord1, coord2), 0.001);\n const geometry = circle(coord1, this.radius, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.shape = 'Circle';\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Circle';\n geometry.properties.editProperties.radius = {value: this.radius, unit: 'kilometers'};\n geometry.properties.editProperties.center = coord1;\n // calculate area of circle with turf function\n this.areaCircle = area(geometry);\n\n return geometry;\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props?.modeConfig,\n radius: this.radius,\n areaCircle: this.areaCircle\n });\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param radius\n * @param areaCircle\n */\n _getTooltips = memoize(({modeConfig, radius, areaCircle}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text: string;\n if (radius && areaCircle) {\n if (formatTooltip) {\n text = formatTooltip(radius);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Radius: ${parseFloat(radius).toFixed(2)} kilometers\n \\n Area: ${parseFloat(areaCircle).toFixed(2)}`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport area from '@turf/area';\nimport {memoize} from '../utils/memoize';\nimport {ModeProps, Tooltip} from './types';\nimport {Position, Polygon, Feature, FeatureCollection} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawCircleByDiameterMode extends TwoClickPolygonMode {\n radius: number | null | undefined = null;\n position: Position = null!;\n areaCircle: number | null | undefined = null;\n diameter: number | null | undefined = null;\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // Default turf value for circle is 64\n const {steps = 64} = modeConfig || {};\n const options = {steps};\n\n if (steps < 4) {\n console.warn('Minimum steps to draw a circle is 4 '); // eslint-disable-line no-console,no-undef\n options.steps = 4;\n }\n\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n // setting value of radius as distance of center and other point\n this.radius = Math.max(distance(coord1, centerCoordinates), 0.001);\n // setting value of diameter as distance of points\n this.diameter = Math.max(distance(coord1, coord2), 0.001);\n // setting position tooltip as center of circle\n this.position = centerCoordinates;\n\n const geometry = circle(centerCoordinates, this.radius, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.shape = 'Circle';\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Circle';\n geometry.properties.editProperties.radius = {value: this.radius, unit: 'kilometers'};\n geometry.properties.editProperties.center = centerCoordinates;\n // calculate area of circle with turf function\n this.areaCircle = area(geometry);\n\n return geometry;\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props.modeConfig,\n radius: this.radius,\n areaCircle: this.areaCircle,\n diameter: this.diameter\n });\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param radius\n * @param areaCircle\n * @param diameter\n */\n _getTooltips = memoize(({modeConfig, radius, areaCircle, diameter}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text;\n if (radius && areaCircle) {\n if (formatTooltip) {\n text = formatTooltip(radius);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Radius: ${parseFloat(radius).toFixed(2)} kilometers\n \\n Area: ${parseFloat(areaCircle).toFixed(2)}\n \\n Diameter: ${parseFloat(diameter).toFixed(2)} kilometers`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport distance from '@turf/distance';\nimport ellipse from '@turf/ellipse';\nimport {point} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawEllipseByBoundingBoxMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const minX = Math.min(coord1[0], coord2[0]);\n const minY = Math.min(coord1[1], coord2[1]);\n const maxX = Math.max(coord1[0], coord2[0]);\n const maxY = Math.max(coord1[1], coord2[1]);\n\n const polygonPoints = bboxPolygon([minX, minY, maxX, maxY]).geometry.coordinates[0];\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n\n const xSemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[1])), 0.001);\n const ySemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[3])), 0.001);\n\n const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, {});\n\n geometry.properties = geometry.properties || {};\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Ellipse';\n geometry.properties.editProperties.xSemiAxis = {value: xSemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.angle = 0;\n geometry.properties.editProperties.center = centerCoordinates;\n\n return geometry;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {Position, Polygon, Feature, FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport omit from 'lodash.omit';\n\nexport class ThreeClickPolygonMode extends GeoJsonEditMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.addClickSequence(event);\n const clickSequence = this.getClickSequence();\n const tentativeFeature = this.getTentativeGuide(props);\n\n if (\n clickSequence.length > 2 &&\n tentativeFeature &&\n tentativeFeature.geometry.type === 'Polygon'\n ) {\n const editAction = this.getAddFeatureOrBooleanPolygonAction(\n tentativeFeature.geometry,\n props,\n omit(tentativeFeature.properties, 'guideType')\n );\n this.resetClickSequence();\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent, modeConfig} = props;\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length === 0) {\n // nothing to do yet\n return guides;\n }\n\n const hoveredCoord = lastPointerMoveEvent.mapCoords;\n\n if (clickSequence.length === 1) {\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [clickSequence[0], hoveredCoord]\n }\n });\n } else {\n const polygon = this.getThreeClickPolygon(\n clickSequence[0],\n clickSequence[1],\n hoveredCoord,\n modeConfig\n );\n if (polygon) {\n guides.features.push({\n type: 'Feature',\n properties: {\n ...polygon.properties,\n guideType: 'tentative'\n },\n geometry: polygon.geometry\n });\n }\n }\n\n return guides;\n }\n\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n return null;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n let tentativeFeature;\n if (clickSequence.length === 2) {\n tentativeFeature = this.getThreeClickPolygon(\n clickSequence[0],\n clickSequence[1],\n lastCoords[0],\n props.modeConfig\n );\n }\n\n return tentativeFeature;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {generatePointsParallelToLinePoints} from './utils';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {ThreeClickPolygonMode} from './three-click-polygon-mode';\n\nexport class DrawRectangleUsingThreePointsMode extends ThreeClickPolygonMode {\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n const [p3, p4] = generatePointsParallelToLinePoints(coord1, coord2, coord3);\n\n return {\n type: 'Feature',\n properties: {\n shape: 'Rectangle'\n },\n geometry: {\n type: 'Polygon',\n coordinates: [\n [\n // Draw a polygon containing all the points of the LineString,\n // then the points orthogonal to the lineString,\n // then back to the starting position\n coord1,\n coord2,\n p3,\n p4,\n coord1\n ]\n ]\n }\n };\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport distance from '@turf/distance';\nimport ellipse from '@turf/ellipse';\nimport bearing from '@turf/bearing';\nimport {point} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {ThreeClickPolygonMode} from './three-click-polygon-mode';\n\nexport class DrawEllipseUsingThreePointsMode extends ThreeClickPolygonMode {\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n const xSemiAxis = Math.max(distance(centerCoordinates, point(coord3)), 0.001);\n const ySemiAxis = Math.max(distance(coord1, coord2), 0.001) / 2;\n const options = {angle: bearing(coord1, coord2)};\n const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Ellipse';\n geometry.properties.editProperties.xSemiAxis = {value: xSemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.angle = options.angle;\n geometry.properties.editProperties.center = centerCoordinates;\n\n return geometry;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport lineIntersect from '@turf/line-intersect';\nimport turfDistance from '@turf/distance';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {\n generatePointsParallelToLinePoints,\n getPickedEditHandle,\n getEditHandlesForGeometry\n} from './utils';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {Polygon, LineString, Position, FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class Draw90DegreePolygonMode extends GeoJsonEditMode {\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const clickSequence = this.getClickSequence();\n\n const {mapCoords} = props.lastPointerMoveEvent;\n\n let p3;\n if (clickSequence.length <= 1) {\n p3 = mapCoords;\n } else {\n const p1 = clickSequence[clickSequence.length - 2];\n const p2 = clickSequence[clickSequence.length - 1];\n [p3] = generatePointsParallelToLinePoints(p1, p2, mapCoords);\n }\n\n let tentativeFeature;\n\n if (clickSequence.length < 3) {\n // Draw a LineString connecting all the clicked points with the hovered point\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, p3]\n }\n };\n } else {\n // Draw a Polygon connecting all the clicked points with the hovered point\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'Polygon',\n coordinates: [[...clickSequence, p3, clickSequence[0]]]\n }\n };\n }\n\n return tentativeFeature;\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const clickSequence = this.getClickSequence();\n\n if (clickSequence.length === 0 || !props.lastPointerMoveEvent) {\n return guides;\n }\n const tentativeFeature = this.createTentativeFeature(props);\n\n guides.features.push(tentativeFeature);\n\n guides.features = guides.features.concat(\n getEditHandlesForGeometry(tentativeFeature.geometry, -1)\n );\n\n // Slice off the handles that are are next to the pointer\n guides.features = guides.features.slice(0, -1);\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const tentativeFeature = this.getTentativeGuide(props);\n this.addClickSequence(event);\n const clickSequence = this.getClickSequence();\n\n if (!tentativeFeature) {\n // nothing else to do\n return;\n }\n\n if (clickSequence.length === 3 && tentativeFeature.geometry.type === 'LineString') {\n const lineString: LineString = tentativeFeature.geometry;\n\n // Tweak the clicked position to be the snapped 90 degree point along the polygon\n clickSequence[clickSequence.length - 1] =\n lineString.coordinates[lineString.coordinates.length - 1];\n } else if (clickSequence.length > 3 && tentativeFeature.geometry.type === 'Polygon') {\n const polygon: Polygon = tentativeFeature.geometry;\n\n // Tweak the clicked position to be the snapped 90 degree point along the polygon\n clickSequence[clickSequence.length - 1] =\n polygon.coordinates[0][polygon.coordinates[0].length - 2];\n\n const clickedEditHandle = getPickedEditHandle(picks);\n\n if (\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n (clickedEditHandle.properties.positionIndexes[1] === 0 ||\n clickedEditHandle.properties.positionIndexes[1] === polygon.coordinates[0].length - 3)\n ) {\n // They clicked the first or last point (or double-clicked), so complete the polygon\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: this.finalizedCoordinates([...polygon.coordinates[0]])\n };\n\n this.resetClickSequence();\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n } else {\n // Trigger pointer move right away in order for it to update edit handles (to support double-click)\n const fakePointerMoveEvent: PointerMoveEvent = {\n screenCoords: [-1, -1],\n mapCoords: event.mapCoords,\n picks: [],\n pointerDownPicks: null,\n pointerDownScreenCoords: null,\n pointerDownMapCoords: null,\n cancelPan: () => {},\n sourceEvent: null\n };\n\n this.handlePointerMove(fakePointerMoveEvent, props);\n }\n }\n\n finalizedCoordinates(coords: Position[]) {\n // Remove the hovered position\n let coordinates = [[...coords.slice(0, -2), coords[0]]];\n let pt = this.getIntermediatePoint([...coords]);\n if (!pt) {\n // if intermediate point with 90 degree not available\n // try remove the last clicked point and get the intermediate point.\n const tc = [...coords];\n tc.splice(-3, 1);\n pt = this.getIntermediatePoint([...tc]);\n if (pt) {\n coordinates = [[...coords.slice(0, -3), pt, coords[0]]];\n }\n } else {\n coordinates = [[...coords.slice(0, -2), pt, coords[0]]];\n }\n return coordinates;\n }\n\n getIntermediatePoint(coordinates: Position[]): Position | null {\n let pt: Position | null = null;\n if (coordinates.length > 4) {\n const [p1, p2] = [...coordinates];\n const angle1 = bearing(p1, p2);\n const p3 = coordinates[coordinates.length - 3];\n const p4 = coordinates[coordinates.length - 4];\n const angle2 = bearing(p3, p4);\n\n const angles = {first: [] as number[], second: [] as number[]};\n // calculate 3 right angle points for first and last points in lineString\n [1, 2, 3].forEach((factor) => {\n const newAngle1 = angle1 + factor * 90;\n // convert angles to 0 to -180 for anti-clock and 0 to 180 for clock wise\n angles.first.push(newAngle1 > 180 ? newAngle1 - 360 : newAngle1);\n const newAngle2 = angle2 + factor * 90;\n angles.second.push(newAngle2 > 180 ? newAngle2 - 360 : newAngle2);\n });\n\n const distance = turfDistance(point(p1), point(p3));\n // Draw imaginary right angle lines for both first and last points in lineString\n // If there is intersection point for any 2 lines, will be the 90 degree point.\n [0, 1, 2].forEach((indexFirst) => {\n const line1 = turfLineString([\n p1,\n destination(p1, distance, angles.first[indexFirst]).geometry.coordinates\n ]);\n [0, 1, 2].forEach((indexSecond) => {\n const line2 = turfLineString([\n p3,\n destination(p3, distance, angles.second[indexSecond]).geometry.coordinates\n ]);\n const fc = lineIntersect(line1, line2);\n if (fc && fc.features.length) {\n // found the intersect point\n pt = fc.features[0].geometry.coordinates;\n }\n });\n });\n }\n return pt;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport throttle from 'lodash.throttle';\nimport {ClickEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, ModeProps} from './types';\nimport {Polygon, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {DrawPolygonMode} from './draw-polygon-mode';\n\ntype DraggingHandler = (event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) => void;\n\nexport class DrawPolygonByDraggingMode extends DrawPolygonMode {\n handleDraggingThrottled: DraggingHandler | null | undefined = null;\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n // No-op\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n event.cancelPan();\n if (props.modeConfig && props.modeConfig.throttleMs) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.handleDraggingThrottled = throttle(this.handleDraggingAux, props.modeConfig.throttleMs);\n } else {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.handleDraggingThrottled = this.handleDraggingAux;\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.addClickSequence(event);\n const clickSequence = this.getClickSequence();\n // @ts-expect-error cancel() not typed\n if (this.handleDraggingThrottled && this.handleDraggingThrottled.cancel) {\n // @ts-expect-error cancel() not typed\n this.handleDraggingThrottled.cancel();\n }\n\n if (clickSequence.length > 2) {\n // Complete the polygon.\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: [[...clickSequence, clickSequence[0]]]\n };\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n this.resetClickSequence();\n }\n\n handleDraggingAux(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one.\n this.addClickSequence(event);\n props.onEdit({\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this.handleDraggingThrottled) {\n this.handleDraggingThrottled(event, props);\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (event.key === 'Enter') {\n const clickSequence = this.getClickSequence();\n if (clickSequence.length > 2) {\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: [[...clickSequence, clickSequence[0]]]\n };\n this.resetClickSequence();\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n } else if (event.key === 'Escape') {\n this.resetClickSequence();\n if (this.handleDraggingThrottled) {\n this.handleDraggingThrottled = null;\n }\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Position, FeatureCollection, SimpleFeatureCollection, SimpleFeature} from '../utils/geojson-types';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n Pick,\n GuideFeatureCollection,\n EditHandleFeature\n} from './types';\nimport {\n getPickedSnapSourceEditHandle,\n getPickedEditHandles,\n getEditHandlesForGeometry\n} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\ntype MovementTypeEvent = PointerMoveEvent | StartDraggingEvent | StopDraggingEvent | DraggingEvent;\n\nexport class SnappableMode extends GeoJsonEditMode {\n _handler: GeoJsonEditMode;\n\n constructor(handler: GeoJsonEditMode) {\n super();\n this._handler = handler;\n }\n\n _getSnappedMouseEvent<T extends MovementTypeEvent>(\n event: T,\n snapSource: EditHandleFeature,\n snapTarget: EditHandleFeature\n ): T {\n return Object.assign(event, {\n mapCoords: snapTarget.geometry.coordinates,\n pointerDownMapCoords: snapSource && snapSource.geometry.coordinates\n });\n }\n\n _getPickedSnapTarget(picks: Pick[]): EditHandleFeature | null | undefined {\n return getPickedEditHandles(picks).find(\n (handle) => handle.properties.editHandleType === 'snap-target'\n );\n }\n\n _getPickedSnapSource(\n pointerDownPicks: Pick[] | null | undefined\n ): EditHandleFeature | null | undefined {\n return getPickedSnapSourceEditHandle(pointerDownPicks);\n }\n\n _getUpdatedSnapSourceHandle(\n snapSourceHandle: EditHandleFeature,\n data: SimpleFeatureCollection\n ): EditHandleFeature {\n const {featureIndex, positionIndexes} = snapSourceHandle.properties;\n if (!Array.isArray(positionIndexes)) {\n return snapSourceHandle;\n }\n const snapSourceFeature = data.features[featureIndex];\n\n // $FlowFixMe\n const snapSourceCoordinates = positionIndexes.reduce(\n (a: any[], b: number) => a[b],\n snapSourceFeature.geometry.coordinates\n ) as Position;\n\n return {\n ...snapSourceHandle,\n geometry: {\n type: 'Point',\n coordinates: snapSourceCoordinates\n }\n };\n }\n\n // If additionalSnapTargets is present in modeConfig and is populated, this\n // method will return those features along with the features\n // that live in the current layer. Otherwise, this method will simply return the\n // features from the current layer\n _getSnapTargets(props: ModeProps<SimpleFeatureCollection>): SimpleFeature[] {\n let {additionalSnapTargets} = props.modeConfig || {};\n additionalSnapTargets = additionalSnapTargets || [];\n\n const features = [...props.data.features, ...additionalSnapTargets];\n return features;\n }\n\n _getSnapTargetHandles(props: ModeProps<SimpleFeatureCollection>): EditHandleFeature[] {\n const handles: EditHandleFeature[] = [];\n const features = this._getSnapTargets(props);\n\n for (let i = 0; i < features.length; i++) {\n // Filter out the currently selected feature(s)\n const isCurrentIndexFeatureNotSelected = !props.selectedIndexes.includes(i);\n\n if (isCurrentIndexFeatureNotSelected) {\n const {geometry} = features[i];\n handles.push(...getEditHandlesForGeometry(geometry, i, 'snap-target'));\n }\n }\n return handles;\n }\n\n // If no snap handle has been picked, only display the edit handles of the\n // selected feature. If a snap handle has been picked, display said snap handle\n // along with all snappable points on all non-selected features.\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const {modeConfig, lastPointerMoveEvent} = props;\n const {enableSnapping} = modeConfig || {};\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: [...this._handler.getGuides(props).features]\n };\n\n if (!enableSnapping) {\n return guides;\n }\n\n const snapSourceHandle: EditHandleFeature | null | undefined =\n lastPointerMoveEvent && this._getPickedSnapSource(lastPointerMoveEvent.pointerDownPicks);\n\n // They started dragging a handle\n // So render the picked handle (in its updated location) and all possible snap targets\n if (snapSourceHandle) {\n guides.features.push(\n ...this._getSnapTargetHandles(props),\n this._getUpdatedSnapSourceHandle(snapSourceHandle, props.data)\n );\n\n return guides;\n }\n\n // Render the possible snap source handles\n const {features} = props.data;\n for (const index of props.selectedIndexes) {\n if (index < features.length) {\n const {geometry} = features[index];\n guides.features.push(...getEditHandlesForGeometry(geometry, index, 'snap-source'));\n }\n }\n\n return guides;\n }\n\n _getSnapAwareEvent<T extends MovementTypeEvent>(\n event: T,\n props: ModeProps<FeatureCollection>\n ): T {\n const snapSource = this._getPickedSnapSource(props.lastPointerMoveEvent.pointerDownPicks);\n const snapTarget = this._getPickedSnapTarget(event.picks);\n\n return snapSource && snapTarget\n ? this._getSnappedMouseEvent(event, snapSource, snapTarget)\n : event;\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleStartDragging(event, props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleStopDragging(this._getSnapAwareEvent(event, props), props);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleDragging(this._getSnapAwareEvent(event, props), props);\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handlePointerMove(this._getSnapAwareEvent(event, props), props);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {featureCollection} from '@turf/helpers';\nimport {PointerMoveEvent, ModeProps, StartDraggingEvent} from './types';\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {TranslateMode} from './translate-mode';\nimport {ScaleMode} from './scale-mode';\nimport {RotateMode} from './rotate-mode';\n\nimport {CompositeMode} from './composite-mode';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class TransformMode extends CompositeMode {\n constructor() {\n super([new TranslateMode(), new ScaleMode(), new RotateMode()]);\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n let updatedCursor: string | null = null;\n super.handlePointerMove(event, {\n ...props,\n onUpdateCursor: (cursor) => {\n updatedCursor = cursor || updatedCursor;\n }\n });\n props.onUpdateCursor(updatedCursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n let scaleMode: ScaleMode | null = null;\n let translateMode: TranslateMode | null = null;\n const filteredModes: GeoJsonEditMode[] = [];\n\n if (event.picks.length) {\n event.cancelPan();\n }\n\n // If the user selects a scaling edit handle that overlaps with part of the selected feature,\n // it is possible for both scale and translate actions to be triggered. This logic prevents\n // this simultaneous action trigger from happening by putting a higher priority on scaling\n // since the user needs to be more precise to hover over a scaling edit handle.\n this._modes.forEach((mode) => {\n if (mode instanceof TranslateMode) {\n translateMode = mode;\n } else {\n if (mode instanceof ScaleMode) {\n scaleMode = mode;\n }\n filteredModes.push(mode);\n }\n });\n\n if (scaleMode instanceof ScaleMode && !scaleMode.isEditHandleSelected()) {\n filteredModes.push(translateMode);\n }\n\n filteredModes.filter(Boolean).forEach((mode) => mode.handleStartDragging(event, props));\n }\n\n getGuides(props: ModeProps<FeatureCollection>) {\n let compositeGuides = super.getGuides(props);\n const rotateMode = (this._modes || []).find((mode) => mode instanceof RotateMode);\n\n if (rotateMode instanceof RotateMode) {\n const nonEnvelopeGuides = compositeGuides.features.filter((guide) => {\n const {editHandleType, mode} = (guide.properties as any) || {};\n // Both scale and rotate modes have the same enveloping box as a guide - only need one\n const guidesToFilterOut = [mode];\n // Do not render scaling edit handles if rotating\n if (rotateMode.getIsRotating()) {\n guidesToFilterOut.push(editHandleType);\n }\n return !guidesToFilterOut.includes('scale');\n });\n\n // @ts-expect-error turf types\n compositeGuides = featureCollection(nonEnvelopeGuides);\n }\n return compositeGuides;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {\n ModeProps,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n GuideFeatureCollection,\n GuideFeature\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class CompositeMode extends GeoJsonEditMode {\n _modes: Array<GeoJsonEditMode>;\n\n constructor(modes: Array<GeoJsonEditMode>) {\n super();\n this._modes = modes;\n }\n\n _coalesce<T>(\n callback: (arg0: GeoJsonEditMode) => T,\n resultEval: ((arg0: T) => boolean | null | undefined) | null = null\n ): T {\n let result: T | null = null;\n\n for (let i = 0; i < this._modes.length; i++) {\n // eslint-disable-next-line callback-return\n result = callback(this._modes[i]);\n if (resultEval ? resultEval(result) : result) {\n break;\n }\n }\n\n return result;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n this._coalesce((handler) => handler.handleClick(event, props));\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handlePointerMove(event, props));\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleStartDragging(event, props));\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleStopDragging(event, props));\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleDragging(event, props));\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n // TODO: Combine the guides *BUT* make sure if none of the results have\n // changed to return the same object so that \"guides !== this.state.guides\"\n // in editable-geojson-layer works.\n\n const allGuides: GuideFeature[] = [];\n for (const mode of this._modes) {\n allGuides.push(...mode.getGuides(props).features);\n }\n\n return {\n type: 'FeatureCollection',\n features: allGuides\n };\n }\n}\n", "import {FeatureCollection} from '../utils/geojson-types';\n\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ClickEvent, ModeProps} from './types';\nexport class DeleteMode extends GeoJsonEditMode {\n handleClick(_event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n const selectedFeatureIndexes = props.lastPointerMoveEvent.picks.map((pick) => pick.index);\n if (selectedFeatureIndexes.length > 0) {\n const indexToDelete = selectedFeatureIndexes[0];\n\n const features = props.data.features.filter((_, index) => index !== indexToDelete);\n const updatedData = {\n ...props.data,\n features\n };\n\n const editAction = {\n updatedData,\n editType: 'deleteFeature',\n editContext: {\n featureIndexes: selectedFeatureIndexes\n }\n };\n\n props.onEdit(editAction);\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * A multiplier for screen-space width/scale for Arc, Line, Icon and Text layers.\n * Required in order to maintain the same appearance after upgrading to deck.gl v8.5.\n * https://github.com/visgl/deck.gl/blob/master/docs/upgrade-guide.md\n */\nexport const PROJECTED_PIXEL_SIZE_MULTIPLIER = 2 / 3;\n\n/**\n * Unit literal to shader unit number conversion.\n */\nexport const UNIT = {\n common: 0,\n meters: 1,\n pixels: 2\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {CompositeLayerProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport {\n DraggingEvent,\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n PointerMoveEvent,\n DoubleClickEvent\n} from '../edit-modes/types';\nimport {Position} from '../utils/geojson-types';\n\nconst EVENT_TYPES = ['click', 'pointermove', 'panstart', 'panmove', 'panend', 'keyup', 'dblclick'];\n\n// TODO(v9): remove generic layer\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type EditableLayerProps<DataType = any> = CompositeLayerProps & {\n pickingRadius?: number;\n pickingDepth?: number;\n onCancelPan?: () => void;\n};\n\nexport abstract class EditableLayer<\n DataT = any,\n ExtraPropsT = Record<string, unknown>\n> extends CompositeLayer<ExtraPropsT & Required<EditableLayerProps<DataT>>> {\n static layerName = 'EditableLayer';\n\n state: {_editableLayerState: any} = undefined!;\n\n // Overridable interaction event handlers\n onLayerClick(event: ClickEvent): void {\n // default implementation - do nothing\n }\n onLayerDoubleClick(event: DoubleClickEvent): void {\n // default implementation - do nothing\n }\n\n onStartDragging(event: StartDraggingEvent): void {\n // default implementation - do nothing\n }\n\n onStopDragging(event: StopDraggingEvent): void {\n // default implementation - do nothing\n }\n\n onDragging(event: DraggingEvent): void {\n // default implementation - do nothing\n }\n\n onPointerMove(event: PointerMoveEvent): void {\n // default implementation - do nothing\n }\n\n onLayerKeyUp(event: KeyboardEvent): void {\n // default implementation - do nothing;\n }\n // TODO: implement onCancelDragging (e.g. drag off screen)\n\n initializeState() {\n this.setState({\n _editableLayerState: {\n // Picked objects at the time the pointer went down\n pointerDownPicks: null,\n // Screen coordinates where the pointer went down\n pointerDownScreenCoords: null,\n // Ground coordinates where the pointer went down\n pointerDownMapCoords: null,\n\n // Keep track of the mjolnir.js event handler so it can be deregistered\n eventHandler: this._forwardEventToCurrentLayer.bind(this)\n }\n });\n\n this._addEventHandlers();\n }\n\n finalizeState() {\n this._removeEventHandlers();\n }\n\n _addEventHandlers() {\n // @ts-expect-error accessing protected props\n const {eventManager} = this.context.deck;\n const {eventHandler} = this.state._editableLayerState;\n\n for (const eventType of EVENT_TYPES) {\n eventManager.on(eventType as any, eventHandler, {\n // give nebula a higher priority so that it can stop propagation to deck.gl's map panning handlers\n priority: 100\n });\n }\n }\n\n _removeEventHandlers() {\n // @ts-expect-error accessing protected props\n const {eventManager} = this.context.deck;\n const {eventHandler} = this.state._editableLayerState;\n\n for (const eventType of EVENT_TYPES) {\n eventManager.off(eventType as any, eventHandler);\n }\n }\n\n // A new layer instance is created on every render, so forward the event to the current layer\n // This means that the first layer instance will stick around to be the event listener, but will forward the event\n // to the latest layer instance.\n _forwardEventToCurrentLayer(event: any) {\n const currentLayer = this.getCurrentLayer();\n\n // Use a naming convention to find the event handling function for this event type\n const func = currentLayer[`_on${event.type}`].bind(currentLayer);\n if (!func) {\n console.warn(`no handler for mjolnir.js event ${event.type}`); // eslint-disable-line\n return;\n }\n func(event);\n }\n\n _onclick({srcEvent}: any) {\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const picks = this.getPicks(screenCoords);\n\n this.onLayerClick({\n mapCoords,\n screenCoords,\n picks,\n sourceEvent: srcEvent\n });\n }\n\n _ondblclick({srcEvent}: any) {\n this.onLayerDoubleClick(srcEvent);\n }\n\n _onkeyup({srcEvent}: {srcEvent: KeyboardEvent}) {\n this.onLayerKeyUp(srcEvent);\n }\n\n _onpanstart(event: any) {\n const screenCoords = this.getScreenCoords(event.srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n const picks = this.getPicks(screenCoords);\n\n this.setState({\n _editableLayerState: {\n ...this.state._editableLayerState,\n pointerDownScreenCoords: screenCoords,\n pointerDownMapCoords: mapCoords,\n pointerDownPicks: picks\n }\n });\n\n this.onStartDragging({\n picks,\n screenCoords,\n mapCoords,\n pointerDownScreenCoords: screenCoords,\n pointerDownMapCoords: mapCoords,\n cancelPan: () => {\n if (this.props.onCancelPan) {\n this.props.onCancelPan();\n }\n\n event.stopImmediatePropagation();\n },\n sourceEvent: event.srcEvent\n });\n }\n\n _onpanmove(event: any) {\n const {srcEvent} = event;\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onDragging({\n screenCoords,\n mapCoords,\n picks,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent,\n cancelPan: event.stopImmediatePropagation\n // another (hacky) approach for cancelling map panning\n // const controller = this.context.deck.viewManager.controllers[\n // Object.keys(this.context.deck.viewManager.controllers)[0]\n // ];\n // controller._state.isDragging = false;\n });\n }\n\n _onpanend({srcEvent}: any) {\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onStopDragging({\n picks,\n screenCoords,\n mapCoords,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent\n });\n\n this.setState({\n _editableLayerState: {\n ...this.state._editableLayerState,\n pointerDownScreenCoords: null,\n pointerDownMapCoords: null,\n pointerDownPicks: null\n }\n });\n }\n\n _onpointermove(event: any) {\n const {srcEvent} = event;\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onPointerMove({\n screenCoords,\n mapCoords,\n picks,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent,\n cancelPan: event.stopImmediatePropagation\n });\n }\n\n getPicks(screenCoords: [number, number]) {\n return this.context.deck.pickMultipleObjects({\n x: screenCoords[0],\n y: screenCoords[1],\n layerIds: [this.props.id],\n radius: this.props.pickingRadius,\n depth: this.props.pickingDepth\n });\n }\n\n getScreenCoords(pointerEvent: any): Position {\n return [\n pointerEvent.clientX -\n (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().left,\n pointerEvent.clientY -\n (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().top\n ];\n }\n\n getMapCoords(screenCoords: Position): Position {\n return this.context.viewport.unproject([screenCoords[0], screenCoords[1]]) as Position;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PathLayerProps} from '@deck.gl/layers';\nimport {PathLayer} from '@deck.gl/layers';\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport {insertBefore} from '../utils/utils';\n\nconst uniformBlock = `\\\nuniform pickingLineWidthUniforms {\n float extraPixels;\n} pickingLineWidth;\n`;\n\nexport type PickingLineWidthProps = {\n extraPixels: number;\n};\n\nexport const pickingUniforms = {\n name: 'pickingLineWidth',\n vs: uniformBlock,\n fs: uniformBlock,\n uniformTypes: {\n extraPixels: 'f32'\n }\n} as const satisfies ShaderModule<PickingLineWidthProps>;\n\ninterface EditablePathLayerProps extends PathLayerProps<any> {\n pickingLineWidthExtraPixels?: number;\n}\n\nconst defaultProps = {\n ...PathLayer.defaultProps,\n pickingLineWidthExtraPixels: {type: 'number', min: 0, value: Number.MAX_SAFE_INTEGER}\n};\n\nexport class EditablePathLayer extends PathLayer<any, EditablePathLayerProps> {\n getShaders() {\n const shaders = super.getShaders();\n\n shaders.vs = insertBefore(\n shaders.vs,\n 'vec3 width;',\n `\n if(bool(picking.isActive)){\n widthPixels.xy += pickingLineWidth.extraPixels;\n }\n `\n );\n\n return {\n ...shaders,\n modules: [...shaders.modules, pickingUniforms]\n };\n }\n\n draw(props) {\n const {pickingLineWidthExtraPixels} = this.props;\n const pickingProps: PickingLineWidthProps = {extraPixels: pickingLineWidthExtraPixels};\n const model = this.state.model;\n model.shaderInputs.setProps({pickingLineWidth: pickingProps});\n super.draw(props);\n }\n}\n\nEditablePathLayer.defaultProps = defaultProps;\nEditablePathLayer.layerName = 'EditablePathLayer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {DefaultProps} from '@deck.gl/core';\nimport {H3ClusterLayer} from '@deck.gl/geo-layers';\n// TODO: Fix H3 support.\n// import { polyfill, geoToH3 } from 'h3-js';\nimport {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants';\nimport {EditableGeoJsonLayer} from './editable-geojson-layer';\nimport {EditableLayer, EditableLayerProps} from './editable-layer';\nimport {ViewMode} from '../edit-modes/view-mode';\n\nconst DEFAULT_EDIT_MODE = ViewMode;\nconst DEFAULT_H3_RESOLUTION = 9;\nconst EMPTY_FEATURE_COLLECTION = {\n type: 'FeatureCollection',\n features: []\n};\n\nexport type EditableH3ClusterLayerProps<DataT> = EditableLayerProps & {\n data: DataT;\n resolution?: number;\n mode?: any;\n modeConfig?: any;\n selectedIndexes?: number[];\n getEditedCluster?: (updatedHexagons: any[], existingCluster: any) => any;\n getHexagons?: (d) => number[];\n onEdit?: (updatedData?, editType?: string, featureIndexes?: number[], editContext?) => void;\n filled?: boolean;\n stroked?: boolean;\n lineWidthScale?: number;\n lineWidthMinPixels?: number;\n lineWidthMaxPixels?: number;\n lineWidthUnits?: string;\n};\n\nconst defaultProps: DefaultProps<EditableH3ClusterLayerProps<any>> = {\n mode: DEFAULT_EDIT_MODE,\n\n ...EditableGeoJsonLayer.defaultProps,\n\n // h3 layer\n data: [],\n selectedIndexes: [],\n filled: false,\n stroked: true,\n lineWidthScale: PROJECTED_PIXEL_SIZE_MULTIPLIER,\n lineWidthMinPixels: 1,\n lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n lineWidthUnits: 'pixels',\n getHexagons: (d) => d.hexIds,\n getEditedCluster: (updatedHexagons, existingCluster) => {\n if (existingCluster) {\n return {\n ...existingCluster,\n hexIds: updatedHexagons\n };\n }\n return {\n hexIds: updatedHexagons\n };\n },\n resolution: DEFAULT_H3_RESOLUTION\n};\n\nexport class EditableH3ClusterLayer extends EditableLayer<any, EditableH3ClusterLayerProps<any>> {\n static layerName = 'EditableH3ClusterLayer';\n static defaultProps = defaultProps;\n\n state: EditableLayer['state'] & {\n cursor?: 'grabbing' | 'grab' | null;\n tentativeHexagonIDs: string[];\n } = undefined!;\n\n initializeState() {\n super.initializeState();\n\n this.setState({\n tentativeHexagonIDs: []\n });\n }\n\n // convert array of (lng, lat) coords to cluster of hexes\n getDerivedHexagonIDs(coords) {\n throw new Error('not implemented'); // TODO\n // return polyfill(coords, this.props.resolution, true);\n }\n\n // convert pair of (lng, lat) coords into single hex\n getDerivedHexagonID(coords) {\n throw new Error('not implemented'); // TODO\n // return geoToH3(coords[1], coords[0], this.props.resolution);\n }\n\n renderLayers() {\n const layers: any = [\n new EditableGeoJsonLayer(\n this.getSubLayerProps({\n id: 'editable-geojson',\n\n mode: this.props.mode,\n data: EMPTY_FEATURE_COLLECTION,\n selectedFeatureIndexes: [],\n\n onEdit: (editAction) => {\n const {editType, editContext} = editAction;\n\n switch (editType) {\n case 'updateTentativeFeature':\n // tentative feature updates, updated on every pointer move\n if (editContext.feature.geometry.type === 'Polygon') {\n const coords = editContext.feature.geometry.coordinates;\n const hexIDs = this.getDerivedHexagonIDs(coords);\n\n this.setState({tentativeHexagonIDs: hexIDs});\n } else if (editContext.feature.geometry.type === 'Point') {\n const coords = editContext.feature.geometry.coordinates;\n const hexID = this.getDerivedHexagonID(coords);\n\n this.setState({tentativeHexagonIDs: [hexID]});\n }\n break;\n case 'addFeature':\n const updatedData = [...this.props.data];\n const {modeConfig} = this.props;\n\n if (!modeConfig || !modeConfig.booleanOperation) {\n // add new h3 cluster\n updatedData.push(\n this.props.getEditedCluster(this.state.tentativeHexagonIDs, null)\n );\n } else if (this.props.selectedIndexes.length !== 1) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('booleanOperation only supported for single cluster selection');\n } else {\n // they're affecting a selected cluster\n let finalHexagonIDs: (string | number)[];\n const committedHexagonIDs = new Set<string | number>(this.getSelectedHexIDs());\n const tentativeHexagonIDs = new Set<string | number>(\n this.state.tentativeHexagonIDs\n );\n\n switch (modeConfig.booleanOperation) {\n case 'union':\n default:\n finalHexagonIDs = [\n ...new Set([...committedHexagonIDs, ...tentativeHexagonIDs])\n ];\n break;\n case 'intersection':\n finalHexagonIDs = [...committedHexagonIDs].filter((hexID: string | number) =>\n tentativeHexagonIDs.has(hexID)\n );\n break;\n case 'difference':\n finalHexagonIDs = [...committedHexagonIDs].filter(\n (hexID: string | number) => !tentativeHexagonIDs.has(hexID)\n );\n break;\n }\n\n const selectedIndex = this.props.selectedIndexes[0];\n const existingCluster = this.props.data[selectedIndex];\n updatedData[selectedIndex] = this.props.getEditedCluster(\n finalHexagonIDs,\n existingCluster\n );\n }\n\n this.setState({\n tentativeHexagonIDs: []\n });\n\n this.props.onEdit({updatedData});\n\n break;\n default:\n break;\n }\n }\n })\n ),\n\n new H3ClusterLayer(\n this.getSubLayerProps({\n id: 'hexagons',\n data: this.props.data,\n getHexagons: this.props.getHexagons\n })\n ),\n new H3ClusterLayer(\n this.getSubLayerProps({\n id: 'tentative-hexagons',\n data: [\n {\n hexIds: this.state.tentativeHexagonIDs\n }\n ],\n getHexagons: (d) => d.hexIds\n })\n )\n ];\n return layers;\n }\n\n // because data is an array of hexagon data, we take the cumulative of all selected indexes,\n // using props.getHexagons to support multiple data types\n getSelectedHexIDs() {\n let cumulativeHexIDs: number[] = [];\n this.props.selectedIndexes.forEach((index) => {\n const selectedCluster = this.props.data[index];\n const hexIDs = this.props.getHexagons(selectedCluster);\n cumulativeHexIDs = cumulativeHexIDs.concat(hexIDs);\n });\n return cumulativeHexIDs;\n }\n\n getCursor({isDragging}: {isDragging: boolean}): 'grabbing' | 'grab' {\n let {cursor} = this.state || {};\n if (!cursor) {\n // default cursor\n cursor = isDragging ? 'grabbing' : 'grab';\n }\n return cursor;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {CompositeLayerProps, DefaultProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport {PolygonLayer} from '@deck.gl/layers';\nimport {featureCollection, polygon} from '@turf/helpers';\nimport turfBuffer from '@turf/buffer';\nimport turfDifference from '@turf/difference';\n\nimport {EditableGeoJsonLayer} from './editable-geojson-layer';\nimport {DrawRectangleMode} from '../edit-modes/draw-rectangle-mode';\nimport {DrawPolygonMode} from '../edit-modes/draw-polygon-mode';\nimport {ViewMode} from '../edit-modes/view-mode';\n\nexport const SELECTION_TYPE = {\n NONE: null,\n RECTANGLE: 'rectangle',\n POLYGON: 'polygon'\n};\n\nconst MODE_MAP = {\n [SELECTION_TYPE.RECTANGLE]: DrawRectangleMode,\n [SELECTION_TYPE.POLYGON]: DrawPolygonMode\n};\n\nconst MODE_CONFIG_MAP = {\n [SELECTION_TYPE.RECTANGLE]: {dragToDraw: true}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface SelectionLayerProps<DataT> extends CompositeLayerProps {\n layerIds: any[];\n onSelect: (info: any) => any;\n selectionType: string | null;\n}\n\nconst defaultProps: DefaultProps<SelectionLayerProps<any>> = {\n selectionType: SELECTION_TYPE.RECTANGLE,\n layerIds: [],\n onSelect: () => {}\n};\n\nconst EMPTY_DATA = {\n type: 'FeatureCollection',\n features: []\n};\n\nconst EXPANSION_KM = 50;\nconst LAYER_ID_GEOJSON = 'selection-geojson';\nconst LAYER_ID_BLOCKER = 'selection-blocker';\n\nconst PASS_THROUGH_PROPS = [\n 'lineWidthScale',\n 'lineWidthMinPixels',\n 'lineWidthMaxPixels',\n 'lineWidthUnits',\n 'lineJointRounded',\n 'lineCapRounded',\n 'lineMiterLimit',\n 'pointRadiusScale',\n 'pointRadiusMinPixels',\n 'pointRadiusMaxPixels',\n 'lineDashJustified',\n 'getLineColor',\n 'getFillColor',\n 'getRadius',\n 'getLineWidth',\n 'getLineDashArray',\n 'getTentativeLineDashArray',\n 'getTentativeLineColor',\n 'getTentativeFillColor',\n 'getTentativeLineWidth'\n];\nexport class SelectionLayer<DataT, ExtraPropsT> extends CompositeLayer<\n ExtraPropsT & Required<SelectionLayerProps<DataT>>\n> {\n static layerName = 'SelectionLayer';\n static defaultProps = defaultProps;\n\n state: {\n pendingPolygonSelection: {\n bigPolygon: ReturnType<typeof turfDifference>;\n };\n } = undefined!;\n\n _selectRectangleObjects(coordinates: any) {\n const {layerIds, onSelect} = this.props;\n const [x1, y1] = this.context.viewport.project(coordinates[0][0]);\n const [x2, y2] = this.context.viewport.project(coordinates[0][2]);\n const pickingInfos = this.context.deck.pickObjects({\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n layerIds\n });\n\n onSelect({pickingInfos});\n }\n\n _selectPolygonObjects(coordinates: any) {\n const {layerIds, onSelect} = this.props;\n const mousePoints = coordinates[0].map((c) => this.context.viewport.project(c));\n\n const allX = mousePoints.map((mousePoint) => mousePoint[0]);\n const allY = mousePoints.map((mousePoint) => mousePoint[1]);\n const x = Math.min(...allX);\n const y = Math.min(...allY);\n const maxX = Math.max(...allX);\n const maxY = Math.max(...allY);\n\n // Use a polygon to hide the outside, because pickObjects()\n // does not support polygons\n const landPointsPoly = polygon(coordinates);\n const bigBuffer = turfBuffer(landPointsPoly, EXPANSION_KM);\n let bigPolygon;\n try {\n // turfDifference throws an exception if the polygon\n // intersects with itself (TODO: check if true in all versions)\n bigPolygon = turfDifference(featureCollection([bigBuffer, landPointsPoly]));\n } catch (e) {\n // invalid selection polygon\n console.log('turfDifference() error', e); // eslint-disable-line\n return;\n }\n\n this.setState({\n pendingPolygonSelection: {\n bigPolygon\n }\n });\n\n const blockerId = `${this.props.id}-${LAYER_ID_BLOCKER}`;\n\n // HACK, find a better way\n setTimeout(() => {\n const pickingInfos = this.context.deck.pickObjects({\n x,\n y,\n width: maxX - x,\n height: maxY - y,\n layerIds: [blockerId, ...layerIds]\n });\n\n onSelect({\n pickingInfos: pickingInfos.filter((item) => item.layer.id !== this.props.id)\n });\n }, 250);\n }\n\n renderLayers() {\n const {pendingPolygonSelection} = this.state;\n\n const mode = MODE_MAP[this.props.selectionType] || ViewMode;\n const modeConfig = MODE_CONFIG_MAP[this.props.selectionType];\n\n const inheritedProps = {};\n PASS_THROUGH_PROPS.forEach((p) => {\n if (this.props[p] !== undefined) inheritedProps[p] = this.props[p];\n });\n\n const layers: any[] = [\n new EditableGeoJsonLayer(\n this.getSubLayerProps({\n id: LAYER_ID_GEOJSON,\n pickable: true,\n mode,\n modeConfig,\n selectedFeatureIndexes: [],\n data: EMPTY_DATA,\n onEdit: ({updatedData, editType}) => {\n if (editType === 'addFeature') {\n const {coordinates} = updatedData.features[0].geometry;\n\n if (this.props.selectionType === SELECTION_TYPE.RECTANGLE) {\n this._selectRectangleObjects(coordinates);\n } else if (this.props.selectionType === SELECTION_TYPE.POLYGON) {\n this._selectPolygonObjects(coordinates);\n }\n }\n },\n ...inheritedProps\n })\n )\n ];\n\n if (pendingPolygonSelection) {\n const {bigPolygon} = pendingPolygonSelection as any;\n layers.push(\n new PolygonLayer(\n this.getSubLayerProps({\n id: LAYER_ID_BLOCKER,\n pickable: true,\n stroked: false,\n opacity: 1.0,\n data: [bigPolygon],\n getLineColor: (obj) => [0, 0, 0, 1],\n getFillColor: (obj) => [0, 0, 0, 1],\n getPolygon: (o) => o.geometry.coordinates\n })\n )\n );\n }\n\n return layers;\n }\n\n shouldUpdateState({changeFlags: {stateChanged, propsOrDataChanged}}: Record<string, any>) {\n return stateChanged || propsOrDataChanged;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport {CompositeLayer} from '@deck.gl/core';\nimport {ScatterplotLayer, LineLayer} from '@deck.gl/layers';\n\nconst defaultProps = {};\n\nexport class ElevatedEditHandleLayer extends CompositeLayer<any> {\n static layerName = 'ElevatedEditHandleLayer';\n static defaultProps = defaultProps;\n renderLayers() {\n const handles = new ScatterplotLayer(\n Object.assign({}, this.props, {\n id: `${this.props.id}-ScatterplotLayer`,\n data: this.props.data\n })\n );\n\n const lines = new LineLayer(\n Object.assign({}, this.props, {\n id: `${this.props.id}-LineLayer`,\n data: this.props.data,\n pickable: false,\n getSourcePosition: ({position}) => [position[0], position[1], 0],\n getTargetPosition: ({position}) => [position[0], position[1], position[2] || 0],\n getColor: [150, 150, 150, 200],\n getStrokeWidth: 3\n })\n );\n\n return [handles, lines];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {ComponentChild, JSX} from 'preact';\nimport {\n Widget,\n type WidgetProps,\n type WidgetPlacement,\n type Deck\n} from '@deck.gl/core';\nimport type {\n GeoJsonEditModeConstructor,\n GeoJsonEditModeType\n} from '../edit-modes/geojson-edit-mode';\n\nexport type EditModeTrayWidgetModeOption = {\n /**\n * Optional identifier for the mode button.\n * If not provided, one will be inferred from the supplied mode.\n */\n id?: string;\n /** Edit mode constructor or instance that the button should activate. */\n mode: GeoJsonEditModeConstructor | GeoJsonEditModeType;\n /**\n * The icon or element rendered inside the button.\n * A simple string can also be supplied for text labels.\n */\n icon?: ComponentChild;\n /** Optional text label rendered below the icon when provided. */\n label?: string;\n /** Optional tooltip text applied to the button element. */\n title?: string;\n};\n\nexport type EditModeTrayWidgetSelectEvent = {\n id: string;\n mode: GeoJsonEditModeConstructor | GeoJsonEditModeType;\n option: EditModeTrayWidgetModeOption;\n};\n\nexport type EditModeTrayWidgetProps = WidgetProps & {\n /** Placement for the widget root element. */\n placement?: WidgetPlacement;\n /** Layout direction for mode buttons. */\n layout?: 'vertical' | 'horizontal';\n /** Collection of modes rendered in the tray. */\n modes?: EditModeTrayWidgetModeOption[];\n /** Identifier of the currently active mode. */\n selectedModeId?: string | null;\n /** Currently active mode instance/constructor. */\n activeMode?: GeoJsonEditModeConstructor | GeoJsonEditModeType | null;\n /** Callback fired when the user selects a mode. */\n onSelectMode?: (event: EditModeTrayWidgetSelectEvent) => void;\n};\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n pointerEvents: 'auto',\n userSelect: 'none',\n zIndex: '99'\n};\n\nconst TRAY_BASE_STYLE: JSX.CSSProperties = {\n display: 'flex',\n gap: '6px',\n background: 'rgba(36, 40, 41, 0.88)',\n borderRadius: '999px',\n padding: '6px',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)'\n};\n\nconst BUTTON_BASE_STYLE: JSX.CSSProperties = {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: '#f0f0f0',\n width: '34px',\n height: '34px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n cursor: 'pointer',\n padding: '0',\n transition: 'background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease'\n};\n\nconst BUTTON_ACTIVE_STYLE: JSX.CSSProperties = {\n background: '#0071e3',\n color: '#ffffff',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 0.35)'\n};\n\nconst BUTTON_LABEL_STYLE: JSX.CSSProperties = {\n fontSize: '10px',\n marginTop: '2px',\n lineHeight: '12px'\n};\n\nexport class EditModeTrayWidget extends Widget<EditModeTrayWidgetProps> {\n static override defaultProps = {\n id: 'edit-mode-tray',\n placement: 'top-left',\n layout: 'vertical',\n modes: [],\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<EditModeTrayWidgetProps, 'placement' | 'layout'>> &\n EditModeTrayWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-edit-mode-tray';\n layout: 'vertical' | 'horizontal' = 'vertical';\n selectedModeId: string | null = null;\n deck?: Deck | null = null;\n private appliedCustomClassName: string | null = null;\n\n constructor(props: EditModeTrayWidgetProps = {}) {\n super({...EditModeTrayWidget.defaultProps, ...props});\n this.placement = props.placement ?? EditModeTrayWidget.defaultProps.placement;\n this.layout = props.layout ?? EditModeTrayWidget.defaultProps.layout;\n this.selectedModeId = this.resolveSelectedModeId(props.modes ?? [], props);\n }\n\n override setProps(props: Partial<EditModeTrayWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.layout !== undefined) {\n this.layout = props.layout;\n }\n\n const modes = props.modes ?? this.props.modes ?? [];\n this.selectedModeId = this.resolveSelectedModeId(modes, props);\n\n super.setProps(props);\n this.renderTray();\n }\n\n override onAdd({deck}: {deck: Deck}): void {\n this.deck = deck;\n }\n\n override onRemove(): void {\n this.deck = null;\n const root = this.rootElement;\n if (root) {\n render(null, root);\n }\n this.rootElement = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...ROOT_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n if (this.appliedCustomClassName && this.appliedCustomClassName !== this.props.className) {\n rootElement.classList.remove(this.appliedCustomClassName);\n this.appliedCustomClassName = null;\n }\n if (this.props.className) {\n rootElement.classList.add(this.props.className);\n this.appliedCustomClassName = this.props.className;\n }\n rootElement.classList.add(this.className);\n\n this.renderTray();\n }\n\n private renderTray() {\n const root = this.rootElement;\n if (!root) {\n return;\n }\n\n const modes = this.props.modes ?? [];\n const selectedId = this.selectedModeId;\n const direction = this.layout === 'horizontal' ? 'row' : 'column';\n\n const trayStyle: JSX.CSSProperties = {\n ...TRAY_BASE_STYLE,\n flexDirection: direction\n };\n\n const stopEvent = (event: Event) => {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n };\n\n const ui = (\n <div\n style={trayStyle}\n onPointerDown={stopEvent}\n onPointerMove={stopEvent}\n onPointerUp={stopEvent}\n onMouseDown={stopEvent}\n onMouseMove={stopEvent}\n onMouseUp={stopEvent}\n onTouchStart={stopEvent}\n onTouchMove={stopEvent}\n onTouchEnd={stopEvent}\n >\n {modes.map((option, index) => {\n const id = this.getModeId(option, index);\n const active = id === selectedId;\n const label = option.label ?? '';\n const title = option.title ?? label;\n\n const buttonStyle: JSX.CSSProperties = {\n ...BUTTON_BASE_STYLE,\n ...(active ? BUTTON_ACTIVE_STYLE : {})\n };\n\n return (\n <button\n key={id}\n type=\"button\"\n title={title || undefined}\n aria-pressed={active}\n style={buttonStyle}\n onClick={(event) => {\n stopEvent(event);\n this.handleSelect(option, id);\n }}\n >\n {option.icon}\n {label ? <span style={BUTTON_LABEL_STYLE}>{label}</span> : null}\n </button>\n );\n })}\n </div>\n );\n\n render(ui, root);\n }\n\n private handleSelect(option: EditModeTrayWidgetModeOption, id: string) {\n if (this.selectedModeId !== id) {\n this.selectedModeId = id;\n this.renderTray();\n }\n\n this.props.onSelectMode?.({\n id,\n mode: option.mode,\n option\n });\n }\n\n private resolveSelectedModeId(\n modes: EditModeTrayWidgetModeOption[],\n props: Partial<EditModeTrayWidgetProps>\n ): string | null {\n if (props.selectedModeId !== undefined) {\n return props.selectedModeId;\n }\n\n const activeMode = props.activeMode ?? this.props?.activeMode ?? null;\n if (activeMode) {\n const match = this.findOptionByMode(modes, activeMode);\n if (match) {\n return this.getModeId(match.option, match.index);\n }\n }\n\n if (this.selectedModeId) {\n const existing = this.findOptionById(modes, this.selectedModeId);\n if (existing) {\n return this.selectedModeId;\n }\n }\n\n const first = modes[0];\n return first ? this.getModeId(first, 0) : null;\n }\n\n private findOptionByMode(\n modes: EditModeTrayWidgetModeOption[],\n activeMode: GeoJsonEditModeConstructor | GeoJsonEditModeType\n ): {option: EditModeTrayWidgetModeOption; index: number} | null {\n for (let index = 0; index < modes.length; index++) {\n const option = modes[index];\n if (option.mode === activeMode) {\n return {option, index};\n }\n if (this.isSameMode(option.mode, activeMode)) {\n return {option, index};\n }\n }\n return null;\n }\n\n private findOptionById(\n modes: EditModeTrayWidgetModeOption[],\n id: string\n ): {option: EditModeTrayWidgetModeOption; index: number} | null {\n for (let index = 0; index < modes.length; index++) {\n if (this.getModeId(modes[index], index) === id) {\n return {option: modes[index], index};\n }\n }\n return null;\n }\n\n private getModeId(option: EditModeTrayWidgetModeOption, index: number): string {\n if (option.id) {\n return option.id;\n }\n\n const mode = option.mode as any;\n if (mode) {\n if (typeof mode === 'function' && mode.name) {\n return mode.name;\n }\n if (mode && mode.constructor && mode.constructor.name) {\n return mode.constructor.name;\n }\n }\n\n return `mode-${index}`;\n }\n\n private isSameMode(\n modeA: GeoJsonEditModeConstructor | GeoJsonEditModeType,\n modeB: GeoJsonEditModeConstructor | GeoJsonEditModeType\n ): boolean {\n if (modeA === modeB) {\n return true;\n }\n const constructorA = (modeA as GeoJsonEditModeType)?.constructor;\n const constructorB = (modeB as GeoJsonEditModeType)?.constructor;\n return Boolean(constructorA && constructorB && constructorA === constructorB);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompositeLayerProps, DefaultProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport type {ScatterplotLayerProps} from '@deck.gl/layers';\nimport {ScatterplotLayer} from '@deck.gl/layers';\n\nimport {Color} from '../utils/types';\n\ntype JunctionScatterplotLayerProps = CompositeLayerProps &\n Omit<ScatterplotLayerProps, 'getFillColor'> & {\n getFillColor?: Color | ((d) => Color);\n getStrokeColor?: Color | ((d) => Color);\n getInnerRadius?: number | ((d) => number);\n };\n\nexport class JunctionScatterplotLayer extends CompositeLayer<JunctionScatterplotLayerProps> {\n static layerName = 'JunctionScatterplotLayer';\n static defaultProps: DefaultProps<JunctionScatterplotLayerProps> = {\n ...ScatterplotLayer.defaultProps,\n getFillColor: (d) => [0, 0, 0, 255],\n getStrokeColor: (d) => [255, 255, 255, 255],\n getInnerRadius: (d) => 1\n };\n\n renderLayers() {\n const {id, getFillColor, getStrokeColor, getInnerRadius, updateTriggers} = this.props;\n\n // data needs to be passed explicitly after deck.gl 5.3\n return [\n // the full circles\n new ScatterplotLayer<any>({\n ...this.props,\n id: `${id}-full`,\n data: this.props.data as any,\n getLineColor: getStrokeColor,\n updateTriggers: {\n ...updateTriggers,\n getStrokeColor: updateTriggers.getStrokeColor\n }\n }), // the inner part\n new ScatterplotLayer<any>({\n ...this.props,\n id: `${id}-inner`,\n data: this.props.data as any,\n getFillColor,\n getRadius: getInnerRadius,\n pickable: false,\n updateTriggers: {\n ...updateTriggers,\n getFillColor: updateTriggers.getFillColor,\n getRadius: updateTriggers.getInnerRadius\n }\n })\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport nearestPointOnLine from '@turf/nearest-point-on-line';\nimport {point, lineString as toLineString} from '@turf/helpers';\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport turfCenter from '@turf/center';\nimport {\n recursivelyTraverseNestedArrays,\n nearestPointOnProjectedLine,\n getPickedEditHandles,\n getPickedEditHandle,\n NearestPointType\n} from './utils';\nimport {LineString, Point, FeatureCollection, Feature, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {Viewport} from '../utils/types';\nimport {\n ModeProps,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n EditHandleFeature,\n GuideFeatureCollection,\n GuideFeature,\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ResizeCircleMode extends GeoJsonEditMode {\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _isResizing = false;\n\n // eslint-disable-next-line complexity\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const handles: GuideFeature[] = [];\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const {lastPointerMoveEvent} = props;\n const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;\n const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;\n\n // intermediate edit handle\n if (\n picks &&\n picks.length &&\n mapCoords &&\n selectedFeatureIndexes.length === 1 &&\n !this._isResizing\n ) {\n const featureAsPick = picks.find((pick) => !pick.isGuide);\n\n // is the feature in the pick selected\n if (\n featureAsPick &&\n featureAsPick.object.properties.shape &&\n featureAsPick.object.properties.shape.includes('Circle') &&\n props.selectedIndexes.includes(featureAsPick.index)\n ) {\n let intermediatePoint: NearestPointType | null = null;\n let positionIndexPrefix: number[] = [];\n const referencePoint = point(mapCoords);\n // process all lines of the (single) feature\n recursivelyTraverseNestedArrays(\n featureAsPick.object.geometry.coordinates,\n [],\n (lineString, prefix) => {\n const lineStringFeature = toLineString(lineString);\n const candidateIntermediatePoint = this.getNearestPoint(\n\n lineStringFeature,\n referencePoint,\n props.modeConfig && props.modeConfig.viewport\n );\n if (\n !intermediatePoint ||\n candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist\n ) {\n intermediatePoint = candidateIntermediatePoint;\n positionIndexPrefix = prefix;\n }\n }\n );\n // tack on the lone intermediate point to the set of handles\n if (intermediatePoint) {\n const {\n geometry: {coordinates: position},\n properties: {index}\n } = intermediatePoint;\n handles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'intermediate',\n featureIndex: featureAsPick.index,\n positionIndexes: [...positionIndexPrefix, index + 1]\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n }\n }\n\n return {\n type: 'FeatureCollection',\n features: handles\n };\n }\n\n // turf.js does not support elevation for nearestPointOnLine\n getNearestPoint(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport | null | undefined\n ): NearestPointType {\n const {coordinates} = line.geometry;\n if (coordinates.some((coord) => coord.length > 2)) {\n if (viewport) {\n // This line has elevation, we need to use alternative algorithm\n return nearestPointOnProjectedLine(line, inPoint, viewport);\n }\n // eslint-disable-next-line no-console,no-undef\n console.log(\n 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.'\n );\n }\n return nearestPointOnLine(line, inPoint);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n // Cancel map panning if pointer went down on an edit handle\n event.cancelPan();\n\n const editHandleProperties = editHandle.properties;\n\n const feature = this.getSelectedFeature(props);\n const center = turfCenter(feature).geometry.coordinates;\n const numberOfSteps = Object.entries(feature.geometry.coordinates[0]).length - 1;\n const radius = Math.max(distance(center, event.mapCoords), 0.001);\n\n const {steps = numberOfSteps} = {};\n const options = {steps};\n const updatedFeature = circle(center, radius, options);\n const geometry = updatedFeature.geometry;\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(editHandleProperties.featureIndex, geometry)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'unionGeometry',\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex]\n }\n });\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n if (!this._isResizing) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'intermediate'\n ? selectedEditHandle\n : null;\n }\n\n const cursor = this.getCursor(event);\n props.onUpdateCursor(cursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isResizing = true;\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n if (this._isResizing) {\n this._selectedEditHandle = null;\n this._isResizing = false;\n }\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n const picks = (event && event.picks) || [];\n\n const handlesPicked = getPickedEditHandles(picks);\n if (handlesPicked.length) {\n return 'cell';\n }\n return null;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Position, LineString, FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {ClickEvent, PointerMoveEvent, ModeProps, GuideFeatureCollection} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ExtendLineStringMode extends GeoJsonEditMode {\n getSingleSelectedLineString(props: ModeProps<SimpleFeatureCollection>): LineString | null | undefined {\n const selectedGeometry = this.getSelectedGeometry(props);\n\n if (selectedGeometry && selectedGeometry.type === 'LineString') {\n return selectedGeometry;\n }\n return null;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {selectedIndexes} = props;\n const selectedLineString = this.getSingleSelectedLineString(props);\n\n if (!selectedLineString) {\n console.warn(`ExtendLineStringMode only supported for single LineString selection`); // eslint-disable-line\n return;\n }\n\n // Extend the LineString\n let positionIndexes = [selectedLineString.coordinates.length];\n\n const modeConfig = props.modeConfig;\n if (modeConfig && modeConfig.drawAtFront) {\n positionIndexes = [0];\n }\n const featureIndex = selectedIndexes[0];\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(featureIndex, positionIndexes, event.mapCoords)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: event.mapCoords\n }\n });\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const selectedLineString = this.getSingleSelectedLineString(props);\n if (!selectedLineString) {\n return guides;\n }\n\n const mapCoords = props.lastPointerMoveEvent && props.lastPointerMoveEvent.mapCoords;\n\n if (!mapCoords) {\n return guides;\n }\n\n // Draw an extension line starting from one end of the selected LineString to the cursor\n let startPosition: Position | null | undefined = null;\n const {modeConfig} = props;\n if (modeConfig && modeConfig.drawAtFront) {\n startPosition = selectedLineString.coordinates[0];\n } else {\n startPosition = selectedLineString.coordinates[selectedLineString.coordinates.length - 1];\n }\n\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [startPosition, mapCoords]\n }\n });\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfDistance from '@turf/distance';\nimport turfMidpoint from '@turf/midpoint';\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n Tooltip,\n GuideFeature\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class MeasureDistanceMode extends GeoJsonEditMode {\n _isMeasuringSessionFinished = false;\n _currentTooltips: Tooltip[] = [];\n _currentDistance = 0;\n\n _calculateDistanceForTooltip = ({positionA, positionB, modeConfig}) => {\n const {turfOptions, measurementCallback} = modeConfig || {};\n const distance = turfDistance(positionA, positionB, turfOptions);\n\n if (measurementCallback) {\n measurementCallback(distance);\n }\n\n return distance;\n };\n\n _formatTooltip(distance, modeConfig?) {\n const {formatTooltip, turfOptions} = modeConfig || {};\n const units = (turfOptions && turfOptions.units) || 'kilometers';\n\n let text;\n if (formatTooltip) {\n text = formatTooltip(distance);\n } else {\n // By default, round to 2 decimal places and append units\n text = `${parseFloat(distance).toFixed(2)} ${units}`;\n }\n\n return text;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>) {\n const {modeConfig, data, onEdit} = props;\n const {centerTooltipsOnLine = false} = modeConfig || {};\n\n // restart measuring session\n if (this._isMeasuringSessionFinished) {\n this._isMeasuringSessionFinished = false;\n this.resetClickSequence();\n this._currentTooltips = [];\n this._currentDistance = 0;\n }\n\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n let positionAdded = false;\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one\n this.addClickSequence(event);\n positionAdded = true;\n }\n const clickSequence = this.getClickSequence();\n\n if (\n clickSequence.length > 1 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1\n ) {\n // They clicked the last point (or double-clicked), so add the LineString\n this._isMeasuringSessionFinished = true;\n } else if (positionAdded) {\n if (clickSequence.length > 1) {\n this._currentDistance += this._calculateDistanceForTooltip({\n positionA: clickSequence[clickSequence.length - 2],\n positionB: clickSequence[clickSequence.length - 1],\n modeConfig\n });\n\n const tooltipPosition = centerTooltipsOnLine\n ? turfMidpoint(\n clickSequence[clickSequence.length - 2],\n clickSequence[clickSequence.length - 1]\n ).geometry.coordinates\n : event.mapCoords;\n\n this._currentTooltips.push({\n position: tooltipPosition,\n text: this._formatTooltip(this._currentDistance, modeConfig)\n });\n }\n\n // new tentative point\n onEdit({\n // data is the same\n updatedData: data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<FeatureCollection>) {\n if (this._isMeasuringSessionFinished) return;\n\n event.stopPropagation();\n const {key} = event;\n\n const clickSequenceLength = this.getClickSequence().length;\n\n switch (key) {\n case 'Escape':\n this._isMeasuringSessionFinished = true;\n if (clickSequenceLength === 1) {\n this.resetClickSequence();\n this._currentTooltips = [];\n }\n // force update drawings\n props.onUpdateCursor('cell');\n break;\n case 'Enter':\n this.handleClick(props.lastPointerMoveEvent, props);\n this._isMeasuringSessionFinished = true;\n break;\n default:\n break;\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords =\n lastPointerMoveEvent && !this._isMeasuringSessionFinished\n ? [lastPointerMoveEvent.mapCoords]\n : [];\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length > 0) {\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, ...lastCoords]\n }\n });\n }\n\n const editHandles: GuideFeature[] = clickSequence.map((clickedCoord, index) => ({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'existing',\n featureIndex: -1,\n positionIndexes: [index]\n },\n geometry: {\n type: 'Point',\n coordinates: clickedCoord\n }\n }));\n\n guides.features.push(...editHandles);\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const {lastPointerMoveEvent, modeConfig} = props;\n const {centerTooltipsOnLine = false} = modeConfig || {};\n const positions = this.getClickSequence();\n\n if (positions.length > 0 && lastPointerMoveEvent && !this._isMeasuringSessionFinished) {\n const distance = this._calculateDistanceForTooltip({\n positionA: positions[positions.length - 1],\n positionB: lastPointerMoveEvent.mapCoords,\n modeConfig: props.modeConfig\n });\n\n const tooltipPosition = centerTooltipsOnLine\n ? turfMidpoint(positions[positions.length - 1], lastPointerMoveEvent.mapCoords).geometry\n .coordinates\n : lastPointerMoveEvent.mapCoords;\n\n return [\n ...this._currentTooltips,\n {\n position: tooltipPosition,\n text: this._formatTooltip(this._currentDistance + distance, modeConfig)\n }\n ];\n }\n\n return this._currentTooltips;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfArea from '@turf/area';\nimport turfCentroid from '@turf/centroid';\nimport {ClickEvent, Tooltip, ModeProps} from './types';\nimport {FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {DrawPolygonMode} from './draw-polygon-mode';\n\nconst DEFAULT_TOOLTIPS = [];\n\nexport class MeasureAreaMode extends DrawPolygonMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const propsWithoutEdit = {\n ...props,\n onEdit: () => {}\n };\n\n super.handleClick(event, propsWithoutEdit);\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const propsWithoutEdit = {\n ...props,\n onEdit: () => {}\n };\n\n super.handleKeyUp(event, propsWithoutEdit);\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const tentativeGuide = this.getTentativeGuide(props);\n\n if (tentativeGuide && tentativeGuide.geometry.type === 'Polygon') {\n const {modeConfig} = props;\n const {formatTooltip, measurementCallback} = modeConfig || {};\n const units = 'sq. m';\n\n const centroid = turfCentroid(tentativeGuide);\n const area = turfArea(tentativeGuide);\n\n let text: string;\n if (formatTooltip) {\n text = formatTooltip(area);\n } else {\n // By default, round to 2 decimal places and append units\n // @ts-expect-error are isn't string\n text = `${parseFloat(area).toFixed(2)} ${units}`;\n }\n\n if (measurementCallback) {\n measurementCallback(area);\n }\n\n return [\n {\n position: centroid.geometry.coordinates,\n text\n }\n ];\n }\n return DEFAULT_TOOLTIPS;\n }\n}\n", "import turfBearing from '@turf/bearing';\nimport turfCenter from '@turf/center';\nimport {memoize} from '../utils/memoize';\n\nimport {ClickEvent, PointerMoveEvent, Tooltip, ModeProps, GuideFeatureCollection} from './types';\nimport {FeatureCollection, Position} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nconst DEFAULT_TOOLTIPS: Tooltip[] = [];\n\nexport class MeasureAngleMode extends GeoJsonEditMode {\n _getTooltips = memoize(\n ({\n modeConfig,\n vertex,\n point1,\n point2\n }: {\n modeConfig: any;\n vertex: any;\n point1: Position;\n point2: Position;\n }): Tooltip[] => {\n let tooltips = DEFAULT_TOOLTIPS;\n\n if (vertex && point1 && point2) {\n const {formatTooltip, measurementCallback} = modeConfig || {};\n const units = 'deg';\n\n const angle1 = turfBearing(vertex, point1);\n const angle2 = turfBearing(vertex, point2);\n let angle = Math.abs(angle1 - angle2);\n if (angle > 180) {\n angle = 360 - angle;\n }\n\n let text: string;\n if (formatTooltip) {\n text = formatTooltip(angle);\n } else {\n // By default, round to 2 decimal places and append units\n // @ts-expect-error angle isn't string\n text = `${parseFloat(angle).toFixed(2)} ${units}`;\n }\n\n if (measurementCallback) {\n measurementCallback(angle);\n }\n\n const position = turfCenter({\n type: 'FeatureCollection',\n features: [point1, point2].map((p) => ({\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: p\n },\n properties: {}\n }))\n }).geometry.coordinates;\n\n tooltips = [{position, text}];\n }\n\n return tooltips;\n }\n );\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n if (this.getClickSequence().length >= 3) {\n this.resetClickSequence();\n }\n\n this.addClickSequence(event);\n }\n\n // Called when the pointer moved, regardless of whether the pointer is down, up, and whether something was picked\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n props.onUpdateCursor('cell');\n }\n\n getPoints(props: ModeProps<FeatureCollection>): Position[] {\n const clickSequence = this.getClickSequence();\n\n const points = [...clickSequence];\n\n if (clickSequence.length < 3 && props.lastPointerMoveEvent) {\n points.push(props.lastPointerMoveEvent.mapCoords);\n }\n\n return points;\n }\n\n // Return features that can be used as a guide for editing the data\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {type: 'FeatureCollection', features: []};\n const {features} = guides;\n\n const points = this.getPoints(props);\n\n if (points.length > 2) {\n features.push({\n type: 'Feature',\n properties: {guideType: 'tentative'},\n geometry: {\n type: 'LineString',\n coordinates: [points[1], points[0], points[2]]\n }\n });\n } else if (points.length > 1) {\n features.push({\n type: 'Feature',\n properties: {guideType: 'tentative'},\n geometry: {\n type: 'LineString',\n coordinates: [points[1], points[0]]\n }\n });\n }\n\n return guides;\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const points = this.getPoints(props);\n\n return this._getTooltips({\n modeConfig: props.modeConfig,\n vertex: points[0],\n point1: points[1],\n point2: points[2]\n }) as Tooltip[];\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["mapCoords", "lineString", "pointToLineDistance", "bearing", "destination", "x", "y", "x2", "y2", "index", "x1", "y1", "distance", "import_layers", "import_helpers", "import_destination", "import_bearing", "import_point_to_line_distance", "import_helpers", "
|
|
3
|
+
"sources": ["../src/index.ts", "../src/utils/utils.ts", "../src/editable-layers/editable-geojson-layer.ts", "../src/edit-modes/geojson-edit-mode.ts", "../src/edit-modes/utils.ts", "../src/edit-modes/immutable-feature-collection.ts", "../src/edit-modes/view-mode.ts", "../src/edit-modes/translate-mode.ts", "../src/utils/translate-from-center.ts", "../src/edit-modes/modify-mode.ts", "../src/edit-modes/scale-mode.ts", "../src/edit-modes/rotate-mode.ts", "../src/edit-modes/duplicate-mode.ts", "../src/edit-modes/split-polygon-mode.ts", "../src/edit-modes/extrude-mode.ts", "../src/edit-modes/elevation-mode.ts", "../src/edit-modes/draw-point-mode.ts", "../src/edit-modes/draw-line-string-mode.ts", "../src/utils/memoize.ts", "../src/edit-modes/draw-polygon-mode.ts", "../src/edit-modes/draw-rectangle-mode.ts", "../src/edit-modes/two-click-polygon-mode.ts", "../src/edit-modes/draw-square-mode.ts", "../src/edit-modes/draw-rectangle-from-center-mode.ts", "../src/edit-modes/draw-square-from-center-mode.ts", "../src/edit-modes/draw-circle-from-center-mode.ts", "../src/edit-modes/draw-circle-by-diameter-mode.ts", "../src/edit-modes/draw-ellipse-by-bounding-box-mode.ts", "../src/edit-modes/three-click-polygon-mode.ts", "../src/edit-modes/draw-rectangle-using-three-points-mode.ts", "../src/edit-modes/draw-ellipse-using-three-points-mode.ts", "../src/edit-modes/draw-90degree-polygon-mode.ts", "../src/edit-modes/draw-polygon-by-dragging-mode.ts", "../src/edit-modes/snappable-mode.ts", "../src/edit-modes/transform-mode.ts", "../src/edit-modes/composite-mode.ts", "../src/edit-modes/delete-mode.ts", "../src/constants.ts", "../src/editable-layers/editable-layer.ts", "../src/editable-layers/editable-path-layer.ts", "../src/editable-layers/editable-h3-cluster-layer.ts", "../src/editable-layers/selection-layer.ts", "../src/editable-layers/elevated-edit-handle-layer.ts", "../src/widgets/edit-mode-tray-widget.tsx", "../src/widgets/editor-toolbar-widget.tsx", "../src/editable-layers/junction-scatterplot-layer.ts", "../src/edit-modes/resize-circle-mode.ts", "../src/edit-modes/extend-line-string-mode.ts", "../src/edit-modes/measure-distance-mode.ts", "../src/edit-modes/measure-area-mode.ts", "../src/edit-modes/measure-angle-mode.ts"],
|
|
4
|
+
"sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Utils\nexport {toDeckColor} from './utils/utils';\n\n// Types\nexport type {Color, Style, Viewport} from './utils/types';\n\n// Layers\nexport {EditableGeoJsonLayer} from './editable-layers/editable-geojson-layer';\nexport {EditableH3ClusterLayer} from './editable-layers/editable-h3-cluster-layer';\nexport {SelectionLayer} from './editable-layers/selection-layer';\nexport {ElevatedEditHandleLayer} from './editable-layers/elevated-edit-handle-layer';\n\n// Widgets\nexport {EditModeTrayWidget} from './widgets/edit-mode-tray-widget';\nexport type {\n EditModeTrayWidgetProps,\n EditModeTrayWidgetModeOption,\n EditModeTrayWidgetSelectEvent\n} from './widgets/edit-mode-tray-widget';\n\nexport {EditorToolbarWidget} from './widgets/editor-toolbar-widget';\nexport type {EditorToolbarWidgetProps, BooleanOperation} from './widgets/editor-toolbar-widget';\n\n// Layers move to deck.gl-community/layers?\nexport {JunctionScatterplotLayer} from './editable-layers/junction-scatterplot-layer';\n\n// Types\n\nimport * as utils from './utils/utils';\n\nexport {utils};\n\nexport {getPickedEditHandle, getEditHandlesForGeometry} from './edit-modes/utils';\n\nexport type {EditMode} from './edit-modes/edit-mode';\nexport type {GeoJsonEditModeType} from './edit-modes/geojson-edit-mode';\nexport type {GeoJsonEditModeConstructor} from './edit-modes/geojson-edit-mode';\n\nexport type {EditableGeoJsonLayerProps} from './editable-layers/editable-geojson-layer';\nexport type {SelectionLayerProps} from './editable-layers/selection-layer';\n\nexport {GeoJsonEditMode} from './edit-modes/geojson-edit-mode';\n\n// Alter modes\nexport {DeleteMode} from './edit-modes/delete-mode';\nexport {ModifyMode} from './edit-modes/modify-mode';\nexport {ResizeCircleMode} from './edit-modes/resize-circle-mode';\nexport {TranslateMode} from './edit-modes/translate-mode';\nexport {ScaleMode} from './edit-modes/scale-mode';\nexport {RotateMode} from './edit-modes/rotate-mode';\nexport {DuplicateMode} from './edit-modes/duplicate-mode';\nexport {ExtendLineStringMode} from './edit-modes/extend-line-string-mode';\nexport {SplitPolygonMode} from './edit-modes/split-polygon-mode';\nexport {ExtrudeMode} from './edit-modes/extrude-mode';\nexport {ElevationMode} from './edit-modes/elevation-mode';\nexport {TransformMode} from './edit-modes/transform-mode';\n\n// Draw modes\nexport {DrawPointMode} from './edit-modes/draw-point-mode';\nexport {DrawLineStringMode} from './edit-modes/draw-line-string-mode';\nexport {DrawPolygonMode} from './edit-modes/draw-polygon-mode';\nexport {DrawRectangleMode} from './edit-modes/draw-rectangle-mode';\nexport {DrawSquareMode} from './edit-modes/draw-square-mode';\nexport {DrawRectangleFromCenterMode} from './edit-modes/draw-rectangle-from-center-mode';\nexport {DrawSquareFromCenterMode} from './edit-modes/draw-square-from-center-mode';\nexport {DrawCircleByDiameterMode} from './edit-modes/draw-circle-by-diameter-mode';\nexport {DrawCircleFromCenterMode} from './edit-modes/draw-circle-from-center-mode';\nexport {DrawEllipseByBoundingBoxMode} from './edit-modes/draw-ellipse-by-bounding-box-mode';\nexport {DrawEllipseUsingThreePointsMode} from './edit-modes/draw-ellipse-using-three-points-mode';\nexport {DrawRectangleUsingThreePointsMode} from './edit-modes/draw-rectangle-using-three-points-mode';\nexport {Draw90DegreePolygonMode} from './edit-modes/draw-90degree-polygon-mode';\nexport {DrawPolygonByDraggingMode} from './edit-modes/draw-polygon-by-dragging-mode';\nexport {ImmutableFeatureCollection} from './edit-modes/immutable-feature-collection';\n\n// Other modes\nexport {ViewMode} from './edit-modes/view-mode';\nexport {MeasureDistanceMode} from './edit-modes/measure-distance-mode';\nexport {MeasureAreaMode} from './edit-modes/measure-area-mode';\nexport {MeasureAngleMode} from './edit-modes/measure-angle-mode';\nexport {CompositeMode} from './edit-modes/composite-mode';\nexport {SnappableMode} from './edit-modes/snappable-mode';\n\nexport type {\n ScreenCoordinates,\n EditAction,\n Pick,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n GuideFeatureCollection,\n // Viewport,\n Tooltip\n} from './edit-modes/types';\n\nexport type {\n Position,\n SimpleFeature,\n SimpleFeatureCollection,\n SimpleGeometry,\n SimpleGeometryCoordinates,\n Point,\n LineString,\n Polygon,\n MultiPoint,\n MultiLineString,\n MultiPolygon,\n PolygonGeometry,\n Feature,\n FeatureCollection,\n AnyGeoJson\n} from './utils/geojson-types';\n\n// Experimental\nexport {memoize as _memoize} from './utils/memoize';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport pointToLineDistance from '@turf/point-to-line-distance';\nimport {point} from '@turf/helpers';\nimport {WebMercatorViewport} from '@math.gl/web-mercator';\nimport {Feature, LineString, Point, Position} from './geojson-types';\nimport {Viewport} from './types';\n\n// TODO edit-modes: delete and use edit-modes/utils instead\n\nexport type NearestPointType = Feature<Point, {dist: number; index: number}>;\n\nexport function toDeckColor(\n color?: [number, number, number, number] | number,\n defaultColor: [number, number, number, number] = [255, 0, 0, 255]\n): [number, number, number, number] {\n if (!Array.isArray(color)) {\n return defaultColor;\n }\n return [color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255];\n}\n\n//\n// a GeoJSON helper function that calls the provided function with\n// an argument that is the most deeply-nested array having elements\n// that are arrays of primitives as an argument, e.g.\n//\n// {\n// \"type\": \"MultiPolygon\",\n// \"coordinates\": [\n// [\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n// ],\n// [\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n// ]\n// ]\n// }\n//\n// the function would be called on:\n//\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n//\n// and\n//\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n//\nexport function recursivelyTraverseNestedArrays(\n array: Array<any>,\n prefix: Array<number>,\n fn: Function\n) {\n if (!Array.isArray(array[0])) {\n return true;\n }\n for (let i = 0; i < array.length; i++) {\n if (recursivelyTraverseNestedArrays(array[i], [...prefix, i], fn)) {\n fn(array, prefix);\n break;\n }\n }\n return false;\n}\n\nexport function generatePointsParallelToLinePoints(\n p1: Position,\n p2: Position,\n mapCoords: Position\n): Position[] {\n const lineString: LineString = {\n type: 'LineString',\n coordinates: [p1, p2]\n };\n const pt = point(mapCoords);\n const ddistance = pointToLineDistance(pt, lineString);\n const lineBearing = bearing(p1, p2);\n\n // Check if current point is to the left or right of line\n // Line from A=(x1,y1) to B=(x2,y2) a point P=(x,y)\n // then (x\u2212x1)(y2\u2212y1)\u2212(y\u2212y1)(x2\u2212x1)\n const isPointToLeftOfLine =\n (mapCoords[0] - p1[0]) * (p2[1] - p1[1]) - (mapCoords[1] - p1[1]) * (p2[0] - p1[0]);\n\n // Bearing to draw perpendicular to the line string\n const orthogonalBearing = isPointToLeftOfLine < 0 ? lineBearing - 90 : lineBearing - 270;\n\n // Get coordinates for the point p3 and p4 which are perpendicular to the lineString\n // Add the distance as the current position moves away from the lineString\n const p3 = destination(p2, ddistance, orthogonalBearing);\n const p4 = destination(p1, ddistance, orthogonalBearing);\n return [p3.geometry.coordinates, p4.geometry.coordinates] as [Position, Position];\n}\n\nexport function distance2d(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function mix(a: number, b: number, ratio: number): number {\n return b * ratio + a * (1 - ratio);\n}\n\nexport function nearestPointOnProjectedLine(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport\n): NearestPointType {\n const wmViewport = new WebMercatorViewport(viewport);\n // Project the line to viewport, then find the nearest point\n const coordinates: Array<Array<number>> = line.geometry.coordinates as any;\n const projectedCoords = coordinates.map(([x, y, z = 0]) => wmViewport.project([x, y, z]));\n const [x, y] = wmViewport.project(inPoint.geometry.coordinates);\n // console.log('projectedCoords', JSON.stringify(projectedCoords));\n\n let minDistance = Infinity;\n let minPointInfo = {};\n\n projectedCoords.forEach(([x2, y2], index) => {\n if (index === 0) {\n return;\n }\n\n const [x1, y1] = projectedCoords[index - 1];\n\n // line from projectedCoords[index - 1] to projectedCoords[index]\n // convert to Ax + By + C = 0\n const A = y1 - y2;\n const B = x2 - x1;\n const C = x1 * y2 - x2 * y1;\n\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n const div = A * A + B * B;\n const distance = Math.abs(A * x + B * y + C) / Math.sqrt(div);\n\n // TODO: Check if inside bounds\n\n if (distance < minDistance) {\n minDistance = distance;\n minPointInfo = {\n index,\n x0: (B * (B * x - A * y) - A * C) / div,\n y0: (A * (-B * x + A * y) - B * C) / div\n };\n }\n });\n const {index, x0, y0} = minPointInfo as any;\n const [x1, y1, z1 = 0] = projectedCoords[index - 1];\n const [x2, y2, z2 = 0] = projectedCoords[index];\n\n // calculate what ratio of the line we are on to find the proper z\n const lineLength = distance2d(x1, y1, x2, y2);\n const startToPointLength = distance2d(x1, y1, x0, y0);\n const ratio = startToPointLength / lineLength;\n const z0 = mix(z1, z2, ratio);\n\n return {\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: wmViewport.unproject([x0, y0, z0])\n },\n properties: {\n // TODO: calculate the distance in proper units\n dist: minDistance,\n index: index - 1\n }\n };\n}\n\n/**\n * Inserts toInsert string into base string before insertBefore string.\n * @param base A string to insert into.\n * @param insertBeforeText A sub string in `base` string to insert before.\n * @param toInsert A string to insert.\n * @returns Combined string. `base` string if `insertBefore` string isn't found.\n */\nexport function insertBefore(base: string, insertBeforeText: string, toInsert: string): string {\n const at = base.indexOf(insertBeforeText);\n if (at < 0) {\n return base;\n }\n return base.slice(0, at) + toInsert + base.slice(at);\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {UpdateParameters, DefaultProps} from '@deck.gl/core';\nimport {GeoJsonLayer, ScatterplotLayer, IconLayer, TextLayer} from '@deck.gl/layers';\nimport {\n EditAction,\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n PointerMoveEvent,\n DoubleClickEvent,\n ModeProps\n} from '../edit-modes/types';\n\nimport {ViewMode} from '../edit-modes/view-mode';\nimport {TranslateMode} from '../edit-modes/translate-mode';\nimport {ModifyMode} from '../edit-modes/modify-mode';\nimport {ScaleMode} from '../edit-modes/scale-mode';\nimport {RotateMode} from '../edit-modes/rotate-mode';\nimport {DuplicateMode} from '../edit-modes/duplicate-mode';\nimport {SplitPolygonMode} from '../edit-modes/split-polygon-mode';\nimport {ExtrudeMode} from '../edit-modes/extrude-mode';\nimport {ElevationMode} from '../edit-modes/elevation-mode';\nimport {DrawPointMode} from '../edit-modes/draw-point-mode';\nimport {DrawLineStringMode} from '../edit-modes/draw-line-string-mode';\nimport {DrawPolygonMode} from '../edit-modes/draw-polygon-mode';\nimport {DrawRectangleMode} from '../edit-modes/draw-rectangle-mode';\nimport {DrawSquareMode} from '../edit-modes/draw-square-mode';\nimport {DrawRectangleFromCenterMode} from '../edit-modes/draw-rectangle-from-center-mode';\nimport {DrawSquareFromCenterMode} from '../edit-modes/draw-square-from-center-mode';\nimport {DrawCircleFromCenterMode} from '../edit-modes/draw-circle-from-center-mode';\nimport {DrawCircleByDiameterMode} from '../edit-modes/draw-circle-by-diameter-mode';\nimport {DrawEllipseByBoundingBoxMode} from '../edit-modes/draw-ellipse-by-bounding-box-mode';\nimport {DrawRectangleUsingThreePointsMode} from '../edit-modes/draw-rectangle-using-three-points-mode';\nimport {DrawEllipseUsingThreePointsMode} from '../edit-modes/draw-ellipse-using-three-points-mode';\nimport {Draw90DegreePolygonMode} from '../edit-modes/draw-90degree-polygon-mode';\nimport {DrawPolygonByDraggingMode} from '../edit-modes/draw-polygon-by-dragging-mode';\nimport {SnappableMode} from '../edit-modes/snappable-mode';\nimport {TransformMode} from '../edit-modes/transform-mode';\nimport {DeleteMode} from '../edit-modes/delete-mode';\nimport {GeoJsonEditModeType} from '../edit-modes/geojson-edit-mode';\n\nimport {Color} from '../utils/types';\nimport {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants';\n\nimport {EditableLayer, EditableLayerProps} from './editable-layer';\nimport {EditablePathLayer} from './editable-path-layer';\nimport {Feature, FeatureCollection} from '../utils/geojson-types';\n\nconst DEFAULT_LINE_COLOR: Color = [0x0, 0x0, 0x0, 0x99];\nconst DEFAULT_FILL_COLOR: Color = [0x0, 0x0, 0x0, 0x90];\nconst DEFAULT_SELECTED_LINE_COLOR: Color = [0x0, 0x0, 0x0, 0xff];\nconst DEFAULT_SELECTED_FILL_COLOR: Color = [0x0, 0x0, 0x90, 0x90];\nconst DEFAULT_TENTATIVE_LINE_COLOR: Color = [0x90, 0x90, 0x90, 0xff];\nconst DEFAULT_TENTATIVE_FILL_COLOR: Color = [0x90, 0x90, 0x90, 0x90];\nconst DEFAULT_EDITING_EXISTING_POINT_COLOR: Color = [0xc0, 0x0, 0x0, 0xff];\nconst DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR: Color = [0x0, 0x0, 0x0, 0x80];\nconst DEFAULT_EDITING_SNAP_POINT_COLOR: Color = [0x7c, 0x00, 0xc0, 0xff];\nconst DEFAULT_EDITING_POINT_OUTLINE_COLOR: Color = [0xff, 0xff, 0xff, 0xff];\nconst DEFAULT_EDITING_EXISTING_POINT_RADIUS = 5;\nconst DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS = 3;\nconst DEFAULT_EDITING_SNAP_POINT_RADIUS = 7;\nconst DEFAULT_TOOLTIP_FONT_SIZE = 32 * PROJECTED_PIXEL_SIZE_MULTIPLIER;\n\nconst DEFAULT_EDIT_MODE = DrawPolygonMode;\n\nfunction guideAccessor(accessor) {\n if (!accessor || typeof accessor !== 'function') {\n return accessor;\n }\n return (guideMaybeWrapped) => accessor(unwrapGuide(guideMaybeWrapped));\n}\n\n// The object handed to us from deck.gl is different depending on the version of deck.gl used, unwrap as necessary\nfunction unwrapGuide(guideMaybeWrapped) {\n if (guideMaybeWrapped.__source) {\n return guideMaybeWrapped.__source.object;\n } else if (guideMaybeWrapped.sourceFeature) {\n return guideMaybeWrapped.sourceFeature.feature;\n }\n // It is not wrapped, return as is\n return guideMaybeWrapped;\n}\n\nfunction getEditHandleColor(handle) {\n switch (handle.properties.editHandleType) {\n case 'existing':\n return DEFAULT_EDITING_EXISTING_POINT_COLOR;\n case 'snap-source':\n return DEFAULT_EDITING_SNAP_POINT_COLOR;\n case 'intermediate':\n default:\n return DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR;\n }\n}\n\nfunction getEditHandleOutlineColor(handle) {\n return DEFAULT_EDITING_POINT_OUTLINE_COLOR;\n}\n\nfunction getEditHandleRadius(handle) {\n switch (handle.properties.editHandleType) {\n case 'existing':\n return DEFAULT_EDITING_EXISTING_POINT_RADIUS;\n case 'snap':\n return DEFAULT_EDITING_SNAP_POINT_RADIUS;\n case 'intermediate':\n default:\n return DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS;\n }\n}\n\nexport type EditableGeoJsonLayerProps<DataT = any> = EditableLayerProps & {\n data: DataT;\n mode?: any;\n modeConfig?: any;\n selectedFeatureIndexes?: number[];\n onEdit?: (editAction: EditAction<DataT>) => void;\n\n pickable?: boolean;\n pickingRadius?: number;\n pickingDepth?: number;\n fp64?: boolean;\n filled?: boolean;\n stroked?: boolean;\n lineWidthScale?: number;\n lineWidthMinPixels?: number;\n lineWidthMaxPixels?: number;\n pickingLineWidthExtraPixels?: number;\n lineWidthUnits?: string;\n lineJointRounded?: boolean;\n lineCapRounded?: boolean;\n lineMiterLimit?: number;\n pointRadiusScale?: number;\n pointRadiusMinPixels?: number;\n pointRadiusMaxPixels?: number;\n\n getLineColor?: Color | ((feature, isSelected, mode) => Color);\n getFillColor?: Color | ((feature, isSelected, mode) => Color);\n getRadius?: number | ((feature, isSelected, mode) => number);\n getLineWidth?: number | ((feature, isSelected, mode) => number);\n\n getTentativeLineColor?: Color | ((feature, isSelected, mode) => Color);\n getTentativeFillColor?: Color | ((feature, isSelected, mode) => Color);\n getTentativeLineWidth?: number | ((f) => number);\n\n editHandleType?: string;\n\n editHandlePointRadiusScale?: number;\n editHandlePointOutline?: boolean;\n editHandlePointStrokeWidth?: number;\n editHandlePointRadiusUnits?: string;\n editHandlePointRadiusMinPixels?: number;\n editHandlePointRadiusMaxPixels?: number;\n getEditHandlePointColor?: Color | ((handle) => Color);\n getEditHandlePointOutlineColor?: Color | ((handle) => Color);\n getEditHandlePointRadius?: number | ((handle) => number);\n\n // icon handles\n editHandleIconAtlas?: any;\n editHandleIconMapping?: any;\n editHandleIconSizeScale?: number;\n editHandleIconSizeUnits?: string;\n getEditHandleIcon?: (handle) => string;\n getEditHandleIconSize?: number;\n getEditHandleIconColor?: Color | ((handle) => Color);\n getEditHandleIconAngle?: number | ((handle) => number);\n\n // misc\n billboard?: boolean;\n};\n\nconst defaultProps: DefaultProps<EditableGeoJsonLayerProps<any>> = {\n mode: DEFAULT_EDIT_MODE,\n\n // Edit and interaction events\n onEdit: () => {},\n\n pickable: true,\n pickingRadius: 10,\n pickingDepth: 5,\n fp64: false,\n filled: true,\n stroked: true,\n lineWidthScale: PROJECTED_PIXEL_SIZE_MULTIPLIER,\n lineWidthMinPixels: 1,\n lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n pickingLineWidthExtraPixels: 0,\n lineWidthUnits: 'pixels',\n lineJointRounded: false,\n lineCapRounded: false,\n lineMiterLimit: 4,\n pointRadiusScale: 1,\n pointRadiusMinPixels: 2,\n pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,\n getLineColor: (feature, isSelected, mode) =>\n isSelected ? DEFAULT_SELECTED_LINE_COLOR : DEFAULT_LINE_COLOR,\n getFillColor: (feature, isSelected, mode) =>\n isSelected ? DEFAULT_SELECTED_FILL_COLOR : DEFAULT_FILL_COLOR,\n getRadius: (f) =>\n (f && f.properties && f.properties.radius) || (f && f.properties && f.properties.size) || 1,\n getLineWidth: (f) => (f && f.properties && f.properties.lineWidth) || 3,\n\n // Tentative feature rendering\n getTentativeLineColor: (f) => DEFAULT_TENTATIVE_LINE_COLOR,\n getTentativeFillColor: (f) => DEFAULT_TENTATIVE_FILL_COLOR,\n getTentativeLineWidth: (f) => (f && f.properties && f.properties.lineWidth) || 3,\n\n editHandleType: 'point',\n\n // point handles\n editHandlePointRadiusScale: 1,\n editHandlePointOutline: true,\n editHandlePointStrokeWidth: 2,\n editHandlePointRadiusUnits: 'pixels',\n editHandlePointRadiusMinPixels: 4,\n editHandlePointRadiusMaxPixels: 8,\n getEditHandlePointColor: getEditHandleColor,\n getEditHandlePointOutlineColor: getEditHandleOutlineColor,\n getEditHandlePointRadius: getEditHandleRadius,\n\n // icon handles\n editHandleIconAtlas: null,\n editHandleIconMapping: null,\n editHandleIconSizeScale: 1,\n editHandleIconSizeUnits: 'pixels',\n getEditHandleIcon: (handle) => handle.properties.editHandleType,\n getEditHandleIconSize: 10,\n getEditHandleIconColor: getEditHandleColor,\n getEditHandleIconAngle: 0,\n\n // misc\n billboard: true\n};\n\n// Mapping of mode name to mode class (for legacy purposes)\nconst modeNameMapping = {\n view: ViewMode,\n\n // Alter modes\n modify: ModifyMode,\n translate: new SnappableMode(new TranslateMode()),\n\n transform: new SnappableMode(new TransformMode()),\n scale: ScaleMode,\n rotate: RotateMode,\n duplicate: DuplicateMode,\n split: SplitPolygonMode,\n extrude: ExtrudeMode,\n elevation: ElevationMode,\n delete: DeleteMode,\n\n // Draw modes\n drawPoint: DrawPointMode,\n drawLineString: DrawLineStringMode,\n drawPolygon: DrawPolygonMode,\n drawRectangle: DrawRectangleMode,\n drawSquare: DrawSquareMode,\n drawRectangleFromCenter: DrawRectangleFromCenterMode,\n drawSquareFromCenter: DrawSquareFromCenterMode,\n drawCircleFromCenter: DrawCircleFromCenterMode,\n drawCircleByBoundingBox: DrawCircleByDiameterMode,\n drawEllipseByBoundingBox: DrawEllipseByBoundingBoxMode,\n drawRectangleUsing3Points: DrawRectangleUsingThreePointsMode,\n drawEllipseUsing3Points: DrawEllipseUsingThreePointsMode,\n draw90DegreePolygon: Draw90DegreePolygonMode,\n drawPolygonByDragging: DrawPolygonByDraggingMode\n};\n\nexport class EditableGeoJsonLayer extends EditableLayer<\n FeatureCollection,\n EditableGeoJsonLayerProps<FeatureCollection>\n> {\n static layerName = 'EditableGeoJsonLayer';\n static defaultProps = defaultProps;\n\n state: EditableLayer['state'] & {\n cursor?: 'grabbing' | 'grab' | null;\n mode: GeoJsonEditModeType;\n lastPointerMoveEvent: PointerMoveEvent;\n tentativeFeature?: Feature;\n editHandles: any[];\n selectedFeatures: Feature[];\n } = undefined!;\n\n // setState: ($Shape<State>) => void;\n renderLayers() {\n const subLayerProps = this.getSubLayerProps({\n id: 'geojson',\n\n // Proxy most GeoJsonLayer props as-is\n data: this.props.data,\n fp64: this.props.fp64,\n filled: this.props.filled,\n stroked: this.props.stroked,\n lineWidthScale: this.props.lineWidthScale,\n lineWidthMinPixels: this.props.lineWidthMinPixels,\n lineWidthMaxPixels: this.props.lineWidthMaxPixels,\n lineWidthUnits: this.props.lineWidthUnits,\n lineJointRounded: this.props.lineJointRounded,\n lineCapRounded: this.props.lineCapRounded,\n lineMiterLimit: this.props.lineMiterLimit,\n pointRadiusScale: this.props.pointRadiusScale,\n pointRadiusMinPixels: this.props.pointRadiusMinPixels,\n pointRadiusMaxPixels: this.props.pointRadiusMaxPixels,\n getLineColor: this.selectionAwareAccessor(this.props.getLineColor),\n getFillColor: this.selectionAwareAccessor(this.props.getFillColor),\n getPointRadius: this.selectionAwareAccessor(this.props.getRadius),\n getLineWidth: this.selectionAwareAccessor(this.props.getLineWidth),\n\n _subLayerProps: {\n linestrings: {\n billboard: this.props.billboard,\n updateTriggers: {\n // required to update dashed array attribute\n all: [this.props.selectedFeatureIndexes, this.props.mode]\n }\n },\n 'polygons-stroke': {\n billboard: this.props.billboard,\n pickingLineWidthExtraPixels: this.props.pickingLineWidthExtraPixels,\n type: EditablePathLayer,\n updateTriggers: {\n // required to update dashed array attribute\n all: [this.props.selectedFeatureIndexes, this.props.mode]\n }\n }\n },\n\n updateTriggers: {\n getLineColor: [\n this.props.updateTriggers.getLineColor,\n this.props.selectedFeatureIndexes,\n this.props.mode\n ],\n getFillColor: [\n this.props.updateTriggers.getFillColor,\n this.props.selectedFeatureIndexes,\n this.props.mode\n ],\n getPointRadius: [\n this.props.updateTriggers.getPointRadius,\n this.props.selectedFeatureIndexes,\n this.props.mode\n ],\n getLineWidth: [\n this.props.updateTriggers.getLineWidth,\n this.props.selectedFeatureIndexes,\n this.props.mode\n ]\n }\n });\n\n let layers: any = [new GeoJsonLayer(subLayerProps)];\n\n layers = layers.concat(this.createGuidesLayers(), this.createTooltipsLayers());\n\n return layers;\n }\n\n initializeState() {\n super.initializeState();\n\n this.setState({\n selectedFeatures: [],\n editHandles: []\n });\n }\n\n // TODO: is this the best way to properly update state from an outside event handler?\n shouldUpdateState(opts: any) {\n // console.log(\n // 'shouldUpdateState',\n // opts.changeFlags.propsOrDataChanged,\n // opts.changeFlags.stateChanged\n // );\n return super.shouldUpdateState(opts) || opts.changeFlags.stateChanged;\n }\n\n updateState({props, oldProps, changeFlags, context}: UpdateParameters<this>) {\n super.updateState({oldProps, props, changeFlags, context});\n\n if (changeFlags.propsOrDataChanged) {\n const modePropChanged = Object.keys(oldProps).length === 0 || props.mode !== oldProps.mode;\n if (modePropChanged) {\n let mode: DrawPolygonMode;\n if (typeof props.mode === 'function') {\n // They passed a constructor/class, so new it up\n const ModeConstructor = props.mode;\n mode = new ModeConstructor();\n } else if (typeof props.mode === 'string') {\n // Lookup the mode based on its name (for backwards compatibility)\n mode = modeNameMapping[props.mode];\n // eslint-disable-next-line no-console\n console.warn(\n \"Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead.\"\n );\n } else {\n // Should be an instance of EditMode in this case\n mode = props.mode;\n }\n\n if (!mode) {\n console.warn(`No mode configured for ${String(props.mode)}`); // eslint-disable-line no-console,no-undef\n // Use default mode\n mode = new DEFAULT_EDIT_MODE();\n }\n\n if (mode !== this.state.mode) {\n this.setState({mode, cursor: null});\n }\n }\n }\n\n let selectedFeatures = [];\n if (\n Array.isArray(props.selectedFeatureIndexes) &&\n typeof props.data === 'object' &&\n 'features' in props.data\n ) {\n // TODO: needs improved testing, i.e. checking for duplicates, NaNs, out of range numbers, ...\n const propsData = props.data;\n selectedFeatures = props.selectedFeatureIndexes.map((elem) => propsData.features[elem]);\n }\n\n this.setState({selectedFeatures});\n }\n\n getModeProps<DataT>(props: EditableGeoJsonLayerProps<DataT>): ModeProps<DataT> {\n return {\n modeConfig: props.modeConfig,\n data: props.data,\n selectedIndexes: props.selectedFeatureIndexes,\n lastPointerMoveEvent: this.state.lastPointerMoveEvent,\n cursor: this.state.cursor,\n onEdit: (editAction) => {\n // Force a re-render\n // This supports double-click where we need to ensure that there's a re-render between the two clicks\n // even though the data wasn't changed, just the internal tentative feature.\n this.setNeedsUpdate();\n props.onEdit(editAction);\n },\n onUpdateCursor: (cursor: string | null | undefined) => {\n this.setState({cursor});\n }\n };\n }\n\n selectionAwareAccessor(accessor: any) {\n if (typeof accessor !== 'function') {\n return accessor;\n }\n return (feature: Feature) =>\n accessor(feature, this.isFeatureSelected(feature), this.props.mode);\n }\n\n isFeatureSelected(feature: Feature) {\n if (!this.props.data || !this.props.selectedFeatureIndexes) {\n return false;\n }\n if (!this.props.selectedFeatureIndexes.length) {\n return false;\n }\n\n return this.state.selectedFeatures.includes(feature);\n }\n\n getPickingInfo({info, sourceLayer}: Record<string, any>) {\n if (sourceLayer.id.endsWith('guides')) {\n // If user is picking an editing handle, add additional data to the info\n info.isGuide = true;\n }\n\n return info;\n }\n\n _updateAutoHighlight(info) {\n // Extra handling for guides\n if (info?.sourceLayer) {\n if (info.isGuide) {\n for (const layer of info.sourceLayer.getSubLayers()) {\n layer.updateAutoHighlight(info);\n }\n } else {\n info.sourceLayer.updateAutoHighlight(info);\n }\n }\n }\n\n createGuidesLayers() {\n const mode = this.getActiveMode();\n const guides: FeatureCollection = mode.getGuides(this.getModeProps(this.props));\n\n if (!guides || !guides.features.length) {\n return [];\n }\n\n const subLayerProps = {\n linestrings: {\n billboard: this.props.billboard,\n autoHighlight: false\n },\n 'polygons-fill': {\n autoHighlight: false\n },\n 'polygons-stroke': {\n billboard: this.props.billboard\n }\n };\n\n if (this.props.editHandleType === 'icon') {\n subLayerProps['points-icon'] = {\n type: IconLayer,\n iconAtlas: this.props.editHandleIconAtlas,\n iconMapping: this.props.editHandleIconMapping,\n sizeUnits: this.props.editHandleIconSizeUnits,\n sizeScale: this.props.editHandleIconSizeScale,\n getIcon: guideAccessor(this.props.getEditHandleIcon),\n getSize: guideAccessor(this.props.getEditHandleIconSize),\n getColor: guideAccessor(this.props.getEditHandleIconColor),\n getAngle: guideAccessor(this.props.getEditHandleIconAngle),\n billboard: this.props.billboard\n };\n } else {\n subLayerProps['points-circle'] = {\n type: ScatterplotLayer,\n radiusScale: this.props.editHandlePointRadiusScale,\n stroked: this.props.editHandlePointOutline,\n getLineWidth: this.props.editHandlePointStrokeWidth,\n radiusUnits: this.props.editHandlePointRadiusUnits,\n radiusMinPixels: this.props.editHandlePointRadiusMinPixels,\n radiusMaxPixels: this.props.editHandlePointRadiusMaxPixels,\n getRadius: guideAccessor(this.props.getEditHandlePointRadius),\n getFillColor: guideAccessor(this.props.getEditHandlePointColor),\n getLineColor: guideAccessor(this.props.getEditHandlePointOutlineColor),\n billboard: this.props.billboard\n };\n }\n\n const layer = new GeoJsonLayer(\n this.getSubLayerProps({\n id: 'guides',\n data: guides,\n fp64: this.props.fp64,\n _subLayerProps: subLayerProps,\n lineWidthScale: this.props.lineWidthScale,\n lineWidthMinPixels: this.props.lineWidthMinPixels,\n lineWidthMaxPixels: this.props.lineWidthMaxPixels,\n lineWidthUnits: this.props.lineWidthUnits,\n lineJointRounded: this.props.lineJointRounded,\n lineCapRounded: this.props.lineCapRounded,\n lineMiterLimit: this.props.lineMiterLimit,\n getLineColor: guideAccessor(this.props.getTentativeLineColor),\n getLineWidth: guideAccessor(this.props.getTentativeLineWidth),\n getFillColor: guideAccessor(this.props.getTentativeFillColor),\n pointType: this.props.editHandleType === 'icon' ? 'icon' : 'circle',\n iconAtlas: this.props.editHandleIconAtlas\n })\n );\n\n return [layer];\n }\n\n createTooltipsLayers() {\n const mode = this.getActiveMode();\n const tooltips = mode.getTooltips(this.getModeProps(this.props));\n\n const layer = new TextLayer({\n getSize: DEFAULT_TOOLTIP_FONT_SIZE,\n ...this.getSubLayerProps({\n id: 'tooltips',\n data: tooltips\n })\n });\n\n return [layer];\n }\n\n onLayerClick(event: ClickEvent): void {\n this.getActiveMode().handleClick(event, this.getModeProps(this.props));\n }\n\n onLayerDoubleClick(event: DoubleClickEvent): void {\n if (this.getActiveMode().handleDoubleClick) {\n this.getActiveMode().handleDoubleClick(event, this.getModeProps(this.props));\n }\n }\n\n onLayerKeyUp(event: KeyboardEvent): void {\n this.getActiveMode().handleKeyUp(event, this.getModeProps(this.props));\n }\n\n onStartDragging(event: StartDraggingEvent): void {\n this.getActiveMode().handleStartDragging(event, this.getModeProps(this.props));\n }\n\n onDragging(event: DraggingEvent): void {\n this.getActiveMode().handleDragging(event, this.getModeProps(this.props));\n }\n\n onStopDragging(event: StopDraggingEvent): void {\n this.getActiveMode().handleStopDragging(event, this.getModeProps(this.props));\n }\n\n onPointerMove(event: PointerMoveEvent): void {\n this.setState({lastPointerMoveEvent: event});\n this.getActiveMode().handlePointerMove(event, this.getModeProps(this.props));\n }\n\n getCursor({isDragging}: {isDragging: boolean}): null | 'grabbing' | 'grab' {\n if (this.state === null || this.state === undefined) {\n // Layer in 'Awaiting state'\n return null;\n }\n\n let {cursor} = this.state;\n if (!cursor) {\n // default cursor\n cursor = isDragging ? 'grabbing' : 'grab';\n }\n return cursor;\n }\n\n getActiveMode(): GeoJsonEditModeType {\n return this.state.mode;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {featureCollection} from '@turf/helpers';\nimport turfUnion from '@turf/union';\nimport turfDifference from '@turf/difference';\nimport turfIntersect from '@turf/intersect';\nimport rewind from '@turf/rewind';\n\nimport {\n EditAction,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n Pick,\n Tooltip,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {\n FeatureCollection,\n Feature,\n Polygon,\n SimpleGeometry,\n Position,\n SimpleFeatureCollection,\n SimpleFeature\n} from '../utils/geojson-types';\nimport {getPickedEditHandles, getNonGuidePicks} from './utils';\nimport {EditMode} from './edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport type GeoJsonEditAction = EditAction<SimpleFeatureCollection>;\n\nconst DEFAULT_GUIDES: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n};\nconst DEFAULT_TOOLTIPS: Tooltip[] = [];\n\n// Main interface for `EditMode`s that edit GeoJSON\nexport type GeoJsonEditModeType = EditMode<FeatureCollection, FeatureCollection>;\n\nexport interface GeoJsonEditModeConstructor {\n new (): GeoJsonEditModeType;\n}\n\nexport class GeoJsonEditMode implements EditMode<FeatureCollection, GuideFeatureCollection> {\n _clickSequence: Position[] = [];\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n return DEFAULT_GUIDES;\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return DEFAULT_TOOLTIPS;\n }\n\n getSelectedFeature(props: ModeProps<SimpleFeatureCollection>): SimpleFeature | null | undefined {\n if (props.selectedIndexes.length === 1) {\n return props.data.features[props.selectedIndexes[0]];\n }\n return null;\n }\n\n getSelectedGeometry(\n props: ModeProps<SimpleFeatureCollection>\n ): SimpleGeometry | null | undefined {\n const feature = this.getSelectedFeature(props);\n if (feature) {\n return feature.geometry;\n }\n return null;\n }\n\n getSelectedFeaturesAsFeatureCollection(\n props: ModeProps<SimpleFeatureCollection>\n ): SimpleFeatureCollection {\n const {features} = props.data;\n const selectedFeatures = props.selectedIndexes.map((selectedIndex) => features[selectedIndex]);\n return {\n type: 'FeatureCollection',\n features: selectedFeatures\n };\n }\n\n getClickSequence(): Position[] {\n return this._clickSequence;\n }\n\n addClickSequence({mapCoords}: ClickEvent): void {\n this._clickSequence.push(mapCoords);\n }\n\n resetClickSequence(): void {\n this._clickSequence = [];\n }\n\n getTentativeGuide(props: ModeProps<FeatureCollection>): TentativeFeature | null | undefined {\n const guides = this.getGuides(props);\n return guides.features.find(\n (f) => f.properties && f.properties.guideType === 'tentative'\n ) as TentativeFeature;\n }\n\n isSelectionPicked(picks: Pick[], props: ModeProps<FeatureCollection>): boolean {\n if (!picks.length) return false;\n const pickedFeatures = getNonGuidePicks(picks).map(({index}) => index);\n const pickedHandles = getPickedEditHandles(picks).map(\n ({properties}) => properties.featureIndex\n );\n const pickedIndexes = new Set([...pickedFeatures, ...pickedHandles]);\n return props.selectedIndexes.some((index) => pickedIndexes.has(index));\n }\n\n rewindPolygon(feature: SimpleFeature): SimpleFeature {\n const {geometry} = feature;\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n if (isPolygonal) {\n return rewind(feature) as SimpleFeature;\n }\n\n return feature;\n }\n\n getAddFeatureAction(\n featureOrGeometry: SimpleGeometry | Feature,\n features: SimpleFeatureCollection,\n featureProperties?: {}\n ): GeoJsonEditAction {\n // Unsure why flow can't deal with Geometry type, but there I fixed it\n const featureOrGeometryAsAny: any = featureOrGeometry;\n featureProperties = featureProperties || {};\n\n const feature: any =\n featureOrGeometryAsAny.type === 'Feature'\n ? featureOrGeometryAsAny\n : {\n type: 'Feature',\n properties: featureProperties,\n geometry: featureOrGeometryAsAny\n };\n\n const rewindFeature = this.rewindPolygon(feature);\n const updatedData = new ImmutableFeatureCollection(features)\n .addFeature(rewindFeature)\n .getObject();\n\n return {\n updatedData,\n editType: 'addFeature',\n editContext: {\n featureIndexes: [updatedData.features.length - 1]\n }\n };\n }\n\n getAddManyFeaturesAction(\n {features: featuresToAdd}: SimpleFeatureCollection,\n features: SimpleFeatureCollection\n ): GeoJsonEditAction {\n let updatedData = new ImmutableFeatureCollection(features);\n const initialIndex = updatedData.getObject().features.length;\n const updatedIndexes: number[] = [];\n for (const feature of featuresToAdd) {\n const {properties, geometry} = feature;\n const geometryAsAny: any = geometry;\n updatedData = updatedData.addFeature({\n type: 'Feature',\n properties,\n geometry: geometryAsAny\n });\n updatedIndexes.push(initialIndex + updatedIndexes.length);\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType: 'addFeature',\n editContext: {\n featureIndexes: updatedIndexes\n }\n };\n }\n\n // eslint-disable-next-line complexity\n getAddFeatureOrBooleanPolygonAction(\n featureOrGeometry: Polygon | Feature,\n props: ModeProps<SimpleFeatureCollection>,\n featureProperties?: {}\n ): GeoJsonEditAction | null | undefined {\n const featureOrGeometryAsAny: any = featureOrGeometry;\n featureProperties = featureProperties || {};\n\n const selectedFeature = this.getSelectedFeature(props);\n const {modeConfig} = props;\n if (modeConfig && modeConfig.booleanOperation) {\n if (\n !selectedFeature ||\n (selectedFeature.geometry.type !== 'Polygon' &&\n selectedFeature.geometry.type !== 'MultiPolygon')\n ) {\n // eslint-disable-next-line no-console,no-undef\n console.warn(\n 'booleanOperation only supported for single Polygon or MultiPolygon selection'\n );\n return null;\n }\n\n const feature =\n featureOrGeometryAsAny.type === 'Feature'\n ? featureOrGeometryAsAny\n : {\n type: 'Feature',\n geometry: featureOrGeometryAsAny\n };\n\n let updatedGeometry;\n if (modeConfig.booleanOperation === 'union') {\n updatedGeometry = turfUnion(featureCollection([selectedFeature, feature]));\n } else if (modeConfig.booleanOperation === 'difference') {\n updatedGeometry = turfDifference(featureCollection([selectedFeature, feature]));\n } else if (modeConfig.booleanOperation === 'intersection') {\n updatedGeometry = turfIntersect(featureCollection([selectedFeature, feature]));\n } else {\n // eslint-disable-next-line no-console,no-undef\n console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`);\n return null;\n }\n\n if (!updatedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('Canceling edit. Boolean operation erased entire polygon.');\n return null;\n }\n\n const featureIndex = props.selectedIndexes[0];\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(featureIndex, updatedGeometry.geometry)\n .getObject();\n\n const editAction: GeoJsonEditAction = {\n updatedData,\n editType: 'unionGeometry',\n editContext: {\n featureIndexes: [featureIndex]\n }\n };\n\n return editAction;\n }\n return this.getAddFeatureAction(featureOrGeometry, props.data, featureProperties);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature | null {\n return null;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {}\n handleDoubleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {}\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n const tentativeFeature = this.createTentativeFeature(props);\n if (tentativeFeature) {\n props.onEdit({\n updatedData: props.data,\n editType: 'updateTentativeFeature',\n editContext: {\n feature: tentativeFeature\n }\n });\n }\n }\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void {}\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void {}\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void {}\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<FeatureCollection>): void {\n if (event.key === 'Escape') {\n this.resetClickSequence();\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n}\n\nexport function getIntermediatePosition(position1: Position, position2: Position): Position {\n const intermediatePosition: Position = [\n (position1[0] + position2[0]) / 2.0,\n (position1[1] + position2[1]) / 2.0\n ];\n\n return intermediatePosition;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable no-shadow */\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport pointToLineDistance from '@turf/point-to-line-distance';\nimport {flattenEach} from '@turf/meta';\nimport {point} from '@turf/helpers';\nimport {getCoords} from '@turf/invariant';\nimport {WebMercatorViewport} from '@math.gl/web-mercator';\nimport {Viewport, Pick, EditHandleFeature, EditHandleType, StartDraggingEvent} from './types';\nimport {\n SimpleGeometry,\n Position,\n Point,\n LineString,\n Polygon,\n Feature,\n SimpleGeometryCoordinates\n} from '../utils/geojson-types';\n\nexport type NearestPointType = Feature<Point, {dist: number; index: number}>;\n\nexport function toDeckColor(\n color?: [number, number, number, number] | number,\n defaultColor: [number, number, number, number] = [255, 0, 0, 255]\n): [number, number, number, number] {\n if (!Array.isArray(color)) {\n return defaultColor;\n }\n return [color[0] * 255, color[1] * 255, color[2] * 255, color[3] * 255];\n}\n\n//\n// a GeoJSON helper function that calls the provided function with\n// an argument that is the most deeply-nested array having elements\n// that are arrays of primitives as an argument, e.g.\n//\n// {\n// \"type\": \"MultiPolygon\",\n// \"coordinates\": [\n// [\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n// ],\n// [\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n// ]\n// ]\n// }\n//\n// the function would be called on:\n//\n// [[30, 20], [45, 40], [10, 40], [30, 20]]\n//\n// and\n//\n// [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]]\n//\nexport function recursivelyTraverseNestedArrays(\n array: Array<any>,\n prefix: Array<number>,\n fn: (array: Array<any>, prefix: number[]) => void\n) {\n if (!Array.isArray(array[0])) {\n return true;\n }\n for (let i = 0; i < array.length; i++) {\n if (recursivelyTraverseNestedArrays(array[i], [...prefix, i], fn)) {\n fn(array, prefix);\n break;\n }\n }\n return false;\n}\n\nexport function generatePointsParallelToLinePoints(\n p1: Position,\n p2: Position,\n coords: Position\n): Position[] {\n const lineString: LineString = {\n type: 'LineString',\n coordinates: [p1, p2]\n };\n const pt = point(coords);\n const ddistance = pointToLineDistance(pt, lineString);\n const lineBearing = bearing(p1, p2);\n\n // Check if current point is to the left or right of line\n // Line from A=(x1,y1) to B=(x2,y2) a point P=(x,y)\n // then (x\u2212x1)(y2\u2212y1)\u2212(y\u2212y1)(x2\u2212x1)\n const isPointToLeftOfLine =\n (coords[0] - p1[0]) * (p2[1] - p1[1]) - (coords[1] - p1[1]) * (p2[0] - p1[0]);\n\n // Bearing to draw perpendicular to the line string\n const orthogonalBearing = isPointToLeftOfLine < 0 ? lineBearing - 90 : lineBearing - 270;\n\n // Get coordinates for the point p3 and p4 which are perpendicular to the lineString\n // Add the distance as the current position moves away from the lineString\n const p3 = destination(p2, ddistance, orthogonalBearing);\n const p4 = destination(p1, ddistance, orthogonalBearing);\n\n return [p3.geometry.coordinates, p4.geometry.coordinates] as Position[];\n}\n\nexport function distance2d(x1: number, y1: number, x2: number, y2: number): number {\n const dx = x1 - x2;\n const dy = y1 - y2;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\nexport function mix(a: number, b: number, ratio: number): number {\n return b * ratio + a * (1 - ratio);\n}\n\nexport function nearestPointOnProjectedLine(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport\n): NearestPointType {\n const wmViewport = new WebMercatorViewport(viewport);\n // Project the line to viewport, then find the nearest point\n const coordinates: Array<Array<number>> = line.geometry.coordinates as any;\n const projectedCoords = coordinates.map(([x, y, z = 0]) => wmViewport.project([x, y, z]));\n const [x, y] = wmViewport.project(inPoint.geometry.coordinates);\n // console.log('projectedCoords', JSON.stringify(projectedCoords));\n\n let minDistance = Infinity;\n let minPointInfo = {};\n\n projectedCoords.forEach(([x2, y2], index) => {\n if (index === 0) {\n return;\n }\n\n const [x1, y1] = projectedCoords[index - 1];\n\n // line from projectedCoords[index - 1] to projectedCoords[index]\n // convert to Ax + By + C = 0\n const A = y1 - y2;\n const B = x2 - x1;\n const C = x1 * y2 - x2 * y1;\n\n // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line\n const div = A * A + B * B;\n const distance = Math.abs(A * x + B * y + C) / Math.sqrt(div);\n\n // TODO: Check if inside bounds\n\n if (distance < minDistance) {\n minDistance = distance;\n minPointInfo = {\n index,\n x0: (B * (B * x - A * y) - A * C) / div,\n y0: (A * (-B * x + A * y) - B * C) / div\n };\n }\n });\n // @ts-expect-error TODO\n const {index, x0, y0} = minPointInfo;\n const [x1, y1, z1 = 0] = projectedCoords[index - 1];\n const [x2, y2, z2 = 0] = projectedCoords[index];\n\n // calculate what ratio of the line we are on to find the proper z\n const lineLength = distance2d(x1, y1, x2, y2);\n const startToPointLength = distance2d(x1, y1, x0, y0);\n const ratio = startToPointLength / lineLength;\n const z0 = mix(z1, z2, ratio);\n\n return {\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: wmViewport.unproject([x0, y0, z0])\n },\n properties: {\n // TODO: calculate the distance in proper units\n dist: minDistance,\n index: index - 1\n }\n };\n}\n\nexport function nearestPointOnLine( // <G extends LineString | MultiLineString>(\n lines: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport?: Viewport\n): NearestPointType {\n let mercator;\n\n if (viewport) {\n mercator = new WebMercatorViewport(viewport);\n }\n let closestPoint: any = point([Infinity, Infinity], {\n dist: Infinity\n });\n\n if (!lines.geometry?.coordinates.length || lines.geometry?.coordinates.length < 2) {\n return closestPoint;\n }\n\n // eslint-disable-next-line max-statements, complexity\n flattenEach(lines, (line: any) => {\n const coords: any = getCoords(line);\n const pointCoords: any = getCoords(inPoint);\n\n let minDist;\n let to;\n let from;\n let x;\n let y;\n let segmentIdx;\n let dist;\n\n if (coords.length > 1 && pointCoords.length) {\n let lineCoordinates;\n let pointCoordinate;\n\n // If viewport is given, then translate these coordinates to pixels to increase precision\n if (mercator) {\n lineCoordinates = coords.map((lineCoordinate) => mercator.project(lineCoordinate));\n pointCoordinate = mercator.project(pointCoords);\n } else {\n lineCoordinates = coords;\n pointCoordinate = pointCoords;\n }\n\n for (let n = 1; n < lineCoordinates.length; n++) {\n if (lineCoordinates[n][0] !== lineCoordinates[n - 1][0]) {\n const slope =\n (lineCoordinates[n][1] - lineCoordinates[n - 1][1]) /\n (lineCoordinates[n][0] - lineCoordinates[n - 1][0]);\n const inverseSlope = lineCoordinates[n][1] - slope * lineCoordinates[n][0];\n\n dist =\n Math.abs(slope * pointCoordinate[0] + inverseSlope - pointCoordinate[1]) /\n Math.sqrt(slope * slope + 1);\n } else dist = Math.abs(pointCoordinate[0] - lineCoordinates[n][0]);\n\n // length^2 of line segment\n const rl2 =\n Math.pow(lineCoordinates[n][1] - lineCoordinates[n - 1][1], 2) +\n Math.pow(lineCoordinates[n][0] - lineCoordinates[n - 1][0], 2);\n\n // distance^2 of pt to end line segment\n const ln2 =\n Math.pow(lineCoordinates[n][1] - pointCoordinate[1], 2) +\n Math.pow(lineCoordinates[n][0] - pointCoordinate[0], 2);\n\n // distance^2 of pt to begin line segment\n const lnm12 =\n Math.pow(lineCoordinates[n - 1][1] - pointCoordinate[1], 2) +\n Math.pow(lineCoordinates[n - 1][0] - pointCoordinate[0], 2);\n\n // minimum distance^2 of pt to infinite line\n const dist2 = Math.pow(dist, 2);\n\n // calculated length^2 of line segment\n const calcrl2 = ln2 - dist2 + lnm12 - dist2;\n\n // redefine minimum distance to line segment (not infinite line) if necessary\n if (calcrl2 > rl2) {\n dist = Math.sqrt(Math.min(ln2, lnm12));\n }\n\n if (minDist === null || minDist === undefined || minDist > dist) {\n // eslint-disable-next-line max-depth\n if (calcrl2 > rl2) {\n // eslint-disable-next-line max-depth\n if (lnm12 < ln2) {\n to = 0; // nearer to previous point\n from = 1;\n } else {\n from = 0; // nearer to current point\n to = 1;\n }\n } else {\n // perpendicular from point intersects line segment\n to = Math.sqrt(lnm12 - dist2) / Math.sqrt(rl2);\n from = Math.sqrt(ln2 - dist2) / Math.sqrt(rl2);\n }\n minDist = dist;\n segmentIdx = n;\n }\n }\n\n const dx = lineCoordinates[segmentIdx - 1][0] - lineCoordinates[segmentIdx][0];\n const dy = lineCoordinates[segmentIdx - 1][1] - lineCoordinates[segmentIdx][1];\n\n x = lineCoordinates[segmentIdx - 1][0] - dx * to;\n y = lineCoordinates[segmentIdx - 1][1] - dy * to;\n }\n\n // index needs to be -1 because we have to account for the shift from initial backscan\n let snapPoint = {x, y, idx: segmentIdx - 1, to, from};\n\n if (mercator) {\n const pixelToLatLong = mercator.unproject([snapPoint.x, snapPoint.y]);\n snapPoint = {\n x: pixelToLatLong[0],\n y: pixelToLatLong[1],\n idx: segmentIdx - 1,\n to,\n from\n };\n }\n\n closestPoint = point([snapPoint.x, snapPoint.y], {\n dist: Math.abs(snapPoint.from - snapPoint.to),\n index: snapPoint.idx\n });\n });\n\n return closestPoint;\n}\n\nexport function getPickedEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.length ? handles[0] : null;\n}\n\nexport function getPickedSnapSourceEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find((handle) => handle.properties.editHandleType === 'snap-source');\n}\n\nexport function getNonGuidePicks(picks: Pick[]): Pick[] {\n return picks && picks.filter((pick) => !pick.isGuide);\n}\n\nexport function getPickedExistingEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find(\n ({properties}) => properties.featureIndex >= 0 && properties.editHandleType === 'existing'\n );\n}\n\nexport function getPickedIntermediateEditHandle(\n picks: Pick[] | null | undefined\n): EditHandleFeature | null | undefined {\n const handles = getPickedEditHandles(picks);\n return handles.find(\n ({properties}) => properties.featureIndex >= 0 && properties.editHandleType === 'intermediate'\n );\n}\n\nexport function getPickedEditHandles(picks: Pick[] | null | undefined): EditHandleFeature[] {\n const handles =\n (picks &&\n picks\n .filter((pick) => pick.isGuide && pick.object.properties.guideType === 'editHandle')\n .map((pick) => pick.object)) ||\n [];\n\n return handles;\n}\n\nexport function getEditHandlesForGeometry(\n geometry: SimpleGeometry,\n featureIndex: number,\n editHandleType: EditHandleType = 'existing'\n): EditHandleFeature[] {\n let handles: EditHandleFeature[] = [];\n\n switch (geometry.type) {\n case 'Point':\n // positions are not nested\n handles = [\n {\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType,\n positionIndexes: [],\n featureIndex\n },\n geometry: {\n type: 'Point',\n coordinates: geometry.coordinates\n }\n }\n ];\n break;\n case 'MultiPoint':\n case 'LineString':\n // positions are nested 1 level\n handles = handles.concat(\n getEditHandlesForCoordinates(geometry.coordinates, [], featureIndex, editHandleType)\n );\n break;\n case 'Polygon':\n case 'MultiLineString':\n // positions are nested 2 levels\n for (let a = 0; a < geometry.coordinates.length; a++) {\n handles = handles.concat(\n getEditHandlesForCoordinates(geometry.coordinates[a], [a], featureIndex, editHandleType)\n );\n if (geometry.type === 'Polygon') {\n // Don't repeat the first/last handle for Polygons\n handles = handles.slice(0, -1);\n }\n }\n\n break;\n case 'MultiPolygon':\n // positions are nested 3 levels\n for (let a = 0; a < geometry.coordinates.length; a++) {\n for (let b = 0; b < geometry.coordinates[a].length; b++) {\n handles = handles.concat(\n getEditHandlesForCoordinates(\n geometry.coordinates[a][b],\n [a, b],\n featureIndex,\n editHandleType\n )\n );\n // Don't repeat the first/last handle for Polygons\n handles = handles.slice(0, -1);\n }\n }\n\n break;\n default:\n throw Error(`Unhandled geometry type: ${(geometry as {type: string}).type}`);\n }\n\n return handles;\n}\n\nfunction getEditHandlesForCoordinates(\n coordinates: any[],\n positionIndexPrefix: number[],\n featureIndex: number,\n editHandleType: EditHandleType = 'existing'\n): EditHandleFeature[] {\n const editHandles: EditHandleFeature[] = [];\n for (let i = 0; i < coordinates.length; i++) {\n const position = coordinates[i] as Position;\n editHandles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n positionIndexes: [...positionIndexPrefix, i],\n featureIndex,\n editHandleType\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n return editHandles;\n}\n\n/**\n * Calculates coordinates for a feature preserving rectangular shape.\n * @param feature Feature before modification.\n * @param editHandleIndex Index of the point to modify.\n * @param coords New position for the point.\n * @returns Updated coordinates.\n */\nexport function updateRectanglePosition(\n feature: Feature<Polygon>,\n editHandleIndex: number,\n coords: Position\n): Position[][] | null {\n const coordinates = feature.geometry.coordinates;\n if (!coordinates) {\n return null;\n }\n\n const points = coordinates[0].slice(0, 4);\n points[editHandleIndex % 4] = coords;\n\n const p0 = points[(editHandleIndex + 2) % 4];\n const p2 = points[editHandleIndex % 4];\n points[(editHandleIndex + 1) % 4] = [p2[0], p0[1]];\n points[(editHandleIndex + 3) % 4] = [p0[0], p2[1]];\n\n return [[...points, points[0]]];\n}\n\n/** Creates a copy of feature's coordinates.\n * Each position in coordinates is transformed by calling the provided function.\n * @param coords Coordinates of a feature.\n * @param callback A function to transform each coordinate.\n * @retuns Transformed coordinates.\n */\nexport function mapCoords(\n coords: SimpleGeometryCoordinates,\n callback: (coords: Position) => Position\n): SimpleGeometryCoordinates {\n if (typeof coords[0] === 'number') {\n if (!isNaN(coords[0]) && isFinite(coords[0])) {\n return callback(coords as Position);\n }\n return coords;\n }\n\n return (coords as Position[])\n .map((coord) => {\n return mapCoords(coord, callback) as Position;\n })\n .filter(Boolean);\n}\n\nexport function shouldCancelPan(event: StartDraggingEvent) {\n return event.picks.length && event.picks.find((p) => p.featureType === 'points');\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n SimpleFeatureCollection,\n SimpleGeometry,\n Polygon,\n MultiLineString,\n MultiPolygon,\n Position,\n SimpleFeature\n} from '../utils/geojson-types';\n\nexport class ImmutableFeatureCollection {\n featureCollection: Readonly<SimpleFeatureCollection>;\n\n constructor(featureCollection: SimpleFeatureCollection) {\n this.featureCollection = featureCollection;\n }\n\n getObject() {\n return this.featureCollection;\n }\n\n /**\n * Replaces the position deeply nested withing the given feature's geometry.\n * Works with Point, MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the position to replace\n * @param updatedPosition The updated position to place in the result (i.e. [lng, lat])\n *\n * @returns A new `ImmutableFeatureCollection` with the given position replaced. Does not modify this `ImmutableFeatureCollection`.\n */\n replacePosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined,\n updatedPosition: Position\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyReplacePosition(\n geometry.coordinates,\n positionIndexes,\n updatedPosition,\n isPolygonal\n )\n };\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n /**\n * Removes a position deeply nested in a GeoJSON geometry coordinates array.\n * Works with MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the postion to remove\n *\n * @returns A new `ImmutableFeatureCollection` with the given coordinate removed. Does not modify this `ImmutableFeatureCollection`.\n *\n */\n // eslint-disable-next-line complexity\n removePosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n if (geometry.type === 'Point') {\n throw Error(\"Can't remove a position from a Point or there'd be nothing left\");\n }\n if (\n geometry.type === 'MultiPoint' && // only 1 point left\n geometry.coordinates.length < 2\n ) {\n throw Error(\"Can't remove the last point of a MultiPoint or there'd be nothing left\");\n }\n if (\n geometry.type === 'LineString' && // only 2 positions\n geometry.coordinates.length < 3\n ) {\n throw Error(\"Can't remove position. LineString must have at least two positions\");\n }\n if (\n geometry.type === 'Polygon' && // outer ring is a triangle\n geometry.coordinates[0].length < 5 &&\n Array.isArray(positionIndexes) && // trying to remove from outer ring\n positionIndexes[0] === 0\n ) {\n throw Error(\"Can't remove position. Polygon's outer ring must have at least four positions\");\n }\n if (\n geometry.type === 'MultiLineString' && // only 1 LineString left\n geometry.coordinates.length === 1 && // only 2 positions\n geometry.coordinates[0].length < 3\n ) {\n throw Error(\"Can't remove position. MultiLineString must have at least two positions\");\n }\n if (\n geometry.type === 'MultiPolygon' && // only 1 polygon left\n geometry.coordinates.length === 1 && // outer ring is a triangle\n geometry.coordinates[0][0].length < 5 &&\n Array.isArray(positionIndexes) && // trying to remove from first polygon\n positionIndexes[0] === 0 && // trying to remove from outer ring\n positionIndexes[1] === 0\n ) {\n throw Error(\n \"Can't remove position. MultiPolygon's outer ring must have at least four positions\"\n );\n }\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyRemovePosition(geometry.coordinates, positionIndexes, isPolygonal)\n };\n\n // Handle cases where incomplete geometries need pruned (e.g. holes that were triangles)\n pruneGeometryIfNecessary(updatedGeometry);\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n /**\n * Adds a position deeply nested in a GeoJSON geometry coordinates array.\n * Works with MultiPoint, LineString, MultiLineString, Polygon, and MultiPolygon.\n *\n * @param featureIndex The index of the feature to update\n * @param positionIndexes An array containing the indexes of the position that will proceed the new position\n * @param positionToAdd The new position to place in the result (i.e. [lng, lat])\n *\n * @returns A new `ImmutableFeatureCollection` with the given coordinate removed. Does not modify this `ImmutableFeatureCollection`.\n */\n addPosition(\n featureIndex: number,\n positionIndexes: number[] | null | undefined,\n positionToAdd: Position\n ): ImmutableFeatureCollection {\n const geometry = this.featureCollection.features[featureIndex].geometry;\n\n if (geometry.type === 'Point') {\n throw new Error('Unable to add a position to a Point feature');\n }\n\n const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon';\n const updatedGeometry: any = {\n ...geometry,\n coordinates: immutablyAddPosition(\n geometry.coordinates,\n positionIndexes,\n positionToAdd,\n isPolygonal\n )\n };\n\n return this.replaceGeometry(featureIndex, updatedGeometry);\n }\n\n replaceGeometry(featureIndex: number, geometry: SimpleGeometry): ImmutableFeatureCollection {\n const updatedFeature: any = {\n ...this.featureCollection.features[featureIndex],\n geometry\n };\n\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features: [\n ...this.featureCollection.features.slice(0, featureIndex),\n updatedFeature,\n ...this.featureCollection.features.slice(featureIndex + 1)\n ]\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n\n addFeature(feature: SimpleFeature): ImmutableFeatureCollection {\n return this.addFeatures([feature]);\n }\n\n addFeatures(features: SimpleFeature[]): ImmutableFeatureCollection {\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features: [...this.featureCollection.features, ...features]\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n\n deleteFeature(featureIndex: number) {\n return this.deleteFeatures([featureIndex]);\n }\n\n deleteFeatures(featureIndexes: number[]) {\n const features = [...this.featureCollection.features];\n featureIndexes.sort();\n for (let i = featureIndexes.length - 1; i >= 0; i--) {\n const featureIndex = featureIndexes[i];\n if (featureIndex >= 0 && featureIndex < features.length) {\n features.splice(featureIndex, 1);\n }\n }\n\n const updatedFeatureCollection = {\n ...this.featureCollection,\n features\n };\n\n return new ImmutableFeatureCollection(updatedFeatureCollection);\n }\n}\n\nfunction getUpdatedPosition(updatedPosition: Position, previousPosition: Position): Position {\n // This function checks if the updatedPosition is missing elevation\n // and copies it from previousPosition\n if (updatedPosition.length === 2 && previousPosition.length === 3) {\n const elevation = (previousPosition as any)[2];\n return [updatedPosition[0], updatedPosition[1], elevation];\n }\n\n return updatedPosition;\n}\n\nfunction immutablyReplacePosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n updatedPosition: Position,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n return getUpdatedPosition(updatedPosition, coordinates);\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n getUpdatedPosition(updatedPosition, coordinates[positionIndexes[0]]),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n\n if (\n isPolygonal &&\n (positionIndexes[0] === 0 || positionIndexes[0] === coordinates.length - 1)\n ) {\n // for polygons, the first point is repeated at the end of the array\n // so, update it on both ends of the array\n updated[0] = getUpdatedPosition(updatedPosition, coordinates[0]);\n updated[coordinates.length - 1] = getUpdatedPosition(updatedPosition, coordinates[0]);\n }\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyReplacePosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n updatedPosition,\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction immutablyRemovePosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n throw Error('Must specify the index of the position to remove');\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n\n if (\n isPolygonal &&\n (positionIndexes[0] === 0 || positionIndexes[0] === coordinates.length - 1)\n ) {\n // for polygons, the first point is repeated at the end of the array\n // so, if the first/last coordinate is to be removed, coordinates[1] will be the new first/last coordinate\n if (positionIndexes[0] === 0) {\n // change the last to be the same as the first\n updated[updated.length - 1] = updated[0];\n } else if (positionIndexes[0] === coordinates.length - 1) {\n // change the first to be the same as the last\n updated[0] = updated[updated.length - 1];\n }\n }\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyRemovePosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction immutablyAddPosition(\n coordinates: any,\n positionIndexes: number[] | null | undefined,\n positionToAdd: Position,\n isPolygonal: boolean\n): any {\n if (!positionIndexes) {\n return coordinates;\n }\n if (positionIndexes.length === 0) {\n throw Error('Must specify the index of the position to remove');\n }\n if (positionIndexes.length === 1) {\n const updated = [\n ...coordinates.slice(0, positionIndexes[0]),\n positionToAdd,\n ...coordinates.slice(positionIndexes[0])\n ];\n return updated;\n }\n\n // recursively update inner array\n return [\n ...coordinates.slice(0, positionIndexes[0]),\n immutablyAddPosition(\n coordinates[positionIndexes[0]],\n positionIndexes.slice(1, positionIndexes.length),\n positionToAdd,\n isPolygonal\n ),\n ...coordinates.slice(positionIndexes[0] + 1)\n ];\n}\n\nfunction pruneGeometryIfNecessary(geometry: SimpleGeometry) {\n switch (geometry.type) {\n case 'Polygon':\n prunePolygonIfNecessary(geometry);\n break;\n case 'MultiLineString':\n pruneMultiLineStringIfNecessary(geometry);\n break;\n case 'MultiPolygon':\n pruneMultiPolygonIfNecessary(geometry);\n break;\n default:\n // Not downgradable\n break;\n }\n}\n\nfunction prunePolygonIfNecessary(geometry: Polygon) {\n const polygon = geometry.coordinates;\n\n // If any hole is no longer a polygon, remove the hole entirely\n for (let holeIndex = 1; holeIndex < polygon.length; holeIndex++) {\n if (removeHoleIfNecessary(polygon, holeIndex)) {\n // It was removed, so keep the index the same\n holeIndex--;\n }\n }\n}\n\nfunction pruneMultiLineStringIfNecessary(geometry: MultiLineString) {\n for (let lineStringIndex = 0; lineStringIndex < geometry.coordinates.length; lineStringIndex++) {\n const lineString = geometry.coordinates[lineStringIndex];\n if (lineString.length === 1) {\n // Only a single position left on this LineString, so remove it (can't have Point in MultiLineString)\n geometry.coordinates.splice(lineStringIndex, 1);\n // Keep the index the same\n lineStringIndex--;\n }\n }\n}\n\nfunction pruneMultiPolygonIfNecessary(geometry: MultiPolygon) {\n for (let polygonIndex = 0; polygonIndex < geometry.coordinates.length; polygonIndex++) {\n const polygon = geometry.coordinates[polygonIndex];\n const outerRing = polygon[0];\n\n // If the outer ring is no longer a polygon, remove the whole polygon\n if (outerRing.length <= 3) {\n geometry.coordinates.splice(polygonIndex, 1);\n // It was removed, so keep the index the same\n polygonIndex--;\n }\n\n for (let holeIndex = 1; holeIndex < polygon.length; holeIndex++) {\n if (removeHoleIfNecessary(polygon, holeIndex)) {\n // It was removed, so keep the index the same\n holeIndex--;\n }\n }\n }\n}\n\nfunction removeHoleIfNecessary(polygon: Polygon['coordinates'], holeIndex: number) {\n const hole = polygon[holeIndex];\n if (hole.length <= 3) {\n polygon.splice(holeIndex, 1);\n return true;\n }\n return false;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class ViewMode extends GeoJsonEditMode {}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfBearing from '@turf/bearing';\nimport turfDistance from '@turf/distance';\nimport clone from '@turf/clone';\nimport {point} from '@turf/helpers';\nimport {WebMercatorViewport} from '@math.gl/web-mercator';\nimport {\n FeatureCollection,\n Position,\n SimpleGeometry,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps\n} from './types';\nimport {mapCoords} from './utils';\nimport {translateFromCenter} from '../utils/translate-from-center';\nimport {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class TranslateMode extends GeoJsonEditMode {\n _geometryBeforeTranslate: SimpleFeatureCollection | null | undefined;\n _isTranslatable: boolean = undefined!;\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isTranslatable) {\n // Nothing to do\n return;\n }\n\n if (this._geometryBeforeTranslate) {\n // Translate the geometry\n const editAction = this.getTranslateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'translating',\n props\n );\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n\n // cancel map panning\n event.cancelPan();\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n this._isTranslatable = this.isSelectionPicked(event.pointerDownPicks || event.picks, props);\n\n this.updateCursor(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isTranslatable) {\n return;\n }\n\n event.cancelPan();\n this._geometryBeforeTranslate = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._geometryBeforeTranslate) {\n // Translate the geometry\n const editAction = this.getTranslateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'translated',\n props\n );\n\n if (editAction) {\n props.onEdit(editAction);\n }\n\n this._geometryBeforeTranslate = null;\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._isTranslatable) {\n props.onUpdateCursor('move');\n } else {\n props.onUpdateCursor(null);\n }\n }\n\n // eslint-disable-next-line max-statements\n getTranslateAction(\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ): GeoJsonEditAction | null | undefined {\n if (!this._geometryBeforeTranslate) {\n return null;\n }\n\n let updatedData = new ImmutableFeatureCollection(props.data);\n const selectedIndexes = props.selectedIndexes;\n\n const {viewport: viewportDesc, screenSpace} = props.modeConfig || {};\n\n // move features without adapting to mercator projection\n if (viewportDesc && screenSpace) {\n const viewport = viewportDesc.project ? viewportDesc : new WebMercatorViewport(viewportDesc);\n\n const from = viewport.project(startDragPoint);\n const to = viewport.project(currentPoint);\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const feature = this._geometryBeforeTranslate.features[i];\n\n let coordinates = feature.geometry.coordinates;\n if (coordinates) {\n coordinates = mapCoords(coordinates, (coord) => {\n const pixels = viewport.project(coord);\n if (pixels) {\n pixels[0] += dx;\n pixels[1] += dy;\n return viewport.unproject(pixels);\n }\n return null;\n });\n\n updatedData = updatedData.replaceGeometry(selectedIndex, {\n type: feature.geometry.type,\n coordinates\n } as SimpleGeometry);\n }\n }\n } else {\n const p1 = point(startDragPoint);\n const p2 = point(currentPoint);\n\n const distanceMoved = turfDistance(p1, p2);\n const direction = turfBearing(p1, p2);\n\n const movedFeatures = this._geometryBeforeTranslate.features.map((feature) =>\n translateFromCenter(clone(feature), distanceMoved, direction)\n );\n\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = movedFeatures[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType,\n editContext: {\n featureIndexes: selectedIndexes\n }\n };\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfCenter from '@turf/center';\nimport turfRhumbBearing from '@turf/rhumb-bearing';\nimport turfRhumbDistance from '@turf/rhumb-distance';\nimport turfRhumbDestination from '@turf/rhumb-destination';\nimport {mapCoords} from '../edit-modes/utils';\nimport type {SimpleFeature} from './geojson-types';\n\n// This function takes feature's center, moves it,\n// and builds new feature around it keeping the proportions\nexport function translateFromCenter(feature: SimpleFeature, distance: number, direction: number) {\n const initialCenterPoint = turfCenter(feature);\n\n const movedCenterPoint = turfRhumbDestination(initialCenterPoint, distance, direction);\n\n const movedCoordinates = mapCoords(feature.geometry.coordinates, (coordinate) => {\n const rhumbDistance = turfRhumbDistance(initialCenterPoint.geometry.coordinates, coordinate);\n const rhumbDirection = turfRhumbBearing(initialCenterPoint.geometry.coordinates, coordinate);\n\n const movedPosition = turfRhumbDestination(\n movedCenterPoint.geometry.coordinates,\n rhumbDistance,\n rhumbDirection\n ).geometry.coordinates;\n return movedPosition;\n });\n\n feature.geometry.coordinates = movedCoordinates;\n\n return feature;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {point, lineString as toLineString} from '@turf/helpers';\nimport {\n recursivelyTraverseNestedArrays,\n nearestPointOnProjectedLine,\n nearestPointOnLine,\n getEditHandlesForGeometry,\n getPickedEditHandles,\n getPickedEditHandle,\n getPickedExistingEditHandle,\n getPickedIntermediateEditHandle,\n updateRectanglePosition,\n NearestPointType,\n shouldCancelPan\n} from './utils';\nimport {\n LineString,\n Point,\n Polygon,\n FeatureCollection,\n Feature,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {\n ModeProps,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n Viewport,\n GuideFeatureCollection,\n EditHandleFeature,\n GuideFeature\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ModifyMode extends GeoJsonEditMode {\n // eslint-disable-next-line complexity\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const handles: GuideFeature[] = [];\n\n const {data, lastPointerMoveEvent} = props;\n const {features} = data;\n const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;\n const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;\n\n for (const index of props.selectedIndexes) {\n if (index < features.length) {\n const {geometry} = features[index];\n handles.push(...getEditHandlesForGeometry(geometry, index));\n } else {\n console.warn(`selectedFeatureIndexes out of range ${index}`); // eslint-disable-line no-console,no-undef\n }\n }\n\n // intermediate edit handle\n if (picks && picks.length && mapCoords) {\n const existingEditHandle = getPickedExistingEditHandle(picks);\n // don't show intermediate point when too close to an existing edit handle\n const featureAsPick = !existingEditHandle && picks.find((pick) => !pick.isGuide);\n\n // is the feature in the pick selected\n if (\n featureAsPick &&\n !featureAsPick.object.geometry.type.includes('Point') &&\n !(\n props.modeConfig?.lockRectangles && featureAsPick.object.properties.shape === 'Rectangle'\n ) &&\n props.selectedIndexes.includes(featureAsPick.index)\n ) {\n let intermediatePoint: NearestPointType | null | undefined = null;\n let positionIndexPrefix: number[] = [];\n const referencePoint = point(mapCoords);\n // process all lines of the (single) feature\n recursivelyTraverseNestedArrays(\n featureAsPick.object.geometry.coordinates,\n [],\n (lineString, prefix) => {\n const lineStringFeature = toLineString(lineString);\n const candidateIntermediatePoint = this.getNearestPoint(\n lineStringFeature,\n referencePoint,\n props.modeConfig && props.modeConfig.viewport\n );\n if (\n !intermediatePoint ||\n candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist\n ) {\n intermediatePoint = candidateIntermediatePoint;\n positionIndexPrefix = prefix;\n }\n }\n );\n // tack on the lone intermediate point to the set of handles\n if (intermediatePoint) {\n const {\n geometry: {coordinates: position},\n properties: {index}\n } = intermediatePoint;\n handles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'intermediate',\n featureIndex: featureAsPick.index,\n positionIndexes: [...positionIndexPrefix, index + 1]\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n }\n }\n\n return {\n type: 'FeatureCollection',\n features: handles\n };\n }\n\n // turf.js does not support elevation for nearestPointOnLine\n getNearestPoint(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport | null | undefined\n ): NearestPointType {\n const {coordinates} = line.geometry;\n if (coordinates.some((coord) => coord.length > 2)) {\n if (viewport) {\n // This line has elevation, we need to use alternative algorithm\n return nearestPointOnProjectedLine(line, inPoint, viewport);\n }\n // eslint-disable-next-line no-console,no-undef\n console.log(\n 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.'\n );\n }\n return nearestPointOnLine(line, inPoint, viewport);\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const pickedExistingHandle = getPickedExistingEditHandle(event.picks);\n const pickedIntermediateHandle = getPickedIntermediateEditHandle(event.picks);\n\n if (pickedExistingHandle) {\n const {featureIndex, positionIndexes} = pickedExistingHandle.properties;\n\n const feature = props.data.features[featureIndex];\n const canRemovePosition = !(\n props.modeConfig?.lockRectangles && feature?.properties.shape === 'Rectangle'\n );\n if (canRemovePosition) {\n let updatedData;\n try {\n updatedData = new ImmutableFeatureCollection(props.data)\n .removePosition(featureIndex, positionIndexes)\n .getObject();\n } catch (ignored) {\n // This happens if user attempts to remove the last point\n }\n\n if (updatedData) {\n props.onEdit({\n updatedData,\n editType: 'removePosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: pickedExistingHandle.geometry.coordinates\n }\n });\n }\n }\n } else if (pickedIntermediateHandle) {\n const {featureIndex, positionIndexes} = pickedIntermediateHandle.properties;\n\n const feature = props.data.features[featureIndex];\n const canAddPosition = !(\n props.modeConfig?.lockRectangles && feature?.properties.shape === 'Rectangle'\n );\n\n if (canAddPosition) {\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(featureIndex, positionIndexes, pickedIntermediateHandle.geometry.coordinates)\n .getObject();\n\n if (updatedData) {\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: pickedIntermediateHandle.geometry.coordinates\n }\n });\n }\n }\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n // Cancel map panning if pointer went down on an edit handle\n event.cancelPan();\n\n this._dragEditHandle('movePosition', props, editHandle, event);\n }\n }\n\n _dragEditHandle(\n editType: string,\n props: ModeProps<SimpleFeatureCollection>,\n editHandle: EditHandleFeature,\n event: StopDraggingEvent | DraggingEvent\n ) {\n const editHandleProperties = editHandle.properties;\n const editedFeature = props.data.features[editHandleProperties.featureIndex];\n\n let updatedData;\n if (props.modeConfig?.lockRectangles && editedFeature.properties.shape === 'Rectangle') {\n const coordinates = updateRectanglePosition(\n editedFeature as Feature<Polygon>,\n editHandleProperties.positionIndexes[1],\n event.mapCoords\n ) as any; // TODO\n\n updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(editHandleProperties.featureIndex, {coordinates, type: 'Polygon'})\n .getObject();\n } else {\n updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(\n editHandleProperties.featureIndex,\n editHandleProperties.positionIndexes,\n event.mapCoords\n )\n .getObject();\n }\n\n props.onEdit({\n updatedData,\n editType,\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex],\n positionIndexes: editHandleProperties.positionIndexes,\n position: event.mapCoords\n }\n });\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n const cursor = this.getCursor(event);\n props.onUpdateCursor(cursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (shouldCancelPan(event)) {\n event.cancelPan();\n }\n\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const editHandle = getPickedIntermediateEditHandle(event.picks);\n if (selectedFeatureIndexes.length && editHandle) {\n const editHandleProperties = editHandle.properties;\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(\n editHandleProperties.featureIndex,\n editHandleProperties.positionIndexes,\n event.mapCoords\n )\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex],\n positionIndexes: editHandleProperties.positionIndexes,\n position: event.mapCoords\n }\n });\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const selectedFeatureIndexes = props.selectedIndexes;\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n if (selectedFeatureIndexes.length && editHandle) {\n this._dragEditHandle('finishMovePosition', props, editHandle, event);\n }\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n const picks = (event && event.picks) || [];\n\n const handlesPicked = getPickedEditHandles(picks);\n if (handlesPicked.length) {\n return 'cell';\n }\n return null;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bbox from '@turf/bbox';\nimport turfCentroid from '@turf/centroid';\nimport turfBearing from '@turf/bearing';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {point, featureCollection} from '@turf/helpers';\nimport {polygonToLine} from '@turf/polygon-to-line';\nimport {coordEach} from '@turf/meta';\nimport turfDistance from '@turf/distance';\nimport turfTransformScale from '@turf/transform-scale';\nimport {getCoord, getGeom} from '@turf/invariant';\nimport {FeatureCollection, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ModeProps,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n EditHandleFeature,\n GuideFeatureCollection\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ScaleMode extends GeoJsonEditMode {\n _geometryBeingScaled: SimpleFeatureCollection | null | undefined;\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _cornerGuidePoints: Array<EditHandleFeature> = [];\n _cursor: string | null | undefined;\n _isScaling = false;\n\n _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => {\n const {features} = geometry || {};\n if (Array.isArray(features) && features.length === 1) {\n const {type}: {type: string} = getGeom(features[0]);\n return type === 'Point';\n }\n return false;\n };\n\n _getOppositeScaleHandle = (selectedHandle: EditHandleFeature): EditHandleFeature | null => {\n const selectedHandleIndex =\n selectedHandle &&\n selectedHandle.properties &&\n Array.isArray(selectedHandle.properties.positionIndexes) &&\n selectedHandle.properties.positionIndexes[0];\n\n if (typeof selectedHandleIndex !== 'number') {\n return null;\n }\n const guidePointCount = this._cornerGuidePoints.length;\n const oppositeIndex = (selectedHandleIndex + guidePointCount / 2) % guidePointCount;\n return (\n this._cornerGuidePoints.find((p) => {\n if (!Array.isArray(p.properties.positionIndexes)) {\n return false;\n }\n return p.properties.positionIndexes[0] === oppositeIndex;\n }) || null\n );\n };\n\n _getUpdatedData = (\n props: ModeProps<SimpleFeatureCollection>,\n editedData: SimpleFeatureCollection\n ) => {\n let updatedData = new ImmutableFeatureCollection(props.data);\n const selectedIndexes = props.selectedIndexes;\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = editedData.features[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n return updatedData.getObject();\n };\n\n isEditHandleSelected = (): boolean => Boolean(this._selectedEditHandle);\n\n getScaleAction = (\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ) => {\n if (!this._selectedEditHandle) {\n return null;\n }\n\n const oppositeHandle = this._getOppositeScaleHandle(this._selectedEditHandle);\n const origin = getCoord(oppositeHandle) as Position;\n\n const scaleFactor = getScaleFactor(origin, startDragPoint, currentPoint);\n\n const scaledFeatures = turfTransformScale(this._geometryBeingScaled, scaleFactor, {origin});\n\n return {\n updatedData: this._getUpdatedData(props, scaledFeatures),\n editType,\n editContext: {\n featureIndexes: props.selectedIndexes\n }\n };\n };\n\n updateCursor = (props: ModeProps<SimpleFeatureCollection>) => {\n if (this._selectedEditHandle) {\n if (this._cursor) {\n props.onUpdateCursor(this._cursor);\n }\n const cursorGeometry = this.getSelectedFeaturesAsFeatureCollection(props);\n\n // Get resize cursor direction from the hovered scale editHandle (e.g. nesw or nwse)\n const centroid = turfCentroid(cursorGeometry);\n const bearing = turfBearing(centroid, this._selectedEditHandle);\n const positiveBearing = bearing < 0 ? bearing + 180 : bearing;\n if (\n (positiveBearing >= 0 && positiveBearing <= 90) ||\n (positiveBearing >= 180 && positiveBearing <= 270)\n ) {\n this._cursor = 'nesw-resize';\n props.onUpdateCursor('nesw-resize');\n } else {\n this._cursor = 'nwse-resize';\n props.onUpdateCursor('nwse-resize');\n }\n } else {\n props.onUpdateCursor(null);\n this._cursor = null;\n }\n };\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isScaling) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'scale'\n ? selectedEditHandle\n : null;\n\n this.updateCursor(props);\n }\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isScaling = true;\n this._geometryBeingScaled = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isScaling) {\n return;\n }\n\n props.onUpdateCursor(this._cursor);\n\n const scaleAction = this.getScaleAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'scaling',\n props\n );\n if (scaleAction) {\n props.onEdit(scaleAction);\n }\n\n event.cancelPan();\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._isScaling) {\n // Scale the geometry\n const scaleAction = this.getScaleAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'scaled',\n props\n );\n if (scaleAction) {\n props.onEdit(scaleAction);\n }\n\n props.onUpdateCursor(null);\n\n this._geometryBeingScaled = null;\n this._selectedEditHandle = null;\n this._cursor = null;\n this._isScaling = false;\n }\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n this._cornerGuidePoints = [];\n const selectedGeometry = this.getSelectedFeaturesAsFeatureCollection(props);\n\n // Add buffer to the enveloping box if a single Point feature is selected\n if (this._isSinglePointGeometrySelected(selectedGeometry)) {\n return {type: 'FeatureCollection', features: []};\n }\n\n const boundingBox = bboxPolygon(bbox(selectedGeometry));\n boundingBox.properties.mode = 'scale';\n const cornerGuidePoints: EditHandleFeature[] = [];\n\n coordEach(boundingBox, (coord, coordIndex) => {\n if (coordIndex < 4) {\n // Get corner midpoint guides from the enveloping box\n const cornerPoint = point(coord, {\n guideType: 'editHandle',\n editHandleType: 'scale',\n positionIndexes: [coordIndex]\n });\n cornerGuidePoints.push(cornerPoint as EditHandleFeature);\n }\n });\n\n this._cornerGuidePoints = cornerGuidePoints;\n // @ts-expect-error turf types diff\n return featureCollection([polygonToLine(boundingBox), ...this._cornerGuidePoints]);\n }\n}\n\nfunction getScaleFactor(centroid: Position, startDragPoint: Position, currentPoint: Position) {\n const startDistance = turfDistance(centroid, startDragPoint);\n const endDistance = turfDistance(centroid, currentPoint);\n return endDistance / startDistance;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bbox from '@turf/bbox';\nimport turfCentroid from '@turf/centroid';\nimport turfBearing from '@turf/bearing';\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport {coordEach} from '@turf/meta';\nimport {getGeom} from '@turf/invariant';\nimport {point, featureCollection, lineString} from '@turf/helpers';\nimport turfTransformRotate from '@turf/transform-rotate';\nimport {polygonToLine} from '@turf/polygon-to-line';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n EditHandleFeature,\n GuideFeatureCollection\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {FeatureCollection, Position, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {GeoJsonEditMode, GeoJsonEditAction, getIntermediatePosition} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class RotateMode extends GeoJsonEditMode {\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _geometryBeingRotated: SimpleFeatureCollection | null | undefined;\n _isRotating = false;\n\n _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => {\n const {features} = geometry || {};\n if (Array.isArray(features) && features.length === 1) {\n const {type}: {type: string} = getGeom(features[0]);\n return type === 'Point';\n }\n return false;\n };\n\n getIsRotating = () => this._isRotating;\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const selectedGeometry =\n this._geometryBeingRotated || this.getSelectedFeaturesAsFeatureCollection(props);\n\n if (this._isSinglePointGeometrySelected(selectedGeometry)) {\n return {type: 'FeatureCollection', features: []};\n }\n\n if (this._isRotating) {\n // Display rotate pivot\n return featureCollection([turfCentroid(selectedGeometry)]) as GuideFeatureCollection;\n }\n\n const boundingBox = bboxPolygon(bbox(selectedGeometry));\n\n let previousCoord: Position | null = null;\n let topEdgeMidpointCoords: Position | null = null;\n let longestEdgeLength = 0;\n\n coordEach(boundingBox, (coord: any) => {\n if (previousCoord) {\n const edgeMidpoint = getIntermediatePosition(coord, previousCoord);\n if (!topEdgeMidpointCoords || edgeMidpoint[1] > topEdgeMidpointCoords[1]) {\n // Get the top edge midpoint of the enveloping box\n topEdgeMidpointCoords = edgeMidpoint;\n }\n // Get the length of the longest edge of the enveloping box\n const edgeDistance = turfDistance(coord, previousCoord);\n longestEdgeLength = Math.max(longestEdgeLength, edgeDistance);\n }\n previousCoord = coord;\n });\n\n // Scale the length of the line between the rotate handler and the enveloping box\n // relative to the length of the longest edge of the enveloping box\n const rotateHandleCoords = topEdgeMidpointCoords && [\n topEdgeMidpointCoords[0],\n topEdgeMidpointCoords[1] + longestEdgeLength / 1000\n ];\n\n const lineFromEnvelopeToRotateHandle = lineString([topEdgeMidpointCoords, rotateHandleCoords]);\n const rotateHandle = point(rotateHandleCoords, {\n guideType: 'editHandle',\n editHandleType: 'rotate'\n });\n\n const outFeatures = [polygonToLine(boundingBox), rotateHandle, lineFromEnvelopeToRotateHandle];\n\n // @ts-expect-error turf type diff\n return featureCollection(outFeatures);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (!this._isRotating) {\n return;\n }\n\n const rotateAction = this.getRotateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'rotating',\n props\n );\n if (rotateAction) {\n props.onEdit(rotateAction);\n }\n\n event.cancelPan();\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n if (!this._isRotating) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'rotate'\n ? selectedEditHandle\n : null;\n }\n\n this.updateCursor(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isRotating = true;\n this._geometryBeingRotated = this.getSelectedFeaturesAsFeatureCollection(props);\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this._isRotating) {\n // Rotate the geometry\n const rotateAction = this.getRotateAction(\n event.pointerDownMapCoords,\n event.mapCoords,\n 'rotated',\n props\n );\n\n if (rotateAction) {\n props.onEdit(rotateAction);\n }\n\n this._geometryBeingRotated = null;\n this._selectedEditHandle = null;\n this._isRotating = false;\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._selectedEditHandle) {\n // TODO: look at doing SVG cursors to get a better \"rotate\" cursor\n props.onUpdateCursor('crosshair');\n } else {\n props.onUpdateCursor(null);\n }\n }\n\n getRotateAction(\n startDragPoint: Position,\n currentPoint: Position,\n editType: string,\n props: ModeProps<SimpleFeatureCollection>\n ): GeoJsonEditAction | null | undefined {\n if (!this._geometryBeingRotated) {\n return null;\n }\n const centroid = turfCentroid(this._geometryBeingRotated);\n const angle = getRotationAngle(centroid.geometry.coordinates, startDragPoint, currentPoint);\n const rotatedFeatures = turfTransformRotate(this._geometryBeingRotated, angle, {\n pivot: centroid\n });\n\n let updatedData = new ImmutableFeatureCollection(props.data);\n\n const selectedIndexes = props.selectedIndexes;\n for (let i = 0; i < selectedIndexes.length; i++) {\n const selectedIndex = selectedIndexes[i];\n const movedFeature = rotatedFeatures.features[i];\n updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry);\n }\n\n return {\n updatedData: updatedData.getObject(),\n editType,\n editContext: {\n featureIndexes: selectedIndexes\n }\n };\n }\n}\n\nfunction getRotationAngle(centroid: Position, startDragPoint: Position, currentPoint: Position) {\n const bearing1 = turfBearing(centroid, startDragPoint);\n const bearing2 = turfBearing(centroid, currentPoint);\n return bearing2 - bearing1;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {StartDraggingEvent, ModeProps} from './types';\nimport {FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {TranslateMode} from './translate-mode';\n\nexport class DuplicateMode extends TranslateMode {\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n super.handleStartDragging(event, props);\n\n if (this._geometryBeforeTranslate) {\n props.onEdit(this.getAddManyFeaturesAction(this._geometryBeforeTranslate, props.data));\n }\n }\n\n updateCursor(props: ModeProps<FeatureCollection>) {\n if (this._isTranslatable) {\n props.onUpdateCursor('copy');\n } else {\n props.onUpdateCursor(null);\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport booleanPointInPolygon from '@turf/boolean-point-in-polygon';\nimport turfDifference from '@turf/difference';\nimport turfBuffer from '@turf/buffer';\nimport lineIntersect from '@turf/line-intersect';\nimport type {Point} from 'geojson';\nimport {feature as turfFeature, featureCollection, lineString} from '@turf/helpers';\nimport turfBearing from '@turf/bearing';\nimport turfDistance from '@turf/distance';\nimport turfDestination from '@turf/destination';\nimport turfPolygonToLine from '@turf/polygon-to-line';\nimport nearestPointOnLine from '@turf/nearest-point-on-line';\nimport {generatePointsParallelToLinePoints} from './utils';\nimport {FeatureCollection, PolygonGeometry, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class SplitPolygonMode extends GeoJsonEditMode {\n calculateMapCoords(\n clickSequence: any,\n mapCoords: any,\n props: ModeProps<SimpleFeatureCollection>\n ) {\n const modeConfig = props.modeConfig;\n if (!modeConfig || !modeConfig.lock90Degree || !clickSequence.length) {\n return mapCoords;\n }\n if (clickSequence.length === 1) {\n // if first point is clicked, then find closest polygon point and build ~90deg vector\n const firstPoint = clickSequence[0];\n const selectedGeometry = this.getSelectedGeometry(props);\n const feature = turfPolygonToLine(selectedGeometry as PolygonGeometry);\n\n const lines = feature.type === 'FeatureCollection' ? feature.features : [feature];\n let minDistance = Number.MAX_SAFE_INTEGER;\n let closestPoint: ReturnType<typeof nearestPointOnLine> | null = null;\n // If Multipolygon, then we should find nearest polygon line and stick split to it.\n lines.forEach((line) => {\n const snapPoint = nearestPointOnLine(line, firstPoint);\n const distanceFromOrigin = turfDistance(snapPoint, firstPoint);\n if (minDistance > distanceFromOrigin) {\n minDistance = distanceFromOrigin;\n closestPoint = snapPoint;\n }\n });\n\n if (closestPoint) {\n // closest point is used as 90degree entry to the polygon\n const lastBearing = turfBearing(firstPoint, closestPoint);\n const currentDistance = turfDistance(firstPoint, mapCoords, {units: 'meters'});\n return turfDestination(firstPoint, currentDistance, lastBearing, {\n units: 'meters'\n }).geometry.coordinates;\n }\n return mapCoords;\n }\n // Allow only 90 degree turns\n const lastPoint = clickSequence[clickSequence.length - 1];\n const [approximatePoint] = generatePointsParallelToLinePoints(\n clickSequence[clickSequence.length - 2],\n lastPoint,\n mapCoords\n );\n // align point with current ground\n const nearestPt = nearestPointOnLine(lineString([lastPoint, approximatePoint]), mapCoords)\n .geometry.coordinates;\n return nearestPt;\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length === 0 || !props.lastPointerMoveEvent) {\n // nothing to do yet\n return guides;\n }\n\n const {mapCoords} = props.lastPointerMoveEvent;\n\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, this.calculateMapCoords(clickSequence, mapCoords, props)]\n }\n });\n\n return guides;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const tentativeFeature = this.getTentativeGuide(props);\n\n const selectedGeometry = this.getSelectedGeometry(props);\n\n if (!selectedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('A polygon must be selected for splitting');\n return;\n }\n\n const clickSequence = this.getClickSequence();\n if (tentativeFeature && tentativeFeature.geometry.type === 'LineString') {\n clickSequence.push(\n tentativeFeature.geometry.coordinates[tentativeFeature.geometry.coordinates.length - 1]\n );\n } else {\n this.addClickSequence(event);\n }\n\n const pt: Point = {\n type: 'Point',\n coordinates: clickSequence[clickSequence.length - 1]\n };\n\n const isPointInPolygon = booleanPointInPolygon(pt, selectedGeometry as PolygonGeometry);\n if (clickSequence.length > 1 && tentativeFeature && !isPointInPolygon) {\n this.resetClickSequence();\n // @ts-expect-error narrow type\n const isLineInterectingWithPolygon = lineIntersect(tentativeFeature, selectedGeometry);\n if (isLineInterectingWithPolygon.features.length === 0) {\n return;\n }\n\n const editAction = this.splitPolygon(tentativeFeature, props);\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n splitPolygon(tentativeFeature: TentativeFeature, props: ModeProps<SimpleFeatureCollection>) {\n const selectedGeometry = this.getSelectedGeometry(props);\n const featureIndex = props.selectedIndexes[0];\n const modeConfig = props.modeConfig || {};\n\n // Default gap in between the polygon\n let {gap = 0.1, units = 'centimeters'} = modeConfig;\n if (gap === 0) {\n gap = 0.1;\n units = 'centimeters';\n }\n\n const buffer = turfBuffer(tentativeFeature, gap, {units});\n const updatedGeometry = turfDifference(\n featureCollection([turfFeature(selectedGeometry as PolygonGeometry), buffer])\n );\n if (!updatedGeometry) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('Canceling edit. Split Polygon erased');\n return null;\n }\n\n const {type, coordinates} = updatedGeometry.geometry;\n let updatedCoordinates: any[] = []; // TODO\n if (type === 'Polygon') {\n // Update the coordinates as per Multipolygon\n updatedCoordinates = coordinates.map((c) => [c]);\n } else {\n // Handle Case when Multipolygon has holes\n updatedCoordinates = coordinates.reduce((agg, prev) => {\n prev.forEach((p) => {\n // @ts-expect-error revisit coordinates type here\n agg.push([p]);\n });\n return agg;\n }, []);\n }\n\n // Update the type to Mulitpolygon\n const updatedData = new ImmutableFeatureCollection(props.data).replaceGeometry(featureIndex, {\n type: 'MultiPolygon',\n coordinates: updatedCoordinates\n });\n\n const editAction: GeoJsonEditAction = {\n updatedData: updatedData.getObject(),\n editType: 'split',\n editContext: {\n featureIndexes: [featureIndex]\n }\n };\n\n return editAction;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bearing from '@turf/bearing';\nimport {\n generatePointsParallelToLinePoints,\n getPickedEditHandle,\n getPickedIntermediateEditHandle,\n shouldCancelPan\n} from './utils';\nimport {SimpleFeatureCollection} from '../utils/geojson-types';\nimport {ModeProps, StartDraggingEvent, StopDraggingEvent, DraggingEvent} from './types';\nimport {ModifyMode} from './modify-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ExtrudeMode extends ModifyMode {\n // this mode is busted =(\n\n isPointAdded = false;\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n const {featureIndex} = editHandle.properties;\n let {positionIndexes} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n positionIndexes = this.isPointAdded\n ? this.nextPositionIndexes(positionIndexes, size)\n : positionIndexes;\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n if (p1 && p2) {\n // p3 and p4 are end points for moving (extruding) edge\n const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)\n .replacePosition(featureIndex, positionIndexes, p3)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'extruding',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes: this.nextPositionIndexes(positionIndexes, size),\n position: p3\n }\n });\n\n event.cancelPan();\n }\n }\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (shouldCancelPan(event)) {\n event.cancelPan();\n }\n\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const editHandle = getPickedIntermediateEditHandle(event.picks);\n if (selectedFeatureIndexes.length && editHandle) {\n const {positionIndexes, featureIndex} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n\n if (p1 && p2) {\n let updatedData = new ImmutableFeatureCollection(props.data);\n if (!this.isOrthogonal(positionIndexes, featureIndex, size, props.data)) {\n updatedData = updatedData.addPosition(featureIndex, positionIndexes, p2);\n }\n if (\n !this.isOrthogonal(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n size,\n props.data\n )\n ) {\n updatedData = updatedData.addPosition(featureIndex, positionIndexes, p1);\n this.isPointAdded = true;\n }\n\n props.onEdit({\n updatedData: updatedData.getObject(),\n editType: 'startExtruding',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: p1\n }\n });\n }\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const selectedFeatureIndexes = props.selectedIndexes;\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n if (selectedFeatureIndexes.length && editHandle) {\n const {featureIndex} = editHandle.properties;\n let {positionIndexes} = editHandle.properties;\n\n const size = this.coordinatesSize(positionIndexes, featureIndex, props.data);\n positionIndexes = this.isPointAdded\n ? this.nextPositionIndexes(positionIndexes, size)\n : positionIndexes;\n // p1 and p1 are end points for edge\n const p1 = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n props.data\n );\n const p2 = this.getPointForPositionIndexes(positionIndexes, featureIndex, props.data);\n\n if (p1 && p2) {\n // p3 and p4 are end points for new moved (extruded) edge\n const [p3, p4] = generatePointsParallelToLinePoints(p1, p2, event.mapCoords);\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replacePosition(featureIndex, this.prevPositionIndexes(positionIndexes, size), p4)\n .replacePosition(featureIndex, positionIndexes, p3)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'extruded',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: p3\n }\n });\n }\n }\n this.isPointAdded = false;\n }\n\n coordinatesSize(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n {features}: SimpleFeatureCollection\n ) {\n let size = 0;\n if (Array.isArray(positionIndexes)) {\n const feature = features[featureIndex];\n const coordinates: any = feature.geometry.coordinates;\n // for Multi polygons, length will be 3\n if (positionIndexes.length === 3) {\n const [a, b] = positionIndexes;\n if (coordinates.length && coordinates[a].length) {\n size = coordinates[a][b].length;\n }\n } else {\n const [b] = positionIndexes;\n if (coordinates.length && coordinates[b].length) {\n size = coordinates[b].length;\n }\n }\n }\n return size;\n }\n\n getBearing(p1: any, p2: any) {\n const angle = bearing(p1, p2);\n if (angle < 0) {\n return Math.floor(360 + angle);\n }\n return Math.floor(angle);\n }\n\n isOrthogonal(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n size: number,\n features: SimpleFeatureCollection\n ) {\n if (!Array.isArray(positionIndexes)) {\n return false;\n }\n if (positionIndexes[positionIndexes.length - 1] === size - 1) {\n positionIndexes[positionIndexes.length - 1] = 0;\n }\n const prevPoint = this.getPointForPositionIndexes(\n this.prevPositionIndexes(positionIndexes, size),\n featureIndex,\n features\n );\n const nextPoint = this.getPointForPositionIndexes(\n this.nextPositionIndexes(positionIndexes, size),\n featureIndex,\n features\n );\n const currentPoint = this.getPointForPositionIndexes(positionIndexes, featureIndex, features);\n const prevAngle = this.getBearing(currentPoint, prevPoint);\n const nextAngle = this.getBearing(currentPoint, nextPoint);\n return [89, 90, 91, 269, 270, 271].includes(Math.abs(prevAngle - nextAngle));\n }\n\n nextPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[] {\n if (!Array.isArray(positionIndexes)) {\n return [];\n }\n const next = [...positionIndexes];\n if (next.length) {\n next[next.length - 1] = next[next.length - 1] === size - 1 ? 0 : next[next.length - 1] + 1;\n }\n return next;\n }\n\n prevPositionIndexes(positionIndexes: number[] | null | undefined, size: number): number[] {\n if (!Array.isArray(positionIndexes)) {\n return [];\n }\n const prev = [...positionIndexes];\n if (prev.length) {\n prev[prev.length - 1] = prev[prev.length - 1] === 0 ? size - 2 : prev[prev.length - 1] - 1;\n }\n return prev;\n }\n\n getPointForPositionIndexes(\n positionIndexes: number[] | null | undefined,\n featureIndex: number,\n {features}: SimpleFeatureCollection\n ) {\n let p1;\n if (Array.isArray(positionIndexes)) {\n const feature = features[featureIndex];\n const coordinates: any = feature.geometry.coordinates;\n // for Multi polygons, length will be 3\n if (positionIndexes.length === 3) {\n const [a, b, c] = positionIndexes;\n if (coordinates.length && coordinates[a].length) {\n p1 = coordinates[a][b][c];\n }\n } else {\n const [b, c] = positionIndexes;\n if (coordinates.length && coordinates[b].length) {\n p1 = coordinates[b][c];\n }\n }\n }\n return p1;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ModeProps, PointerMoveEvent, StopDraggingEvent} from './types';\nimport {Position, FeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {ModifyMode} from './modify-mode';\n\nfunction defaultCalculateElevationChange({\n pointerDownScreenCoords,\n screenCoords\n}: {\n pointerDownScreenCoords: Position;\n screenCoords: Position;\n}) {\n return 10 * (pointerDownScreenCoords[1] - screenCoords[1]);\n}\n\nexport class ElevationMode extends ModifyMode {\n makeElevatedEvent(\n event: PointerMoveEvent | StopDraggingEvent,\n position: Position,\n props: ModeProps<FeatureCollection>\n ): Record<string, any> {\n const {\n minElevation = 0,\n maxElevation = 20000,\n calculateElevationChange = defaultCalculateElevationChange\n } = props.modeConfig || {};\n\n if (!event.pointerDownScreenCoords) {\n return event;\n }\n\n // $FlowFixMe - really, I know it has something at index 2\n let elevation = position.length === 3 ? position[2] : 0;\n\n // calculateElevationChange is configurable because (at this time) modes are not aware of the viewport\n elevation += calculateElevationChange({\n pointerDownScreenCoords: event.pointerDownScreenCoords,\n screenCoords: event.screenCoords\n });\n elevation = Math.min(elevation, maxElevation);\n elevation = Math.max(elevation, minElevation);\n\n return Object.assign({}, event, {\n mapCoords: [position[0], position[1], elevation]\n });\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;\n // @ts-expect-error return type too wide\n super.handlePointerMove(this.makeElevatedEvent(event, position, props), props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n const editHandle = getPickedEditHandle(event.picks);\n const position = editHandle ? editHandle.geometry.coordinates : event.mapCoords;\n // @ts-expect-error return type too wide\n super.handleStopDragging(this.makeElevatedEvent(event, position, props), props);\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n let cursor = super.getCursor(event);\n if (cursor === 'cell') {\n cursor = 'ns-resize';\n }\n return cursor;\n }\n\n static calculateElevationChangeWithViewport(\n viewport: any,\n {\n pointerDownScreenCoords,\n screenCoords\n }: {\n pointerDownScreenCoords: Position;\n screenCoords: Position;\n }\n ): number {\n // Source: https://gis.stackexchange.com/a/127949/111804\n const metersPerPixel =\n (156543.03392 * Math.cos((viewport.latitude * Math.PI) / 180)) / Math.pow(2, viewport.zoom);\n\n return (metersPerPixel * (pointerDownScreenCoords[1] - screenCoords[1])) / 2;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ClickEvent, PointerMoveEvent, ModeProps, TentativeFeature} from './types';\nimport {FeatureCollection, SimpleFeatureCollection, Point} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class DrawPointMode extends GeoJsonEditMode {\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n return {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'Point',\n coordinates: lastCoords[0]\n }\n };\n }\n\n handleClick({mapCoords}: ClickEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const geometry: Point = {\n type: 'Point',\n coordinates: mapCoords\n };\n\n props.onEdit(this.getAddFeatureAction(geometry, props.data));\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport distance from '@turf/distance';\nimport {memoize} from '../utils/memoize';\nimport {\n LineString,\n FeatureCollection,\n Position,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n GuideFeature,\n Tooltip,\n DoubleClickEvent\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class DrawLineStringMode extends GeoJsonEditMode {\n // declaration of variables for the calculation of the distance of linestring\n dist = 0;\n position: Position = null!;\n elems: Position[] = [];\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n let positionAdded = false;\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one\n this.addClickSequence(event);\n positionAdded = true;\n }\n const clickSequence = this.getClickSequence();\n\n // check if the pointer is on editable state calculate the distance of new point\n if (!clickedEditHandle) {\n this.calculateInfoDraw(clickSequence);\n }\n\n if (\n clickSequence.length > 1 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1\n ) {\n // They clicked the last point (or double-clicked), so add the LineString\n // reset distance to new calculate\n this.dist = 0;\n this.finishDrawing(props);\n } else if (positionAdded) {\n // new tentative point\n props.onEdit({\n // data is the same\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDoubleClick(event: DoubleClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.finishDrawing(props);\n }\n\n finishDrawing(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n if (clickSequence.length > 1) {\n const lineStringToAdd: LineString = {\n type: 'LineString',\n coordinates: [...clickSequence]\n };\n this.resetClickSequence();\n const editAction = this.getAddFeatureAction(lineStringToAdd, props.data);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {key} = event;\n if (key === 'Enter') {\n this.finishDrawing(props);\n } else if (key === 'Escape') {\n this.resetClickSequence();\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n let tentativeFeature;\n if (clickSequence.length > 0) {\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, ...lastCoords]\n }\n };\n }\n\n if (tentativeFeature) {\n guides.features.push(tentativeFeature);\n }\n\n const editHandles: GuideFeature[] = clickSequence.map((clickedCoord, index) => ({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'existing',\n featureIndex: -1,\n positionIndexes: [index]\n },\n geometry: {\n type: 'Point',\n coordinates: clickedCoord\n }\n }));\n\n guides.features.push(...editHandles);\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props.modeConfig,\n dist: this.dist\n });\n }\n\n // utility function\n calculateInfoDraw(clickSequence) {\n // check if the selected points are at least 2\n if (clickSequence.length > 1) {\n // setting the last point\n this.position = clickSequence[clickSequence.length - 1];\n // calculate the new distance by adding the\n // distance of the new drawn linestring\n this.dist += distance(\n clickSequence[clickSequence.length - 2],\n clickSequence[clickSequence.length - 1]\n );\n }\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param dist\n */\n _getTooltips = memoize(({modeConfig, dist}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text;\n if (dist) {\n if (formatTooltip) {\n text = formatTooltip(dist);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Distance: ${parseFloat(dist).toFixed(2)} kilometers`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// port from @deck.gl/core\nfunction isEqual(a: any, b: any) {\n if (a === b) {\n return true;\n }\n if (Array.isArray(a)) {\n // Special treatment for arrays: compare 1-level deep\n // This is to support equality of matrix/coordinate props\n const len = a.length;\n if (!b || b.length !== len) {\n return false;\n }\n\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n\n/**\n * Speed up consecutive function calls by caching the result of calls with identical input\n * https://en.wikipedia.org/wiki/Memoization\n * @param {function} compute - the function to be memoized\n */\nexport function memoize(compute: Function) {\n let cachedArgs = {};\n let cachedResult;\n\n return (args: any) => {\n for (const key in args) {\n if (!isEqual(args[key], cachedArgs[key])) {\n cachedResult = compute(args);\n cachedArgs = args;\n break;\n }\n }\n return cachedResult;\n };\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {lineIntersect} from '@turf/line-intersect';\nimport {polygon as turfPolygon} from '@turf/helpers';\nimport {booleanWithin} from '@turf/boolean-within';\nimport type {Geometry} from 'geojson';\nimport {kinks} from '@turf/kinks';\n\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature,\n GuideFeature,\n DoubleClickEvent\n} from './types';\nimport {Position, FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class DrawPolygonMode extends GeoJsonEditMode {\n holeSequence: Position[] = [];\n isDrawingHole = false;\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n const holeSequence = this.holeSequence;\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n let geometry: Geometry;\n\n if (this.isDrawingHole && holeSequence.length > 1) {\n geometry = {\n type: 'Polygon',\n coordinates: [\n [...clickSequence, clickSequence[0]],\n [...holeSequence, ...lastCoords, holeSequence[0]]\n ]\n };\n } else if (clickSequence.length > 2) {\n geometry = {\n type: 'Polygon',\n coordinates: [[...clickSequence, ...lastCoords, clickSequence[0]]]\n };\n } else {\n geometry = {\n type: 'LineString',\n coordinates: [...clickSequence, ...lastCoords]\n };\n }\n\n return {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry\n };\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const tentative = this.createTentativeFeature(props);\n if (tentative) guides.features.push(tentative);\n\n const sequence = this.isDrawingHole ? this.holeSequence : this.getClickSequence();\n\n const handles: GuideFeature[] = sequence.map((coord, index) => ({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'existing',\n featureIndex: -1,\n positionIndexes: [index]\n },\n geometry: {\n type: 'Point',\n coordinates: coord\n }\n }));\n\n guides.features.push(...handles);\n return guides;\n }\n\n // eslint-disable-next-line complexity, max-statements\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n const clickSequence = this.getClickSequence();\n const coords = event.mapCoords;\n\n // Check if they clicked on an edit handle to complete the polygon\n if (\n !this.isDrawingHole &&\n clickSequence.length > 2 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n (clickedEditHandle.properties.positionIndexes[0] === 0 ||\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1)\n ) {\n // They clicked the first or last point, so complete the polygon\n this.finishDrawing(props);\n return;\n }\n\n // Check if they clicked near the first point to complete the polygon\n if (!this.isDrawingHole && clickSequence.length > 2) {\n if (isNearFirstPoint(coords, clickSequence[0])) {\n this.finishDrawing(props);\n this.resetClickSequence();\n return;\n }\n }\n\n if (this.isDrawingHole) {\n const current = this.holeSequence;\n current.push(coords);\n\n if (current.length > 2) {\n const poly: Geometry = {\n type: 'Polygon',\n coordinates: [\n [...clickSequence, clickSequence[0]],\n [...current, current[0]]\n ]\n };\n\n this.resetClickSequence();\n this.holeSequence = [];\n this.isDrawingHole = false;\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(poly, props);\n if (editAction) props.onEdit(editAction);\n }\n return;\n }\n\n // Add the click if we didn't click on a handle\n let positionAdded = false;\n if (!clickedEditHandle) {\n this.addClickSequence(event);\n positionAdded = true;\n }\n\n if (positionAdded) {\n // new tentative point\n props.onEdit({\n // data is the same\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDoubleClick(_event: DoubleClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.finishDrawing(props);\n this.resetClickSequence();\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (event.key === 'Enter') {\n this.finishDrawing(props);\n this.resetClickSequence();\n } else if (event.key === 'Escape') {\n this.resetClickSequence();\n this.holeSequence = [];\n this.isDrawingHole = false;\n\n props.onEdit({\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n // eslint-disable-next-line max-statements, complexity\n finishDrawing(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n const polygon = [...clickSequence, clickSequence[0]];\n\n const newPolygon = turfPolygon([polygon]);\n\n const canAddHole = canAddHoleToPolygon(props);\n const canOverlap = canPolygonOverlap(props);\n\n // Check if the polygon intersects itself (excluding shared start/end point)\n if (!canOverlap) {\n const overlapping = kinks(newPolygon).features;\n\n if (overlapping.length > 0) {\n // \u274C Invalid polygon: overlaps\n props.onEdit({\n updatedData: props.data,\n editType: 'invalidPolygon',\n editContext: {reason: 'overlaps'}\n });\n this.resetClickSequence();\n return;\n }\n }\n\n if (canAddHole) {\n const holeResult = this.tryAddHoleToExistingPolygon(newPolygon, polygon, props);\n if (holeResult.handled) {\n this.resetClickSequence();\n return;\n }\n }\n\n // If no valid hole was found, add the polygon as a new feature\n const editAction = this.getAddFeatureOrBooleanPolygonAction(\n {\n type: 'Polygon',\n coordinates: [[...this.getClickSequence(), this.getClickSequence()[0]]]\n },\n props\n );\n if (editAction) props.onEdit(editAction);\n this.resetClickSequence();\n return;\n }\n\n private tryAddHoleToExistingPolygon(\n newPolygon: any,\n polygon: Position[],\n props: ModeProps<SimpleFeatureCollection>\n ): {handled: boolean} {\n for (const [featureIndex, feature] of props.data.features.entries()) {\n if (feature.geometry.type === 'Polygon') {\n const result = this.validateAndCreateHole(\n feature,\n featureIndex,\n newPolygon,\n polygon,\n props\n );\n if (result.handled) {\n return result;\n }\n }\n }\n\n return {handled: false};\n }\n\n private validateAndCreateHole(\n feature: any,\n featureIndex: number,\n newPolygon: any,\n polygon: Position[],\n props: ModeProps<SimpleFeatureCollection>\n ): {handled: boolean} {\n const outer = turfPolygon(feature.geometry.coordinates);\n\n // Check existing holes for conflicts\n for (let i = 1; i < feature.geometry.coordinates.length; i++) {\n const hole = turfPolygon([feature.geometry.coordinates[i]]);\n const intersection = lineIntersect(hole, newPolygon);\n\n if (intersection.features.length > 0) {\n props.onEdit({\n updatedData: props.data,\n editType: 'invalidHole',\n editContext: {reason: 'intersects-existing-hole'}\n });\n return {handled: true};\n }\n\n if (booleanWithin(hole, newPolygon) || booleanWithin(newPolygon, hole)) {\n props.onEdit({\n updatedData: props.data,\n editType: 'invalidHole',\n editContext: {reason: 'contains-or-contained-by-existing-hole'}\n });\n return {handled: true};\n }\n }\n\n // Check outer polygon conflicts\n const intersectionWithOuter = lineIntersect(outer, newPolygon);\n if (intersectionWithOuter.features.length > 0) {\n props.onEdit({\n updatedData: props.data,\n editType: 'invalidPolygon',\n editContext: {reason: 'intersects-existing-polygon'}\n });\n return {handled: true};\n }\n\n if (booleanWithin(outer, newPolygon)) {\n props.onEdit({\n updatedData: props.data,\n editType: 'invalidPolygon',\n editContext: {reason: 'contains-existing-polygon'}\n });\n return {handled: true};\n }\n\n // Check if new polygon is within outer polygon (valid hole)\n if (booleanWithin(newPolygon, outer)) {\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(featureIndex, {\n ...feature.geometry,\n coordinates: [...feature.geometry.coordinates, polygon]\n })\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'addHole',\n editContext: {hole: newPolygon.geometry}\n });\n return {handled: true};\n }\n return {handled: false};\n }\n}\n\n// Helper function to check if a point is near the first point in the sequence\nfunction isNearFirstPoint(click: Position, first: Position, threshold = 1e-4): boolean {\n const dx = click[0] - first[0];\n const dy = click[1] - first[1];\n return dx * dx + dy * dy < threshold * threshold;\n}\n\n// Helper function to determine if a hole can be added to a polygon\nfunction canAddHoleToPolygon(props: ModeProps<FeatureCollection>): boolean {\n // For simplicity, always return true in this example.\n // Implement your own logic based on application requirements.\n return props.modeConfig?.allowHoles ?? false;\n}\n\n// Helper function to determine if a polygon can intersect itself\nfunction canPolygonOverlap(props: ModeProps<FeatureCollection>): boolean {\n // Return the value of allowSelfIntersection (defaults to false for safety)\n return props.modeConfig?.allowSelfIntersection ?? false;\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawRectangleMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const rectangle = bboxPolygon([coord1[0], coord1[1], coord2[0], coord2[1]]);\n rectangle.properties = rectangle.properties || {};\n rectangle.properties.shape = 'Rectangle';\n\n return rectangle;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {\n Polygon,\n FeatureCollection,\n Feature,\n Position,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport omit from 'lodash.omit';\n\nexport class TwoClickPolygonMode extends GeoJsonEditMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (props.modeConfig && props.modeConfig.dragToDraw) {\n // handled in drag handlers\n return;\n }\n\n this.addClickSequence(event);\n\n this.checkAndFinishPolygon(props);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n if (!props.modeConfig || !props.modeConfig.dragToDraw) {\n // handled in click handlers\n return;\n }\n\n this.addClickSequence(event);\n event.cancelPan();\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n if (!props.modeConfig || !props.modeConfig.dragToDraw) {\n // handled in click handlers\n return;\n }\n this.addClickSequence(event);\n\n this.checkAndFinishPolygon(props);\n }\n\n checkAndFinishPolygon(props: ModeProps<SimpleFeatureCollection>) {\n const clickSequence = this.getClickSequence();\n const tentativeFeature = this.getTentativeGuide(props);\n\n if (\n clickSequence.length > 1 &&\n tentativeFeature &&\n tentativeFeature.geometry.type === 'Polygon'\n ) {\n const feature: Feature<Polygon> = {\n type: 'Feature',\n properties: omit(tentativeFeature.properties, 'guideType'),\n geometry: {\n type: 'Polygon',\n coordinates: tentativeFeature.geometry.coordinates\n }\n };\n const editAction = this.getAddFeatureOrBooleanPolygonAction(feature, props);\n\n this.resetClickSequence();\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent, modeConfig} = props;\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length === 0 || !lastPointerMoveEvent) {\n // nothing to do yet\n return guides;\n }\n\n const corner1 = clickSequence[0];\n const corner2 = lastPointerMoveEvent.mapCoords;\n\n const polygon = this.getTwoClickPolygon(corner1, corner2, modeConfig);\n if (polygon) {\n guides.features.push({\n type: 'Feature',\n properties: {\n ...polygon.properties,\n guideType: 'tentative'\n },\n geometry: polygon.geometry\n });\n }\n\n return guides;\n }\n\n getTwoClickPolygon(\n coord1: Position,\n coord2: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n return null;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n let tentativeFeature;\n if (clickSequence.length === 1) {\n tentativeFeature = this.getTwoClickPolygon(clickSequence[0], lastCoords[0], props.modeConfig);\n }\n\n return tentativeFeature;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport turfAlong from '@turf/along';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawSquareMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // get the coordinates of the other two rectangle vertices\n const coord3 = [coord2[0], coord1[1]];\n const coord4 = [coord1[0], coord2[1]];\n\n // determine the shortest distance to the origin, which will be the length of each square side\n const distance1 = turfDistance(point(coord3), point(coord1));\n const distance2 = turfDistance(point(coord4), point(coord1));\n const shortestDistance = distance1 <= distance2 ? distance1 : distance2;\n\n // determine which coordinate pair of the two is closest to the origin\n const closestPoint = distance1 <= distance2 ? coord3 : coord4;\n\n // create a linestring which will used to locate the second square vertex\n const line = turfLineString([closestPoint, coord2]);\n\n // get the coordinates of the second square vertex\n const newPoint = turfAlong(line, shortestDistance);\n const corner = newPoint.geometry.coordinates;\n\n const square = bboxPolygon([coord1[0], coord1[1], corner[0], corner[1]]);\n square.properties = square.properties || {};\n square.properties.shape = 'Square';\n\n return square;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawRectangleFromCenterMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const longitude =\n coord1[0] > coord2[0]\n ? coord1[0] + Math.abs(coord1[0] - coord2[0])\n : coord1[0] - Math.abs(coord1[0] - coord2[0]);\n const latitude =\n coord1[1] > coord2[1]\n ? coord1[1] + Math.abs(coord1[1] - coord2[1])\n : coord1[1] - Math.abs(coord1[1] - coord2[1]);\n\n const rectangle = bboxPolygon([longitude, latitude, coord2[0], coord2[1]]);\n rectangle.properties = rectangle.properties || {};\n rectangle.properties.shape = 'Rectangle';\n\n return rectangle;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport turfDistance from '@turf/distance';\nimport turfAlong from '@turf/along';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawSquareFromCenterMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // get the coordinates of the other two rectangle vertices\n const coord3 = [coord2[0], coord1[1]];\n const coord4 = [coord1[0], coord2[1]];\n\n // determine the shortest distance to the origin, which will be the length of each square side\n const distance1 = turfDistance(point(coord3), point(coord1));\n const distance2 = turfDistance(point(coord4), point(coord1));\n const shortestDistance = distance1 <= distance2 ? distance1 : distance2;\n\n // determine which coordinate pair of the two is closest to the origin\n const closestPoint = distance1 <= distance2 ? coord3 : coord4;\n\n // create a linestring which will used to locate the second square vertex\n const line = turfLineString([closestPoint, coord2]);\n\n // get the coordinates of the second square vertex\n const newPoint = turfAlong(line, shortestDistance);\n const corner = newPoint.geometry.coordinates;\n\n // determine the longitude and latitude values of the opposite corner\n const longitude =\n coord1[0] > corner[0]\n ? coord1[0] + Math.abs(coord1[0] - corner[0])\n : coord1[0] - Math.abs(coord1[0] - corner[0]);\n const latitude =\n coord1[1] > corner[1]\n ? coord1[1] + Math.abs(coord1[1] - corner[1])\n : coord1[1] - Math.abs(coord1[1] - corner[1]);\n\n const square = bboxPolygon([longitude, latitude, corner[0], corner[1]]);\n square.properties = square.properties || {};\n square.properties.shape = 'Square';\n\n return square;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport area from '@turf/area';\nimport {memoize} from '../utils/memoize';\nimport {ModeProps, Tooltip} from './types';\nimport {Position, Polygon, Feature, FeatureCollection} from '../utils/geojson-types';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawCircleFromCenterMode extends TwoClickPolygonMode {\n radius: number | null | undefined = null;\n position: Position = null!;\n areaCircle: number | null | undefined = null;\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // Default turf value for circle is 64\n const {steps = 64} = modeConfig || {};\n const options = {steps};\n // setting with position of center of circle\n this.position = coord2;\n\n if (steps < 4) {\n console.warn('Minimum steps to draw a circle is 4 '); // eslint-disable-line no-console,no-undef\n options.steps = 4;\n }\n\n // setting value of radius as distance of center and other point\n this.radius = Math.max(distance(coord1, coord2), 0.001);\n const geometry = circle(coord1, this.radius, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.shape = 'Circle';\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Circle';\n geometry.properties.editProperties.radius = {value: this.radius, unit: 'kilometers'};\n geometry.properties.editProperties.center = coord1;\n // calculate area of circle with turf function\n this.areaCircle = area(geometry);\n\n return geometry;\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props?.modeConfig,\n radius: this.radius,\n areaCircle: this.areaCircle\n });\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param radius\n * @param areaCircle\n */\n _getTooltips = memoize(({modeConfig, radius, areaCircle}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text: string;\n if (radius && areaCircle) {\n if (formatTooltip) {\n text = formatTooltip(radius);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Radius: ${parseFloat(radius).toFixed(2)} kilometers\n \\n Area: ${parseFloat(areaCircle).toFixed(2)}`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport area from '@turf/area';\nimport {memoize} from '../utils/memoize';\nimport {ModeProps, Tooltip} from './types';\nimport {Position, Polygon, Feature, FeatureCollection} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawCircleByDiameterMode extends TwoClickPolygonMode {\n radius: number | null | undefined = null;\n position: Position = null!;\n areaCircle: number | null | undefined = null;\n diameter: number | null | undefined = null;\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n // Default turf value for circle is 64\n const {steps = 64} = modeConfig || {};\n const options = {steps};\n\n if (steps < 4) {\n console.warn('Minimum steps to draw a circle is 4 '); // eslint-disable-line no-console,no-undef\n options.steps = 4;\n }\n\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n // setting value of radius as distance of center and other point\n this.radius = Math.max(distance(coord1, centerCoordinates), 0.001);\n // setting value of diameter as distance of points\n this.diameter = Math.max(distance(coord1, coord2), 0.001);\n // setting position tooltip as center of circle\n this.position = centerCoordinates;\n\n const geometry = circle(centerCoordinates, this.radius, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.shape = 'Circle';\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Circle';\n geometry.properties.editProperties.radius = {value: this.radius, unit: 'kilometers'};\n geometry.properties.editProperties.center = centerCoordinates;\n // calculate area of circle with turf function\n this.areaCircle = area(geometry);\n\n return geometry;\n }\n\n /**\n * define the default function to display the tooltip for\n * nebula geometry mode type\n * @param props properties of geometry nebula mode\n */\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n return this._getTooltips({\n modeConfig: props.modeConfig,\n radius: this.radius,\n areaCircle: this.areaCircle,\n diameter: this.diameter\n });\n }\n\n /**\n * redefine the tooltip of geometry\n * @param modeConfig\n * @param radius\n * @param areaCircle\n * @param diameter\n */\n _getTooltips = memoize(({modeConfig, radius, areaCircle, diameter}) => {\n let tooltips: Tooltip[] = [];\n const {formatTooltip} = modeConfig || {};\n let text;\n if (radius && areaCircle) {\n if (formatTooltip) {\n text = formatTooltip(radius);\n } else {\n // By default, round to 2 decimal places and append units\n text = `Radius: ${parseFloat(radius).toFixed(2)} kilometers\n \\n Area: ${parseFloat(areaCircle).toFixed(2)}\n \\n Diameter: ${parseFloat(diameter).toFixed(2)} kilometers`;\n }\n\n tooltips = [\n {\n position: this.position,\n text\n }\n ];\n }\n\n return tooltips;\n });\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport bboxPolygon from '@turf/bbox-polygon';\nimport distance from '@turf/distance';\nimport ellipse from '@turf/ellipse';\nimport {point} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {TwoClickPolygonMode} from './two-click-polygon-mode';\n\nexport class DrawEllipseByBoundingBoxMode extends TwoClickPolygonMode {\n getTwoClickPolygon(coord1: Position, coord2: Position, modeConfig: any): Feature<Polygon> {\n const minX = Math.min(coord1[0], coord2[0]);\n const minY = Math.min(coord1[1], coord2[1]);\n const maxX = Math.max(coord1[0], coord2[0]);\n const maxY = Math.max(coord1[1], coord2[1]);\n\n const polygonPoints = bboxPolygon([minX, minY, maxX, maxY]).geometry.coordinates[0];\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n\n const xSemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[1])), 0.001);\n const ySemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[3])), 0.001);\n\n const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, {});\n\n geometry.properties = geometry.properties || {};\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Ellipse';\n geometry.properties.editProperties.xSemiAxis = {value: xSemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.angle = 0;\n geometry.properties.editProperties.center = centerCoordinates;\n\n return geometry;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {\n Position,\n Polygon,\n Feature,\n FeatureCollection,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class ThreeClickPolygonMode extends GeoJsonEditMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.addClickSequence(event);\n\n const {modeConfig} = props;\n const clickSequence = this.getClickSequence();\n\n if (clickSequence.length > 2) {\n const {geometry, properties} = this.getThreeClickPolygon(\n clickSequence[0],\n clickSequence[1],\n clickSequence[2],\n modeConfig\n );\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(geometry, props, properties);\n this.resetClickSequence();\n\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent, modeConfig} = props;\n const clickSequence = this.getClickSequence();\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const coords = [\n ...clickSequence,\n ...(lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [])\n ];\n\n if (coords.length === 2) {\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [coords[0], coords[1]]\n }\n });\n } else if (coords.length > 2) {\n const polygon = this.getThreeClickPolygon(coords[0], coords[1], coords[2], modeConfig);\n if (polygon) {\n guides.features.push({\n ...polygon,\n properties: {\n ...polygon.properties,\n guideType: 'tentative'\n }\n });\n }\n }\n\n return guides;\n }\n\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n return null;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords = lastPointerMoveEvent ? [lastPointerMoveEvent.mapCoords] : [];\n\n let tentativeFeature;\n if (clickSequence.length === 2) {\n tentativeFeature = this.getThreeClickPolygon(\n clickSequence[0],\n clickSequence[1],\n lastCoords[0],\n props.modeConfig\n );\n }\n\n return tentativeFeature;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {generatePointsParallelToLinePoints} from './utils';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {ThreeClickPolygonMode} from './three-click-polygon-mode';\n\nexport class DrawRectangleUsingThreePointsMode extends ThreeClickPolygonMode {\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n const [p3, p4] = generatePointsParallelToLinePoints(coord1, coord2, coord3);\n\n return {\n type: 'Feature',\n properties: {\n shape: 'Rectangle'\n },\n geometry: {\n type: 'Polygon',\n coordinates: [\n [\n // Draw a polygon containing all the points of the LineString,\n // then the points orthogonal to the lineString,\n // then back to the starting position\n coord1,\n coord2,\n p3,\n p4,\n coord1\n ]\n ]\n }\n };\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport distance from '@turf/distance';\nimport ellipse from '@turf/ellipse';\nimport bearing from '@turf/bearing';\nimport {point} from '@turf/helpers';\nimport {Position, Polygon, Feature} from '../utils/geojson-types';\nimport {getIntermediatePosition} from './geojson-edit-mode';\nimport {ThreeClickPolygonMode} from './three-click-polygon-mode';\n\nexport class DrawEllipseUsingThreePointsMode extends ThreeClickPolygonMode {\n getThreeClickPolygon(\n coord1: Position,\n coord2: Position,\n coord3: Position,\n modeConfig: any\n ): Feature<Polygon> | null | undefined {\n const centerCoordinates = getIntermediatePosition(coord1, coord2);\n const xSemiAxis = Math.max(distance(centerCoordinates, point(coord3)), 0.001);\n const ySemiAxis = Math.max(distance(coord1, coord2), 0.001) / 2;\n const options = {angle: bearing(coord1, coord2)};\n const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, options);\n\n geometry.properties = geometry.properties || {};\n geometry.properties.editProperties = geometry.properties.editProperties || {};\n geometry.properties.editProperties.shape = 'Ellipse';\n geometry.properties.editProperties.xSemiAxis = {value: xSemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'};\n geometry.properties.editProperties.angle = options.angle;\n geometry.properties.editProperties.center = centerCoordinates;\n\n return geometry;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport destination from '@turf/destination';\nimport bearing from '@turf/bearing';\nimport lineIntersect from '@turf/line-intersect';\nimport turfDistance from '@turf/distance';\nimport {point, lineString as turfLineString} from '@turf/helpers';\nimport {\n generatePointsParallelToLinePoints,\n getPickedEditHandle,\n getEditHandlesForGeometry\n} from './utils';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n TentativeFeature\n} from './types';\nimport {\n Polygon,\n LineString,\n Position,\n FeatureCollection,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class Draw90DegreePolygonMode extends GeoJsonEditMode {\n createTentativeFeature(props: ModeProps<FeatureCollection>): TentativeFeature {\n const clickSequence = this.getClickSequence();\n\n const {mapCoords} = props.lastPointerMoveEvent;\n\n let p3;\n if (clickSequence.length <= 1) {\n p3 = mapCoords;\n } else {\n const p1 = clickSequence[clickSequence.length - 2];\n const p2 = clickSequence[clickSequence.length - 1];\n [p3] = generatePointsParallelToLinePoints(p1, p2, mapCoords);\n }\n\n let tentativeFeature;\n\n if (clickSequence.length < 3) {\n // Draw a LineString connecting all the clicked points with the hovered point\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, p3]\n }\n };\n } else {\n // Draw a Polygon connecting all the clicked points with the hovered point\n tentativeFeature = {\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'Polygon',\n coordinates: [[...clickSequence, p3, clickSequence[0]]]\n }\n };\n }\n\n return tentativeFeature;\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const clickSequence = this.getClickSequence();\n\n if (clickSequence.length === 0 || !props.lastPointerMoveEvent) {\n return guides;\n }\n const tentativeFeature = this.createTentativeFeature(props);\n\n guides.features.push(tentativeFeature);\n\n guides.features = guides.features.concat(\n getEditHandlesForGeometry(tentativeFeature.geometry, -1)\n );\n\n // Slice off the handles that are are next to the pointer\n guides.features = guides.features.slice(0, -1);\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n super.handlePointerMove(event, props);\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const tentativeFeature = this.getTentativeGuide(props);\n this.addClickSequence(event);\n const clickSequence = this.getClickSequence();\n\n if (!tentativeFeature) {\n // nothing else to do\n return;\n }\n\n if (clickSequence.length === 3 && tentativeFeature.geometry.type === 'LineString') {\n const lineString: LineString = tentativeFeature.geometry;\n\n // Tweak the clicked position to be the snapped 90 degree point along the polygon\n clickSequence[clickSequence.length - 1] =\n lineString.coordinates[lineString.coordinates.length - 1];\n } else if (clickSequence.length > 3 && tentativeFeature.geometry.type === 'Polygon') {\n const polygon: Polygon = tentativeFeature.geometry;\n\n // Tweak the clicked position to be the snapped 90 degree point along the polygon\n clickSequence[clickSequence.length - 1] =\n polygon.coordinates[0][polygon.coordinates[0].length - 2];\n\n const clickedEditHandle = getPickedEditHandle(picks);\n\n if (\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n (clickedEditHandle.properties.positionIndexes[1] === 0 ||\n clickedEditHandle.properties.positionIndexes[1] === polygon.coordinates[0].length - 3)\n ) {\n // They clicked the first or last point (or double-clicked), so complete the polygon\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: this.finalizedCoordinates([...polygon.coordinates[0]])\n };\n\n this.resetClickSequence();\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n } else {\n // Trigger pointer move right away in order for it to update edit handles (to support double-click)\n const fakePointerMoveEvent: PointerMoveEvent = {\n screenCoords: [-1, -1],\n mapCoords: event.mapCoords,\n picks: [],\n pointerDownPicks: null,\n pointerDownScreenCoords: null,\n pointerDownMapCoords: null,\n cancelPan: () => {},\n sourceEvent: null\n };\n\n this.handlePointerMove(fakePointerMoveEvent, props);\n }\n }\n\n finalizedCoordinates(coords: Position[]) {\n // Remove the hovered position\n let coordinates = [[...coords.slice(0, -2), coords[0]]];\n let pt = this.getIntermediatePoint([...coords]);\n if (!pt) {\n // if intermediate point with 90 degree not available\n // try remove the last clicked point and get the intermediate point.\n const tc = [...coords];\n tc.splice(-3, 1);\n pt = this.getIntermediatePoint([...tc]);\n if (pt) {\n coordinates = [[...coords.slice(0, -3), pt, coords[0]]];\n }\n } else {\n coordinates = [[...coords.slice(0, -2), pt, coords[0]]];\n }\n return coordinates;\n }\n\n getIntermediatePoint(coordinates: Position[]): Position | null {\n let pt: Position | null = null;\n if (coordinates.length > 4) {\n const [p1, p2] = [...coordinates];\n const angle1 = bearing(p1, p2);\n const p3 = coordinates[coordinates.length - 3];\n const p4 = coordinates[coordinates.length - 4];\n const angle2 = bearing(p3, p4);\n\n const angles = {first: [] as number[], second: [] as number[]};\n // calculate 3 right angle points for first and last points in lineString\n [1, 2, 3].forEach((factor) => {\n const newAngle1 = angle1 + factor * 90;\n // convert angles to 0 to -180 for anti-clock and 0 to 180 for clock wise\n angles.first.push(newAngle1 > 180 ? newAngle1 - 360 : newAngle1);\n const newAngle2 = angle2 + factor * 90;\n angles.second.push(newAngle2 > 180 ? newAngle2 - 360 : newAngle2);\n });\n\n const distance = turfDistance(point(p1), point(p3));\n // Draw imaginary right angle lines for both first and last points in lineString\n // If there is intersection point for any 2 lines, will be the 90 degree point.\n [0, 1, 2].forEach((indexFirst) => {\n const line1 = turfLineString([\n p1,\n destination(p1, distance, angles.first[indexFirst]).geometry.coordinates\n ]);\n [0, 1, 2].forEach((indexSecond) => {\n const line2 = turfLineString([\n p3,\n destination(p3, distance, angles.second[indexSecond]).geometry.coordinates\n ]);\n const fc = lineIntersect(line1, line2);\n if (fc && fc.features.length) {\n // found the intersect point\n pt = fc.features[0].geometry.coordinates;\n }\n });\n });\n }\n return pt;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport throttle from 'lodash.throttle';\nimport {ClickEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, ModeProps} from './types';\nimport {Polygon, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {getPickedEditHandle} from './utils';\nimport {DrawPolygonMode} from './draw-polygon-mode';\n\ntype DraggingHandler = (event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) => void;\n\nexport class DrawPolygonByDraggingMode extends DrawPolygonMode {\n handleDraggingThrottled: DraggingHandler | null | undefined = null;\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n // No-op\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n event.cancelPan();\n if (props.modeConfig && props.modeConfig.throttleMs) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.handleDraggingThrottled = throttle(this.handleDraggingAux, props.modeConfig.throttleMs);\n } else {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.handleDraggingThrottled = this.handleDraggingAux;\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n this.addClickSequence(event);\n const clickSequence = this.getClickSequence();\n // @ts-expect-error cancel() not typed\n if (this.handleDraggingThrottled && this.handleDraggingThrottled.cancel) {\n // @ts-expect-error cancel() not typed\n this.handleDraggingThrottled.cancel();\n }\n\n if (clickSequence.length > 2) {\n // Complete the polygon.\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: [[...clickSequence, clickSequence[0]]]\n };\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n this.resetClickSequence();\n }\n\n handleDraggingAux(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one.\n this.addClickSequence(event);\n props.onEdit({\n updatedData: props.data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (this.handleDraggingThrottled) {\n this.handleDraggingThrottled(event, props);\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>) {\n if (event.key === 'Enter') {\n const clickSequence = this.getClickSequence();\n if (clickSequence.length > 2) {\n const polygonToAdd: Polygon = {\n type: 'Polygon',\n coordinates: [[...clickSequence, clickSequence[0]]]\n };\n this.resetClickSequence();\n\n const editAction = this.getAddFeatureOrBooleanPolygonAction(polygonToAdd, props);\n if (editAction) {\n props.onEdit(editAction);\n }\n }\n } else if (event.key === 'Escape') {\n this.resetClickSequence();\n if (this.handleDraggingThrottled) {\n this.handleDraggingThrottled = null;\n }\n props.onEdit({\n // Because the new drawing feature is dropped, so the data will keep as the same.\n updatedData: props.data,\n editType: 'cancelFeature',\n editContext: {}\n });\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n Position,\n FeatureCollection,\n SimpleFeatureCollection,\n SimpleFeature\n} from '../utils/geojson-types';\nimport {\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n ModeProps,\n Pick,\n GuideFeatureCollection,\n EditHandleFeature\n} from './types';\nimport {\n getPickedSnapSourceEditHandle,\n getPickedEditHandles,\n getEditHandlesForGeometry\n} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\ntype MovementTypeEvent = PointerMoveEvent | StartDraggingEvent | StopDraggingEvent | DraggingEvent;\n\nexport class SnappableMode extends GeoJsonEditMode {\n _handler: GeoJsonEditMode;\n\n constructor(handler: GeoJsonEditMode) {\n super();\n this._handler = handler;\n }\n\n _getSnappedMouseEvent<T extends MovementTypeEvent>(\n event: T,\n snapSource: EditHandleFeature,\n snapTarget: EditHandleFeature\n ): T {\n return Object.assign(event, {\n mapCoords: snapTarget.geometry.coordinates,\n pointerDownMapCoords: snapSource && snapSource.geometry.coordinates\n });\n }\n\n _getPickedSnapTarget(picks: Pick[]): EditHandleFeature | null | undefined {\n return getPickedEditHandles(picks).find(\n (handle) => handle.properties.editHandleType === 'snap-target'\n );\n }\n\n _getPickedSnapSource(\n pointerDownPicks: Pick[] | null | undefined\n ): EditHandleFeature | null | undefined {\n return getPickedSnapSourceEditHandle(pointerDownPicks);\n }\n\n _getUpdatedSnapSourceHandle(\n snapSourceHandle: EditHandleFeature,\n data: SimpleFeatureCollection\n ): EditHandleFeature {\n const {featureIndex, positionIndexes} = snapSourceHandle.properties;\n if (!Array.isArray(positionIndexes)) {\n return snapSourceHandle;\n }\n const snapSourceFeature = data.features[featureIndex];\n\n // $FlowFixMe\n const snapSourceCoordinates = positionIndexes.reduce(\n (a: any[], b: number) => a[b],\n snapSourceFeature.geometry.coordinates\n ) as Position;\n\n return {\n ...snapSourceHandle,\n geometry: {\n type: 'Point',\n coordinates: snapSourceCoordinates\n }\n };\n }\n\n // If additionalSnapTargets is present in modeConfig and is populated, this\n // method will return those features along with the features\n // that live in the current layer. Otherwise, this method will simply return the\n // features from the current layer\n _getSnapTargets(props: ModeProps<SimpleFeatureCollection>): SimpleFeature[] {\n let {additionalSnapTargets} = props.modeConfig || {};\n additionalSnapTargets = additionalSnapTargets || [];\n\n const features = [...props.data.features, ...additionalSnapTargets];\n return features;\n }\n\n _getSnapTargetHandles(props: ModeProps<SimpleFeatureCollection>): EditHandleFeature[] {\n const handles: EditHandleFeature[] = [];\n const features = this._getSnapTargets(props);\n\n for (let i = 0; i < features.length; i++) {\n // Filter out the currently selected feature(s)\n const isCurrentIndexFeatureNotSelected = !props.selectedIndexes.includes(i);\n\n if (isCurrentIndexFeatureNotSelected) {\n const {geometry} = features[i];\n handles.push(...getEditHandlesForGeometry(geometry, i, 'snap-target'));\n }\n }\n return handles;\n }\n\n // If no snap handle has been picked, only display the edit handles of the\n // selected feature. If a snap handle has been picked, display said snap handle\n // along with all snappable points on all non-selected features.\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const {modeConfig, lastPointerMoveEvent} = props;\n const {enableSnapping} = modeConfig || {};\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: [...this._handler.getGuides(props).features]\n };\n\n if (!enableSnapping) {\n return guides;\n }\n\n const snapSourceHandle: EditHandleFeature | null | undefined =\n lastPointerMoveEvent && this._getPickedSnapSource(lastPointerMoveEvent.pointerDownPicks);\n\n // They started dragging a handle\n // So render the picked handle (in its updated location) and all possible snap targets\n if (snapSourceHandle) {\n guides.features.push(\n ...this._getSnapTargetHandles(props),\n this._getUpdatedSnapSourceHandle(snapSourceHandle, props.data)\n );\n\n return guides;\n }\n\n // Render the possible snap source handles\n const {features} = props.data;\n for (const index of props.selectedIndexes) {\n if (index < features.length) {\n const {geometry} = features[index];\n guides.features.push(...getEditHandlesForGeometry(geometry, index, 'snap-source'));\n }\n }\n\n return guides;\n }\n\n _getSnapAwareEvent<T extends MovementTypeEvent>(\n event: T,\n props: ModeProps<FeatureCollection>\n ): T {\n const snapSource = this._getPickedSnapSource(props.lastPointerMoveEvent.pointerDownPicks);\n const snapTarget = this._getPickedSnapTarget(event.picks);\n\n return snapSource && snapTarget\n ? this._getSnappedMouseEvent(event, snapSource, snapTarget)\n : event;\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleStartDragging(event, props);\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleStopDragging(this._getSnapAwareEvent(event, props), props);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handleDragging(this._getSnapAwareEvent(event, props), props);\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n this._handler.handlePointerMove(this._getSnapAwareEvent(event, props), props);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {featureCollection} from '@turf/helpers';\nimport {PointerMoveEvent, ModeProps, StartDraggingEvent} from './types';\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {TranslateMode} from './translate-mode';\nimport {ScaleMode} from './scale-mode';\nimport {RotateMode} from './rotate-mode';\n\nimport {CompositeMode} from './composite-mode';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class TransformMode extends CompositeMode {\n constructor() {\n super([new TranslateMode(), new ScaleMode(), new RotateMode()]);\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n let updatedCursor: string | null = null;\n super.handlePointerMove(event, {\n ...props,\n onUpdateCursor: (cursor) => {\n updatedCursor = cursor || updatedCursor;\n }\n });\n props.onUpdateCursor(updatedCursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n let scaleMode: ScaleMode | null = null;\n let translateMode: TranslateMode | null = null;\n const filteredModes: GeoJsonEditMode[] = [];\n\n if (event.picks.length) {\n event.cancelPan();\n }\n\n // If the user selects a scaling edit handle that overlaps with part of the selected feature,\n // it is possible for both scale and translate actions to be triggered. This logic prevents\n // this simultaneous action trigger from happening by putting a higher priority on scaling\n // since the user needs to be more precise to hover over a scaling edit handle.\n this._modes.forEach((mode) => {\n if (mode instanceof TranslateMode) {\n translateMode = mode;\n } else {\n if (mode instanceof ScaleMode) {\n scaleMode = mode;\n }\n filteredModes.push(mode);\n }\n });\n\n if (scaleMode instanceof ScaleMode && !scaleMode.isEditHandleSelected()) {\n filteredModes.push(translateMode);\n }\n\n filteredModes.filter(Boolean).forEach((mode) => mode.handleStartDragging(event, props));\n }\n\n getGuides(props: ModeProps<FeatureCollection>) {\n let compositeGuides = super.getGuides(props);\n const rotateMode = (this._modes || []).find((mode) => mode instanceof RotateMode);\n\n if (rotateMode instanceof RotateMode) {\n const nonEnvelopeGuides = compositeGuides.features.filter((guide) => {\n const {editHandleType, mode} = (guide.properties as any) || {};\n // Both scale and rotate modes have the same enveloping box as a guide - only need one\n const guidesToFilterOut = [mode];\n // Do not render scaling edit handles if rotating\n if (rotateMode.getIsRotating()) {\n guidesToFilterOut.push(editHandleType);\n }\n return !guidesToFilterOut.includes('scale');\n });\n\n // @ts-expect-error turf types\n compositeGuides = featureCollection(nonEnvelopeGuides);\n }\n return compositeGuides;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {\n ModeProps,\n ClickEvent,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n GuideFeatureCollection,\n GuideFeature\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class CompositeMode extends GeoJsonEditMode {\n _modes: Array<GeoJsonEditMode>;\n\n constructor(modes: Array<GeoJsonEditMode>) {\n super();\n this._modes = modes;\n }\n\n _coalesce<T>(\n callback: (arg0: GeoJsonEditMode) => T,\n resultEval: ((arg0: T) => boolean | null | undefined) | null = null\n ): T {\n let result: T | null = null;\n\n for (let i = 0; i < this._modes.length; i++) {\n // eslint-disable-next-line callback-return\n result = callback(this._modes[i]);\n if (resultEval ? resultEval(result) : result) {\n break;\n }\n }\n\n return result;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n this._coalesce((handler) => handler.handleClick(event, props));\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handlePointerMove(event, props));\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleStartDragging(event, props));\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleStopDragging(event, props));\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<FeatureCollection>): void {\n return this._coalesce((handler) => handler.handleDragging(event, props));\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n // TODO: Combine the guides *BUT* make sure if none of the results have\n // changed to return the same object so that \"guides !== this.state.guides\"\n // in editable-geojson-layer works.\n\n const allGuides: GuideFeature[] = [];\n for (const mode of this._modes) {\n allGuides.push(...mode.getGuides(props).features);\n }\n\n return {\n type: 'FeatureCollection',\n features: allGuides\n };\n }\n}\n", "import {FeatureCollection} from '../utils/geojson-types';\n\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ClickEvent, ModeProps} from './types';\nexport class DeleteMode extends GeoJsonEditMode {\n handleClick(_event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n const selectedFeatureIndexes = props.lastPointerMoveEvent.picks.map((pick) => pick.index);\n if (selectedFeatureIndexes.length > 0) {\n const indexToDelete = selectedFeatureIndexes[0];\n\n const features = props.data.features.filter((_, index) => index !== indexToDelete);\n const updatedData = {\n ...props.data,\n features\n };\n\n const editAction = {\n updatedData,\n editType: 'deleteFeature',\n editContext: {\n featureIndexes: selectedFeatureIndexes\n }\n };\n\n props.onEdit(editAction);\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * A multiplier for screen-space width/scale for Arc, Line, Icon and Text layers.\n * Required in order to maintain the same appearance after upgrading to deck.gl v8.5.\n * https://github.com/visgl/deck.gl/blob/master/docs/upgrade-guide.md\n */\nexport const PROJECTED_PIXEL_SIZE_MULTIPLIER = 2 / 3;\n\n/**\n * Unit literal to shader unit number conversion.\n */\nexport const UNIT = {\n common: 0,\n meters: 1,\n pixels: 2\n};\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {CompositeLayerProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport {\n DraggingEvent,\n ClickEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n PointerMoveEvent,\n DoubleClickEvent\n} from '../edit-modes/types';\nimport {Position} from '../utils/geojson-types';\n\nconst EVENT_TYPES = ['click', 'pointermove', 'panstart', 'panmove', 'panend', 'keyup', 'dblclick'];\n\n// TODO(v9): remove generic layer\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type EditableLayerProps<DataType = any> = CompositeLayerProps & {\n pickingRadius?: number;\n pickingDepth?: number;\n onCancelPan?: () => void;\n};\n\nexport abstract class EditableLayer<\n DataT = any,\n ExtraPropsT = Record<string, unknown>\n> extends CompositeLayer<ExtraPropsT & Required<EditableLayerProps<DataT>>> {\n static layerName = 'EditableLayer';\n\n state: {_editableLayerState: any} = undefined!;\n\n // Overridable interaction event handlers\n onLayerClick(event: ClickEvent): void {\n // default implementation - do nothing\n }\n onLayerDoubleClick(event: DoubleClickEvent): void {\n // default implementation - do nothing\n }\n\n onStartDragging(event: StartDraggingEvent): void {\n // default implementation - do nothing\n }\n\n onStopDragging(event: StopDraggingEvent): void {\n // default implementation - do nothing\n }\n\n onDragging(event: DraggingEvent): void {\n // default implementation - do nothing\n }\n\n onPointerMove(event: PointerMoveEvent): void {\n // default implementation - do nothing\n }\n\n onLayerKeyUp(event: KeyboardEvent): void {\n // default implementation - do nothing;\n }\n // TODO: implement onCancelDragging (e.g. drag off screen)\n\n initializeState() {\n this.setState({\n _editableLayerState: {\n // Picked objects at the time the pointer went down\n pointerDownPicks: null,\n // Screen coordinates where the pointer went down\n pointerDownScreenCoords: null,\n // Ground coordinates where the pointer went down\n pointerDownMapCoords: null,\n\n // Keep track of the mjolnir.js event handler so it can be deregistered\n eventHandler: this._forwardEventToCurrentLayer.bind(this)\n }\n });\n\n this._addEventHandlers();\n }\n\n finalizeState() {\n this._removeEventHandlers();\n }\n\n _addEventHandlers() {\n // @ts-expect-error accessing protected props\n const {eventManager} = this.context.deck;\n const {eventHandler} = this.state._editableLayerState;\n\n for (const eventType of EVENT_TYPES) {\n eventManager.on(eventType as any, eventHandler, {\n // give nebula a higher priority so that it can stop propagation to deck.gl's map panning handlers\n priority: 100\n });\n }\n }\n\n _removeEventHandlers() {\n // @ts-expect-error accessing protected props\n const {eventManager} = this.context.deck;\n const {eventHandler} = this.state._editableLayerState;\n\n for (const eventType of EVENT_TYPES) {\n eventManager.off(eventType as any, eventHandler);\n }\n }\n\n // A new layer instance is created on every render, so forward the event to the current layer\n // This means that the first layer instance will stick around to be the event listener, but will forward the event\n // to the latest layer instance.\n _forwardEventToCurrentLayer(event: any) {\n const currentLayer = this.getCurrentLayer();\n\n // Use a naming convention to find the event handling function for this event type\n const func = currentLayer[`_on${event.type}`].bind(currentLayer);\n if (!func) {\n console.warn(`no handler for mjolnir.js event ${event.type}`); // eslint-disable-line\n return;\n }\n func(event);\n }\n\n _onclick({srcEvent}: any) {\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const picks = this.getPicks(screenCoords);\n\n this.onLayerClick({\n mapCoords,\n screenCoords,\n picks,\n sourceEvent: srcEvent\n });\n }\n\n _ondblclick({srcEvent}: any) {\n this.onLayerDoubleClick(srcEvent);\n }\n\n _onkeyup({srcEvent}: {srcEvent: KeyboardEvent}) {\n this.onLayerKeyUp(srcEvent);\n }\n\n _onpanstart(event: any) {\n const screenCoords = this.getScreenCoords(event.srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n const picks = this.getPicks(screenCoords);\n\n this.setState({\n _editableLayerState: {\n ...this.state._editableLayerState,\n pointerDownScreenCoords: screenCoords,\n pointerDownMapCoords: mapCoords,\n pointerDownPicks: picks\n }\n });\n\n this.onStartDragging({\n picks,\n screenCoords,\n mapCoords,\n pointerDownScreenCoords: screenCoords,\n pointerDownMapCoords: mapCoords,\n cancelPan: () => {\n if (this.props.onCancelPan) {\n this.props.onCancelPan();\n }\n\n event.stopImmediatePropagation();\n },\n sourceEvent: event.srcEvent\n });\n }\n\n _onpanmove(event: any) {\n const {srcEvent} = event;\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onDragging({\n screenCoords,\n mapCoords,\n picks,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent,\n cancelPan: event.stopImmediatePropagation\n // another (hacky) approach for cancelling map panning\n // const controller = this.context.deck.viewManager.controllers[\n // Object.keys(this.context.deck.viewManager.controllers)[0]\n // ];\n // controller._state.isDragging = false;\n });\n }\n\n _onpanend({srcEvent}: any) {\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onStopDragging({\n picks,\n screenCoords,\n mapCoords,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent\n });\n\n this.setState({\n _editableLayerState: {\n ...this.state._editableLayerState,\n pointerDownScreenCoords: null,\n pointerDownMapCoords: null,\n pointerDownPicks: null\n }\n });\n }\n\n _onpointermove(event: any) {\n const {srcEvent} = event;\n const screenCoords = this.getScreenCoords(srcEvent) as [number, number];\n const mapCoords = this.getMapCoords(screenCoords);\n\n const {pointerDownPicks, pointerDownScreenCoords, pointerDownMapCoords} =\n this.state._editableLayerState;\n\n const picks = this.getPicks(screenCoords);\n\n this.onPointerMove({\n screenCoords,\n mapCoords,\n picks,\n pointerDownPicks,\n pointerDownScreenCoords,\n pointerDownMapCoords,\n sourceEvent: srcEvent,\n cancelPan: event.stopImmediatePropagation\n });\n }\n\n getPicks(screenCoords: [number, number]) {\n return this.context.deck.pickMultipleObjects({\n x: screenCoords[0],\n y: screenCoords[1],\n layerIds: [this.props.id],\n radius: this.props.pickingRadius,\n depth: this.props.pickingDepth\n });\n }\n\n getScreenCoords(pointerEvent: any): Position {\n return [\n pointerEvent.clientX -\n (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().left,\n pointerEvent.clientY -\n (this.context.gl.canvas as HTMLCanvasElement).getBoundingClientRect().top\n ];\n }\n\n getMapCoords(screenCoords: Position): Position {\n return this.context.viewport.unproject([screenCoords[0], screenCoords[1]]) as Position;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {PathLayerProps} from '@deck.gl/layers';\nimport {PathLayer} from '@deck.gl/layers';\nimport type {ShaderModule} from '@luma.gl/shadertools';\n\nimport {insertBefore} from '../utils/utils';\n\nconst uniformBlock = `\\\nuniform pickingLineWidthUniforms {\n float extraPixels;\n} pickingLineWidth;\n`;\n\nexport type PickingLineWidthProps = {\n extraPixels: number;\n};\n\nexport const pickingUniforms = {\n name: 'pickingLineWidth',\n vs: uniformBlock,\n fs: uniformBlock,\n uniformTypes: {\n extraPixels: 'f32'\n }\n} as const satisfies ShaderModule<PickingLineWidthProps>;\n\ninterface EditablePathLayerProps extends PathLayerProps<any> {\n pickingLineWidthExtraPixels?: number;\n}\n\nconst defaultProps = {\n ...PathLayer.defaultProps,\n pickingLineWidthExtraPixels: {type: 'number', min: 0, value: Number.MAX_SAFE_INTEGER}\n};\n\nexport class EditablePathLayer extends PathLayer<any, EditablePathLayerProps> {\n getShaders() {\n const shaders = super.getShaders();\n\n shaders.vs = insertBefore(\n shaders.vs,\n 'vec3 width;',\n `\n if(bool(picking.isActive)){\n widthPixels.xy += pickingLineWidth.extraPixels;\n }\n `\n );\n\n return {\n ...shaders,\n modules: [...shaders.modules, pickingUniforms]\n };\n }\n\n draw(props) {\n const {pickingLineWidthExtraPixels} = this.props;\n const pickingProps: PickingLineWidthProps = {extraPixels: pickingLineWidthExtraPixels};\n const model = this.state.model;\n model.shaderInputs.setProps({pickingLineWidth: pickingProps});\n super.draw(props);\n }\n}\n\nEditablePathLayer.defaultProps = defaultProps;\nEditablePathLayer.layerName = 'EditablePathLayer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {DefaultProps} from '@deck.gl/core';\nimport {H3ClusterLayer} from '@deck.gl/geo-layers';\n// TODO: Fix H3 support.\n// import { polyfill, geoToH3 } from 'h3-js';\nimport {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants';\nimport {EditableGeoJsonLayer} from './editable-geojson-layer';\nimport {EditableLayer, EditableLayerProps} from './editable-layer';\nimport {ViewMode} from '../edit-modes/view-mode';\n\nconst DEFAULT_EDIT_MODE = ViewMode;\nconst DEFAULT_H3_RESOLUTION = 9;\nconst EMPTY_FEATURE_COLLECTION = {\n type: 'FeatureCollection',\n features: []\n};\n\nexport type EditableH3ClusterLayerProps<DataT> = EditableLayerProps & {\n data: DataT;\n resolution?: number;\n mode?: any;\n modeConfig?: any;\n selectedIndexes?: number[];\n getEditedCluster?: (updatedHexagons: any[], existingCluster: any) => any;\n getHexagons?: (d) => number[];\n onEdit?: (updatedData?, editType?: string, featureIndexes?: number[], editContext?) => void;\n filled?: boolean;\n stroked?: boolean;\n lineWidthScale?: number;\n lineWidthMinPixels?: number;\n lineWidthMaxPixels?: number;\n lineWidthUnits?: string;\n};\n\nconst defaultProps: DefaultProps<EditableH3ClusterLayerProps<any>> = {\n mode: DEFAULT_EDIT_MODE,\n\n ...EditableGeoJsonLayer.defaultProps,\n\n // h3 layer\n data: [],\n selectedIndexes: [],\n filled: false,\n stroked: true,\n lineWidthScale: PROJECTED_PIXEL_SIZE_MULTIPLIER,\n lineWidthMinPixels: 1,\n lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,\n lineWidthUnits: 'pixels',\n getHexagons: (d) => d.hexIds,\n getEditedCluster: (updatedHexagons, existingCluster) => {\n if (existingCluster) {\n return {\n ...existingCluster,\n hexIds: updatedHexagons\n };\n }\n return {\n hexIds: updatedHexagons\n };\n },\n resolution: DEFAULT_H3_RESOLUTION\n};\n\nexport class EditableH3ClusterLayer extends EditableLayer<any, EditableH3ClusterLayerProps<any>> {\n static layerName = 'EditableH3ClusterLayer';\n static defaultProps = defaultProps;\n\n state: EditableLayer['state'] & {\n cursor?: 'grabbing' | 'grab' | null;\n tentativeHexagonIDs: string[];\n } = undefined!;\n\n initializeState() {\n super.initializeState();\n\n this.setState({\n tentativeHexagonIDs: []\n });\n }\n\n // convert array of (lng, lat) coords to cluster of hexes\n getDerivedHexagonIDs(coords) {\n throw new Error('not implemented'); // TODO\n // return polyfill(coords, this.props.resolution, true);\n }\n\n // convert pair of (lng, lat) coords into single hex\n getDerivedHexagonID(coords) {\n throw new Error('not implemented'); // TODO\n // return geoToH3(coords[1], coords[0], this.props.resolution);\n }\n\n renderLayers() {\n const layers: any = [\n new EditableGeoJsonLayer(\n this.getSubLayerProps({\n id: 'editable-geojson',\n\n mode: this.props.mode,\n data: EMPTY_FEATURE_COLLECTION,\n selectedFeatureIndexes: [],\n\n onEdit: (editAction) => {\n const {editType, editContext} = editAction;\n\n switch (editType) {\n case 'updateTentativeFeature':\n // tentative feature updates, updated on every pointer move\n if (editContext.feature.geometry.type === 'Polygon') {\n const coords = editContext.feature.geometry.coordinates;\n const hexIDs = this.getDerivedHexagonIDs(coords);\n\n this.setState({tentativeHexagonIDs: hexIDs});\n } else if (editContext.feature.geometry.type === 'Point') {\n const coords = editContext.feature.geometry.coordinates;\n const hexID = this.getDerivedHexagonID(coords);\n\n this.setState({tentativeHexagonIDs: [hexID]});\n }\n break;\n case 'addFeature':\n const updatedData = [...this.props.data];\n const {modeConfig} = this.props;\n\n if (!modeConfig || !modeConfig.booleanOperation) {\n // add new h3 cluster\n updatedData.push(\n this.props.getEditedCluster(this.state.tentativeHexagonIDs, null)\n );\n } else if (this.props.selectedIndexes.length !== 1) {\n // eslint-disable-next-line no-console,no-undef\n console.warn('booleanOperation only supported for single cluster selection');\n } else {\n // they're affecting a selected cluster\n let finalHexagonIDs: (string | number)[];\n const committedHexagonIDs = new Set<string | number>(this.getSelectedHexIDs());\n const tentativeHexagonIDs = new Set<string | number>(\n this.state.tentativeHexagonIDs\n );\n\n switch (modeConfig.booleanOperation) {\n case 'union':\n default:\n finalHexagonIDs = [\n ...new Set([...committedHexagonIDs, ...tentativeHexagonIDs])\n ];\n break;\n case 'intersection':\n finalHexagonIDs = [...committedHexagonIDs].filter((hexID: string | number) =>\n tentativeHexagonIDs.has(hexID)\n );\n break;\n case 'difference':\n finalHexagonIDs = [...committedHexagonIDs].filter(\n (hexID: string | number) => !tentativeHexagonIDs.has(hexID)\n );\n break;\n }\n\n const selectedIndex = this.props.selectedIndexes[0];\n const existingCluster = this.props.data[selectedIndex];\n updatedData[selectedIndex] = this.props.getEditedCluster(\n finalHexagonIDs,\n existingCluster\n );\n }\n\n this.setState({\n tentativeHexagonIDs: []\n });\n\n this.props.onEdit({updatedData});\n\n break;\n default:\n break;\n }\n }\n })\n ),\n\n new H3ClusterLayer(\n this.getSubLayerProps({\n id: 'hexagons',\n data: this.props.data,\n getHexagons: this.props.getHexagons\n })\n ),\n new H3ClusterLayer(\n this.getSubLayerProps({\n id: 'tentative-hexagons',\n data: [\n {\n hexIds: this.state.tentativeHexagonIDs\n }\n ],\n getHexagons: (d) => d.hexIds\n })\n )\n ];\n return layers;\n }\n\n // because data is an array of hexagon data, we take the cumulative of all selected indexes,\n // using props.getHexagons to support multiple data types\n getSelectedHexIDs() {\n let cumulativeHexIDs: number[] = [];\n this.props.selectedIndexes.forEach((index) => {\n const selectedCluster = this.props.data[index];\n const hexIDs = this.props.getHexagons(selectedCluster);\n cumulativeHexIDs = cumulativeHexIDs.concat(hexIDs);\n });\n return cumulativeHexIDs;\n }\n\n getCursor({isDragging}: {isDragging: boolean}): 'grabbing' | 'grab' {\n let {cursor} = this.state || {};\n if (!cursor) {\n // default cursor\n cursor = isDragging ? 'grabbing' : 'grab';\n }\n return cursor;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport type {CompositeLayerProps, DefaultProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport {PolygonLayer} from '@deck.gl/layers';\nimport {featureCollection, polygon} from '@turf/helpers';\nimport turfBuffer from '@turf/buffer';\nimport turfDifference from '@turf/difference';\n\nimport {EditableGeoJsonLayer} from './editable-geojson-layer';\nimport {DrawRectangleMode} from '../edit-modes/draw-rectangle-mode';\nimport {DrawPolygonMode} from '../edit-modes/draw-polygon-mode';\nimport {ViewMode} from '../edit-modes/view-mode';\n\nexport const SELECTION_TYPE = {\n NONE: null,\n RECTANGLE: 'rectangle',\n POLYGON: 'polygon'\n};\n\nconst MODE_MAP = {\n [SELECTION_TYPE.RECTANGLE]: DrawRectangleMode,\n [SELECTION_TYPE.POLYGON]: DrawPolygonMode\n};\n\nconst MODE_CONFIG_MAP = {\n [SELECTION_TYPE.RECTANGLE]: {dragToDraw: true}\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface SelectionLayerProps<DataT> extends CompositeLayerProps {\n layerIds: any[];\n onSelect: (info: any) => any;\n selectionType: string | null;\n}\n\nconst defaultProps: DefaultProps<SelectionLayerProps<any>> = {\n selectionType: SELECTION_TYPE.RECTANGLE,\n layerIds: [],\n onSelect: () => {}\n};\n\nconst EMPTY_DATA = {\n type: 'FeatureCollection',\n features: []\n};\n\nconst EXPANSION_KM = 50;\nconst LAYER_ID_GEOJSON = 'selection-geojson';\nconst LAYER_ID_BLOCKER = 'selection-blocker';\n\nconst PASS_THROUGH_PROPS = [\n 'lineWidthScale',\n 'lineWidthMinPixels',\n 'lineWidthMaxPixels',\n 'lineWidthUnits',\n 'lineJointRounded',\n 'lineCapRounded',\n 'lineMiterLimit',\n 'pointRadiusScale',\n 'pointRadiusMinPixels',\n 'pointRadiusMaxPixels',\n 'lineDashJustified',\n 'getLineColor',\n 'getFillColor',\n 'getRadius',\n 'getLineWidth',\n 'getLineDashArray',\n 'getTentativeLineDashArray',\n 'getTentativeLineColor',\n 'getTentativeFillColor',\n 'getTentativeLineWidth'\n];\nexport class SelectionLayer<DataT, ExtraPropsT> extends CompositeLayer<\n ExtraPropsT & Required<SelectionLayerProps<DataT>>\n> {\n static layerName = 'SelectionLayer';\n static defaultProps = defaultProps;\n\n state: {\n pendingPolygonSelection: {\n bigPolygon: ReturnType<typeof turfDifference>;\n };\n } = undefined!;\n\n _selectRectangleObjects(coordinates: any) {\n const {layerIds, onSelect} = this.props;\n const [x1, y1] = this.context.viewport.project(coordinates[0][0]);\n const [x2, y2] = this.context.viewport.project(coordinates[0][2]);\n const pickingInfos = this.context.deck.pickObjects({\n x: Math.min(x1, x2),\n y: Math.min(y1, y2),\n width: Math.abs(x2 - x1),\n height: Math.abs(y2 - y1),\n layerIds\n });\n\n onSelect({pickingInfos});\n }\n\n _selectPolygonObjects(coordinates: any) {\n const {layerIds, onSelect} = this.props;\n const mousePoints = coordinates[0].map((c) => this.context.viewport.project(c));\n\n const allX = mousePoints.map((mousePoint) => mousePoint[0]);\n const allY = mousePoints.map((mousePoint) => mousePoint[1]);\n const x = Math.min(...allX);\n const y = Math.min(...allY);\n const maxX = Math.max(...allX);\n const maxY = Math.max(...allY);\n\n // Use a polygon to hide the outside, because pickObjects()\n // does not support polygons\n const landPointsPoly = polygon(coordinates);\n const bigBuffer = turfBuffer(landPointsPoly, EXPANSION_KM);\n let bigPolygon;\n try {\n // turfDifference throws an exception if the polygon\n // intersects with itself (TODO: check if true in all versions)\n bigPolygon = turfDifference(featureCollection([bigBuffer, landPointsPoly]));\n } catch (e) {\n // invalid selection polygon\n console.log('turfDifference() error', e); // eslint-disable-line\n return;\n }\n\n this.setState({\n pendingPolygonSelection: {\n bigPolygon\n }\n });\n\n const blockerId = `${this.props.id}-${LAYER_ID_BLOCKER}`;\n\n // HACK, find a better way\n setTimeout(() => {\n const pickingInfos = this.context.deck.pickObjects({\n x,\n y,\n width: maxX - x,\n height: maxY - y,\n layerIds: [blockerId, ...layerIds]\n });\n\n onSelect({\n pickingInfos: pickingInfos.filter((item) => item.layer.id !== this.props.id)\n });\n }, 250);\n }\n\n renderLayers() {\n const {pendingPolygonSelection} = this.state;\n\n const mode = MODE_MAP[this.props.selectionType] || ViewMode;\n const modeConfig = MODE_CONFIG_MAP[this.props.selectionType];\n\n const inheritedProps = {};\n PASS_THROUGH_PROPS.forEach((p) => {\n if (this.props[p] !== undefined) inheritedProps[p] = this.props[p];\n });\n\n const layers: any[] = [\n new EditableGeoJsonLayer(\n this.getSubLayerProps({\n id: LAYER_ID_GEOJSON,\n pickable: true,\n mode,\n modeConfig,\n selectedFeatureIndexes: [],\n data: EMPTY_DATA,\n onEdit: ({updatedData, editType}) => {\n if (editType === 'addFeature') {\n const {coordinates} = updatedData.features[0].geometry;\n\n if (this.props.selectionType === SELECTION_TYPE.RECTANGLE) {\n this._selectRectangleObjects(coordinates);\n } else if (this.props.selectionType === SELECTION_TYPE.POLYGON) {\n this._selectPolygonObjects(coordinates);\n }\n }\n },\n ...inheritedProps\n })\n )\n ];\n\n if (pendingPolygonSelection) {\n const {bigPolygon} = pendingPolygonSelection as any;\n layers.push(\n new PolygonLayer(\n this.getSubLayerProps({\n id: LAYER_ID_BLOCKER,\n pickable: true,\n stroked: false,\n opacity: 1.0,\n data: [bigPolygon],\n getLineColor: (obj) => [0, 0, 0, 1],\n getFillColor: (obj) => [0, 0, 0, 1],\n getPolygon: (o) => o.geometry.coordinates\n })\n )\n );\n }\n\n return layers;\n }\n\n shouldUpdateState({changeFlags: {stateChanged, propsOrDataChanged}}: Record<string, any>) {\n return stateChanged || propsOrDataChanged;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-env browser */\n\nimport {CompositeLayer} from '@deck.gl/core';\nimport {ScatterplotLayer, LineLayer} from '@deck.gl/layers';\n\nconst defaultProps = {};\n\nexport class ElevatedEditHandleLayer extends CompositeLayer<any> {\n static layerName = 'ElevatedEditHandleLayer';\n static defaultProps = defaultProps;\n renderLayers() {\n const handles = new ScatterplotLayer(\n Object.assign({}, this.props, {\n id: `${this.props.id}-ScatterplotLayer`,\n data: this.props.data\n })\n );\n\n const lines = new LineLayer(\n Object.assign({}, this.props, {\n id: `${this.props.id}-LineLayer`,\n data: this.props.data,\n pickable: false,\n getSourcePosition: ({position}) => [position[0], position[1], 0],\n getTargetPosition: ({position}) => [position[0], position[1], position[2] || 0],\n getColor: [150, 150, 150, 200],\n getStrokeWidth: 3\n })\n );\n\n return [handles, lines];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {ComponentChild, JSX} from 'preact';\nimport {Widget, type WidgetProps, type WidgetPlacement, type Deck} from '@deck.gl/core';\nimport type {\n GeoJsonEditModeConstructor,\n GeoJsonEditModeType\n} from '../edit-modes/geojson-edit-mode';\n\nexport type EditModeTrayWidgetModeOption = {\n /**\n * Optional identifier for the mode button.\n * If not provided, one will be inferred from the supplied mode.\n */\n id?: string;\n /** Edit mode constructor or instance that the button should activate. */\n mode: GeoJsonEditModeConstructor | GeoJsonEditModeType;\n /**\n * The icon or element rendered inside the button.\n * A simple string can also be supplied for text labels.\n */\n icon?: ComponentChild;\n /** Optional text label rendered below the icon when provided. */\n label?: string;\n /** Optional tooltip text applied to the button element. */\n title?: string;\n};\n\nexport type EditModeTrayWidgetSelectEvent = {\n id: string;\n mode: GeoJsonEditModeConstructor | GeoJsonEditModeType;\n option: EditModeTrayWidgetModeOption;\n};\n\nexport type EditModeTrayWidgetProps = WidgetProps & {\n /** Placement for the widget root element. */\n placement?: WidgetPlacement;\n /** Layout direction for mode buttons. */\n layout?: 'vertical' | 'horizontal';\n /** Collection of modes rendered in the tray. */\n modes?: EditModeTrayWidgetModeOption[];\n /** Identifier of the currently active mode. */\n selectedModeId?: string | null;\n /** Currently active mode instance/constructor. */\n activeMode?: GeoJsonEditModeConstructor | GeoJsonEditModeType | null;\n /** Callback fired when the user selects a mode. */\n onSelectMode?: (event: EditModeTrayWidgetSelectEvent) => void;\n};\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n pointerEvents: 'auto',\n userSelect: 'none',\n zIndex: '99'\n};\n\nconst TRAY_BASE_STYLE: JSX.CSSProperties = {\n display: 'flex',\n gap: '6px',\n background: 'rgba(36, 40, 41, 0.88)',\n borderRadius: '999px',\n padding: '6px',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)'\n};\n\nconst BUTTON_BASE_STYLE: JSX.CSSProperties = {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: '#f0f0f0',\n width: '34px',\n height: '34px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n cursor: 'pointer',\n padding: '0',\n transition: 'background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease'\n};\n\nconst BUTTON_ACTIVE_STYLE: JSX.CSSProperties = {\n background: '#0071e3',\n color: '#ffffff',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 0.35)'\n};\n\nconst BUTTON_LABEL_STYLE: JSX.CSSProperties = {\n fontSize: '10px',\n marginTop: '2px',\n lineHeight: '12px'\n};\n\nexport class EditModeTrayWidget extends Widget<EditModeTrayWidgetProps> {\n static override defaultProps = {\n id: 'edit-mode-tray',\n _container: null,\n placement: 'top-left',\n layout: 'vertical',\n modes: [],\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<EditModeTrayWidgetProps, 'placement' | 'layout'>> &\n EditModeTrayWidgetProps;\n\n placement: WidgetPlacement = 'top-left';\n className = 'deck-widget-edit-mode-tray';\n layout: 'vertical' | 'horizontal' = 'vertical';\n selectedModeId: string | null = null;\n deck?: Deck | null = null;\n private appliedCustomClassName: string | null = null;\n\n constructor(props: EditModeTrayWidgetProps = {}) {\n super({...EditModeTrayWidget.defaultProps, ...props});\n this.placement = props.placement ?? EditModeTrayWidget.defaultProps.placement;\n this.layout = props.layout ?? EditModeTrayWidget.defaultProps.layout;\n this.selectedModeId = this.resolveSelectedModeId(props.modes ?? [], props);\n }\n\n override setProps(props: Partial<EditModeTrayWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n if (props.layout !== undefined) {\n this.layout = props.layout;\n }\n\n const modes = props.modes ?? this.props.modes ?? [];\n this.selectedModeId = this.resolveSelectedModeId(modes, props);\n\n super.setProps(props);\n this.renderTray();\n }\n\n override onAdd({deck}: {deck: Deck}): void {\n this.deck = deck;\n }\n\n override onRemove(): void {\n this.deck = null;\n const root = this.rootElement;\n if (root) {\n render(null, root);\n }\n this.rootElement = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...ROOT_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n if (this.appliedCustomClassName && this.appliedCustomClassName !== this.props.className) {\n rootElement.classList.remove(this.appliedCustomClassName);\n this.appliedCustomClassName = null;\n }\n if (this.props.className) {\n rootElement.classList.add(this.props.className);\n this.appliedCustomClassName = this.props.className;\n }\n rootElement.classList.add(this.className);\n\n this.renderTray();\n }\n\n private renderTray() {\n const root = this.rootElement;\n if (!root) {\n return;\n }\n\n const modes = this.props.modes ?? [];\n const selectedId = this.selectedModeId;\n const direction = this.layout === 'horizontal' ? 'row' : 'column';\n\n const trayStyle: JSX.CSSProperties = {\n ...TRAY_BASE_STYLE,\n flexDirection: direction\n };\n\n const stopEvent = (event: Event) => {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n };\n\n const ui = (\n <div\n style={trayStyle}\n onPointerDown={stopEvent}\n onPointerMove={stopEvent}\n onPointerUp={stopEvent}\n onMouseDown={stopEvent}\n onMouseMove={stopEvent}\n onMouseUp={stopEvent}\n onTouchStart={stopEvent}\n onTouchMove={stopEvent}\n onTouchEnd={stopEvent}\n >\n {modes.map((option, index) => {\n const id = this.getModeId(option, index);\n const active = id === selectedId;\n const label = option.label ?? '';\n const title = option.title ?? label;\n\n const buttonStyle: JSX.CSSProperties = {\n ...BUTTON_BASE_STYLE,\n ...(active ? BUTTON_ACTIVE_STYLE : {})\n };\n\n return (\n <button\n key={id}\n type=\"button\"\n title={title || undefined}\n aria-pressed={active}\n style={buttonStyle}\n onClick={(event) => {\n stopEvent(event);\n this.handleSelect(option, id);\n }}\n >\n {option.icon}\n {label ? <span style={BUTTON_LABEL_STYLE}>{label}</span> : null}\n </button>\n );\n })}\n </div>\n );\n\n render(ui, root);\n }\n\n private handleSelect(option: EditModeTrayWidgetModeOption, id: string) {\n if (this.selectedModeId !== id) {\n this.selectedModeId = id;\n this.renderTray();\n }\n\n this.props.onSelectMode?.({\n id,\n mode: option.mode,\n option\n });\n }\n\n private resolveSelectedModeId(\n modes: EditModeTrayWidgetModeOption[],\n props: Partial<EditModeTrayWidgetProps>\n ): string | null {\n if (props.selectedModeId !== undefined) {\n return props.selectedModeId;\n }\n\n const activeMode = props.activeMode ?? this.props?.activeMode ?? null;\n if (activeMode) {\n const match = this.findOptionByMode(modes, activeMode);\n if (match) {\n return this.getModeId(match.option, match.index);\n }\n }\n\n if (this.selectedModeId) {\n const existing = this.findOptionById(modes, this.selectedModeId);\n if (existing) {\n return this.selectedModeId;\n }\n }\n\n const first = modes[0];\n return first ? this.getModeId(first, 0) : null;\n }\n\n private findOptionByMode(\n modes: EditModeTrayWidgetModeOption[],\n activeMode: GeoJsonEditModeConstructor | GeoJsonEditModeType\n ): {option: EditModeTrayWidgetModeOption; index: number} | null {\n for (let index = 0; index < modes.length; index++) {\n const option = modes[index];\n if (option.mode === activeMode) {\n return {option, index};\n }\n if (this.isSameMode(option.mode, activeMode)) {\n return {option, index};\n }\n }\n return null;\n }\n\n private findOptionById(\n modes: EditModeTrayWidgetModeOption[],\n id: string\n ): {option: EditModeTrayWidgetModeOption; index: number} | null {\n for (let index = 0; index < modes.length; index++) {\n if (this.getModeId(modes[index], index) === id) {\n return {option: modes[index], index};\n }\n }\n return null;\n }\n\n private getModeId(option: EditModeTrayWidgetModeOption, index: number): string {\n if (option.id) {\n return option.id;\n }\n\n const mode = option.mode as any;\n if (mode) {\n if (typeof mode === 'function' && mode.name) {\n return mode.name;\n }\n if (mode && mode.constructor && mode.constructor.name) {\n return mode.constructor.name;\n }\n }\n\n return `mode-${index}`;\n }\n\n private isSameMode(\n modeA: GeoJsonEditModeConstructor | GeoJsonEditModeType,\n modeB: GeoJsonEditModeConstructor | GeoJsonEditModeType\n ): boolean {\n if (modeA === modeB) {\n return true;\n }\n const constructorA = (modeA as GeoJsonEditModeType)?.constructor;\n const constructorB = (modeB as GeoJsonEditModeType)?.constructor;\n return Boolean(constructorA && constructorB && constructorA === constructorB);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {render} from 'preact';\nimport type {JSX} from 'preact';\nimport {Widget, type WidgetProps, type WidgetPlacement, type Deck} from '@deck.gl/core';\n\nexport type BooleanOperation = 'union' | 'difference' | 'intersection' | null;\n\nexport type EditorToolbarWidgetProps = WidgetProps & {\n /** Placement for the widget root element. */\n placement?: WidgetPlacement;\n /** Currently active boolean operation. */\n booleanOperation?: BooleanOperation;\n /** Number of features in the current dataset. */\n featureCount?: number;\n /** Callback fired when the user selects a boolean operation. */\n onSetBooleanOperation?: (op: BooleanOperation) => void;\n /** Callback fired when the user clicks the clear button. */\n onClear?: () => void;\n /** Callback fired when the user clicks the export button. */\n onExport?: () => void;\n};\n\n// --- Styles (match EditModeTrayWidget visual language) ---\n\nconst ROOT_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n display: 'flex',\n flexDirection: 'column',\n gap: '6px',\n pointerEvents: 'auto',\n userSelect: 'none',\n zIndex: '99'\n};\n\nconst TRAY_STYLE: JSX.CSSProperties = {\n display: 'flex',\n gap: '4px',\n background: 'rgba(36, 40, 41, 0.88)',\n borderRadius: '999px',\n padding: '5px 8px',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)'\n};\n\nconst BUTTON_STYLE: JSX.CSSProperties = {\n appearance: 'none',\n background: 'transparent',\n border: 'none',\n color: '#f0f0f0',\n height: '30px',\n padding: '0 8px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '4px',\n borderRadius: '15px',\n cursor: 'pointer',\n fontSize: '11px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: '500',\n transition: 'background 0.15s ease, color 0.15s ease, box-shadow 0.15s ease',\n whiteSpace: 'nowrap'\n};\n\nconst BUTTON_ACTIVE_STYLE: JSX.CSSProperties = {\n background: '#0071e3',\n color: '#ffffff',\n boxShadow: '0 0 0 2px rgba(255, 255, 255, 0.35)'\n};\n\nconst DIVIDER_STYLE: JSX.CSSProperties = {\n width: '1px',\n height: '20px',\n background: 'rgba(255, 255, 255, 0.2)',\n margin: '0 2px',\n flexShrink: '0'\n};\n\nconst BADGE_STYLE: JSX.CSSProperties = {\n color: 'rgba(255, 255, 255, 0.6)',\n fontSize: '11px',\n padding: '0 6px',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n whiteSpace: 'nowrap'\n};\n\n// --- SVG Icons (14x14) ---\n\nfunction PencilIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 1.5l2.5 2.5L4.5 12H2v-2.5z\" />\n </svg>\n );\n}\n\nfunction SubtractIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.1\"\n >\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\" fill=\"rgba(36,40,41,0.88)\" />\n </svg>\n );\n}\n\nfunction UnionIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.1\"\n >\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"1.5\" />\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\" />\n </svg>\n );\n}\n\nfunction IntersectIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" strokeWidth=\"1.1\">\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" opacity=\"0.4\" />\n <rect x=\"5\" y=\"5\" width=\"8\" height=\"8\" rx=\"1.5\" stroke=\"currentColor\" opacity=\"0.4\" />\n <rect x=\"5\" y=\"5\" width=\"4\" height=\"4\" fill=\"currentColor\" opacity=\"0.6\" />\n </svg>\n );\n}\n\nfunction TrashIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2.5 4h9M5.5 4V2.5h3V4M3.5 4l.5 8h6l.5-8\" />\n </svg>\n );\n}\n\nfunction DownloadIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 2v7M4.5 6.5L7 9l2.5-2.5M2.5 11.5h9\" />\n </svg>\n );\n}\n\n// --- Widget ---\n\nconst BOOLEAN_OPS: Array<{\n op: BooleanOperation;\n icon: () => JSX.Element;\n label: string;\n title: string;\n}> = [\n {op: null, icon: PencilIcon, label: 'Edit', title: 'Draw new features'},\n {op: 'difference', icon: SubtractIcon, label: 'Sub', title: 'Subtract from selection'},\n {op: 'union', icon: UnionIcon, label: 'Union', title: 'Union with selection'},\n {op: 'intersection', icon: IntersectIcon, label: 'Sect', title: 'Intersect with selection'}\n];\n\nexport class EditorToolbarWidget extends Widget<EditorToolbarWidgetProps> {\n static override defaultProps = {\n id: 'editor-toolbar',\n _container: null,\n placement: 'bottom-left',\n booleanOperation: null,\n featureCount: 0,\n style: {},\n className: ''\n } satisfies Required<WidgetProps> &\n Required<Pick<EditorToolbarWidgetProps, 'placement'>> &\n EditorToolbarWidgetProps;\n\n placement: WidgetPlacement = 'bottom-left';\n className = 'deck-widget-editor-toolbar';\n deck?: Deck | null = null;\n private appliedCustomClassName: string | null = null;\n\n constructor(props: EditorToolbarWidgetProps = {}) {\n super({...EditorToolbarWidget.defaultProps, ...props});\n this.placement = props.placement ?? EditorToolbarWidget.defaultProps.placement;\n }\n\n override setProps(props: Partial<EditorToolbarWidgetProps>): void {\n if (props.placement !== undefined) {\n this.placement = props.placement;\n }\n super.setProps(props);\n this.renderToolbar();\n }\n\n override onAdd({deck}: {deck: Deck}): void {\n this.deck = deck;\n }\n\n override onRemove(): void {\n this.deck = null;\n const root = this.rootElement;\n if (root) {\n render(null, root);\n }\n this.rootElement = null;\n }\n\n override onRenderHTML(rootElement: HTMLElement): void {\n const style = {...ROOT_STYLE, ...this.props.style};\n Object.assign(rootElement.style, style);\n if (this.appliedCustomClassName && this.appliedCustomClassName !== this.props.className) {\n rootElement.classList.remove(this.appliedCustomClassName);\n this.appliedCustomClassName = null;\n }\n if (this.props.className) {\n rootElement.classList.add(this.props.className);\n this.appliedCustomClassName = this.props.className;\n }\n rootElement.classList.add(this.className);\n this.renderToolbar();\n }\n\n private renderToolbar() {\n const root = this.rootElement;\n if (!root) {\n return;\n }\n\n const booleanOp = this.props.booleanOperation ?? null;\n const featureCount = this.props.featureCount ?? 0;\n\n const stopEvent = (event: Event) => {\n event.stopPropagation();\n if (typeof (event as any).stopImmediatePropagation === 'function') {\n (event as any).stopImmediatePropagation();\n }\n };\n\n const ui = (\n <div\n style={TRAY_STYLE}\n onPointerDown={stopEvent}\n onPointerMove={stopEvent}\n onPointerUp={stopEvent}\n onMouseDown={stopEvent}\n onMouseMove={stopEvent}\n onMouseUp={stopEvent}\n onTouchStart={stopEvent}\n onTouchMove={stopEvent}\n onTouchEnd={stopEvent}\n >\n {/* Boolean operation toggle buttons */}\n {BOOLEAN_OPS.map(({op, icon: Icon, label, title}) => {\n const active = booleanOp === op;\n return (\n <button\n key={label}\n type=\"button\"\n title={title}\n aria-pressed={active}\n style={{...BUTTON_STYLE, ...(active ? BUTTON_ACTIVE_STYLE : {})}}\n onClick={(event) => {\n stopEvent(event);\n this.props.onSetBooleanOperation?.(op);\n }}\n >\n <Icon />\n <span>{label}</span>\n </button>\n );\n })}\n\n <div style={DIVIDER_STYLE} />\n\n {/* Clear button */}\n <button\n type=\"button\"\n title=\"Clear all features\"\n style={BUTTON_STYLE}\n onClick={(event) => {\n stopEvent(event);\n this.props.onClear?.();\n }}\n >\n <TrashIcon />\n </button>\n\n {/* Export button */}\n <button\n type=\"button\"\n title=\"Download as GeoJSON\"\n style={BUTTON_STYLE}\n onClick={(event) => {\n stopEvent(event);\n this.props.onExport?.();\n }}\n >\n <DownloadIcon />\n </button>\n\n <div style={DIVIDER_STYLE} />\n\n {/* Feature count badge */}\n <span style={BADGE_STYLE}>\n {featureCount} feature{featureCount !== 1 ? 's' : ''}\n </span>\n </div>\n );\n\n render(ui, root);\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompositeLayerProps, DefaultProps} from '@deck.gl/core';\nimport {CompositeLayer} from '@deck.gl/core';\nimport type {ScatterplotLayerProps} from '@deck.gl/layers';\nimport {ScatterplotLayer} from '@deck.gl/layers';\n\nimport {Color} from '../utils/types';\n\ntype JunctionScatterplotLayerProps = CompositeLayerProps &\n Omit<ScatterplotLayerProps, 'getFillColor'> & {\n getFillColor?: Color | ((d) => Color);\n getStrokeColor?: Color | ((d) => Color);\n getInnerRadius?: number | ((d) => number);\n };\n\nexport class JunctionScatterplotLayer extends CompositeLayer<JunctionScatterplotLayerProps> {\n static layerName = 'JunctionScatterplotLayer';\n static defaultProps: DefaultProps<JunctionScatterplotLayerProps> = {\n ...ScatterplotLayer.defaultProps,\n getFillColor: (d) => [0, 0, 0, 255],\n getStrokeColor: (d) => [255, 255, 255, 255],\n getInnerRadius: (d) => 1\n };\n\n renderLayers() {\n const {id, getFillColor, getStrokeColor, getInnerRadius, updateTriggers} = this.props;\n\n // data needs to be passed explicitly after deck.gl 5.3\n return [\n // the full circles\n new ScatterplotLayer<any>({\n ...this.props,\n id: `${id}-full`,\n data: this.props.data as any,\n getLineColor: getStrokeColor,\n updateTriggers: {\n ...updateTriggers,\n getStrokeColor: updateTriggers.getStrokeColor\n }\n }), // the inner part\n new ScatterplotLayer<any>({\n ...this.props,\n id: `${id}-inner`,\n data: this.props.data as any,\n getFillColor,\n getRadius: getInnerRadius,\n pickable: false,\n updateTriggers: {\n ...updateTriggers,\n getFillColor: updateTriggers.getFillColor,\n getRadius: updateTriggers.getInnerRadius\n }\n })\n ];\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport nearestPointOnLine from '@turf/nearest-point-on-line';\nimport {point, lineString as toLineString} from '@turf/helpers';\nimport circle from '@turf/circle';\nimport distance from '@turf/distance';\nimport turfCenter from '@turf/center';\nimport {\n recursivelyTraverseNestedArrays,\n nearestPointOnProjectedLine,\n getPickedEditHandles,\n getPickedEditHandle,\n NearestPointType\n} from './utils';\nimport {\n LineString,\n Point,\n FeatureCollection,\n Feature,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {Viewport} from '../utils/types';\nimport {\n ModeProps,\n PointerMoveEvent,\n StartDraggingEvent,\n StopDraggingEvent,\n DraggingEvent,\n EditHandleFeature,\n GuideFeatureCollection,\n GuideFeature\n} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ResizeCircleMode extends GeoJsonEditMode {\n _selectedEditHandle: EditHandleFeature | null | undefined;\n _isResizing = false;\n\n // eslint-disable-next-line complexity\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const handles: GuideFeature[] = [];\n const selectedFeatureIndexes = props.selectedIndexes;\n\n const {lastPointerMoveEvent} = props;\n const picks = lastPointerMoveEvent && lastPointerMoveEvent.picks;\n const mapCoords = lastPointerMoveEvent && lastPointerMoveEvent.mapCoords;\n\n // intermediate edit handle\n if (\n picks &&\n picks.length &&\n mapCoords &&\n selectedFeatureIndexes.length === 1 &&\n !this._isResizing\n ) {\n const featureAsPick = picks.find((pick) => !pick.isGuide);\n\n // is the feature in the pick selected\n if (\n featureAsPick &&\n featureAsPick.object.properties.shape &&\n featureAsPick.object.properties.shape.includes('Circle') &&\n props.selectedIndexes.includes(featureAsPick.index)\n ) {\n let intermediatePoint: NearestPointType | null = null;\n let positionIndexPrefix: number[] = [];\n const referencePoint = point(mapCoords);\n // process all lines of the (single) feature\n recursivelyTraverseNestedArrays(\n featureAsPick.object.geometry.coordinates,\n [],\n (lineString, prefix) => {\n const lineStringFeature = toLineString(lineString);\n const candidateIntermediatePoint = this.getNearestPoint(\n lineStringFeature,\n referencePoint,\n props.modeConfig && props.modeConfig.viewport\n );\n if (\n !intermediatePoint ||\n candidateIntermediatePoint.properties.dist < intermediatePoint.properties.dist\n ) {\n intermediatePoint = candidateIntermediatePoint;\n positionIndexPrefix = prefix;\n }\n }\n );\n // tack on the lone intermediate point to the set of handles\n if (intermediatePoint) {\n const {\n geometry: {coordinates: position},\n properties: {index}\n } = intermediatePoint;\n handles.push({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'intermediate',\n featureIndex: featureAsPick.index,\n positionIndexes: [...positionIndexPrefix, index + 1]\n },\n geometry: {\n type: 'Point',\n coordinates: position\n }\n });\n }\n }\n }\n\n return {\n type: 'FeatureCollection',\n features: handles\n };\n }\n\n // turf.js does not support elevation for nearestPointOnLine\n getNearestPoint(\n line: Feature<LineString>,\n inPoint: Feature<Point>,\n viewport: Viewport | null | undefined\n ): NearestPointType {\n const {coordinates} = line.geometry;\n if (coordinates.some((coord) => coord.length > 2)) {\n if (viewport) {\n // This line has elevation, we need to use alternative algorithm\n return nearestPointOnProjectedLine(line, inPoint, viewport);\n }\n // eslint-disable-next-line no-console,no-undef\n console.log(\n 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.'\n );\n }\n return nearestPointOnLine(line, inPoint);\n }\n\n handleDragging(event: DraggingEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const editHandle = getPickedEditHandle(event.pointerDownPicks);\n\n if (editHandle) {\n // Cancel map panning if pointer went down on an edit handle\n event.cancelPan();\n\n const editHandleProperties = editHandle.properties;\n\n const feature = this.getSelectedFeature(props);\n const center = turfCenter(feature).geometry.coordinates;\n const numberOfSteps = Object.entries(feature.geometry.coordinates[0]).length - 1;\n const radius = Math.max(distance(center, event.mapCoords), 0.001);\n\n const {steps = numberOfSteps} = {};\n const options = {steps};\n const updatedFeature = circle(center, radius, options);\n const geometry = updatedFeature.geometry;\n\n const updatedData = new ImmutableFeatureCollection(props.data)\n .replaceGeometry(editHandleProperties.featureIndex, geometry)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'unionGeometry',\n editContext: {\n featureIndexes: [editHandleProperties.featureIndex]\n }\n });\n }\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n if (!this._isResizing) {\n const selectedEditHandle = getPickedEditHandle(event.picks);\n this._selectedEditHandle =\n selectedEditHandle && selectedEditHandle.properties.editHandleType === 'intermediate'\n ? selectedEditHandle\n : null;\n }\n\n const cursor = this.getCursor(event);\n props.onUpdateCursor(cursor);\n }\n\n handleStartDragging(event: StartDraggingEvent, props: ModeProps<FeatureCollection>) {\n if (this._selectedEditHandle) {\n event.cancelPan();\n this._isResizing = true;\n }\n }\n\n handleStopDragging(event: StopDraggingEvent, props: ModeProps<FeatureCollection>) {\n if (this._isResizing) {\n this._selectedEditHandle = null;\n this._isResizing = false;\n }\n }\n\n getCursor(event: PointerMoveEvent): string | null | undefined {\n const picks = (event && event.picks) || [];\n\n const handlesPicked = getPickedEditHandles(picks);\n if (handlesPicked.length) {\n return 'cell';\n }\n return null;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {\n Position,\n LineString,\n FeatureCollection,\n SimpleFeatureCollection\n} from '../utils/geojson-types';\nimport {ClickEvent, PointerMoveEvent, ModeProps, GuideFeatureCollection} from './types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\nimport {ImmutableFeatureCollection} from './immutable-feature-collection';\n\nexport class ExtendLineStringMode extends GeoJsonEditMode {\n getSingleSelectedLineString(\n props: ModeProps<SimpleFeatureCollection>\n ): LineString | null | undefined {\n const selectedGeometry = this.getSelectedGeometry(props);\n\n if (selectedGeometry && selectedGeometry.type === 'LineString') {\n return selectedGeometry;\n }\n return null;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const {selectedIndexes} = props;\n const selectedLineString = this.getSingleSelectedLineString(props);\n\n if (!selectedLineString) {\n console.warn(`ExtendLineStringMode only supported for single LineString selection`); // eslint-disable-line\n return;\n }\n\n // Extend the LineString\n let positionIndexes = [selectedLineString.coordinates.length];\n\n const modeConfig = props.modeConfig;\n if (modeConfig && modeConfig.drawAtFront) {\n positionIndexes = [0];\n }\n const featureIndex = selectedIndexes[0];\n const updatedData = new ImmutableFeatureCollection(props.data)\n .addPosition(featureIndex, positionIndexes, event.mapCoords)\n .getObject();\n\n props.onEdit({\n updatedData,\n editType: 'addPosition',\n editContext: {\n featureIndexes: [featureIndex],\n positionIndexes,\n position: event.mapCoords\n }\n });\n }\n\n getGuides(props: ModeProps<SimpleFeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n const selectedLineString = this.getSingleSelectedLineString(props);\n if (!selectedLineString) {\n return guides;\n }\n\n const mapCoords = props.lastPointerMoveEvent && props.lastPointerMoveEvent.mapCoords;\n\n if (!mapCoords) {\n return guides;\n }\n\n // Draw an extension line starting from one end of the selected LineString to the cursor\n let startPosition: Position | null | undefined = null;\n const {modeConfig} = props;\n if (modeConfig && modeConfig.drawAtFront) {\n startPosition = selectedLineString.coordinates[0];\n } else {\n startPosition = selectedLineString.coordinates[selectedLineString.coordinates.length - 1];\n }\n\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [startPosition, mapCoords]\n }\n });\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfDistance from '@turf/distance';\nimport turfMidpoint from '@turf/midpoint';\nimport {FeatureCollection} from '../utils/geojson-types';\nimport {\n ClickEvent,\n PointerMoveEvent,\n ModeProps,\n GuideFeatureCollection,\n Tooltip,\n GuideFeature\n} from './types';\nimport {getPickedEditHandle} from './utils';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nexport class MeasureDistanceMode extends GeoJsonEditMode {\n _isMeasuringSessionFinished = false;\n _currentTooltips: Tooltip[] = [];\n _currentDistance = 0;\n\n _calculateDistanceForTooltip = ({positionA, positionB, modeConfig}) => {\n const {turfOptions, measurementCallback} = modeConfig || {};\n const distance = turfDistance(positionA, positionB, turfOptions);\n\n if (measurementCallback) {\n measurementCallback(distance);\n }\n\n return distance;\n };\n\n _formatTooltip(distance, modeConfig?) {\n const {formatTooltip, turfOptions} = modeConfig || {};\n const units = (turfOptions && turfOptions.units) || 'kilometers';\n\n let text;\n if (formatTooltip) {\n text = formatTooltip(distance);\n } else {\n // By default, round to 2 decimal places and append units\n text = `${parseFloat(distance).toFixed(2)} ${units}`;\n }\n\n return text;\n }\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>) {\n const {modeConfig, data, onEdit} = props;\n const {centerTooltipsOnLine = false} = modeConfig || {};\n\n // restart measuring session\n if (this._isMeasuringSessionFinished) {\n this._isMeasuringSessionFinished = false;\n this.resetClickSequence();\n this._currentTooltips = [];\n this._currentDistance = 0;\n }\n\n const {picks} = event;\n const clickedEditHandle = getPickedEditHandle(picks);\n\n let positionAdded = false;\n if (!clickedEditHandle) {\n // Don't add another point right next to an existing one\n this.addClickSequence(event);\n positionAdded = true;\n }\n const clickSequence = this.getClickSequence();\n\n if (\n clickSequence.length > 1 &&\n clickedEditHandle &&\n Array.isArray(clickedEditHandle.properties.positionIndexes) &&\n clickedEditHandle.properties.positionIndexes[0] === clickSequence.length - 1\n ) {\n // They clicked the last point (or double-clicked), so add the LineString\n this._isMeasuringSessionFinished = true;\n } else if (positionAdded) {\n if (clickSequence.length > 1) {\n this._currentDistance += this._calculateDistanceForTooltip({\n positionA: clickSequence[clickSequence.length - 2],\n positionB: clickSequence[clickSequence.length - 1],\n modeConfig\n });\n\n const tooltipPosition = centerTooltipsOnLine\n ? turfMidpoint(\n clickSequence[clickSequence.length - 2],\n clickSequence[clickSequence.length - 1]\n ).geometry.coordinates\n : event.mapCoords;\n\n this._currentTooltips.push({\n position: tooltipPosition,\n text: this._formatTooltip(this._currentDistance, modeConfig)\n });\n }\n\n // new tentative point\n onEdit({\n // data is the same\n updatedData: data,\n editType: 'addTentativePosition',\n editContext: {\n position: event.mapCoords\n }\n });\n }\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<FeatureCollection>) {\n if (this._isMeasuringSessionFinished) return;\n\n event.stopPropagation();\n const {key} = event;\n\n const clickSequenceLength = this.getClickSequence().length;\n\n switch (key) {\n case 'Escape':\n this._isMeasuringSessionFinished = true;\n if (clickSequenceLength === 1) {\n this.resetClickSequence();\n this._currentTooltips = [];\n }\n // force update drawings\n props.onUpdateCursor('cell');\n break;\n case 'Enter':\n this.handleClick(props.lastPointerMoveEvent, props);\n this._isMeasuringSessionFinished = true;\n break;\n default:\n break;\n }\n }\n\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const {lastPointerMoveEvent} = props;\n const clickSequence = this.getClickSequence();\n\n const lastCoords =\n lastPointerMoveEvent && !this._isMeasuringSessionFinished\n ? [lastPointerMoveEvent.mapCoords]\n : [];\n\n const guides: GuideFeatureCollection = {\n type: 'FeatureCollection',\n features: []\n };\n\n if (clickSequence.length > 0) {\n guides.features.push({\n type: 'Feature',\n properties: {\n guideType: 'tentative'\n },\n geometry: {\n type: 'LineString',\n coordinates: [...clickSequence, ...lastCoords]\n }\n });\n }\n\n const editHandles: GuideFeature[] = clickSequence.map((clickedCoord, index) => ({\n type: 'Feature',\n properties: {\n guideType: 'editHandle',\n editHandleType: 'existing',\n featureIndex: -1,\n positionIndexes: [index]\n },\n geometry: {\n type: 'Point',\n coordinates: clickedCoord\n }\n }));\n\n guides.features.push(...editHandles);\n\n return guides;\n }\n\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>) {\n props.onUpdateCursor('cell');\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const {lastPointerMoveEvent, modeConfig} = props;\n const {centerTooltipsOnLine = false} = modeConfig || {};\n const positions = this.getClickSequence();\n\n if (positions.length > 0 && lastPointerMoveEvent && !this._isMeasuringSessionFinished) {\n const distance = this._calculateDistanceForTooltip({\n positionA: positions[positions.length - 1],\n positionB: lastPointerMoveEvent.mapCoords,\n modeConfig: props.modeConfig\n });\n\n const tooltipPosition = centerTooltipsOnLine\n ? turfMidpoint(positions[positions.length - 1], lastPointerMoveEvent.mapCoords).geometry\n .coordinates\n : lastPointerMoveEvent.mapCoords;\n\n return [\n ...this._currentTooltips,\n {\n position: tooltipPosition,\n text: this._formatTooltip(this._currentDistance + distance, modeConfig)\n }\n ];\n }\n\n return this._currentTooltips;\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport turfArea from '@turf/area';\nimport turfCentroid from '@turf/centroid';\nimport {ClickEvent, Tooltip, ModeProps} from './types';\nimport {FeatureCollection, SimpleFeatureCollection} from '../utils/geojson-types';\nimport {DrawPolygonMode} from './draw-polygon-mode';\n\nconst DEFAULT_TOOLTIPS = [];\n\nexport class MeasureAreaMode extends DrawPolygonMode {\n handleClick(event: ClickEvent, props: ModeProps<SimpleFeatureCollection>) {\n const propsWithoutEdit = {\n ...props,\n onEdit: () => {}\n };\n\n super.handleClick(event, propsWithoutEdit);\n }\n\n handleKeyUp(event: KeyboardEvent, props: ModeProps<SimpleFeatureCollection>): void {\n const propsWithoutEdit = {\n ...props,\n onEdit: () => {}\n };\n\n super.handleKeyUp(event, propsWithoutEdit);\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const tentativeGuide = this.getTentativeGuide(props);\n\n if (tentativeGuide && tentativeGuide.geometry.type === 'Polygon') {\n const {modeConfig} = props;\n const {formatTooltip, measurementCallback} = modeConfig || {};\n const units = 'sq. m';\n\n const centroid = turfCentroid(tentativeGuide);\n const area = turfArea(tentativeGuide);\n\n let text: string;\n if (formatTooltip) {\n text = formatTooltip(area);\n } else {\n // By default, round to 2 decimal places and append units\n // @ts-expect-error are isn't string\n text = `${parseFloat(area).toFixed(2)} ${units}`;\n }\n\n if (measurementCallback) {\n measurementCallback(area);\n }\n\n return [\n {\n position: centroid.geometry.coordinates,\n text\n }\n ];\n }\n return DEFAULT_TOOLTIPS;\n }\n}\n", "import turfBearing from '@turf/bearing';\nimport turfCenter from '@turf/center';\nimport {memoize} from '../utils/memoize';\n\nimport {ClickEvent, PointerMoveEvent, Tooltip, ModeProps, GuideFeatureCollection} from './types';\nimport {FeatureCollection, Position} from '../utils/geojson-types';\nimport {GeoJsonEditMode} from './geojson-edit-mode';\n\nconst DEFAULT_TOOLTIPS: Tooltip[] = [];\n\nexport class MeasureAngleMode extends GeoJsonEditMode {\n _getTooltips = memoize(\n ({\n modeConfig,\n vertex,\n point1,\n point2\n }: {\n modeConfig: any;\n vertex: any;\n point1: Position;\n point2: Position;\n }): Tooltip[] => {\n let tooltips = DEFAULT_TOOLTIPS;\n\n if (vertex && point1 && point2) {\n const {formatTooltip, measurementCallback} = modeConfig || {};\n const units = 'deg';\n\n const angle1 = turfBearing(vertex, point1);\n const angle2 = turfBearing(vertex, point2);\n let angle = Math.abs(angle1 - angle2);\n if (angle > 180) {\n angle = 360 - angle;\n }\n\n let text: string;\n if (formatTooltip) {\n text = formatTooltip(angle);\n } else {\n // By default, round to 2 decimal places and append units\n // @ts-expect-error angle isn't string\n text = `${parseFloat(angle).toFixed(2)} ${units}`;\n }\n\n if (measurementCallback) {\n measurementCallback(angle);\n }\n\n const position = turfCenter({\n type: 'FeatureCollection',\n features: [point1, point2].map((p) => ({\n type: 'Feature',\n geometry: {\n type: 'Point',\n coordinates: p\n },\n properties: {}\n }))\n }).geometry.coordinates;\n\n tooltips = [{position, text}];\n }\n\n return tooltips;\n }\n );\n\n handleClick(event: ClickEvent, props: ModeProps<FeatureCollection>): void {\n if (this.getClickSequence().length >= 3) {\n this.resetClickSequence();\n }\n\n this.addClickSequence(event);\n }\n\n // Called when the pointer moved, regardless of whether the pointer is down, up, and whether something was picked\n handlePointerMove(event: PointerMoveEvent, props: ModeProps<FeatureCollection>): void {\n props.onUpdateCursor('cell');\n }\n\n getPoints(props: ModeProps<FeatureCollection>): Position[] {\n const clickSequence = this.getClickSequence();\n\n const points = [...clickSequence];\n\n if (clickSequence.length < 3 && props.lastPointerMoveEvent) {\n points.push(props.lastPointerMoveEvent.mapCoords);\n }\n\n return points;\n }\n\n // Return features that can be used as a guide for editing the data\n getGuides(props: ModeProps<FeatureCollection>): GuideFeatureCollection {\n const guides: GuideFeatureCollection = {type: 'FeatureCollection', features: []};\n const {features} = guides;\n\n const points = this.getPoints(props);\n\n if (points.length > 2) {\n features.push({\n type: 'Feature',\n properties: {guideType: 'tentative'},\n geometry: {\n type: 'LineString',\n coordinates: [points[1], points[0], points[2]]\n }\n });\n } else if (points.length > 1) {\n features.push({\n type: 'Feature',\n properties: {guideType: 'tentative'},\n geometry: {\n type: 'LineString',\n coordinates: [points[1], points[0]]\n }\n });\n }\n\n return guides;\n }\n\n getTooltips(props: ModeProps<FeatureCollection>): Tooltip[] {\n const points = this.getPoints(props);\n\n return this._getTooltips({\n modeConfig: props.modeConfig,\n vertex: points[0],\n point1: points[1],\n point2: points[2]\n }) as Tooltip[];\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["mapCoords", "lineString", "pointToLineDistance", "bearing", "destination", "x", "y", "x2", "y2", "index", "x1", "y1", "distance", "import_layers", "import_helpers", "import_destination", "import_bearing", "import_point_to_line_distance", "import_helpers", "import_web_mercator", "recursivelyTraverseNestedArrays", "generatePointsParallelToLinePoints", "lineString", "pointToLineDistance", "bearing", "destination", "distance2d", "mix", "nearestPointOnProjectedLine", "x", "y", "x2", "y2", "index", "x1", "y1", "distance", "featureCollection", "polygon", "lineString", "mapCoords", "rewind", "turfUnion", "turfDifference", "turfIntersect", "import_bearing", "import_helpers", "import_web_mercator", "distance", "turfCenter", "turfRhumbDestination", "turfRhumbDistance", "turfRhumbBearing", "turfDistance", "turfBearing", "clone", "import_helpers", "mapCoords", "recursivelyTraverseNestedArrays", "lineString", "toLineString", "nearestPointOnProjectedLine", "import_bearing", "import_helpers", "import_meta", "import_distance", "import_invariant", "turfTransformScale", "turfCentroid", "bearing", "turfBearing", "bboxPolygon", "bbox", "turfDistance", "import_bbox", "import_centroid", "import_bearing", "import_bbox_polygon", "import_distance", "import_meta", "import_invariant", "import_helpers", "import_polygon_to_line", "turfCentroid", "bboxPolygon", "bbox", "turfDistance", "turfTransformRotate", "turfBearing", "bearing2", "import_difference", "import_helpers", "import_bearing", "import_distance", "import_destination", "import_polygon_to_line", "mapCoords", "turfPolygonToLine", "nearestPointOnLine", "turfDistance", "turfBearing", "turfDestination", "generatePointsParallelToLinePoints", "booleanPointInPolygon", "lineIntersect", "turfBuffer", "turfDifference", "turfFeature", "import_bearing", "generatePointsParallelToLinePoints", "bearing", "mapCoords", "import_distance", "distance", "import_line_intersect", "import_helpers", "polygon", "turfPolygon", "import_bbox_polygon", "omit", "polygon", "bboxPolygon", "import_bbox_polygon", "import_distance", "import_helpers", "turfDistance", "distance2", "turfLineString", "turfAlong", "bboxPolygon", "import_bbox_polygon", "bboxPolygon", "import_bbox_polygon", "import_distance", "import_along", "import_helpers", "turfDistance", "distance2", "turfLineString", "turfAlong", "bboxPolygon", "import_distance", "distance", "circle", "area", "import_circle", "import_distance", "import_area", "distance", "circle", "area", "import_bbox_polygon", "import_distance", "import_helpers", "bboxPolygon", "distance", "ellipse", "polygon", "generatePointsParallelToLinePoints", "import_distance", "import_ellipse", "import_bearing", "import_helpers", "distance", "bearing", "ellipse", "import_destination", "import_bearing", "import_line_intersect", "import_distance", "import_helpers", "mapCoords", "generatePointsParallelToLinePoints", "lineString", "polygon", "bearing", "distance", "turfDistance", "turfLineString", "destination", "lineIntersect", "import_lodash", "throttle", "import_helpers", "mapCoords", "defaultProps", "DEFAULT_EDIT_MODE", "defaultProps", "import_core", "import_layers", "import_helpers", "import_buffer", "import_difference", "defaultProps", "turfBuffer", "turfDifference", "import_core", "import_layers", "defaultProps", "import_core", "_jsx", "_jsxs", "import_preact", "import_core", "ROOT_STYLE", "BUTTON_ACTIVE_STYLE", "_jsx", "_jsxs", "import_core", "import_layers", "import_nearest_point_on_line", "import_helpers", "import_circle", "import_distance", "import_center", "mapCoords", "recursivelyTraverseNestedArrays", "lineString", "toLineString", "nearestPointOnProjectedLine", "nearestPointOnLine", "turfCenter", "distance", "circle", "mapCoords", "import_distance", "distance", "turfDistance", "turfMidpoint", "import_area", "import_centroid", "DEFAULT_TOOLTIPS", "turfCentroid", "area", "turfArea", "import_bearing", "import_center", "DEFAULT_TOOLTIPS", "point2", "turfBearing", "turfCenter"]
|
|
7
7
|
}
|