diff --git a/modules/editable-layers/package.json b/modules/editable-layers/package.json index ec5b031e..73c49e45 100644 --- a/modules/editable-layers/package.json +++ b/modules/editable-layers/package.json @@ -33,37 +33,36 @@ "src" ], "dependencies": { - "@turf/along": "^6.5.0", - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/bearing": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/buffer": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/circle": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/difference": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/midpoint": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0", - "@turf/rewind": "^6.5.0", - "@turf/transform-rotate": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "@turf/transform-translate": "^6.5.0", - "@turf/union": "^6.5.0", + "@turf/along": "^7.2.0", + "@turf/area": "^7.2.0", + "@turf/bbox": "^7.2.0", + "@turf/bbox-polygon": "^7.2.0", + "@turf/bearing": "^7.2.0", + "@turf/boolean-point-in-polygon": "^7.2.0", + "@turf/buffer": "^7.2.0", + "@turf/center": "^7.2.0", + "@turf/centroid": "^7.2.0", + "@turf/circle": "^7.2.0", + "@turf/clone": "^7.2.0", + "@turf/destination": "^7.2.0", + "@turf/difference": "^7.2.0", + "@turf/distance": "^7.2.0", + "@turf/ellipse": "^7.2.0", + "@turf/helpers": "^7.2.0", + "@turf/intersect": "^7.2.0", + "@turf/invariant": "^7.2.0", + "@turf/line-intersect": "^7.2.0", + "@turf/meta": "^7.2.0", + "@turf/midpoint": "^7.2.0", + "@turf/nearest-point-on-line": "^7.2.0", + "@turf/point-to-line-distance": "^7.2.0", + "@turf/polygon-to-line": "^7.2.0", + "@turf/rewind": "^7.2.0", + "@turf/transform-rotate": "^7.2.0", + "@turf/transform-scale": "^7.2.0", + "@turf/transform-translate": "^7.2.0", + "@turf/union": "^7.2.0", "@types/geojson": "^7946.0.14", - "cubic-hermite-spline": "^1.0.1", "eventemitter3": "^5.0.0", "lodash.throttle": "^4.1.1", "uuid": "9.0.0", diff --git a/modules/editable-layers/src/edit-modes/draw-90degree-polygon-mode.ts b/modules/editable-layers/src/edit-modes/draw-90degree-polygon-mode.ts index cc2a6cd1..9dbc712f 100644 --- a/modules/editable-layers/src/edit-modes/draw-90degree-polygon-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-90degree-polygon-mode.ts @@ -19,7 +19,7 @@ import { GuideFeatureCollection, TentativeFeature } from './types'; -import {Polygon, LineString, Position, FeatureCollection} from '../utils/geojson-types'; +import {Polygon, LineString, Position, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {GeoJsonEditMode} from './geojson-edit-mode'; export class Draw90DegreePolygonMode extends GeoJsonEditMode { @@ -98,7 +98,7 @@ export class Draw90DegreePolygonMode extends GeoJsonEditMode { super.handlePointerMove(event, props); } - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const {picks} = event; const tentativeFeature = this.getTentativeGuide(props); this.addClickSequence(event); diff --git a/modules/editable-layers/src/edit-modes/draw-circle-by-diameter-mode.ts b/modules/editable-layers/src/edit-modes/draw-circle-by-diameter-mode.ts index f45d4992..7e593528 100644 --- a/modules/editable-layers/src/edit-modes/draw-circle-by-diameter-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-circle-by-diameter-mode.ts @@ -44,7 +44,7 @@ export class DrawCircleByDiameterMode extends TwoClickPolygonMode { geometry.properties.editProperties.center = centerCoordinates; // calculate area of circle with turf function this.areaCircle = area(geometry); - // @ts-expect-error turf types diff + return geometry; } diff --git a/modules/editable-layers/src/edit-modes/draw-circle-from-center-mode.ts b/modules/editable-layers/src/edit-modes/draw-circle-from-center-mode.ts index 149a551b..5085cdea 100644 --- a/modules/editable-layers/src/edit-modes/draw-circle-from-center-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-circle-from-center-mode.ts @@ -38,7 +38,7 @@ export class DrawCircleFromCenterMode extends TwoClickPolygonMode { geometry.properties.editProperties.center = coord1; // calculate area of circle with turf function this.areaCircle = area(geometry); - // @ts-expect-error turf types diff + return geometry; } diff --git a/modules/editable-layers/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts b/modules/editable-layers/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts index f60163e8..7a9a0def 100644 --- a/modules/editable-layers/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-ellipse-by-bounding-box-mode.ts @@ -23,7 +23,7 @@ export class DrawEllipseByBoundingBoxMode extends TwoClickPolygonMode { const xSemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[1])), 0.001); const ySemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[3])), 0.001); - const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis); + const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, {}); geometry.properties = geometry.properties || {}; geometry.properties.editProperties = geometry.properties.editProperties || {}; @@ -32,7 +32,7 @@ export class DrawEllipseByBoundingBoxMode extends TwoClickPolygonMode { geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'}; geometry.properties.editProperties.angle = 0; geometry.properties.editProperties.center = centerCoordinates; - // @ts-expect-error fix return types + return geometry; } } diff --git a/modules/editable-layers/src/edit-modes/draw-ellipse-using-three-points-mode.ts b/modules/editable-layers/src/edit-modes/draw-ellipse-using-three-points-mode.ts index 4d388f3d..66259d13 100644 --- a/modules/editable-layers/src/edit-modes/draw-ellipse-using-three-points-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-ellipse-using-three-points-mode.ts @@ -21,7 +21,6 @@ export class DrawEllipseUsingThreePointsMode extends ThreeClickPolygonMode { const xSemiAxis = Math.max(distance(centerCoordinates, point(coord3)), 0.001); const ySemiAxis = Math.max(distance(coord1, coord2), 0.001) / 2; const options = {angle: bearing(coord1, coord2)}; - // @ts-expect-error fix return types const geometry = ellipse(centerCoordinates, xSemiAxis, ySemiAxis, options); geometry.properties = geometry.properties || {}; @@ -31,7 +30,7 @@ export class DrawEllipseUsingThreePointsMode extends ThreeClickPolygonMode { geometry.properties.editProperties.ySemiAxis = {value: ySemiAxis, unit: 'kilometers'}; geometry.properties.editProperties.angle = options.angle; geometry.properties.editProperties.center = centerCoordinates; - // @ts-expect-error fix return types + return geometry; } } diff --git a/modules/editable-layers/src/edit-modes/draw-line-string-mode.ts b/modules/editable-layers/src/edit-modes/draw-line-string-mode.ts index 9ad8b739..865bc39a 100644 --- a/modules/editable-layers/src/edit-modes/draw-line-string-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-line-string-mode.ts @@ -4,7 +4,7 @@ import distance from '@turf/distance'; import {memoize} from '../utils/memoize'; -import {LineString, FeatureCollection, Position} from '../utils/geojson-types'; +import {LineString, FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import { ClickEvent, PointerMoveEvent, @@ -21,7 +21,7 @@ export class DrawLineStringMode extends GeoJsonEditMode { dist = 0; position: Position = null!; elems: Position[] = []; - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const {picks} = event; const clickedEditHandle = getPickedEditHandle(picks); @@ -71,7 +71,7 @@ export class DrawLineStringMode extends GeoJsonEditMode { } } - handleKeyUp(event: KeyboardEvent, props: ModeProps) { + handleKeyUp(event: KeyboardEvent, props: ModeProps>) { const {key} = event; if (key === 'Enter') { const clickSequence = this.getClickSequence(); diff --git a/modules/editable-layers/src/edit-modes/draw-point-mode.ts b/modules/editable-layers/src/edit-modes/draw-point-mode.ts index 1448692a..6d24d0a1 100644 --- a/modules/editable-layers/src/edit-modes/draw-point-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-point-mode.ts @@ -3,7 +3,7 @@ // Copyright (c) vis.gl contributors import {ClickEvent, PointerMoveEvent, ModeProps, TentativeFeature} from './types'; -import {FeatureCollection, Point} from '../utils/geojson-types'; +import {FeatureCollection, Point, SingleGeometry} from '../utils/geojson-types'; import {GeoJsonEditMode} from './geojson-edit-mode'; export class DrawPointMode extends GeoJsonEditMode { @@ -23,7 +23,7 @@ export class DrawPointMode extends GeoJsonEditMode { }; } - handleClick({mapCoords}: ClickEvent, props: ModeProps): void { + handleClick({mapCoords}: ClickEvent, props: ModeProps>): void { const geometry: Point = { type: 'Point', coordinates: mapCoords diff --git a/modules/editable-layers/src/edit-modes/draw-polygon-by-dragging-mode.ts b/modules/editable-layers/src/edit-modes/draw-polygon-by-dragging-mode.ts index a35facab..bb4679d0 100644 --- a/modules/editable-layers/src/edit-modes/draw-polygon-by-dragging-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-polygon-by-dragging-mode.ts @@ -4,7 +4,7 @@ import throttle from 'lodash.throttle'; import {ClickEvent, StartDraggingEvent, StopDraggingEvent, DraggingEvent, ModeProps} from './types'; -import {Polygon, FeatureCollection} from '../utils/geojson-types'; +import {Polygon, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {getPickedEditHandle} from './utils'; import {DrawPolygonMode} from './draw-polygon-mode'; @@ -28,7 +28,7 @@ export class DrawPolygonByDraggingMode extends DrawPolygonMode { } } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { this.addClickSequence(event); const clickSequence = this.getClickSequence(); // @ts-expect-error cancel() not typed @@ -75,7 +75,7 @@ export class DrawPolygonByDraggingMode extends DrawPolygonMode { } } - handleKeyUp(event: KeyboardEvent, props: ModeProps) { + handleKeyUp(event: KeyboardEvent, props: ModeProps>) { if (event.key === 'Enter') { const clickSequence = this.getClickSequence(); if (clickSequence.length > 2) { diff --git a/modules/editable-layers/src/edit-modes/draw-polygon-mode.ts b/modules/editable-layers/src/edit-modes/draw-polygon-mode.ts index c5f83bb1..f402f00d 100644 --- a/modules/editable-layers/src/edit-modes/draw-polygon-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-polygon-mode.ts @@ -12,7 +12,7 @@ import { TentativeFeature, GuideFeature } from './types'; -import {Polygon, FeatureCollection} from '../utils/geojson-types'; +import {Polygon, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {getPickedEditHandle} from './utils'; import {GeoJsonEditMode} from './geojson-edit-mode'; @@ -84,7 +84,7 @@ export class DrawPolygonMode extends GeoJsonEditMode { } // eslint-disable-next-line complexity - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const {picks} = event; const clickedEditHandle = getPickedEditHandle(picks); const clickSequence = this.getClickSequence(); @@ -143,7 +143,7 @@ export class DrawPolygonMode extends GeoJsonEditMode { } } - handleKeyUp(event: KeyboardEvent, props: ModeProps) { + handleKeyUp(event: KeyboardEvent, props: ModeProps>) { if (event.key === 'Enter') { const clickSequence = this.getClickSequence(); if (clickSequence.length > 2) { diff --git a/modules/editable-layers/src/edit-modes/draw-rectangle-from-center-mode.ts b/modules/editable-layers/src/edit-modes/draw-rectangle-from-center-mode.ts index 39a188b0..141aac65 100644 --- a/modules/editable-layers/src/edit-modes/draw-rectangle-from-center-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-rectangle-from-center-mode.ts @@ -21,7 +21,6 @@ export class DrawRectangleFromCenterMode extends TwoClickPolygonMode { rectangle.properties = rectangle.properties || {}; rectangle.properties.shape = 'Rectangle'; - // @ts-expect-error turf typing too wide return rectangle; } } diff --git a/modules/editable-layers/src/edit-modes/draw-rectangle-mode.ts b/modules/editable-layers/src/edit-modes/draw-rectangle-mode.ts index d40e75b3..f7c31688 100644 --- a/modules/editable-layers/src/edit-modes/draw-rectangle-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-rectangle-mode.ts @@ -12,7 +12,6 @@ export class DrawRectangleMode extends TwoClickPolygonMode { rectangle.properties = rectangle.properties || {}; rectangle.properties.shape = 'Rectangle'; - // @ts-expect-error turf typing too wide return rectangle; } } diff --git a/modules/editable-layers/src/edit-modes/draw-square-from-center-mode.ts b/modules/editable-layers/src/edit-modes/draw-square-from-center-mode.ts index e6fc9a83..5ba8094e 100644 --- a/modules/editable-layers/src/edit-modes/draw-square-from-center-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-square-from-center-mode.ts @@ -44,7 +44,6 @@ export class DrawSquareFromCenterMode extends TwoClickPolygonMode { square.properties = square.properties || {}; square.properties.shape = 'Square'; - // @ts-expect-error turf typing too wide return square; } } diff --git a/modules/editable-layers/src/edit-modes/draw-square-mode.ts b/modules/editable-layers/src/edit-modes/draw-square-mode.ts index 781fdcb5..47518208 100644 --- a/modules/editable-layers/src/edit-modes/draw-square-mode.ts +++ b/modules/editable-layers/src/edit-modes/draw-square-mode.ts @@ -34,7 +34,7 @@ export class DrawSquareMode extends TwoClickPolygonMode { square.properties = square.properties || {}; square.properties.shape = 'Square'; - // @ts-expect-error turf types too wide + return square; } } diff --git a/modules/editable-layers/src/edit-modes/duplicate-mode.ts b/modules/editable-layers/src/edit-modes/duplicate-mode.ts index 8bfec676..21b2e4e8 100644 --- a/modules/editable-layers/src/edit-modes/duplicate-mode.ts +++ b/modules/editable-layers/src/edit-modes/duplicate-mode.ts @@ -3,11 +3,11 @@ // Copyright (c) vis.gl contributors import {StartDraggingEvent, ModeProps} from './types'; -import {FeatureCollection} from '../utils/geojson-types'; +import {FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {TranslateMode} from './translate-mode'; export class DuplicateMode extends TranslateMode { - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { super.handleStartDragging(event, props); if (this._geometryBeforeTranslate) { diff --git a/modules/editable-layers/src/edit-modes/extend-line-string-mode.ts b/modules/editable-layers/src/edit-modes/extend-line-string-mode.ts index 33f295f4..f0685776 100644 --- a/modules/editable-layers/src/edit-modes/extend-line-string-mode.ts +++ b/modules/editable-layers/src/edit-modes/extend-line-string-mode.ts @@ -2,13 +2,13 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {Position, LineString, FeatureCollection} from '../utils/geojson-types'; +import {Position, LineString, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {ClickEvent, PointerMoveEvent, ModeProps, GuideFeatureCollection} from './types'; import {GeoJsonEditMode} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class ExtendLineStringMode extends GeoJsonEditMode { - getSingleSelectedLineString(props: ModeProps): LineString | null | undefined { + getSingleSelectedLineString(props: ModeProps>): LineString | null | undefined { const selectedGeometry = this.getSelectedGeometry(props); if (selectedGeometry && selectedGeometry.type === 'LineString') { @@ -17,7 +17,7 @@ export class ExtendLineStringMode extends GeoJsonEditMode { return null; } - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const {selectedIndexes} = props; const selectedLineString = this.getSingleSelectedLineString(props); @@ -49,7 +49,7 @@ export class ExtendLineStringMode extends GeoJsonEditMode { }); } - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { const guides: GuideFeatureCollection = { type: 'FeatureCollection', features: [] diff --git a/modules/editable-layers/src/edit-modes/extrude-mode.ts b/modules/editable-layers/src/edit-modes/extrude-mode.ts index f1d827ca..35021b23 100644 --- a/modules/editable-layers/src/edit-modes/extrude-mode.ts +++ b/modules/editable-layers/src/edit-modes/extrude-mode.ts @@ -9,7 +9,7 @@ import { getPickedIntermediateEditHandle, shouldCancelPan } from './utils'; -import {FeatureCollection} from '../utils/geojson-types'; +import {FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {ModeProps, StartDraggingEvent, StopDraggingEvent, DraggingEvent} from './types'; import {ModifyMode} from './modify-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; @@ -19,7 +19,7 @@ export class ExtrudeMode extends ModifyMode { isPointAdded = false; - handleDragging(event: DraggingEvent, props: ModeProps): void { + handleDragging(event: DraggingEvent, props: ModeProps>): void { const editHandle = getPickedEditHandle(event.pointerDownPicks); if (editHandle) { @@ -61,7 +61,7 @@ export class ExtrudeMode extends ModifyMode { } } - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { if (shouldCancelPan(event)) { event.cancelPan(); } @@ -111,7 +111,7 @@ export class ExtrudeMode extends ModifyMode { } } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { const selectedFeatureIndexes = props.selectedIndexes; const editHandle = getPickedEditHandle(event.pointerDownPicks); if (selectedFeatureIndexes.length && editHandle) { @@ -156,7 +156,7 @@ export class ExtrudeMode extends ModifyMode { coordinatesSize( positionIndexes: number[] | null | undefined, featureIndex: number, - {features}: FeatureCollection + {features}: FeatureCollection ) { let size = 0; if (Array.isArray(positionIndexes)) { @@ -190,7 +190,7 @@ export class ExtrudeMode extends ModifyMode { positionIndexes: number[] | null | undefined, featureIndex: number, size: number, - features: FeatureCollection + features: FeatureCollection ) { if (!Array.isArray(positionIndexes)) { return false; @@ -239,7 +239,7 @@ export class ExtrudeMode extends ModifyMode { getPointForPositionIndexes( positionIndexes: number[] | null | undefined, featureIndex: number, - {features}: FeatureCollection + {features}: FeatureCollection ) { let p1; if (Array.isArray(positionIndexes)) { diff --git a/modules/editable-layers/src/edit-modes/geojson-edit-mode.ts b/modules/editable-layers/src/edit-modes/geojson-edit-mode.ts index 17a1d02e..f57c3462 100644 --- a/modules/editable-layers/src/edit-modes/geojson-edit-mode.ts +++ b/modules/editable-layers/src/edit-modes/geojson-edit-mode.ts @@ -2,6 +2,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors +import {featureCollection} from '@turf/helpers'; import turfUnion from '@turf/union'; import turfDifference from '@turf/difference'; import turfIntersect from '@turf/intersect'; @@ -20,12 +21,12 @@ import { GuideFeatureCollection, TentativeFeature } from './types'; -import {FeatureCollection, Feature, Polygon, Geometry, Position} from '../utils/geojson-types'; +import {FeatureCollection, Feature, Polygon, SingleGeometry, Position} from '../utils/geojson-types'; import {getPickedEditHandles, getNonGuidePicks} from './utils'; import {EditMode} from './edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; -export type GeoJsonEditAction = EditAction; +export type GeoJsonEditAction = EditAction>; const DEFAULT_GUIDES: GuideFeatureCollection = { type: 'FeatureCollection', @@ -51,14 +52,14 @@ export class GeoJsonEditMode implements EditMode): Feature | null | undefined { + getSelectedFeature(props: ModeProps>): Feature | null | undefined { if (props.selectedIndexes.length === 1) { return props.data.features[props.selectedIndexes[0]]; } return null; } - getSelectedGeometry(props: ModeProps): Geometry | null | undefined { + getSelectedGeometry(props: ModeProps>): SingleGeometry | null | undefined { const feature = this.getSelectedFeature(props); if (feature) { return feature.geometry; @@ -66,7 +67,7 @@ export class GeoJsonEditMode implements EditMode): FeatureCollection { + getSelectedFeaturesAsFeatureCollection(props: ModeProps>): FeatureCollection { const {features} = props.data; const selectedFeatures = props.selectedIndexes.map((selectedIndex) => features[selectedIndex]); return { @@ -104,21 +105,20 @@ export class GeoJsonEditMode implements EditMode pickedIndexes.has(index)); } - rewindPolygon(feature: Feature): Feature { + rewindPolygon(feature: Feature): Feature { const {geometry} = feature; const isPolygonal = geometry.type === 'Polygon' || geometry.type === 'MultiPolygon'; if (isPolygonal) { - // @ts-expect-error turf type too wide - return rewind(feature); + return rewind(feature) as Feature; } return feature; } getAddFeatureAction( - featureOrGeometry: Geometry | Feature, - features: FeatureCollection, + featureOrGeometry: SingleGeometry | Feature, + features: FeatureCollection, featureProperties?: {} ): GeoJsonEditAction { // Unsure why flow can't deal with Geometry type, but there I fixed it @@ -149,8 +149,8 @@ export class GeoJsonEditMode implements EditMode, + features: FeatureCollection ): GeoJsonEditAction { let updatedData = new ImmutableFeatureCollection(features); const initialIndex = updatedData.getObject().features.length; @@ -178,7 +178,7 @@ export class GeoJsonEditMode implements EditMode, + props: ModeProps>, featureProperties?: {} ): GeoJsonEditAction | null | undefined { const featureOrGeometryAsAny: any = featureOrGeometry; @@ -209,14 +209,11 @@ export class GeoJsonEditMode implements EditMode; - constructor(featureCollection: FeatureCollection) { + constructor(featureCollection: FeatureCollection) { this.featureCollection = featureCollection; } @@ -162,7 +161,7 @@ export class ImmutableFeatureCollection { return this.replaceGeometry(featureIndex, updatedGeometry); } - replaceGeometry(featureIndex: number, geometry: Geometry): ImmutableFeatureCollection { + replaceGeometry(featureIndex: number, geometry: SingleGeometry): ImmutableFeatureCollection { const updatedFeature: any = { ...this.featureCollection.features[featureIndex], geometry @@ -180,11 +179,11 @@ export class ImmutableFeatureCollection { return new ImmutableFeatureCollection(updatedFeatureCollection); } - addFeature(feature: Feature): ImmutableFeatureCollection { + addFeature(feature: Feature): ImmutableFeatureCollection { return this.addFeatures([feature]); } - addFeatures(features: Feature[]): ImmutableFeatureCollection { + addFeatures(features: Feature[]): ImmutableFeatureCollection { const updatedFeatureCollection = { ...this.featureCollection, features: [...this.featureCollection.features, ...features] @@ -351,7 +350,7 @@ function immutablyAddPosition( ]; } -function pruneGeometryIfNecessary(geometry: Geometry) { +function pruneGeometryIfNecessary(geometry: SingleGeometry) { switch (geometry.type) { case 'Polygon': prunePolygonIfNecessary(geometry); @@ -413,7 +412,7 @@ function pruneMultiPolygonIfNecessary(geometry: MultiPolygon) { } } -function removeHoleIfNecessary(polygon: PolygonCoordinates, holeIndex: number) { +function removeHoleIfNecessary(polygon: Polygon['coordinates'], holeIndex: number) { const hole = polygon[holeIndex]; if (hole.length <= 3) { polygon.splice(holeIndex, 1); diff --git a/modules/editable-layers/src/edit-modes/measure-area-mode.ts b/modules/editable-layers/src/edit-modes/measure-area-mode.ts index 6d6ea521..863c5fd7 100644 --- a/modules/editable-layers/src/edit-modes/measure-area-mode.ts +++ b/modules/editable-layers/src/edit-modes/measure-area-mode.ts @@ -5,13 +5,13 @@ import turfArea from '@turf/area'; import turfCentroid from '@turf/centroid'; import {ClickEvent, Tooltip, ModeProps} from './types'; -import {FeatureCollection} from '../utils/geojson-types'; +import {FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {DrawPolygonMode} from './draw-polygon-mode'; const DEFAULT_TOOLTIPS = []; export class MeasureAreaMode extends DrawPolygonMode { - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const propsWithoutEdit = { ...props, onEdit: () => {} @@ -20,7 +20,7 @@ export class MeasureAreaMode extends DrawPolygonMode { super.handleClick(event, propsWithoutEdit); } - handleKeyUp(event: KeyboardEvent, props: ModeProps): void { + handleKeyUp(event: KeyboardEvent, props: ModeProps>): void { const propsWithoutEdit = { ...props, onEdit: () => {} diff --git a/modules/editable-layers/src/edit-modes/modify-mode.ts b/modules/editable-layers/src/edit-modes/modify-mode.ts index 72f84e61..50402261 100644 --- a/modules/editable-layers/src/edit-modes/modify-mode.ts +++ b/modules/editable-layers/src/edit-modes/modify-mode.ts @@ -16,7 +16,7 @@ import { NearestPointType, shouldCancelPan } from './utils'; -import {LineString, Point, Polygon, FeatureCollection, FeatureOf} from '../utils/geojson-types'; +import {LineString, Point, Polygon, FeatureCollection, FeatureOf, SingleGeometry} from '../utils/geojson-types'; import { ModeProps, ClickEvent, @@ -34,7 +34,7 @@ import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class ModifyMode extends GeoJsonEditMode { // eslint-disable-next-line complexity - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { const handles: GuideFeature[] = []; const {data, lastPointerMoveEvent} = props; @@ -76,7 +76,7 @@ export class ModifyMode extends GeoJsonEditMode { (lineString, prefix) => { const lineStringFeature = toLineString(lineString); const candidateIntermediatePoint = this.getNearestPoint( - // @ts-expect-error turf types too wide + lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport @@ -139,12 +139,12 @@ export class ModifyMode extends GeoJsonEditMode { return nearestPointOnLine(line, inPoint, viewport); } - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const pickedExistingHandle = getPickedExistingEditHandle(event.picks); const pickedIntermediateHandle = getPickedIntermediateEditHandle(event.picks); if (pickedExistingHandle) { - const {featureIndex, positionIndexes} = pickedExistingHandle.properties; + const { featureIndex, positionIndexes } = pickedExistingHandle.properties; let updatedData; try { @@ -194,7 +194,7 @@ export class ModifyMode extends GeoJsonEditMode { } } - handleDragging(event: DraggingEvent, props: ModeProps): void { + handleDragging(event: DraggingEvent, props: ModeProps>): void { const editHandle = getPickedEditHandle(event.pointerDownPicks); if (editHandle) { @@ -207,7 +207,7 @@ export class ModifyMode extends GeoJsonEditMode { _dragEditHandle( editType: string, - props: ModeProps, + props: ModeProps>, editHandle: EditHandleFeature, event: StopDraggingEvent | DraggingEvent ) { @@ -251,7 +251,7 @@ export class ModifyMode extends GeoJsonEditMode { props.onUpdateCursor(cursor); } - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { if (shouldCancelPan(event)) { event.cancelPan(); } @@ -282,7 +282,7 @@ export class ModifyMode extends GeoJsonEditMode { } } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { const selectedFeatureIndexes = props.selectedIndexes; const editHandle = getPickedEditHandle(event.picks); if (selectedFeatureIndexes.length && editHandle) { diff --git a/modules/editable-layers/src/edit-modes/resize-circle-mode.ts b/modules/editable-layers/src/edit-modes/resize-circle-mode.ts index 95d94908..37ceb355 100644 --- a/modules/editable-layers/src/edit-modes/resize-circle-mode.ts +++ b/modules/editable-layers/src/edit-modes/resize-circle-mode.ts @@ -14,7 +14,7 @@ import { getPickedEditHandle, NearestPointType } from './utils'; -import {LineString, Point, FeatureCollection, FeatureOf} from '../utils/geojson-types'; +import {LineString, Point, FeatureCollection, Feature, SingleGeometry} from '../utils/geojson-types'; import {Viewport} from '../utils/types'; import { ModeProps, @@ -24,7 +24,7 @@ import { DraggingEvent, EditHandleFeature, GuideFeatureCollection, - GuideFeature + GuideFeature, } from './types'; import {GeoJsonEditMode} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; @@ -69,7 +69,7 @@ export class ResizeCircleMode extends GeoJsonEditMode { (lineString, prefix) => { const lineStringFeature = toLineString(lineString); const candidateIntermediatePoint = this.getNearestPoint( - // @ts-expect-error turf types too wide + lineStringFeature, referencePoint, props.modeConfig && props.modeConfig.viewport @@ -114,8 +114,8 @@ export class ResizeCircleMode extends GeoJsonEditMode { // turf.js does not support elevation for nearestPointOnLine getNearestPoint( - line: FeatureOf, - inPoint: FeatureOf, + line: Feature, + inPoint: Feature, viewport: Viewport | null | undefined ): NearestPointType { const {coordinates} = line.geometry; @@ -129,11 +129,10 @@ export class ResizeCircleMode extends GeoJsonEditMode { 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.' ); } - // @ts-expect-error turf types diff return nearestPointOnLine(line, inPoint); } - handleDragging(event: DraggingEvent, props: ModeProps): void { + handleDragging(event: DraggingEvent, props: ModeProps>): void { const editHandle = getPickedEditHandle(event.pointerDownPicks); if (editHandle) { @@ -143,7 +142,6 @@ export class ResizeCircleMode extends GeoJsonEditMode { const editHandleProperties = editHandle.properties; const feature = this.getSelectedFeature(props); - // @ts-expect-error turf types diff const center = turfCenter(feature).geometry.coordinates; const numberOfSteps = Object.entries(feature.geometry.coordinates[0]).length - 1; const radius = Math.max(distance(center, event.mapCoords), 0.001); diff --git a/modules/editable-layers/src/edit-modes/rotate-mode.ts b/modules/editable-layers/src/edit-modes/rotate-mode.ts index 6b98e0de..3c27ea30 100644 --- a/modules/editable-layers/src/edit-modes/rotate-mode.ts +++ b/modules/editable-layers/src/edit-modes/rotate-mode.ts @@ -22,19 +22,18 @@ import { GuideFeatureCollection } from './types'; import {getPickedEditHandle} from './utils'; -import {FeatureCollection, Position} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import {GeoJsonEditMode, GeoJsonEditAction, getIntermediatePosition} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class RotateMode extends GeoJsonEditMode { _selectedEditHandle: EditHandleFeature | null | undefined; - _geometryBeingRotated: FeatureCollection | null | undefined; + _geometryBeingRotated: FeatureCollection | null | undefined; _isRotating = false; _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => { const {features} = geometry || {}; if (Array.isArray(features) && features.length === 1) { - // @ts-expect-error turf type diff const {type}: {type: string} = getGeom(features[0]); return type === 'Point'; } @@ -43,7 +42,7 @@ export class RotateMode extends GeoJsonEditMode { getIsRotating = () => this._isRotating; - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { const selectedGeometry = this._geometryBeingRotated || this.getSelectedFeaturesAsFeatureCollection(props); @@ -53,7 +52,6 @@ export class RotateMode extends GeoJsonEditMode { if (this._isRotating) { // Display rotate pivot - // @ts-expect-error turf types diff return featureCollection([turfCentroid(selectedGeometry)]) as GuideFeatureCollection; } @@ -96,7 +94,7 @@ export class RotateMode extends GeoJsonEditMode { return featureCollection(outFeatures); } - handleDragging(event: DraggingEvent, props: ModeProps) { + handleDragging(event: DraggingEvent, props: ModeProps>) { if (!this._isRotating) { return; } @@ -126,7 +124,7 @@ export class RotateMode extends GeoJsonEditMode { this.updateCursor(props); } - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { if (this._selectedEditHandle) { event.cancelPan(); this._isRotating = true; @@ -134,7 +132,7 @@ export class RotateMode extends GeoJsonEditMode { } } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { if (this._isRotating) { // Rotate the geometry const rotateAction = this.getRotateAction( @@ -167,19 +165,15 @@ export class RotateMode extends GeoJsonEditMode { startDragPoint: Position, currentPoint: Position, editType: string, - props: ModeProps + props: ModeProps> ): GeoJsonEditAction | null | undefined { if (!this._geometryBeingRotated) { return null; } - // @ts-expect-error turf types diff const centroid = turfCentroid(this._geometryBeingRotated); - // @ts-expect-error turf types diff - const angle = getRotationAngle(centroid, startDragPoint, currentPoint); + const angle = getRotationAngle(centroid.geometry.coordinates, startDragPoint, currentPoint); + const rotatedFeatures = turfTransformRotate( - // @ts-expect-error turf types too wide - const rotatedFeatures: FeatureCollection = turfTransformRotate( - // @ts-expect-error turf types too wide this._geometryBeingRotated, angle, { diff --git a/modules/editable-layers/src/edit-modes/scale-mode.ts b/modules/editable-layers/src/edit-modes/scale-mode.ts index 58aa518d..6a7d62fc 100644 --- a/modules/editable-layers/src/edit-modes/scale-mode.ts +++ b/modules/editable-layers/src/edit-modes/scale-mode.ts @@ -12,7 +12,7 @@ import {coordEach} from '@turf/meta'; import turfDistance from '@turf/distance'; import turfTransformScale from '@turf/transform-scale'; import {getCoord, getGeom} from '@turf/invariant'; -import {FeatureCollection, Position} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import { ModeProps, PointerMoveEvent, @@ -27,7 +27,7 @@ import {GeoJsonEditMode} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class ScaleMode extends GeoJsonEditMode { - _geometryBeingScaled: FeatureCollection | null | undefined; + _geometryBeingScaled: FeatureCollection | null | undefined; _selectedEditHandle: EditHandleFeature | null | undefined; _cornerGuidePoints: Array = []; _cursor: string | null | undefined; @@ -36,7 +36,6 @@ export class ScaleMode extends GeoJsonEditMode { _isSinglePointGeometrySelected = (geometry: FeatureCollection | null | undefined): boolean => { const {features} = geometry || {}; if (Array.isArray(features) && features.length === 1) { - // @ts-expect-error turf types diff const {type}: {type: string} = getGeom(features[0]); return type === 'Point'; } @@ -65,7 +64,7 @@ export class ScaleMode extends GeoJsonEditMode { ); }; - _getUpdatedData = (props: ModeProps, editedData: FeatureCollection) => { + _getUpdatedData = (props: ModeProps>, editedData: FeatureCollection) => { let updatedData = new ImmutableFeatureCollection(props.data); const selectedIndexes = props.selectedIndexes; for (let i = 0; i < selectedIndexes.length; i++) { @@ -82,7 +81,7 @@ export class ScaleMode extends GeoJsonEditMode { startDragPoint: Position, currentPoint: Position, editType: string, - props: ModeProps + props: ModeProps> ) => { if (!this._selectedEditHandle) { return null; @@ -93,9 +92,7 @@ export class ScaleMode extends GeoJsonEditMode { const scaleFactor = getScaleFactor(origin, startDragPoint, currentPoint); - // @ts-expect-error turf types diff - const scaledFeatures: FeatureCollection = turfTransformScale( - // @ts-expect-error turf types diff + const scaledFeatures = turfTransformScale( this._geometryBeingScaled, scaleFactor, {origin} @@ -110,7 +107,7 @@ export class ScaleMode extends GeoJsonEditMode { }; }; - updateCursor = (props: ModeProps) => { + updateCursor = (props: ModeProps>) => { if (this._selectedEditHandle) { if (this._cursor) { props.onUpdateCursor(this._cursor); @@ -118,7 +115,6 @@ export class ScaleMode extends GeoJsonEditMode { const cursorGeometry = this.getSelectedFeaturesAsFeatureCollection(props); // Get resize cursor direction from the hovered scale editHandle (e.g. nesw or nwse) - // @ts-expect-error turf types diff const centroid = turfCentroid(cursorGeometry); const bearing = turfBearing(centroid, this._selectedEditHandle); const positiveBearing = bearing < 0 ? bearing + 180 : bearing; @@ -138,7 +134,7 @@ export class ScaleMode extends GeoJsonEditMode { } }; - handlePointerMove(event: PointerMoveEvent, props: ModeProps) { + handlePointerMove(event: PointerMoveEvent, props: ModeProps>) { if (!this._isScaling) { const selectedEditHandle = getPickedEditHandle(event.picks); this._selectedEditHandle = @@ -150,7 +146,7 @@ export class ScaleMode extends GeoJsonEditMode { } } - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { if (this._selectedEditHandle) { event.cancelPan(); this._isScaling = true; @@ -158,7 +154,7 @@ export class ScaleMode extends GeoJsonEditMode { } } - handleDragging(event: DraggingEvent, props: ModeProps) { + handleDragging(event: DraggingEvent, props: ModeProps>) { if (!this._isScaling) { return; } @@ -178,7 +174,7 @@ export class ScaleMode extends GeoJsonEditMode { event.cancelPan(); } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { if (this._isScaling) { // Scale the geometry const scaleAction = this.getScaleAction( @@ -200,7 +196,7 @@ export class ScaleMode extends GeoJsonEditMode { } } - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { this._cornerGuidePoints = []; const selectedGeometry = this.getSelectedFeaturesAsFeatureCollection(props); diff --git a/modules/editable-layers/src/edit-modes/snappable-mode.ts b/modules/editable-layers/src/edit-modes/snappable-mode.ts index d4439e8d..144d24e7 100644 --- a/modules/editable-layers/src/edit-modes/snappable-mode.ts +++ b/modules/editable-layers/src/edit-modes/snappable-mode.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {Position, Feature, FeatureCollection} from '../utils/geojson-types'; +import {Position, Feature, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import { PointerMoveEvent, StartDraggingEvent, @@ -55,7 +55,7 @@ export class SnappableMode extends GeoJsonEditMode { _getUpdatedSnapSourceHandle( snapSourceHandle: EditHandleFeature, - data: FeatureCollection + data: FeatureCollection ): EditHandleFeature { const {featureIndex, positionIndexes} = snapSourceHandle.properties; if (!Array.isArray(positionIndexes)) { @@ -82,7 +82,7 @@ export class SnappableMode extends GeoJsonEditMode { // method will return those features along with the features // that live in the current layer. Otherwise, this method will simply return the // features from the current layer - _getSnapTargets(props: ModeProps): Feature[] { + _getSnapTargets(props: ModeProps>): Feature[] { let {additionalSnapTargets} = props.modeConfig || {}; additionalSnapTargets = additionalSnapTargets || []; @@ -90,7 +90,7 @@ export class SnappableMode extends GeoJsonEditMode { return features; } - _getSnapTargetHandles(props: ModeProps): EditHandleFeature[] { + _getSnapTargetHandles(props: ModeProps>): EditHandleFeature[] { const handles: EditHandleFeature[] = []; const features = this._getSnapTargets(props); @@ -109,7 +109,7 @@ export class SnappableMode extends GeoJsonEditMode { // If no snap handle has been picked, only display the edit handles of the // selected feature. If a snap handle has been picked, display said snap handle // along with all snappable points on all non-selected features. - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { const {modeConfig, lastPointerMoveEvent} = props; const {enableSnapping} = modeConfig || {}; diff --git a/modules/editable-layers/src/edit-modes/split-polygon-mode.ts b/modules/editable-layers/src/edit-modes/split-polygon-mode.ts index c945b65b..be740509 100644 --- a/modules/editable-layers/src/edit-modes/split-polygon-mode.ts +++ b/modules/editable-layers/src/edit-modes/split-polygon-mode.ts @@ -6,16 +6,15 @@ import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; import turfDifference from '@turf/difference'; import turfBuffer from '@turf/buffer'; import lineIntersect from '@turf/line-intersect'; -import type {Point} from '@turf/helpers'; -import {lineString} from '@turf/helpers'; +import type {Point} from 'geojson'; +import {feature as turfFeature, featureCollection, lineString} from '@turf/helpers'; import turfBearing from '@turf/bearing'; import turfDistance from '@turf/distance'; import turfDestination from '@turf/destination'; import turfPolygonToLine from '@turf/polygon-to-line'; -import type {NearestPointOnLine} from '@turf/nearest-point-on-line'; import nearestPointOnLine from '@turf/nearest-point-on-line'; import {generatePointsParallelToLinePoints} from './utils'; -import {FeatureCollection} from '../utils/geojson-types'; +import {FeatureCollection, Polygonal, SingleGeometry} from '../utils/geojson-types'; import { ClickEvent, PointerMoveEvent, @@ -27,7 +26,7 @@ import {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class SplitPolygonMode extends GeoJsonEditMode { - calculateMapCoords(clickSequence: any, mapCoords: any, props: ModeProps) { + calculateMapCoords(clickSequence: any, mapCoords: any, props: ModeProps>) { const modeConfig = props.modeConfig; if (!modeConfig || !modeConfig.lock90Degree || !clickSequence.length) { return mapCoords; @@ -36,12 +35,11 @@ export class SplitPolygonMode extends GeoJsonEditMode { // if first point is clicked, then find closest polygon point and build ~90deg vector const firstPoint = clickSequence[0]; const selectedGeometry = this.getSelectedGeometry(props); - // @ts-expect-error turf types diff - const feature = turfPolygonToLine(selectedGeometry); + const feature = turfPolygonToLine(selectedGeometry as Polygonal); const lines = feature.type === 'FeatureCollection' ? feature.features : [feature]; let minDistance = Number.MAX_SAFE_INTEGER; - let closestPoint: NearestPointOnLine | null = null; + let closestPoint: ReturnType | null = null; // If Multipolygon, then we should find nearest polygon line and stick split to it. lines.forEach((line) => { const snapPoint = nearestPointOnLine(line, firstPoint); @@ -55,7 +53,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { if (closestPoint) { // closest point is used as 90degree entry to the polygon const lastBearing = turfBearing(firstPoint, closestPoint); - const currentDistance = turfDistance(firstPoint, mapCoords, {units: 'meters'}); + const currentDistance = turfDistance(firstPoint, mapCoords, { units: 'meters' }); return turfDestination(firstPoint, currentDistance, lastBearing, { units: 'meters' }).geometry.coordinates; @@ -75,7 +73,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { return nearestPt; } - getGuides(props: ModeProps): GuideFeatureCollection { + getGuides(props: ModeProps>): GuideFeatureCollection { const clickSequence = this.getClickSequence(); const guides: GuideFeatureCollection = { @@ -104,7 +102,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { return guides; } - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { const tentativeFeature = this.getTentativeGuide(props); const selectedGeometry = this.getSelectedGeometry(props); @@ -129,8 +127,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { coordinates: clickSequence[clickSequence.length - 1] }; - // @ts-expect-error turf types diff - const isPointInPolygon = booleanPointInPolygon(pt, selectedGeometry); + const isPointInPolygon = booleanPointInPolygon(pt, selectedGeometry as Polygonal); if (clickSequence.length > 1 && tentativeFeature && !isPointInPolygon) { this.resetClickSequence(); // @ts-expect-error narrow type @@ -151,7 +148,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { props.onUpdateCursor('cell'); } - splitPolygon(tentativeFeature: TentativeFeature, props: ModeProps) { + splitPolygon(tentativeFeature: TentativeFeature, props: ModeProps>) { const selectedGeometry = this.getSelectedGeometry(props); const featureIndex = props.selectedIndexes[0]; const modeConfig = props.modeConfig || {}; @@ -164,8 +161,7 @@ export class SplitPolygonMode extends GeoJsonEditMode { } const buffer = turfBuffer(tentativeFeature, gap, {units}); - // @ts-expect-error turf types diff - const updatedGeometry = turfDifference(selectedGeometry, buffer); + const updatedGeometry = turfDifference(featureCollection([turfFeature(selectedGeometry as Polygonal), buffer])); if (!updatedGeometry) { // eslint-disable-next-line no-console,no-undef console.warn('Canceling edit. Split Polygon erased'); diff --git a/modules/editable-layers/src/edit-modes/three-click-polygon-mode.ts b/modules/editable-layers/src/edit-modes/three-click-polygon-mode.ts index fec381a8..cccc6145 100644 --- a/modules/editable-layers/src/edit-modes/three-click-polygon-mode.ts +++ b/modules/editable-layers/src/edit-modes/three-click-polygon-mode.ts @@ -9,12 +9,12 @@ import { GuideFeatureCollection, TentativeFeature } from './types'; -import {Position, Polygon, FeatureOf, FeatureCollection} from '../utils/geojson-types'; +import {Position, Polygon, FeatureOf, FeatureCollection, SingleGeometry} from '../utils/geojson-types'; import {GeoJsonEditMode} from './geojson-edit-mode'; import {omit} from 'lodash'; export class ThreeClickPolygonMode extends GeoJsonEditMode { - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { this.addClickSequence(event); const clickSequence = this.getClickSequence(); const tentativeFeature = this.getTentativeGuide(props); diff --git a/modules/editable-layers/src/edit-modes/translate-mode.ts b/modules/editable-layers/src/edit-modes/translate-mode.ts index 73c72f96..d81b5075 100644 --- a/modules/editable-layers/src/edit-modes/translate-mode.ts +++ b/modules/editable-layers/src/edit-modes/translate-mode.ts @@ -5,10 +5,9 @@ import turfBearing from '@turf/bearing'; import turfDistance from '@turf/distance'; import clone from '@turf/clone'; -import type {Feature as TurfFeature, Geometry as TurfGeometry} from '@turf/helpers'; import {point} from '@turf/helpers'; import {WebMercatorViewport} from 'viewport-mercator-project'; -import {FeatureCollection, Position, Geometry} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import { PointerMoveEvent, StartDraggingEvent, @@ -22,10 +21,10 @@ import {GeoJsonEditMode, GeoJsonEditAction} from './geojson-edit-mode'; import {ImmutableFeatureCollection} from './immutable-feature-collection'; export class TranslateMode extends GeoJsonEditMode { - _geometryBeforeTranslate: FeatureCollection | null | undefined; + _geometryBeforeTranslate: FeatureCollection | null | undefined; _isTranslatable: boolean = undefined!; - handleDragging(event: DraggingEvent, props: ModeProps) { + handleDragging(event: DraggingEvent, props: ModeProps>) { if (!this._isTranslatable) { // Nothing to do return; @@ -55,7 +54,7 @@ export class TranslateMode extends GeoJsonEditMode { this.updateCursor(props); } - handleStartDragging(event: StartDraggingEvent, props: ModeProps) { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>) { if (!this._isTranslatable) { return; } @@ -64,7 +63,7 @@ export class TranslateMode extends GeoJsonEditMode { this._geometryBeforeTranslate = this.getSelectedFeaturesAsFeatureCollection(props); } - handleStopDragging(event: StopDraggingEvent, props: ModeProps) { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>) { if (this._geometryBeforeTranslate) { // Translate the geometry const editAction = this.getTranslateAction( @@ -95,7 +94,7 @@ export class TranslateMode extends GeoJsonEditMode { startDragPoint: Position, currentPoint: Position, editType: string, - props: ModeProps + props: ModeProps> ): GeoJsonEditAction | null | undefined { if (!this._geometryBeforeTranslate) { return null; @@ -131,11 +130,10 @@ export class TranslateMode extends GeoJsonEditMode { return null; }); - // @ts-expect-error turf types updatedData = updatedData.replaceGeometry(selectedIndex, { type: feature.geometry.type, - coordinates - }); + coordinates, + } as SingleGeometry); } } } else { @@ -146,13 +144,13 @@ export class TranslateMode extends GeoJsonEditMode { const direction = turfBearing(p1, p2); const movedFeatures = this._geometryBeforeTranslate.features.map((feature) => - translateFromCenter(clone(feature as TurfFeature), distanceMoved, direction) + translateFromCenter(clone(feature), distanceMoved, direction) ); for (let i = 0; i < selectedIndexes.length; i++) { const selectedIndex = selectedIndexes[i]; const movedFeature = movedFeatures[i]; - updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry as Geometry); + updatedData = updatedData.replaceGeometry(selectedIndex, movedFeature.geometry); } } diff --git a/modules/editable-layers/src/edit-modes/two-click-polygon-mode.ts b/modules/editable-layers/src/edit-modes/two-click-polygon-mode.ts index 1b36254b..3282c7b6 100644 --- a/modules/editable-layers/src/edit-modes/two-click-polygon-mode.ts +++ b/modules/editable-layers/src/edit-modes/two-click-polygon-mode.ts @@ -11,12 +11,12 @@ import { GuideFeatureCollection, TentativeFeature } from './types'; -import {Polygon, FeatureCollection, FeatureOf, Position} from '../utils/geojson-types'; +import {Polygon, FeatureCollection, FeatureOf, Position, SingleGeometry} from '../utils/geojson-types'; import {GeoJsonEditMode} from './geojson-edit-mode'; import {omit} from 'lodash'; export class TwoClickPolygonMode extends GeoJsonEditMode { - handleClick(event: ClickEvent, props: ModeProps) { + handleClick(event: ClickEvent, props: ModeProps>) { if (props.modeConfig && props.modeConfig.dragToDraw) { // handled in drag handlers return; @@ -27,7 +27,7 @@ export class TwoClickPolygonMode extends GeoJsonEditMode { this.checkAndFinishPolygon(props); } - handleStartDragging(event: StartDraggingEvent, props: ModeProps): void { + handleStartDragging(event: StartDraggingEvent, props: ModeProps>): void { if (!props.modeConfig || !props.modeConfig.dragToDraw) { // handled in click handlers return; @@ -37,7 +37,7 @@ export class TwoClickPolygonMode extends GeoJsonEditMode { event.cancelPan(); } - handleStopDragging(event: StopDraggingEvent, props: ModeProps): void { + handleStopDragging(event: StopDraggingEvent, props: ModeProps>): void { if (!props.modeConfig || !props.modeConfig.dragToDraw) { // handled in click handlers return; @@ -47,7 +47,7 @@ export class TwoClickPolygonMode extends GeoJsonEditMode { this.checkAndFinishPolygon(props); } - checkAndFinishPolygon(props: ModeProps) { + checkAndFinishPolygon(props: ModeProps>) { const clickSequence = this.getClickSequence(); const tentativeFeature = this.getTentativeGuide(props); diff --git a/modules/editable-layers/src/edit-modes/types.ts b/modules/editable-layers/src/edit-modes/types.ts index ed49aa5d..af29e0cc 100644 --- a/modules/editable-layers/src/edit-modes/types.ts +++ b/modules/editable-layers/src/edit-modes/types.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {Position, Point, Geometry, FeatureWithProps} from '../utils/geojson-types'; +import {Position, Point, SingleGeometry, FeatureWithProps} from '../utils/geojson-types'; export type ScreenCoordinates = [number, number]; @@ -101,7 +101,7 @@ export type EditHandleFeature = FeatureWithProps< >; export type TentativeFeature = FeatureWithProps< - Geometry, + SingleGeometry, { guideType: 'tentative'; shape?: string; diff --git a/modules/editable-layers/src/edit-modes/utils.ts b/modules/editable-layers/src/edit-modes/utils.ts index 957ada98..d9dd32ca 100644 --- a/modules/editable-layers/src/edit-modes/utils.ts +++ b/modules/editable-layers/src/edit-modes/utils.ts @@ -8,13 +8,13 @@ import destination from '@turf/destination'; import bearing from '@turf/bearing'; import pointToLineDistance from '@turf/point-to-line-distance'; import {flattenEach} from '@turf/meta'; -import type {MultiLineString} from '@turf/helpers'; +import type {MultiLineString} from 'geojson'; import {point} from '@turf/helpers'; import {getCoords} from '@turf/invariant'; import {WebMercatorViewport} from 'viewport-mercator-project'; import {Viewport, Pick, EditHandleFeature, EditHandleType, StartDraggingEvent} from './types'; import { - Geometry, + SingleGeometry, Position, Point, LineString, @@ -204,11 +204,9 @@ export function nearestPointOnLine( return closestPoint; } - // @ts-expect-error TODO // eslint-disable-next-line max-statements, complexity flattenEach(lines, (line: any) => { const coords: any = getCoords(line); - // @ts-expect-error TODO const pointCoords: any = getCoords(inPoint); let minDist; @@ -369,7 +367,7 @@ export function getPickedEditHandles(picks: Pick[] | null | undefined): EditHand } export function getEditHandlesForGeometry( - geometry: Geometry, + geometry: SingleGeometry, featureIndex: number, editHandleType: EditHandleType = 'existing' ): EditHandleFeature[] { diff --git a/modules/editable-layers/src/editable-layers/selection-layer.ts b/modules/editable-layers/src/editable-layers/selection-layer.ts index d0db6b20..0101d87a 100644 --- a/modules/editable-layers/src/editable-layers/selection-layer.ts +++ b/modules/editable-layers/src/editable-layers/selection-layer.ts @@ -7,7 +7,7 @@ import type {CompositeLayerProps, DefaultProps} from '@deck.gl/core'; import {CompositeLayer} from '@deck.gl/core'; import {PolygonLayer} from '@deck.gl/layers'; -import {polygon} from '@turf/helpers'; +import {featureCollection, polygon} from '@turf/helpers'; import turfBuffer from '@turf/buffer'; import turfDifference from '@turf/difference'; @@ -120,7 +120,7 @@ export class SelectionLayer extends CompositeLayer< try { // turfDifference throws an exception if the polygon // intersects with itself (TODO: check if true in all versions) - bigPolygon = turfDifference(bigBuffer, landPointsPoly); + bigPolygon = turfDifference(featureCollection([bigBuffer, landPointsPoly])); } catch (e) { // invalid selection polygon console.log('turfDifference() error', e); // eslint-disable-line diff --git a/modules/editable-layers/src/index.ts b/modules/editable-layers/src/index.ts index 7a5df49c..9118a922 100644 --- a/modules/editable-layers/src/index.ts +++ b/modules/editable-layers/src/index.ts @@ -2,21 +2,6 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -export {ArrowStyles, DEFAULT_ARROWS, MAX_ARROWS} from './lib/style'; -export {SELECTION_TYPE} from './lib/deck-renderer/deck-drawer'; - -export {Feature} from './lib/feature'; -export {LayerMouseEvent} from './lib/layer-mouse-event'; - -export {NebulaLayer} from './lib/nebula-layer'; -export {JunctionsLayer} from './lib/layers/junctions-layer'; -export {TextsLayer} from './lib/layers/texts-layer'; -export {SegmentsLayer} from './lib/layers/segments-layer'; - -export {NebulaCore} from './lib/nebula-core'; - -export {PROJECTED_PIXEL_SIZE_MULTIPLIER} from './lib/constants'; - // Utils export {toDeckColor} from './utils/utils'; @@ -103,12 +88,6 @@ export type { export type { Position, - PointCoordinates, - LineStringCoordinates, - PolygonCoordinates, - MultiPointCoordinates, - MultiLineStringCoordinates, - MultiPolygonCoordinates, AnyCoordinates, Point, LineString, @@ -116,7 +95,6 @@ export type { MultiPoint, MultiLineString, MultiPolygon, - Geometry, Polygonal, BoundingBoxArray, FeatureOf, diff --git a/modules/editable-layers/src/lib/constants.ts b/modules/editable-layers/src/lib/constants.ts deleted file mode 100644 index 5e2923a6..00000000 --- a/modules/editable-layers/src/lib/constants.ts +++ /dev/null @@ -1,10 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -/** - * A multiplier for screen-space width/scale for Arc, Line, Icon and Text layers. - * Required in order to maintain the same appearance after upgrading to deck.gl v8.5. - * https://github.com/visgl/deck.gl/blob/master/docs/upgrade-guide.md - */ -export const PROJECTED_PIXEL_SIZE_MULTIPLIER = 2 / 3; diff --git a/modules/editable-layers/src/lib/deck-renderer/deck-cache.ts b/modules/editable-layers/src/lib/deck-renderer/deck-cache.ts deleted file mode 100644 index 323927d9..00000000 --- a/modules/editable-layers/src/lib/deck-renderer/deck-cache.ts +++ /dev/null @@ -1,61 +0,0 @@ -export class DeckCache { - objects: TCONV[]; - originals: TORIG[]; - updateTrigger: number; - _idToPosition: Map; - _getData: () => TORIG[]; - _convert: (arg0: TORIG) => TCONV; - - constructor(getData: () => TORIG[], convert: (arg0: TORIG) => TCONV) { - this.objects = []; - this.originals = []; - this.updateTrigger = 0; - - this._idToPosition = new Map(); - this._getData = getData; - this._convert = convert; - } - - updateAllDeckObjects() { - if (!this._getData || !this._convert) return; - - this.originals.length = 0; - this.objects.length = 0; - this._idToPosition.clear(); - - this._getData().forEach((d) => { - this._idToPosition.set((d as any).id, this.objects.length); - this.originals.push(d); - this.objects.push(this._convert(d)); - }); - - this.triggerUpdate(); - } - - updateDeckObjectsByIds(ids: string[]) { - if (!this._getData || !this._convert) return; - - ids.forEach((id) => { - const p = this._idToPosition.get(id); - if (p !== undefined) { - this.objects[p] = this._convert(this.originals[p]); - } - }); - - this.triggerUpdate(); - } - - triggerUpdate() { - this.updateTrigger++; - } - - getDeckObjectById(id: string): TCONV | null | undefined { - const p = this._idToPosition.get(id); - return p !== undefined ? this.objects[p] : null; - } - - getOriginalById(id: string): TORIG | null | undefined { - const p = this._idToPosition.get(id); - return p !== undefined ? this.originals[p] : null; - } -} diff --git a/modules/editable-layers/src/lib/deck-renderer/deck-drawer.ts b/modules/editable-layers/src/lib/deck-renderer/deck-drawer.ts deleted file mode 100644 index 0b999b94..00000000 --- a/modules/editable-layers/src/lib/deck-renderer/deck-drawer.ts +++ /dev/null @@ -1,263 +0,0 @@ -import {PolygonLayer} from '@deck.gl/layers'; -import {point, polygon} from '@turf/helpers'; -import turfBbox from '@turf/bbox'; -import turfBboxPolygon from '@turf/bbox-polygon'; -import turfBuffer from '@turf/buffer'; -import turfDifference from '@turf/difference'; -import turfDistance from '@turf/distance'; - -import {Color} from '../../utils/types'; - -const POLYGON_LINE_COLOR = [0, 255, 0, 255]; -const POLYGON_FILL_COLOR = [255, 255, 255, 90]; -const POLYGON_LINE_WIDTH = 2; -// const POLYGON_DASHES = [20, 20]; -const POLYGON_THRESHOLD = 0.01; -const EXPANSION_KM = 10; -const LAYER_ID_VIEW = 'DeckDrawerView'; -const LAYER_ID_PICK = 'DeckDrawerPick'; - -export const SELECTION_TYPE = { - NONE: null, - RECTANGLE: 'rectangle', - POLYGON: 'polygon' -}; - -export class DeckDrawer { - nebula: Record; - usePolygon: boolean; - validPolygon: boolean; - landPoints: [number, number][]; - mousePoints: [number, number][]; - - constructor(nebula: Record) { - this.nebula = nebula; - this.usePolygon = false; - this.validPolygon = true; - this.landPoints = []; - this.mousePoints = []; - } - - _getLayerIds() { - // TODO: sort by mouse priority - return this.nebula.deckgl.props.layers - .filter((l) => l && l.props && l.props.nebulaLayer && l.props.nebulaLayer.enableSelection) - .map((l) => l.id); - } - - _selectFromPickingInfos(pickingInfos: Record[]) { - const objects = pickingInfos.map( - ({layer, index, object}) => - object.original || layer.props.nebulaLayer.deckCache.originals[index] - ); - this.nebula.props.onSelection(objects); - } - - _getBoundingBox(): Record { - const {mousePoints} = this; - const allX = mousePoints.map((mousePoint) => mousePoint[0]); - const allY = mousePoints.map((mousePoint) => mousePoint[1]); - const x = Math.min(...allX); - const y = Math.min(...allY); - const maxX = Math.max(...allX); - const maxY = Math.max(...allY); - - return {x, y, width: maxX - x, height: maxY - y}; - } - - _selectRectangleObjects() { - if (this.landPoints.length !== 2) return; - - const [x1, y1] = this.mousePoints[0]; - const [x2, y2] = this.mousePoints[1]; - const pickingInfos = this.nebula.deckgl.pickObjects({ - x: Math.min(x1, x2), - y: Math.min(y1, y2), - width: Math.abs(x2 - x1), - height: Math.abs(y2 - y1), - layerIds: this._getLayerIds() - }); - - this._selectFromPickingInfos(pickingInfos); - } - - _selectPolygonObjects() { - const pickingInfos = this.nebula.deckgl.pickObjects({ - ...this._getBoundingBox(), - layerIds: [LAYER_ID_PICK, ...this._getLayerIds()] - }); - - this._selectFromPickingInfos(pickingInfos.filter((item) => item.layer.id !== LAYER_ID_PICK)); - } - - _getMousePosFromEvent(event: Record): [number, number] { - const {offsetX, offsetY} = event; - return [offsetX, offsetY]; - } - - // eslint-disable-next-line max-statements, complexity - handleEvent( - event: Record, - lngLat: [number, number], - selectionType: number - ): {redraw: boolean; deactivate: boolean} { - // capture all events (mouse-up is needed to prevent us stuck in moving map) - if (event.type !== 'mouseup') event.stopPropagation(); - - // @ts-expect-error revisit selectionType type - this.usePolygon = selectionType === SELECTION_TYPE.POLYGON; - - let redraw = false; - let deactivate = false; - - const {usePolygon, landPoints, mousePoints} = this; - - if (event.type === 'mousedown') { - if (usePolygon && landPoints.length) { - // if landPoints.length is zero we want to insert two points (so we let it run the else) - // also don't insert if polygon is invalid - if (this.landPoints.length < 3 || this.validPolygon) { - landPoints.push(lngLat); - mousePoints.push(this._getMousePosFromEvent(event)); - } - } else { - this.landPoints = [lngLat, lngLat]; - const m = this._getMousePosFromEvent(event); - this.mousePoints = [m, m]; - } - redraw = true; - } else if (event.type === 'mousemove' && landPoints.length) { - // update last point - landPoints[landPoints.length - 1] = lngLat; - mousePoints[mousePoints.length - 1] = this._getMousePosFromEvent(event); - redraw = true; - } else if (event.type === 'mouseup') { - if (usePolygon) { - // check to see if completed - // TODO: Maybe double-click to finish? - if ( - landPoints.length > 4 && - turfDistance(landPoints[0], landPoints[landPoints.length - 1]) < POLYGON_THRESHOLD && - this.validPolygon - ) { - this._selectPolygonObjects(); - this.reset(); - redraw = true; - deactivate = true; - } - } else { - this._selectRectangleObjects(); - this.reset(); - redraw = true; - deactivate = true; - } - } - - return {redraw, deactivate}; - } - - reset() { - this.landPoints = []; - this.mousePoints = []; - } - - _makeStartPointHighlight(center: [number, number]): number[] { - const buffer = turfBuffer(point(center), POLYGON_THRESHOLD / 4.0); - // @ts-expect-error revisit return type - return turfBboxPolygon(turfBbox(buffer)).geometry.coordinates; - } - - render() { - const data: any[] = []; - const dataPick: any[] = []; - - if (!this.usePolygon && this.landPoints.length === 2) { - // Use mouse points instead of land points so we get the right shape - // no matter what bearing is. - const [[x1, y1], [x2, y2]] = this.mousePoints; - const selPolygon = [ - [x1, y1], - [x1, y2], - [x2, y2], - [x2, y1], - [x1, y1] - ].map((mousePos) => this.nebula.unprojectMousePosition(mousePos)); - data.push({ - polygon: selPolygon, - lineColor: POLYGON_LINE_COLOR, - fillColor: POLYGON_FILL_COLOR - }); - } else if (this.usePolygon && this.landPoints.length) { - data.push({ - polygon: this.landPoints, - lineColor: POLYGON_LINE_COLOR, - fillColor: POLYGON_FILL_COLOR - }); - - // Hack: use a polygon to hide the outside, because pickObjects() - // does not support polygons - if (this.landPoints.length >= 3) { - const landPointsPoly = polygon([[...this.landPoints, this.landPoints[0]]]); - const bigBuffer = turfBuffer(point(this.landPoints[0]), EXPANSION_KM); - let bigPolygon; - try { - // turfDifference throws an exception if the polygon - // intersects with itself - bigPolygon = turfDifference(bigBuffer, landPointsPoly); - dataPick.push({ - polygon: bigPolygon.geometry.coordinates, - fillColor: [0, 0, 0, 1] - }); - this.validPolygon = true; - } catch (e) { - // invalid selection polygon - this.validPolygon = false; - } - } - } - - if (this.landPoints.length) { - // highlight start point - data.push({ - polygon: this._makeStartPointHighlight(this.landPoints[0]), - lineColor: [0, 0, 0, 0], - fillColor: POLYGON_LINE_COLOR - }); - } - - // Hack to make the PolygonLayer() stay active, - // otherwise it takes 3 seconds (!) to init! - // TODO: fix this - data.push({polygon: [[0, 0]]}); - dataPick.push({polygon: [[0, 0]]}); - - return [ - new PolygonLayer({ - id: LAYER_ID_VIEW, - data, - fp64: false, - opacity: 1.0, - pickable: false, - lineWidthMinPixels: POLYGON_LINE_WIDTH, - lineWidthMaxPixels: POLYGON_LINE_WIDTH, - lineDashJustified: true, - // TODO(v9) Add extension - // getLineDashArray: (x) => POLYGON_DASHES, - getLineColor: (obj: {lineColor?: Color}) => obj.lineColor || [0, 0, 0, 255], - getFillColor: (obj: {fillColor?: Color}) => obj.fillColor || [0, 0, 0, 255], - getPolygon: (o: {polygon?: any}) => o.polygon - }), - new PolygonLayer({ - id: LAYER_ID_PICK, - data: dataPick, - getLineColor: (obj: {lineColor?: Color}) => obj.lineColor || [0, 0, 0, 255], - getFillColor: (obj: {fillColor?: Color}) => obj.fillColor || [0, 0, 0, 255], - fp64: false, - opacity: 1.0, - stroked: false, - pickable: true, - getPolygon: (o: {polygon?: any}) => o.polygon - }) - ]; - } -} diff --git a/modules/editable-layers/src/lib/feature.ts b/modules/editable-layers/src/lib/feature.ts deleted file mode 100644 index 858eee8b..00000000 --- a/modules/editable-layers/src/lib/feature.ts +++ /dev/null @@ -1,31 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {Feature as GeoJson} from '../utils/geojson-types'; - -import {Style} from '../utils/types'; - -export class Feature { - // geo json coordinates - geoJson: GeoJson; - style: Style; - original: any | null | undefined; - metadata: Record; - - constructor( - geoJson: GeoJson, - style: Style, - original: any | null | undefined = null, - metadata: Record = {} - ) { - this.geoJson = geoJson; - this.style = style; - this.original = original; - this.metadata = metadata; - } - - getCoords() { - return this.geoJson.geometry.coordinates; - } -} diff --git a/modules/editable-layers/src/lib/layer-mouse-event.ts b/modules/editable-layers/src/lib/layer-mouse-event.ts deleted file mode 100644 index 2e687aef..00000000 --- a/modules/editable-layers/src/lib/layer-mouse-event.ts +++ /dev/null @@ -1,33 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {Position} from '../utils/geojson-types'; - -export class LayerMouseEvent { - canceled: boolean = false; - // original item that this event is related to - data: Record; - // internal nebula info about the object - metadata: Record; - // the mouse [lng,lat] raycasted onto the ground - groundPoint: Position; - // browser event - nativeEvent: MouseEvent; - // reference to nebula - nebula: Record; - - constructor(nativeEvent: MouseEvent, {data, groundPoint, nebula, metadata}: Record) { - this.nativeEvent = nativeEvent; - - this.data = data; - this.groundPoint = groundPoint; - this.nebula = nebula; - this.metadata = metadata; - } - - stopPropagation() { - this.nativeEvent.stopPropagation(); - this.canceled = true; - } -} diff --git a/modules/editable-layers/src/lib/layers/junctions-layer.ts b/modules/editable-layers/src/lib/layers/junctions-layer.ts deleted file mode 100644 index 1f93bfca..00000000 --- a/modules/editable-layers/src/lib/layers/junctions-layer.ts +++ /dev/null @@ -1,44 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {NebulaLayer} from '../nebula-layer'; -import {toDeckColor} from '../../utils/utils'; -import {DeckCache} from '../deck-renderer/deck-cache'; -import {JunctionScatterplotLayer} from '../../editable-layers/junction-scatterplot-layer'; - -export class JunctionsLayer extends NebulaLayer { - deckCache: DeckCache; - - constructor(config: Record) { - super(config); - this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data)); - this.enablePicking = true; - } - - render({nebula}: Record) { - const defaultColor: [number, number, number, number] = [0x0, 0x0, 0x0, 0xff]; - const {objects, updateTrigger} = this.deckCache; - - return new JunctionScatterplotLayer({ - id: `junctions-${this.id}`, - data: objects, - opacity: 1, - pickable: true, - getPosition: (nf: any) => nf.geoJson.geometry.coordinates, - getFillColor: (nf: any) => toDeckColor(nf.style.fillColor) || defaultColor, - getStrokeColor: (nf: any) => - toDeckColor(nf.style.outlineColor) || toDeckColor(nf.style.fillColor) || defaultColor, - getRadius: (nf: any) => nf.style.pointRadiusMeters + nf.style.outlineRadiusMeters || 1, - getInnerRadius: (nf: any) => nf.style.pointRadiusMeters || 0.5, - parameters: { - depthCompare: 'always' - }, - - updateTriggers: {all: updateTrigger}, - - // @ts-expect-error TODO - nebulaLayer: this - }); - } -} diff --git a/modules/editable-layers/src/lib/layers/segments-layer.ts b/modules/editable-layers/src/lib/layers/segments-layer.ts deleted file mode 100644 index dcb77a45..00000000 --- a/modules/editable-layers/src/lib/layers/segments-layer.ts +++ /dev/null @@ -1,112 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {ArrowStyles, DEFAULT_STYLE, MAX_ARROWS} from '../style'; -import {NebulaLayer} from '../nebula-layer'; -import {toDeckColor} from '../../utils/utils'; -import {DeckCache} from '../deck-renderer/deck-cache'; -import {PathMarkerLayer} from '@deck.gl-community/layers'; - -const NEBULA_TO_DECK_DIRECTIONS = { - [ArrowStyles.NONE]: {forward: false, backward: false}, - [ArrowStyles.FORWARD]: {forward: true, backward: false}, - [ArrowStyles.BACKWARD]: {forward: false, backward: true}, - [ArrowStyles.BOTH]: {forward: true, backward: true} -}; - -export class SegmentsLayer extends NebulaLayer { - deckCache: DeckCache; - noBlend: boolean; - highlightColor: [number, number, number, number]; - arrowSize: number; - jointRounded: boolean; - capRounded: boolean; - dashed: boolean; - markerLayerProps: Record | null | undefined; - - constructor(config: Record) { - super(config); - this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data)); - this.enableSelection = true; - this.enablePicking = config.enablePicking ?? true; - this.noBlend = config.noBlend ?? false; - this.jointRounded = config.jointRounded ?? true; - this.capRounded = config.capRounded ?? true; - this.dashed = config.dashed ?? false; - this.markerLayerProps = config.markerLayerProps ?? null; - this.highlightColor = [1, 1, 1, 1]; - this.arrowSize = 1; - } - - getMouseOverSegment(): any { - // TODO: remove references - return null; - } - - _calcMarkerPercentages(nf: Record): number[] { - const {arrowPercentages} = nf.style; - if (arrowPercentages) { - return arrowPercentages; - } - - const arrowStyle = nf.style.arrowStyle || DEFAULT_STYLE.arrowStyle; - if (arrowStyle === ArrowStyles.NONE) return []; - - const arrowCount = Math.min(nf.style.arrowCount || DEFAULT_STYLE.arrowCount, MAX_ARROWS); - return [[0.5], [0.33, 0.66], [0.25, 0.5, 0.75]][arrowCount - 1]; - } - - _getHighlightedObjectIndex({nebula}: Record): number { - const {deckglMouseOverInfo} = nebula; - if (deckglMouseOverInfo) { - const {originalLayer, index} = deckglMouseOverInfo; - if (originalLayer === this) { - return index; - } - } - - // no object - return -1; - } - - render({nebula}: Record) { - const defaultColor: [number, number, number, number] = [0x0, 0x0, 0x0, 0xff]; - const {objects, updateTrigger} = this.deckCache; - - return new PathMarkerLayer({ - id: `segments-${this.id}`, - data: objects, - opacity: 1, - fp64: false, - jointRounded: this.jointRounded, - capRounded: this.capRounded, - pickable: true, - sizeScale: this.arrowSize || 6, - parameters: { - depthCompare: 'always', - blendColorOperation: this.noBlend ? undefined : 'max' - }, - getPath: (nf: any) => nf.geoJson.geometry.coordinates, - getColor: (nf: any) => toDeckColor(nf.style.lineColor, defaultColor), - getWidth: (nf: any) => nf.style.lineWidthMeters || 1, - getZLevel: (nf: any) => nf.style.zLevel * 255, - getDirection: (nf: any) => NEBULA_TO_DECK_DIRECTIONS[nf.style.arrowStyle], - getMarkerColor: (nf: any) => toDeckColor(nf.style.arrowColor, defaultColor), - // eslint-disable-next-line @typescript-eslint/unbound-method - getMarkerPercentages: this._calcMarkerPercentages, - updateTriggers: {all: updateTrigger}, - - highlightedObjectIndex: this._getHighlightedObjectIndex({nebula}), - highlightColor: toDeckColor(this.highlightColor), - - dashJustified: this.dashed, - getDashArray: this.dashed ? (nf) => nf.style.dashArray : undefined, - markerLayerProps: - this.markerLayerProps || - (PathMarkerLayer as Record).defaultProps.markerLayerProps, - - nebulaLayer: this - }); - } -} diff --git a/modules/editable-layers/src/lib/layers/texts-layer.ts b/modules/editable-layers/src/lib/layers/texts-layer.ts deleted file mode 100644 index aa618506..00000000 --- a/modules/editable-layers/src/lib/layers/texts-layer.ts +++ /dev/null @@ -1,47 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {TextLayer} from '@deck.gl/layers'; -import {NebulaLayer} from '../nebula-layer'; -import {toDeckColor} from '../../utils/utils'; -import {PROJECTED_PIXEL_SIZE_MULTIPLIER} from '../constants'; -import {DeckCache} from '../deck-renderer/deck-cache'; -import {Color} from '../../utils/types'; - -export class TextsLayer extends NebulaLayer { - deckCache: DeckCache; - - constructor(config: Record) { - super(config); - this.deckCache = new DeckCache(config.getData, (data) => config.toNebulaFeature(data)); - } - - render({nebula}: Record): TextLayer { - const defaultColor: Color = [0x0, 0x0, 0x0, 0xff]; - const {objects, updateTrigger} = this.deckCache; - - const {zoom} = nebula.props.viewport; - - return new TextLayer({ - id: `texts-${this.id}`, - data: objects, - opacity: 1, - fp64: false, - pickable: false, - - getText: (nf: any) => nf.style.text, - getPosition: (nf: any) => nf.geoJson.geometry.coordinates, - getColor: (nf: {style: {fillColor: Color}}) => - toDeckColor(nf.style.fillColor) || defaultColor, - - // TODO: layer should offer option to scale with zoom - sizeScale: 1 / Math.pow(2, 20 - zoom), - getSize: PROJECTED_PIXEL_SIZE_MULTIPLIER, - - updateTriggers: {all: updateTrigger}, - - nebulaLayer: this - }); - } -} diff --git a/modules/editable-layers/src/lib/math.ts b/modules/editable-layers/src/lib/math.ts deleted file mode 100644 index 791288f6..00000000 --- a/modules/editable-layers/src/lib/math.ts +++ /dev/null @@ -1,30 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {Position} from '../utils/geojson-types'; - -export function toDegree(radian: number): number { - return (radian * 180) / Math.PI; -} - -export function toRadian(angle: number): number { - return (angle * Math.PI) / 180; -} - -/** - * Converts an array of latitudes, longitudes in E7 format to a list of points in degrees. - * - * @param {[]} array: An E7 array [lat_e7, lng_e7, lat_e7, lng_e7, ...] - * @return {[]} An array of points in degrees - * [ [lng_degrees, lat_degrees], [lng_degrees, lat_degrees], ...] - */ -export function convertE7Array(array: number[]): Position[] { - const points: Position[] = []; - for (let i = 0; i < array.length; i += 2) { - const lat = array[i] * 1e-7; - const lng = array[i + 1] * 1e-7; - points.push([lng, lat]); - } - return points; -} diff --git a/modules/editable-layers/src/lib/nebula-core.ts b/modules/editable-layers/src/lib/nebula-core.ts deleted file mode 100644 index 3e17776b..00000000 --- a/modules/editable-layers/src/lib/nebula-core.ts +++ /dev/null @@ -1,327 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {EventEmitter} from 'eventemitter3'; -import {WebMercatorViewport} from '@deck.gl/core'; - -import {DeckDrawer} from './deck-renderer/deck-drawer'; -import {LayerMouseEvent} from './layer-mouse-event'; -import {NebulaLayer} from './nebula-layer'; - -const LOGGER_PREFIX = 'Nebula: '; - -export class NebulaCore { - init(props: Record) { - this.props = props; - this.wmViewport = new WebMercatorViewport(this.props.viewport); - - // TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown'] - ['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) => - document.addEventListener(name, this._onMouseEvent as any, true) - ); - } - - detach() { - // TODO: Properly use pointer events: ['click', 'pointermove', 'pointerup', 'pointerdown'] - ['click', 'mousemove', 'mouseup', 'mousedown'].forEach((name) => - document.removeEventListener(name, this._onMouseEvent as any, true) - ); - } - - updateProps(newProps: Record) { - this.props = newProps; - const {viewport} = this.props; - - this.wmViewport = new WebMercatorViewport(viewport); - } - - props: Record = null!; - deckgl: Record | null = null; - mainContainer: Record | null = null; - deckglMouseOverInfo: Record | null | undefined = null; - _deckDrawer: DeckDrawer = null!; - _mouseWasDown: boolean = null!; - wmViewport: WebMercatorViewport = null!; - queryObjectEvents = new EventEmitter(); - forceUpdate: () => any = null!; - inited: boolean = null!; - - log(message: string) { - const {logger} = this.props; - if (logger && logger.info) { - logger.info(LOGGER_PREFIX + message); - } - } - - updateAllDeckObjects() { - this.getAllLayers().forEach((layer) => { - if (layer && layer.deckCache) { - layer.deckCache.updateAllDeckObjects(); - } - }); - this.forceUpdate(); - } - - updateDeckObjectsByIds(ids: string[]) { - this.getAllLayers().forEach((layer) => { - if (layer && layer.deckCache) { - layer.deckCache.updateDeckObjectsByIds(ids); - } - }); - this.forceUpdate(); - } - - rerenderLayers() { - this.updateAllDeckObjects(); - } - - _isNebulaEvent({buttons, target, type}: Record) { - const {viewport} = this.props; - - // allow mouseup event aggressively to cancel drag properly - // TODO: use pointer capture setPointerCapture() to capture mouseup properly after deckgl - if (this._mouseWasDown && type === 'mouseup') { - this._mouseWasDown = false; - return true; - } - - // allow mousemove event while dragging - if (type === 'mousemove' && buttons > 0) { - return true; - } - - if (!target.getBoundingClientRect) { - return false; - } - - const rect = target.getBoundingClientRect(); - // Only listen to events coming from the basemap - // identified by the canvas of the same size as viewport. - // Need to round the rect dimension as some monitors - // have some sub-pixel difference with viewport. - return ( - Math.round(rect.width) === Math.round(viewport.width) && - Math.round(rect.height) === Math.round(viewport.height) - ); - } - - _onMouseEvent = (event: MouseEvent) => { - if (!this._isNebulaEvent(event)) { - return; - } - - if (event.type === 'mousedown') { - this._mouseWasDown = true; - } - - // offsetX/Y of the MouseEvent provides the offset in the X/Y coordinate - // of the mouse pointer between that event and the padding edge of the target node. - // We set our listener to document so we need to adjust offsetX/Y - // in case the target is not be our WebGL canvas. - const {top = 0, left = 0} = this.mainContainer - ? this.mainContainer.getBoundingClientRect() - : {}; - const proxyEvent = new Proxy(event, { - get: (original: any, propertyName: string) => { - if (propertyName === 'offsetX') { - return original.pageX - left; - } - - if (propertyName === 'offsetY') { - return original.pageY - top; - } - - // TODO: Properly use pointer events - if (propertyName === 'type') { - return original.type.replace('pointer', 'mouse'); - } - - const result = original[propertyName]; - if (typeof result === 'function') { - return result.bind(original); - } - return result; - } - }); - - this._handleDeckGLEvent(proxyEvent); - }; - - getMouseGroundPosition(event: Record) { - return this.wmViewport.unproject([event.offsetX, event.offsetY]) as [number, number]; - } - - unprojectMousePosition(mousePosition: [number, number]): [number, number] { - return this.wmViewport.unproject(mousePosition) as [number, number]; - } - - // eslint-disable-next-line max-statements, complexity - _handleDeckGLEvent(event: Record) { - const { - deckgl, - props: {onMapMouseEvent, selectionType, eventFilter} - } = this; - let sendMapEvent = true; - let cursor = 'auto'; - - if (event && deckgl && selectionType) { - if (!this._deckDrawer) this._deckDrawer = new DeckDrawer(this); - - const lngLat = this.getMouseGroundPosition(event); - if (eventFilter && !eventFilter(lngLat, event)) return; - const drawerResult = this._deckDrawer.handleEvent(event, lngLat, selectionType); - if (drawerResult.redraw) this.forceUpdate(); - return; - } - - if (event && deckgl && (!event.buttons || event.type !== 'mousemove')) { - // TODO: sort by mouse priority - const layerIds = deckgl.props.layers - .filter( - (l: any) => l && l.props && l.props.nebulaLayer && l.props.nebulaLayer.enablePicking - ) - .map((l: any) => l.id); - - const pickingInfo = deckgl.pickObject({ - x: event.offsetX, - y: event.offsetY, - radius: 5, - layerIds - }); - this.queryObjectEvents.emit('pick', {event, pickingInfo}); - if (pickingInfo) { - sendMapEvent = false; - - const {index, lngLat} = pickingInfo; - if (eventFilter && !eventFilter(lngLat, event)) return; - - const {layer: deckLayer, object} = pickingInfo; - - if ( - deckLayer && - deckLayer.props && - deckLayer.props.nebulaLayer && - deckLayer.props.nebulaLayer.eventHandler - ) { - deckLayer.props.nebulaLayer.eventHandler(event, pickingInfo); - } - - const original = - object.original || - (deckLayer.props.nebulaLayer && - deckLayer.props.nebulaLayer.deckCache && - deckLayer.props.nebulaLayer.deckCache.originals[index]); - - if (original) { - this.deckglMouseOverInfo = {originalLayer: deckLayer.props.nebulaLayer, index}; - // @ts-expect-error narrow event type - const nebulaMouseEvent = new LayerMouseEvent(event, { - data: original, - metadata: object.metadata, - groundPoint: lngLat, - nebula: this - }); - deckLayer.props.nebulaLayer.emit(event.type, nebulaMouseEvent); - this.forceUpdate(); - } - - cursor = 'pointer'; - } - } - - if (document.documentElement) { - document.documentElement.style.cursor = cursor; - } - - if (sendMapEvent) { - this.deckglMouseOverInfo = null; - - const lngLat = this.getMouseGroundPosition(event); - if (eventFilter && !eventFilter(lngLat, event)) return; - - // send to layers first - // @ts-expect-error narrow event type - const nebulaMouseEvent = new LayerMouseEvent(event, { - groundPoint: lngLat, - nebula: this - }); - this.getAllLayers() - .filter((layer) => layer && layer.usesMapEvents) - .forEach((layer) => layer.emit('mapMouseEvent', nebulaMouseEvent)); - - this.getAllLayers() - .filter( - (layer) => - layer && layer.props && layer.props.nebulaLayer && layer.props.nebulaLayer.mapMouseEvent - ) - .forEach((layer) => layer.props.nebulaLayer.mapMouseEvent(nebulaMouseEvent, layer)); - - if (onMapMouseEvent) { - onMapMouseEvent(event, lngLat); - } - } - } - - getExtraDeckLayers(): Record[] { - const result: Record[] = []; - - if (this._deckDrawer) result.push(...this._deckDrawer.render()); - - return result; - } - - renderDeckLayers() { - return this.getAllLayers() - .map((layer) => (layer instanceof NebulaLayer ? layer.render({nebula: this}) : layer)) - .filter(Boolean); - } - - getAllLayers() { - const result: Record[] = []; - - this.props.layers.filter(Boolean).forEach((layer) => { - result.push(layer); - // Only NebulaLayers have helpers, Deck GL layers don't. - if (layer instanceof NebulaLayer) { - result.push(...layer.helperLayers); - } - }); - - return result.filter(Boolean); - } - - getRenderedLayers() { - return [...this.renderDeckLayers(), ...this.getExtraDeckLayers()]; - } - - updateAndGetRenderedLayers( - layers: Record[], - viewport: WebMercatorViewport, - container: Record - ) { - if (this.inited) { - this.updateProps({layers, viewport}); - this.forceUpdate = () => container.forceUpdate(); - } else { - this.inited = true; - this.init({layers, viewport}); - this.forceUpdate = () => container.forceUpdate(); - this.updateAllDeckObjects(); - } - - return this.getRenderedLayers(); - } - - setDeck(deckgl: Record | null) { - if (deckgl) { - this.deckgl = deckgl; - } - } - - setMainContainer(mainContainer: Record | null) { - if (mainContainer) { - this.mainContainer = mainContainer; - } - } -} diff --git a/modules/editable-layers/src/lib/nebula-layer.ts b/modules/editable-layers/src/lib/nebula-layer.ts deleted file mode 100644 index 5cf29715..00000000 --- a/modules/editable-layers/src/lib/nebula-layer.ts +++ /dev/null @@ -1,37 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {EventEmitter} from 'eventemitter3'; -import {v4} from 'uuid'; - -import {Feature} from './feature'; - -export class NebulaLayer extends EventEmitter { - getData: () => Record[]; - toNebulaFeature: (data: Record) => Feature; - id: string; - helperLayers: Record[]; - - // flags - usesMapEvents = false; - enablePicking = false; - enableSelection = false; - // - - constructor({getData, on, toNebulaFeature}: Record) { - super(); - this.id = v4(); - this.getData = getData; - this.toNebulaFeature = toNebulaFeature; - this.helperLayers = []; - - if (on) { - Object.keys(on).forEach((key) => this.on(key, on[key])); - } - } - - render(config: Record): unknown { - return null; - } -} diff --git a/modules/editable-layers/src/lib/style.ts b/modules/editable-layers/src/lib/style.ts deleted file mode 100644 index 15a21817..00000000 --- a/modules/editable-layers/src/lib/style.ts +++ /dev/null @@ -1,26 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -// Describes the arrow style of polylines -export const ArrowStyles = { - NONE: 0, - FORWARD: 1, - BACKWARD: 2, - BOTH: 3 -}; - -export const DEFAULT_ARROWS = 1; -export const MAX_ARROWS = 3; - -export const DEFAULT_STYLE = { - arrowColor: [0, 0, 0, 1], - arrowCount: DEFAULT_ARROWS, - arrowStyle: ArrowStyles.NONE, - fillColor: [0, 0, 0, 1], - lineColor: [0, 0, 0, 1], - lineWidthMeters: 5, - outlineRadiusMeters: 0, - opacity: 1, - zLevel: 0 -}; diff --git a/modules/editable-layers/src/mode-handlers/composite-mode-handler.ts b/modules/editable-layers/src/mode-handlers/composite-mode-handler.ts index 618506e3..9c91da83 100644 --- a/modules/editable-layers/src/mode-handlers/composite-mode-handler.ts +++ b/modules/editable-layers/src/mode-handlers/composite-mode-handler.ts @@ -1,4 +1,4 @@ -import {FeatureCollection, Feature, Position} from '../utils/geojson-types'; +import {FeatureCollection, Feature, Position, SingleGeometry} from '../utils/geojson-types'; import { ClickEvent, PointerMoveEvent, @@ -35,7 +35,7 @@ export class CompositeModeHandler extends ModeHandler { return result; } - setFeatureCollection(featureCollection: FeatureCollection): void { + setFeatureCollection(featureCollection: FeatureCollection): void { this.handlers.forEach((handler) => handler.setFeatureCollection(featureCollection)); } @@ -69,7 +69,7 @@ export class CompositeModeHandler extends ModeHandler { return this._coalesce((handler) => handler.handleStopDragging(event)); } - getTentativeFeature(): Feature | null | undefined { + getTentativeFeature(): Feature | null | undefined { return this._coalesce((handler) => handler.getTentativeFeature()); } diff --git a/modules/editable-layers/src/mode-handlers/draw-90degree-polygon-handler.ts b/modules/editable-layers/src/mode-handlers/draw-90degree-polygon-handler.ts index e01f2cf3..e0ba5797 100644 --- a/modules/editable-layers/src/mode-handlers/draw-90degree-polygon-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-90degree-polygon-handler.ts @@ -76,7 +76,8 @@ export class Draw90DegreePolygonHandler extends ModeHandler { geometry: { type: 'LineString', coordinates: [...clickSequence, p3] - } + }, + properties: {} }); } else { // Draw a Polygon connecting all the clicked points with the hovered point @@ -85,7 +86,8 @@ export class Draw90DegreePolygonHandler extends ModeHandler { geometry: { type: 'Polygon', coordinates: [[...clickSequence, p3, clickSequence[0]]] - } + }, + properties: {} }); } diff --git a/modules/editable-layers/src/mode-handlers/draw-circle-by-bounding-box-handler.ts b/modules/editable-layers/src/mode-handlers/draw-circle-by-bounding-box-handler.ts index 12e3bc3e..88210a67 100644 --- a/modules/editable-layers/src/mode-handlers/draw-circle-by-bounding-box-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-circle-by-bounding-box-handler.ts @@ -35,7 +35,6 @@ export class DrawCircleByBoundingBoxHandler extends TwoClickPolygonHandler { const firstClickedPoint = clickSequence[0]; const centerCoordinates = getIntermediatePosition(firstClickedPoint, event.mapCoords); const radius = Math.max(distance(firstClickedPoint, centerCoordinates), 0.001); - // @ts-expect-error turf types diff this._setTentativeFeature(circle(centerCoordinates, radius, options)); return result; diff --git a/modules/editable-layers/src/mode-handlers/draw-circle-from-center-handler.ts b/modules/editable-layers/src/mode-handlers/draw-circle-from-center-handler.ts index 557bd14f..d3a2e90d 100644 --- a/modules/editable-layers/src/mode-handlers/draw-circle-from-center-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-circle-from-center-handler.ts @@ -34,7 +34,6 @@ export class DrawCircleFromCenterHandler extends TwoClickPolygonHandler { const centerCoordinates = clickSequence[0]; const radius = Math.max(distance(centerCoordinates, event.mapCoords), 0.001); - // @ts-expect-error turf types diff this._setTentativeFeature(circle(centerCoordinates, radius, options)); return result; diff --git a/modules/editable-layers/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts b/modules/editable-layers/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts index 7976035c..99d78667 100644 --- a/modules/editable-layers/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-ellipse-by-bounding-box-handler.ts @@ -37,8 +37,7 @@ export class DrawEllipseByBoundingBoxHandler extends TwoClickPolygonHandler { const xSemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[1])), 0.001); const ySemiAxis = Math.max(distance(point(polygonPoints[0]), point(polygonPoints[3])), 0.001); - // @ts-expect-error turf types diff - this._setTentativeFeature(ellipse(centerCoordinates, xSemiAxis, ySemiAxis)); + this._setTentativeFeature(ellipse(centerCoordinates, xSemiAxis, ySemiAxis, {})); return result; } diff --git a/modules/editable-layers/src/mode-handlers/draw-ellipse-using-three-points-handler.ts b/modules/editable-layers/src/mode-handlers/draw-ellipse-using-three-points-handler.ts index 13260a4c..08317510 100644 --- a/modules/editable-layers/src/mode-handlers/draw-ellipse-using-three-points-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-ellipse-using-three-points-handler.ts @@ -32,7 +32,8 @@ export class DrawEllipseUsingThreePointsHandler extends ThreeClickPolygonHandler geometry: { type: 'LineString', coordinates: [clickSequence[0], mapCoords] - } + }, + properties: {} }); } else if (clickSequence.length === 2) { const [p1, p2] = clickSequence; @@ -41,7 +42,7 @@ export class DrawEllipseUsingThreePointsHandler extends ThreeClickPolygonHandler const xSemiAxis = Math.max(distance(centerCoordinates, point(mapCoords)), 0.001); const ySemiAxis = Math.max(distance(p1, p2), 0.001) / 2; const options = {angle: bearing(p1, p2)}; - // @ts-expect-error turf types diff + this._setTentativeFeature(ellipse(centerCoordinates, xSemiAxis, ySemiAxis, options)); } diff --git a/modules/editable-layers/src/mode-handlers/draw-point-handler.ts b/modules/editable-layers/src/mode-handlers/draw-point-handler.ts index 8ae0ad81..ffaa9d49 100644 --- a/modules/editable-layers/src/mode-handlers/draw-point-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-point-handler.ts @@ -2,14 +2,14 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {Geometry} from '../utils/geojson-types'; +import {SingleGeometry} from '../utils/geojson-types'; import {ClickEvent} from '../edit-modes/types'; import {EditAction, ModeHandler} from './mode-handler'; // TODO edit-modes: delete handlers once EditMode fully implemented export class DrawPointHandler extends ModeHandler { handleClick({mapCoords}: ClickEvent): EditAction | null | undefined { - const geometry: Geometry = { + const geometry: SingleGeometry = { type: 'Point', coordinates: mapCoords }; diff --git a/modules/editable-layers/src/mode-handlers/draw-polygon-handler.ts b/modules/editable-layers/src/mode-handlers/draw-polygon-handler.ts index a35b62aa..87cad25d 100644 --- a/modules/editable-layers/src/mode-handlers/draw-polygon-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-polygon-handler.ts @@ -107,7 +107,8 @@ export class DrawPolygonHandler extends ModeHandler { geometry: { type: 'LineString', coordinates: [...clickSequence, mapCoords] - } + }, + properties: {} }); } else { // Draw a Polygon connecting all the clicked points with the hovered point @@ -116,7 +117,8 @@ export class DrawPolygonHandler extends ModeHandler { geometry: { type: 'Polygon', coordinates: [[...clickSequence, mapCoords, clickSequence[0]]] - } + }, + properties: {} }); } diff --git a/modules/editable-layers/src/mode-handlers/draw-rectangle-handler.ts b/modules/editable-layers/src/mode-handlers/draw-rectangle-handler.ts index bce58ea6..8d2f6530 100644 --- a/modules/editable-layers/src/mode-handlers/draw-rectangle-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-rectangle-handler.ts @@ -24,7 +24,6 @@ export class DrawRectangleHandler extends TwoClickPolygonHandler { const corner1 = clickSequence[0]; const corner2 = event.mapCoords; - // @ts-expect-error turf type diff this._setTentativeFeature(bboxPolygon([corner1[0], corner1[1], corner2[0], corner2[1]])); return result; diff --git a/modules/editable-layers/src/mode-handlers/draw-rectangle-using-three-points-handler.ts b/modules/editable-layers/src/mode-handlers/draw-rectangle-using-three-points-handler.ts index 0021ffe9..ebcccb0f 100644 --- a/modules/editable-layers/src/mode-handlers/draw-rectangle-using-three-points-handler.ts +++ b/modules/editable-layers/src/mode-handlers/draw-rectangle-using-three-points-handler.ts @@ -30,7 +30,8 @@ export class DrawRectangleUsingThreePointsHandler extends ThreeClickPolygonHandl geometry: { type: 'LineString', coordinates: [clickSequence[0], mapCoords] - } + }, + properties: {} }); } else if (clickSequence.length === 2) { const lineString: LineString = { @@ -55,7 +56,8 @@ export class DrawRectangleUsingThreePointsHandler extends ThreeClickPolygonHandl p1 ] ] - } + }, + properties: {} }); } diff --git a/modules/editable-layers/src/mode-handlers/mode-handler.ts b/modules/editable-layers/src/mode-handlers/mode-handler.ts index 0bda9367..9757c007 100644 --- a/modules/editable-layers/src/mode-handlers/mode-handler.ts +++ b/modules/editable-layers/src/mode-handlers/mode-handler.ts @@ -4,11 +4,12 @@ // TODO edit-modes: delete handlers once EditMode fully implemented +import {featureCollection as turfFeatureCollection} from '@turf/helpers'; import turfUnion from '@turf/union'; import turfDifference from '@turf/difference'; import turfIntersect from '@turf/intersect'; -import {FeatureCollection, Feature, Polygon, Geometry, Position} from '../utils/geojson-types'; +import {FeatureCollection, Feature, Polygon, SingleGeometry, Position, Polygonal} from '../utils/geojson-types'; import { ClickEvent, @@ -29,7 +30,7 @@ export type EditHandle = { }; export type EditAction = { - updatedData: FeatureCollection; + updatedData: FeatureCollection; editType: string; featureIndexes: number[]; editContext: any; @@ -38,12 +39,12 @@ export type EditAction = { export class ModeHandler { // TODO: add underscore featureCollection: ImmutableFeatureCollection = undefined!; - _tentativeFeature: Feature | null | undefined; + _tentativeFeature: Feature | null | undefined; _modeConfig: any = null; _selectedFeatureIndexes: number[] = []; _clickSequence: Position[] = []; - constructor(featureCollection?: FeatureCollection) { + constructor(featureCollection?: FeatureCollection) { if (featureCollection) { this.setFeatureCollection(featureCollection); } @@ -57,14 +58,14 @@ export class ModeHandler { return this.featureCollection; } - getSelectedFeature(): Feature | null | undefined { + getSelectedFeature(): Feature | null | undefined { if (this._selectedFeatureIndexes.length === 1) { return this.featureCollection.getObject().features[this._selectedFeatureIndexes[0]]; } return null; } - getSelectedGeometry(): Geometry | null | undefined { + getSelectedGeometry(): SingleGeometry | null | undefined { const feature = this.getSelectedFeature(); if (feature) { return feature.geometry; @@ -72,8 +73,8 @@ export class ModeHandler { return null; } - getSelectedFeaturesAsFeatureCollection(): FeatureCollection { - const {features} = this.featureCollection.getObject(); + getSelectedFeaturesAsFeatureCollection(): FeatureCollection { + const { features } = this.featureCollection.getObject(); const selectedFeatures = this.getSelectedFeatureIndexes().map( (selectedIndex) => features[selectedIndex] ); @@ -83,7 +84,7 @@ export class ModeHandler { }; } - setFeatureCollection(featureCollection: FeatureCollection): void { + setFeatureCollection(featureCollection: FeatureCollection): void { this.featureCollection = new ImmutableFeatureCollection(featureCollection); } @@ -121,12 +122,12 @@ export class ModeHandler { this._clickSequence = []; } - getTentativeFeature(): Feature | null | undefined { + getTentativeFeature(): Feature | null | undefined { return this._tentativeFeature; } // TODO: remove the underscore - _setTentativeFeature(tentativeFeature: Feature | null | undefined): void { + _setTentativeFeature(tentativeFeature: Feature | null | undefined): void { this._tentativeFeature = tentativeFeature; if (!tentativeFeature) { // Reset the click sequence @@ -154,7 +155,7 @@ export class ModeHandler { return selectedFeatureIndexes.some((index) => pickedIndexes.includes(index)); } - getAddFeatureAction(geometry: Geometry): EditAction { + getAddFeatureAction(geometry: SingleGeometry): EditAction { // Unsure why flow can't deal with Geometry type, but there I fixed it const geometryAsAny: any = geometry; @@ -218,21 +219,19 @@ export class ModeHandler { return null; } - const feature = { + const feature: Feature = { type: 'Feature', - geometry + geometry, + properties: {}, }; let updatedGeometry; if (modeConfig.booleanOperation === 'union') { - // @ts-expect-error turf types diff - updatedGeometry = turfUnion(selectedFeature, feature); + updatedGeometry = turfUnion(turfFeatureCollection([selectedFeature as Feature, feature])); } else if (modeConfig.booleanOperation === 'difference') { - // @ts-expect-error turf type diff - updatedGeometry = turfDifference(selectedFeature, feature); + updatedGeometry = turfDifference(turfFeatureCollection([selectedFeature as Feature, feature])); } else if (modeConfig.booleanOperation === 'intersection') { - // @ts-expect-error turf type diff - updatedGeometry = turfIntersect(selectedFeature, feature); + updatedGeometry = turfIntersect(turfFeatureCollection([selectedFeature as Feature, feature])); } else { // eslint-disable-next-line no-console,no-undef console.warn(`Invalid booleanOperation ${modeConfig.booleanOperation}`); @@ -307,7 +306,7 @@ export function getIntermediatePosition(position1: Position, position2: Position } export function getEditHandlesForGeometry( - geometry: Geometry, + geometry: SingleGeometry, featureIndex: number, editHandleType: EditHandleType = 'existing' ): EditHandle[] { diff --git a/modules/editable-layers/src/mode-handlers/modify-handler.ts b/modules/editable-layers/src/mode-handlers/modify-handler.ts index df1055c7..14dae59e 100644 --- a/modules/editable-layers/src/mode-handlers/modify-handler.ts +++ b/modules/editable-layers/src/mode-handlers/modify-handler.ts @@ -66,7 +66,6 @@ export class ModifyHandler extends ModeHandler { const lineStringFeature = toLineString(lineString); const candidateIntermediatePoint = this.nearestPointOnLine( - // @ts-expect-error turf type diff lineStringFeature, referencePoint ); @@ -115,7 +114,6 @@ export class ModifyHandler extends ModeHandler { 'Editing 3D point but modeConfig.viewport not provided. Falling back to 2D logic.' ); } - // @ts-expect-error geojson types diff return nearestPointOnLine(line, inPoint); } diff --git a/modules/editable-layers/src/mode-handlers/rotate-handler.ts b/modules/editable-layers/src/mode-handlers/rotate-handler.ts index 3e7817b7..b991816f 100644 --- a/modules/editable-layers/src/mode-handlers/rotate-handler.ts +++ b/modules/editable-layers/src/mode-handlers/rotate-handler.ts @@ -5,14 +5,14 @@ import turfCentroid from '@turf/centroid'; import turfBearing from '@turf/bearing'; import turfTransformRotate from '@turf/transform-rotate'; -import {FeatureCollection, Position} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import {PointerMoveEvent, StartDraggingEvent, StopDraggingEvent} from '../edit-modes/types'; import {EditAction, ModeHandler} from './mode-handler'; // TODO edit-modes: delete handlers once EditMode fully implemented export class RotateHandler extends ModeHandler { _isRotatable: boolean = undefined!; - _geometryBeingRotated: FeatureCollection | null | undefined; + _geometryBeingRotated: FeatureCollection | null | undefined; handlePointerMove(event: PointerMoveEvent): { editAction: EditAction | null | undefined; @@ -66,14 +66,10 @@ export class RotateHandler extends ModeHandler { getRotateAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction { const startPosition = startDragPoint; - // @ts-expect-error turf types diff const centroid = turfCentroid(this._geometryBeingRotated); - // @ts-expect-error turf types diff - const angle = getRotationAngle(centroid, startPosition, currentPoint); + const angle = getRotationAngle(centroid.geometry.coordinates, startPosition, currentPoint); - // @ts-expect-error turf type diff - const rotatedFeatures: FeatureCollection = turfTransformRotate( - // @ts-expect-error turf type diff + const rotatedFeatures = turfTransformRotate( this._geometryBeingRotated, angle ); diff --git a/modules/editable-layers/src/mode-handlers/scale-handler.ts b/modules/editable-layers/src/mode-handlers/scale-handler.ts index bee254ca..14a43ea9 100644 --- a/modules/editable-layers/src/mode-handlers/scale-handler.ts +++ b/modules/editable-layers/src/mode-handlers/scale-handler.ts @@ -5,14 +5,14 @@ import turfCentroid from '@turf/centroid'; import turfDistance from '@turf/distance'; import turfTransformScale from '@turf/transform-scale'; -import {FeatureCollection, Position} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import {PointerMoveEvent, StartDraggingEvent, StopDraggingEvent} from '../edit-modes/types'; import {EditAction, ModeHandler} from './mode-handler'; // TODO edit-modes: delete handlers once EditMode fully implemented export class ScaleHandler extends ModeHandler { _isScalable: boolean = undefined!; - _geometryBeingScaled: FeatureCollection | null | undefined; + _geometryBeingScaled: FeatureCollection | null | undefined; handlePointerMove(event: PointerMoveEvent): { editAction: EditAction | null | undefined; @@ -66,13 +66,9 @@ export class ScaleHandler extends ModeHandler { getScaleAction(startDragPoint: Position, currentPoint: Position, editType: string): EditAction { const startPosition = startDragPoint; - // @ts-expect-error turf types diff const centroid = turfCentroid(this._geometryBeingScaled); - // @ts-expect-error turf types diff - const factor = getScaleFactor(centroid, startPosition, currentPoint); - // @ts-expect-error turf type diff - const scaledFeatures: FeatureCollection = turfTransformScale( - // @ts-expect-error turf type diff + const factor = getScaleFactor(centroid.geometry.coordinates, startPosition, currentPoint); + const scaledFeatures = turfTransformScale( this._geometryBeingScaled, factor, { diff --git a/modules/editable-layers/src/mode-handlers/snappable-handler.ts b/modules/editable-layers/src/mode-handlers/snappable-handler.ts index b6fcc4b8..33ebb13d 100644 --- a/modules/editable-layers/src/mode-handlers/snappable-handler.ts +++ b/modules/editable-layers/src/mode-handlers/snappable-handler.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors -import {Feature, FeatureCollection, Position} from '../utils/geojson-types'; +import {Feature, FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import {PointerMoveEvent, StartDraggingEvent, StopDraggingEvent} from '../edit-modes/types'; import { EditHandle, @@ -25,7 +25,7 @@ export class SnappableHandler extends ModeHandler { this._handler = handler; } - setFeatureCollection(featureCollection: FeatureCollection): void { + setFeatureCollection(featureCollection: FeatureCollection): void { this._handler.setFeatureCollection(featureCollection); } @@ -88,7 +88,7 @@ export class SnappableHandler extends ModeHandler { // method will return those features along with the features // that live in the current layer. Otherwise, this method will simply return the // features from the current layer - _getSnapTargets(): Feature[] { + _getSnapTargets(): Feature[] { let {additionalSnapTargets} = this.getModeConfig() || {}; additionalSnapTargets = additionalSnapTargets || []; diff --git a/modules/editable-layers/src/mode-handlers/split-polygon-handler.ts b/modules/editable-layers/src/mode-handlers/split-polygon-handler.ts index 44f47b38..bc7ac88c 100644 --- a/modules/editable-layers/src/mode-handlers/split-polygon-handler.ts +++ b/modules/editable-layers/src/mode-handlers/split-polygon-handler.ts @@ -6,16 +6,16 @@ import booleanPointInPolygon from '@turf/boolean-point-in-polygon'; import turfDifference from '@turf/difference'; import turfBuffer from '@turf/buffer'; import lineIntersect from '@turf/line-intersect'; -import {lineString} from '@turf/helpers'; +import {feature as turfFeature, featureCollection, lineString} from '@turf/helpers'; import turfBearing from '@turf/bearing'; import turfDistance from '@turf/distance'; import turfDestination from '@turf/destination'; import turfPolygonToLine from '@turf/polygon-to-line'; -import type {NearestPointOnLine} from '@turf/nearest-point-on-line'; import nearestPointOnLine from '@turf/nearest-point-on-line'; import {generatePointsParallelToLinePoints} from '../utils/utils'; import {EditAction, ModeHandler} from './mode-handler'; import {ClickEvent, PointerMoveEvent} from '../edit-modes/types'; +import {Polygonal} from '../utils/geojson-types'; // TODO edit-modes: delete handlers once EditMode fully implemented export class SplitPolygonHandler extends ModeHandler { @@ -33,7 +33,7 @@ export class SplitPolygonHandler extends ModeHandler { const lines = feature.type === 'FeatureCollection' ? feature.features : [feature]; let minDistance = Number.MAX_SAFE_INTEGER; - let closestPoint: NearestPointOnLine | null = null; + let closestPoint: ReturnType | null = null; // If Multipolygon, then we should find nearest polygon line and stick split to it. lines.forEach((line) => { const snapPoint = nearestPointOnLine(line, firstPoint); @@ -120,7 +120,8 @@ export class SplitPolygonHandler extends ModeHandler { geometry: { type: 'LineString', coordinates: [...clickSequence, this.calculateMapCoords(clickSequence, mapCoords)] - } + }, + properties: {} }); return result; @@ -138,10 +139,8 @@ export class SplitPolygonHandler extends ModeHandler { gap = 0.1; units = 'centimeters'; } - // @ts-expect-error turf type diff const buffer = turfBuffer(tentativeFeature, gap, {units}); - // @ts-expect-error turf type diff - const updatedGeometry = turfDifference(selectedGeometry, buffer); + const updatedGeometry = turfDifference(featureCollection([turfFeature(selectedGeometry as Polygonal), buffer])); this._setTentativeFeature(null); if (!updatedGeometry) { // eslint-disable-next-line no-console,no-undef diff --git a/modules/editable-layers/src/mode-handlers/translate-handler.ts b/modules/editable-layers/src/mode-handlers/translate-handler.ts index 7fa33aea..ade08b9f 100644 --- a/modules/editable-layers/src/mode-handlers/translate-handler.ts +++ b/modules/editable-layers/src/mode-handlers/translate-handler.ts @@ -6,13 +6,13 @@ import turfBearing from '@turf/bearing'; import turfDistance from '@turf/distance'; import turfTransformTranslate from '@turf/transform-translate'; import {point} from '@turf/helpers'; -import {FeatureCollection, Position} from '../utils/geojson-types'; +import {FeatureCollection, Position, SingleGeometry} from '../utils/geojson-types'; import {PointerMoveEvent, StartDraggingEvent, StopDraggingEvent} from '../edit-modes/types'; import {EditAction, ModeHandler} from './mode-handler'; // TODO edit-modes: delete handlers once EditMode fully implemented export class TranslateHandler extends ModeHandler { - _geometryBeforeTranslate: FeatureCollection | null | undefined; + _geometryBeforeTranslate: FeatureCollection | null | undefined; _isTranslatable: boolean = undefined!; handlePointerMove(event: PointerMoveEvent): { @@ -87,9 +87,7 @@ export class TranslateHandler extends ModeHandler { const distanceMoved = turfDistance(p1, p2); const direction = turfBearing(p1, p2); - // @ts-expect-error turf type diff - const movedFeatures: FeatureCollection = turfTransformTranslate( - // @ts-expect-error turf type diff + const movedFeatures: FeatureCollection = turfTransformTranslate( this._geometryBeforeTranslate, distanceMoved, direction diff --git a/modules/editable-layers/src/utils/curve-utils.ts b/modules/editable-layers/src/utils/curve-utils.ts deleted file mode 100644 index 55eaa375..00000000 --- a/modules/editable-layers/src/utils/curve-utils.ts +++ /dev/null @@ -1,81 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import hermite from 'cubic-hermite-spline'; -import turfDistance from '@turf/distance'; -import {lineString} from '@turf/helpers'; -import type {Feature, MultiLineString, LineString, Position} from '@turf/helpers'; - -const INTERPOLATION_INTERVAL = 0.005; -const INTERPOLATION_THRESHOLD = 0.001; - -function calculateSingleTangent(p0: [number, number], p1: [number, number], d: number): number[] { - const x = (p1[0] - p0[0]) / d; - const y = (p1[1] - p0[1]) / d; - return [x, y]; -} - -// eslint-disable-next-line max-statements -export function generateCurveFromControlPoints( - line: Feature -): Feature { - // calculate knots - const knots = [0]; - let prev: Position[] | null = null; - let totalDistance = 0; - - const {coordinates: coords} = line.geometry; - - for (let i = 0; i < coords.length; i++) { - const cur = coords[i]; - if (prev !== null) { - // @ts-expect-error turf types diff - totalDistance += turfDistance(prev, cur); - knots.push(totalDistance); - } - prev = cur; - } - - // calculate tangents - const tangents: number[][] = []; - - // first tangent - // @ts-expect-error TODO - tangents.push(calculateSingleTangent(coords[0], coords[1], knots[1] - knots[0])); - - // second to before last - for (let i = 1; i < coords.length - 1; i++) { - // @ts-expect-error TODO - const A = calculateSingleTangent(coords[i], coords[i + 1], knots[i + 1] - knots[i]); - // @ts-expect-error TODO - const B = calculateSingleTangent(coords[i - 1], coords[i], knots[i] - knots[i - 1]); - const x = (A[0] + B[0]) / 2.0; - const y = (A[1] + B[1]) / 2.0; - tangents.push([x, y]); - } - - // last tangent - const last = coords.length - 1; - tangents.push( - // @ts-expect-error TODO - calculateSingleTangent(coords[last - 1], coords[last], knots[last] - knots[last - 1]) - ); - - // generate curve - const result: any[] = []; - for (let i = 0; i < coords.length; i++) { - // add control point - result.push(coords[i]); - - // add interpolated values - for (let t = knots[i] + INTERPOLATION_INTERVAL; t < knots[i + 1]; t += INTERPOLATION_INTERVAL) { - if (knots[i + 1] - t > INTERPOLATION_THRESHOLD) { - // Only add if not too close to a control point (knot = control point) - result.push(hermite(t, coords, tangents, knots)); - } - } - } - - return lineString(result); -} diff --git a/modules/editable-layers/src/utils/geojson-types.ts b/modules/editable-layers/src/utils/geojson-types.ts index 63d2b4f8..ca7d96d2 100644 --- a/modules/editable-layers/src/utils/geojson-types.ts +++ b/modules/editable-layers/src/utils/geojson-types.ts @@ -11,64 +11,27 @@ import type { MultiPoint, MultiLineString, MultiPolygon, - Position + Position, } from 'geojson'; -export {Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, Position}; +export { Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, Position }; -export type PointCoordinates = Position; -export type LineStringCoordinates = Position[]; -export type PolygonCoordinates = Position[][]; -export type MultiPointCoordinates = Position[]; -export type MultiLineStringCoordinates = Position[][]; -export type MultiPolygonCoordinates = Position[][][]; +export type SingleGeometry = Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon; -export type AnyCoordinates = - | PointCoordinates - | LineStringCoordinates - | PolygonCoordinates - | MultiPointCoordinates - | MultiLineStringCoordinates - | MultiPolygonCoordinates; - -export type Geometry = Point | LineString | Polygon | MultiPoint | MultiLineString | MultiPolygon; +export type AnyCoordinates = SingleGeometry['coordinates'] export type Polygonal = Polygon | MultiPolygon; // Feature types -export type BoundingBoxArray = [number, number, number, number]; +import { Feature, FeatureCollection } from 'geojson'; +export { Feature, FeatureCollection } from 'geojson'; -export type FeatureOf = { - type: 'Feature'; - geometry: T; - properties?: { - [key: string]: any; - }; - id?: string | number; - bbox?: BoundingBoxArray; -}; +export type BoundingBoxArray = [number, number, number, number]; +export type FeatureOf = Feature; -export type FeatureWithProps = { - type: 'Feature'; - geometry: T; - properties: P; -}; +export type FeatureWithProps = Feature -export type Feature = - | FeatureOf - | FeatureOf - | FeatureOf - | FeatureOf - | FeatureOf - | FeatureOf; -export type FeatureCollection = { - type: 'FeatureCollection'; - features: Feature[]; - properties?: {}; - id?: string | number; - bbox?: BoundingBoxArray; -}; export type AnyGeoJson = Feature | FeatureCollection; diff --git a/modules/editable-layers/src/utils/translate-from-center.ts b/modules/editable-layers/src/utils/translate-from-center.ts index 2c075aac..8b809b62 100644 --- a/modules/editable-layers/src/utils/translate-from-center.ts +++ b/modules/editable-layers/src/utils/translate-from-center.ts @@ -6,35 +6,31 @@ import turfCenter from '@turf/center'; import turfRhumbBearing from '@turf/rhumb-bearing'; import turfRhumbDistance from '@turf/rhumb-distance'; import turfRhumbDestination from '@turf/rhumb-destination'; -import type { - Position as TurfPosition, - Feature as TurfFeature, - Geometry as TurfGeometry -} from '@turf/helpers'; +import type {Feature} from 'geojson'; import {mapCoords} from '../edit-modes/utils'; -import type {AnyCoordinates /* , Position */} from './geojson-types'; +import type {SingleGeometry} from './geojson-types'; // This function takes feature's center, moves it, // and builds new feature around it keeping the proportions export function translateFromCenter( - feature: TurfFeature, + feature: Feature, distance: number, direction: number ) { - const initialCenterPoint = turfCenter(feature as TurfFeature); + const initialCenterPoint = turfCenter(feature); const movedCenterPoint = turfRhumbDestination(initialCenterPoint, distance, direction); const movedCoordinates = mapCoords( - feature.geometry.coordinates as AnyCoordinates, + feature.geometry.coordinates, (coordinate) => { const rhumbDistance = turfRhumbDistance( initialCenterPoint.geometry.coordinates, - coordinate as TurfPosition + coordinate ); const rhumbDirection = turfRhumbBearing( initialCenterPoint.geometry.coordinates, - coordinate as TurfPosition + coordinate ); const movedPosition = turfRhumbDestination( diff --git a/modules/editable-layers/test/edit-modes/lib/__snapshots__/measure-area-mode.spec.ts.snap b/modules/editable-layers/test/edit-modes/lib/__snapshots__/measure-area-mode.spec.ts.snap index 5a2c1a14..dc72ded1 100644 --- a/modules/editable-layers/test/edit-modes/lib/__snapshots__/measure-area-mode.spec.ts.snap +++ b/modules/editable-layers/test/edit-modes/lib/__snapshots__/measure-area-mode.spec.ts.snap @@ -7,7 +7,7 @@ exports[`three clicks + pointer move > tooltip contains area 1`] = ` 0, 0, ], - "text": "49565599608.28 sq. m", + "text": "49454872580.72 sq. m", }, ] `; diff --git a/modules/editable-layers/test/edit-modes/lib/measure-area-mode.spec.ts b/modules/editable-layers/test/edit-modes/lib/measure-area-mode.spec.ts index 363d60ac..c01d8334 100644 --- a/modules/editable-layers/test/edit-modes/lib/measure-area-mode.spec.ts +++ b/modules/editable-layers/test/edit-modes/lib/measure-area-mode.spec.ts @@ -65,7 +65,7 @@ describe('three clicks + pointer move', () => { ...props, modeConfig: {formatTooltip: (area) => String(Math.round(area))} }); - expect(tooltips[0].text).toEqual('49565599608'); + expect(tooltips[0].text).toEqual('49454872581'); }); }); diff --git a/modules/editable-layers/test/lib/__snapshots__/curve-utils.spec.ts.snap b/modules/editable-layers/test/lib/__snapshots__/curve-utils.spec.ts.snap deleted file mode 100644 index 612a0e20..00000000 --- a/modules/editable-layers/test/lib/__snapshots__/curve-utils.spec.ts.snap +++ /dev/null @@ -1,481 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`test generateCurveFromControlPoints 1`] = ` -{ - "geometry": { - "coordinates": [ - [ - -122.41988182067871, - 37.8014343052295, - ], - [ - -122.41985715431925, - 37.801475724545, - ], - [ - -122.4198329976012, - 37.80151902179406, - ], - [ - -122.41980930049003, - 37.801564012608736, - ], - [ - -122.41978601295123, - 37.80161051262117, - ], - [ - -122.41976308495022, - 37.80165833746338, - ], - [ - -122.41974046645252, - 37.801707302767504, - ], - [ - -122.41971810742356, - 37.80175722416558, - ], - [ - -122.41969595782884, - 37.8018079172897, - ], - [ - -122.41967396763383, - 37.80185919777198, - ], - [ - -122.41965208680396, - 37.801910881244474, - ], - [ - -122.41963026530469, - 37.80196278333927, - ], - [ - -122.41960845310155, - 37.80201471968846, - ], - [ - -122.41958660015999, - 37.80206650592411, - ], - [ - -122.41956465644546, - 37.802117957678334, - ], - [ - -122.41954257192343, - 37.80216889058318, - ], - [ - -122.41952029655936, - 37.80221912027076, - ], - [ - -122.41949778031874, - 37.80226846237314, - ], - [ - -122.41947497316703, - 37.802316732522414, - ], - [ - -122.41945182506966, - 37.80236374635065, - ], - [ - -122.41942828599221, - 37.802409319489946, - ], - [ - -122.41940430590003, - 37.80245326757239, - ], - [ - -122.4193798347586, - 37.80249540623004, - ], - [ - -122.41935482253346, - 37.80253555109499, - ], - [ - -122.41932921919002, - 37.80257351779934, - ], - [ - -122.41930297469379, - 37.802609121975166, - ], - [ - -122.41927603901021, - 37.80264217925455, - ], - [ - -122.41924836210475, - 37.80267250526956, - ], - [ - -122.41921989394287, - 37.8026999156523, - ], - [ - -122.41919058449007, - 37.80272422603484, - ], - [ - -122.4191603837118, - 37.802745252049284, - ], - [ - -122.41912924157351, - 37.80276280932769, - ], - [ - -122.4190971080407, - 37.80277671350214, - ], - [ - -122.4190639330788, - 37.80278678020474, - ], - [ - -122.41904497146605, - 37.802790657411244, - ], - [ - -122.41901000972386, - 37.80279401268719, - ], - [ - -122.41897382179135, - 37.80279260740665, - ], - [ - -122.41893646814607, - 37.802786683431094, - ], - [ - -122.41889800926566, - 37.802776482622036, - ], - [ - -122.41885850562758, - 37.80276224684095, - ], - [ - -122.41881801770954, - 37.80274421794934, - ], - [ - -122.41877660598905, - 37.80272263780869, - ], - [ - -122.4187343309437, - 37.8026977482805, - ], - [ - -122.41869125305111, - 37.80266979122625, - ], - [ - -122.4186474327888, - 37.80263900850743, - ], - [ - -122.4186029306344, - 37.80260564198556, - ], - [ - -122.41855780706545, - 37.80256993352211, - ], - [ - -122.41851212255956, - 37.80253212497857, - ], - [ - -122.41846593759433, - 37.80249245821643, - ], - [ - -122.41841931264727, - 37.802451175097204, - ], - [ - -122.41837230819606, - 37.80240851748236, - ], - [ - -122.4183249847182, - 37.8023647272334, - ], - [ - -122.41827740269127, - 37.80232004621181, - ], - [ - -122.41822962259292, - 37.802274716279086, - ], - [ - -122.41818170490068, - 37.802228979296714, - ], - [ - -122.41813371009214, - 37.80218307712621, - ], - [ - -122.41808569864489, - 37.80213725162904, - ], - [ - -122.41803773103652, - 37.802091744666704, - ], - [ - -122.41798986774458, - 37.802046798100704, - ], - [ - -122.41794216924666, - 37.80200265379251, - ], - [ - -122.41789469602033, - 37.80195955360362, - ], - [ - -122.4178475085432, - 37.801917739395556, - ], - [ - -122.41780066729288, - 37.80187745302976, - ], - [ - -122.41775423274687, - 37.801838936367766, - ], - [ - -122.41770826538279, - 37.80180243127104, - ], - [ - -122.41766282567824, - 37.80176817960109, - ], - [ - -122.41761797411077, - 37.801736423219396, - ], - [ - -122.41757377115798, - 37.80170740398746, - ], - [ - -122.41753027729746, - 37.80168136376677, - ], - [ - -122.41748755300677, - 37.80165854441882, - ], - [ - -122.41744565876347, - 37.80163918780509, - ], - [ - -122.41740465504519, - 37.80162353578708, - ], - [ - -122.4173646023295, - 37.80161183022629, - ], - [ - -122.41732556109396, - 37.80160431298421, - ], - [ - -122.41728759181616, - 37.801601225922326, - ], - [ - -122.4172507549737, - 37.80160281090213, - ], - [ - -122.41724252700804, - 37.801603850614384, - ], - [ - -122.41720693675963, - 37.80161067272053, - ], - [ - -122.417172100407, - 37.801620797280215, - ], - [ - -122.41713798820535, - 37.80163409399563, - ], - [ - -122.4171045704098, - 37.80165043256899, - ], - [ - -122.41707181727556, - 37.80166968270251, - ], - [ - -122.41703969905772, - 37.80169171409837, - ], - [ - -122.41700818601153, - 37.8017163964588, - ], - [ - -122.41697724839206, - 37.80174359948599, - ], - [ - -122.4169468564545, - 37.801773192882145, - ], - [ - -122.41691698045402, - 37.80180504634949, - ], - [ - -122.41688759064576, - 37.8018390295902, - ], - [ - -122.41685865728488, - 37.801875012306496, - ], - [ - -122.41683015062654, - 37.80191286420059, - ], - [ - -122.41680204092589, - 37.80195245497468, - ], - [ - -122.41677429843809, - 37.80199365433096, - ], - [ - -122.41674689341828, - 37.802036331971635, - ], - [ - -122.41671979612167, - 37.802080357598946, - ], - [ - -122.41669297680338, - 37.80212560091506, - ], - [ - -122.41666640571854, - 37.80217193162219, - ], - [ - -122.41664005312235, - 37.802219219422554, - ], - [ - -122.41661388926997, - 37.80226733401834, - ], - [ - -122.41658788441654, - 37.80231614511177, - ], - [ - -122.41656200881721, - 37.80236552240503, - ], - [ - -122.41653623272713, - 37.802415335600344, - ], - [ - -122.4165105264015, - 37.8024654543999, - ], - [ - -122.41648486009544, - 37.80251574850592, - ], - [ - -122.41645920406411, - 37.8025660876206, - ], - [ - -122.41643352856268, - 37.80261634144613, - ], - [ - -122.4164078038463, - 37.80266637968475, - ], - [ - -122.41638200017012, - 37.80271607203864, - ], - [ - -122.41635608778932, - 37.80276528821001, - ], - [ - -122.41633003695902, - 37.80281389790107, - ], - [ - -122.41630381793443, - 37.80286177081402, - ], - [ - -122.41627740097067, - 37.802908776651066, - ], - [ - -122.41625075632288, - 37.80295478511441, - ], - [ - -122.41622385424625, - 37.802999665906256, - ], - [ - -122.41619666499595, - 37.80304328872882, - ], - [ - -122.41616915882707, - 37.803085523284295, - ], - [ - -122.41614130599486, - 37.803126239274896, - ], - [ - -122.41612672805786, - 37.80314669573162, - ], - ], - "type": "LineString", - }, - "properties": {}, - "type": "Feature", -} -`; diff --git a/modules/editable-layers/test/lib/curve-utils.spec.ts b/modules/editable-layers/test/lib/curve-utils.spec.ts deleted file mode 100644 index 264f9aa5..00000000 --- a/modules/editable-layers/test/lib/curve-utils.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -// deck.gl-community -// SPDX-License-Identifier: MIT -// Copyright (c) vis.gl contributors - -import {it, expect} from 'vitest'; -import {generateCurveFromControlPoints} from '../../src/utils/curve-utils'; -import {Feature} from '../../src/utils/geojson-types'; - -const POLYLINE: Feature = { - type: 'Feature', - properties: {}, - geometry: { - type: 'LineString', - coordinates: [ - [-122.41988182067871, 37.8014343052295], - [-122.41904497146605, 37.802790657411244], - [-122.41724252700804, 37.801603850614384], - [-122.41612672805786, 37.80314669573162] - ] - } -}; - -it('test generateCurveFromControlPoints', () => { - // @ts-expect-error TODO - const result = generateCurveFromControlPoints(POLYLINE); - expect(result).toMatchSnapshot(); -}); diff --git a/yarn.lock b/yarn.lock index d98ed966..a9d60dd6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1822,37 +1822,36 @@ __metadata: version: 0.0.0-use.local resolution: "@deck.gl-community/editable-layers@workspace:modules/editable-layers" dependencies: - "@turf/along": "npm:^6.5.0" - "@turf/area": "npm:^6.5.0" - "@turf/bbox": "npm:^6.5.0" - "@turf/bbox-polygon": "npm:^6.5.0" - "@turf/bearing": "npm:^6.5.0" - "@turf/boolean-point-in-polygon": "npm:^6.5.0" - "@turf/buffer": "npm:^6.5.0" - "@turf/center": "npm:^6.5.0" - "@turf/centroid": "npm:^6.5.0" - "@turf/circle": "npm:^6.5.0" - "@turf/clone": "npm:^6.5.0" - "@turf/destination": "npm:^6.5.0" - "@turf/difference": "npm:^6.5.0" - "@turf/distance": "npm:^6.5.0" - "@turf/ellipse": "npm:^6.5.0" - "@turf/helpers": "npm:^6.5.0" - "@turf/intersect": "npm:^6.5.0" - "@turf/invariant": "npm:^6.5.0" - "@turf/line-intersect": "npm:^6.5.0" - "@turf/meta": "npm:^6.5.0" - "@turf/midpoint": "npm:^6.5.0" - "@turf/nearest-point-on-line": "npm:^6.5.0" - "@turf/point-to-line-distance": "npm:^6.5.0" - "@turf/polygon-to-line": "npm:^6.5.0" - "@turf/rewind": "npm:^6.5.0" - "@turf/transform-rotate": "npm:^6.5.0" - "@turf/transform-scale": "npm:^6.5.0" - "@turf/transform-translate": "npm:^6.5.0" - "@turf/union": "npm:^6.5.0" + "@turf/along": "npm:^7.2.0" + "@turf/area": "npm:^7.2.0" + "@turf/bbox": "npm:^7.2.0" + "@turf/bbox-polygon": "npm:^7.2.0" + "@turf/bearing": "npm:^7.2.0" + "@turf/boolean-point-in-polygon": "npm:^7.2.0" + "@turf/buffer": "npm:^7.2.0" + "@turf/center": "npm:^7.2.0" + "@turf/centroid": "npm:^7.2.0" + "@turf/circle": "npm:^7.2.0" + "@turf/clone": "npm:^7.2.0" + "@turf/destination": "npm:^7.2.0" + "@turf/difference": "npm:^7.2.0" + "@turf/distance": "npm:^7.2.0" + "@turf/ellipse": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/intersect": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/line-intersect": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@turf/midpoint": "npm:^7.2.0" + "@turf/nearest-point-on-line": "npm:^7.2.0" + "@turf/point-to-line-distance": "npm:^7.2.0" + "@turf/polygon-to-line": "npm:^7.2.0" + "@turf/rewind": "npm:^7.2.0" + "@turf/transform-rotate": "npm:^7.2.0" + "@turf/transform-scale": "npm:^7.2.0" + "@turf/transform-translate": "npm:^7.2.0" + "@turf/union": "npm:^7.2.0" "@types/geojson": "npm:^7946.0.14" - cubic-hermite-spline: "npm:^1.0.1" eventemitter3: "npm:^5.0.0" lodash.throttle: "npm:^4.1.1" uuid: "npm:9.0.0" @@ -6066,6 +6065,21 @@ __metadata: languageName: node linkType: hard +"@turf/along@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/along@npm:7.2.0" + dependencies: + "@turf/bearing": "npm:^7.2.0" + "@turf/destination": "npm:^7.2.0" + "@turf/distance": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/903b1291dfb55eda8e9980edd01ace91dc744a2cfeaa14cfe10123aa21c459b32156a58f7b9009ca1aeb56d9b92f7a320920709987476dc8e597e5f953fdbfb9 + languageName: node + linkType: hard + "@turf/area@npm:^6.5.0": version: 6.5.0 resolution: "@turf/area@npm:6.5.0" @@ -6076,6 +6090,18 @@ __metadata: languageName: node linkType: hard +"@turf/area@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/area@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/4a7dc2ff92e84bf9b46de349eb227056c53506530021358d1a03ca622e6ba6685f592ce59a9a770ec564d99a7c4156179e9e733e5ebce4e35f5151fd959b1c57 + languageName: node + linkType: hard + "@turf/bbox-polygon@npm:^6.5.0": version: 6.5.0 resolution: "@turf/bbox-polygon@npm:6.5.0" @@ -6085,6 +6111,17 @@ __metadata: languageName: node linkType: hard +"@turf/bbox-polygon@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/bbox-polygon@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/c0b35639fdefae3fddd6345a44ece35f7d411faf07c274731a2ec6fa2e94bce9be7864d86f7618594161ac12dcf3ae7c7f978225a7baeabe1f82d1211ff99c40 + languageName: node + linkType: hard + "@turf/bbox@npm:*": version: 7.0.0 resolution: "@turf/bbox@npm:7.0.0" @@ -6106,6 +6143,18 @@ __metadata: languageName: node linkType: hard +"@turf/bbox@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/bbox@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/766d59d5f75c272481e971cd4004e139962607e8f34391b2abfb15bb34f9544a0479ceb14772565e005e4a12fdd82adf0d440ab1c9e0decbde6de50a5706db43 + languageName: node + linkType: hard + "@turf/bearing@npm:^6.5.0": version: 6.5.0 resolution: "@turf/bearing@npm:6.5.0" @@ -6116,6 +6165,18 @@ __metadata: languageName: node linkType: hard +"@turf/bearing@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/bearing@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/970f1a87f9489f8ca812e6f3193dd4da6b7f89a93dfb46e5c4b11b1064db99e56a04917f0e46ea443aff28e30392da529d7db08315c2bcd2d492b9350070b6e5 + languageName: node + linkType: hard + "@turf/boolean-clockwise@npm:^5.1.5": version: 5.1.5 resolution: "@turf/boolean-clockwise@npm:5.1.5" @@ -6136,6 +6197,18 @@ __metadata: languageName: node linkType: hard +"@turf/boolean-clockwise@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/boolean-clockwise@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/adfc2b9f69188fb89c49aa251ebe8d398f9305e95ed0955588fd433367a341bb2b6e52f4d69ae1e7eaaca80c0e45b3d703bb08442833d6dfcb257442d69b279e + languageName: node + linkType: hard + "@turf/boolean-point-in-polygon@npm:^6.5.0": version: 6.5.0 resolution: "@turf/boolean-point-in-polygon@npm:6.5.0" @@ -6146,6 +6219,19 @@ __metadata: languageName: node linkType: hard +"@turf/boolean-point-in-polygon@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/boolean-point-in-polygon@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + point-in-polygon-hao: "npm:^1.1.0" + tslib: "npm:^2.8.1" + checksum: 10c0/eeb431f70175e466205b27076dbc331b862d3e6867d43730ac4099ecd7e6d6f0fed9e3301fd29f6375f340e379f477489f09060e6aec9fc0f7afa01ac58d5c09 + languageName: node + linkType: hard + "@turf/buffer@npm:^6.5.0": version: 6.5.0 resolution: "@turf/buffer@npm:6.5.0" @@ -6161,6 +6247,22 @@ __metadata: languageName: node linkType: hard +"@turf/buffer@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/buffer@npm:7.2.0" + dependencies: + "@turf/bbox": "npm:^7.2.0" + "@turf/center": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/jsts": "npm:^2.7.1" + "@turf/meta": "npm:^7.2.0" + "@turf/projection": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + d3-geo: "npm:1.7.1" + checksum: 10c0/4dff5c05f9da4e9317c38c6aa9c8a0e53cd566f497d8f9e1539754fa671f9005e81740b32f20037554274d1c0c687783d3fb7669d069c50071cc5d4068ed4be0 + languageName: node + linkType: hard + "@turf/center@npm:^6.5.0": version: 6.5.0 resolution: "@turf/center@npm:6.5.0" @@ -6171,6 +6273,18 @@ __metadata: languageName: node linkType: hard +"@turf/center@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/center@npm:7.2.0" + dependencies: + "@turf/bbox": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/bd05cc871f37fe03022f562afacf28d5880bfb4066eb0c0e8092e96a7699ebdf7b94719a307fd1ac2c69a5b9bc029c7a81dbd7a461b5195ea972ad34e209e4bd + languageName: node + linkType: hard + "@turf/centroid@npm:^6.5.0": version: 6.5.0 resolution: "@turf/centroid@npm:6.5.0" @@ -6181,6 +6295,18 @@ __metadata: languageName: node linkType: hard +"@turf/centroid@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/centroid@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/afdf72cbd140337638528055c509cc76c7839d3b0d6d0379d9bb1d9d04db4af840f1c17855dff6202df76072e87b2d9f02d1cd571f63a5ac704bd3a62c235afd + languageName: node + linkType: hard + "@turf/circle@npm:^6.5.0": version: 6.5.0 resolution: "@turf/circle@npm:6.5.0" @@ -6191,6 +6317,18 @@ __metadata: languageName: node linkType: hard +"@turf/circle@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/circle@npm:7.2.0" + dependencies: + "@turf/destination": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/0327fd8a73009239d5da7816b75ba4d03c85e1b2fe132578f9d857dd7d5cbb46632b7a34fb80db0d5e2a0007bb31ad34d2e5c22d53822a3520babf79b4054a18 + languageName: node + linkType: hard + "@turf/clone@npm:^5.1.5": version: 5.1.5 resolution: "@turf/clone@npm:5.1.5" @@ -6209,6 +6347,17 @@ __metadata: languageName: node linkType: hard +"@turf/clone@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/clone@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/755fa244e1b1dcb177f0dd054ae48a3d92abca04ded8432c0a403f29658120451f5bdc97d17e094fd2d4e852a20cab3b9a924fc957ce7e59a241f421dfefb2f0 + languageName: node + linkType: hard + "@turf/destination@npm:^6.5.0": version: 6.5.0 resolution: "@turf/destination@npm:6.5.0" @@ -6219,6 +6368,18 @@ __metadata: languageName: node linkType: hard +"@turf/destination@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/destination@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/64ca7562d081a3bc9000d7b08a417577a9d5431e91b002f39e771df4c0f8b323becbff2bddaadd414069e7fe8704c7ae1880c4d6cb5c140d3333fba2b65bd6e0 + languageName: node + linkType: hard + "@turf/difference@npm:^6.5.0": version: 6.5.0 resolution: "@turf/difference@npm:6.5.0" @@ -6230,6 +6391,19 @@ __metadata: languageName: node linkType: hard +"@turf/difference@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/difference@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + polyclip-ts: "npm:^0.16.8" + tslib: "npm:^2.8.1" + checksum: 10c0/39c51911ddb564d1c78929f1bb560bbc1b9dcfc39162b97237fe4233b917490fa0b386b4eed5517215209b625712a8ddc04eb128155f485aa680d2b0106bdcab + languageName: node + linkType: hard + "@turf/distance@npm:^6.5.0": version: 6.5.0 resolution: "@turf/distance@npm:6.5.0" @@ -6240,6 +6414,18 @@ __metadata: languageName: node linkType: hard +"@turf/distance@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/distance@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/13ceacf30624e48ee5baabe25340fcba6693c94ecc05c31e6480574ef3017fd1492efb5f7b504933c1451c9428b7a1a7112f11cbeae475571e025a2e0962679a + languageName: node + linkType: hard + "@turf/ellipse@npm:^6.5.0": version: 6.5.0 resolution: "@turf/ellipse@npm:6.5.0" @@ -6252,6 +6438,20 @@ __metadata: languageName: node linkType: hard +"@turf/ellipse@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/ellipse@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/rhumb-destination": "npm:^7.2.0" + "@turf/transform-rotate": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/eb9eef4391484a2eac03f202c0bcd9b8b7b72bc39a6c83dd4ab653b85244ab6b1d798cca353079b6af0bd26349e199d799ec384f194fd473f37d0cb2c033a96b + languageName: node + linkType: hard + "@turf/helpers@npm:6.x, @turf/helpers@npm:^6.5.0": version: 6.5.0 resolution: "@turf/helpers@npm:6.5.0" @@ -6276,6 +6476,16 @@ __metadata: languageName: node linkType: hard +"@turf/helpers@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/helpers@npm:7.2.0" + dependencies: + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/4d6f57164cca00ec7a18e2d3c0200d0274e4ab2b6b3201c6a867b867d899f3f618a82ae242617d467efb04f32740cec150ae06a0e07ee39318397ebc34914687 + languageName: node + linkType: hard + "@turf/intersect@npm:^6.5.0": version: 6.5.0 resolution: "@turf/intersect@npm:6.5.0" @@ -6287,6 +6497,19 @@ __metadata: languageName: node linkType: hard +"@turf/intersect@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/intersect@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + polyclip-ts: "npm:^0.16.8" + tslib: "npm:^2.8.1" + checksum: 10c0/16c39a87819c0173572e1030e29eca1c522115f9aa2c07a3baa00b6b28626573e6e54b428cd919d055f80e49ab1dd90c17166f5e8ba46eb3da738d1a8c8bbd71 + languageName: node + linkType: hard + "@turf/invariant@npm:^5.1.5": version: 5.2.0 resolution: "@turf/invariant@npm:5.2.0" @@ -6305,6 +6528,26 @@ __metadata: languageName: node linkType: hard +"@turf/invariant@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/invariant@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/6968b766d5522488bb2b149a72f863e3f0d4bb0342b14f3992e3e920d9e32c252e1e07e84213732cb51609aef7a82833a8fe76b1c7d0db4cd384954cfedaa4e5 + languageName: node + linkType: hard + +"@turf/jsts@npm:^2.7.1": + version: 2.7.2 + resolution: "@turf/jsts@npm:2.7.2" + dependencies: + jsts: "npm:2.7.1" + checksum: 10c0/19eab63e7e26a613e7186de170d9f96c32759769a0268acac3da4c5cefc8f9f5a1274f9fc73b0cb85c5d52c9d9516167c98a42d1635e03c3a712e2a784e192c7 + languageName: node + linkType: hard + "@turf/line-intersect@npm:^6.5.0": version: 6.5.0 resolution: "@turf/line-intersect@npm:6.5.0" @@ -6318,6 +6561,18 @@ __metadata: languageName: node linkType: hard +"@turf/line-intersect@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/line-intersect@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + sweepline-intersections: "npm:^1.5.0" + tslib: "npm:^2.8.1" + checksum: 10c0/d2ed0159ce84e179f999ed461c5481f063c813bedfdfb4af45e46432503b0acd240128be5c6c2d324e05edc4981fd806a41ee0282567c5d0c80c223497e40cb4 + languageName: node + linkType: hard + "@turf/line-segment@npm:^6.5.0": version: 6.5.0 resolution: "@turf/line-segment@npm:6.5.0" @@ -6356,6 +6611,16 @@ __metadata: languageName: node linkType: hard +"@turf/meta@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/meta@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + checksum: 10c0/707ed63ba64fe48769806bf2419f5c0cd2ebf821a6467aeffb784ba7ebd6a63ec98d4192b97915948529c00304ed46ddc83842a80714fb1f2018fd4e3c455498 + languageName: node + linkType: hard + "@turf/midpoint@npm:^6.5.0": version: 6.5.0 resolution: "@turf/midpoint@npm:6.5.0" @@ -6368,6 +6633,20 @@ __metadata: languageName: node linkType: hard +"@turf/midpoint@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/midpoint@npm:7.2.0" + dependencies: + "@turf/bearing": "npm:^7.2.0" + "@turf/destination": "npm:^7.2.0" + "@turf/distance": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/8bb7fae5358938c080af493c86a2fd36fbee2cf683bcb2536a6dd34eac23d8388b91a86ba01ad26223daa162789ab6971e2fb8f26105afdcb252cb0d1f5be9f2 + languageName: node + linkType: hard + "@turf/nearest-point-on-line@npm:^6.5.0": version: 6.5.0 resolution: "@turf/nearest-point-on-line@npm:6.5.0" @@ -6383,6 +6662,20 @@ __metadata: languageName: node linkType: hard +"@turf/nearest-point-on-line@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/nearest-point-on-line@npm:7.2.0" + dependencies: + "@turf/distance": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/2a2236612db6adbd75337fa35ee89a2acad2897f18f34a55a736bcf313c3d2d1887aa17390580945985e6bc302dce772fd1ed2ce36b1cc299ca48a80ddc2de6e + languageName: node + linkType: hard + "@turf/point-to-line-distance@npm:^6.5.0": version: 6.5.0 resolution: "@turf/point-to-line-distance@npm:6.5.0" @@ -6399,6 +6692,25 @@ __metadata: languageName: node linkType: hard +"@turf/point-to-line-distance@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/point-to-line-distance@npm:7.2.0" + dependencies: + "@turf/bearing": "npm:^7.2.0" + "@turf/distance": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@turf/nearest-point-on-line": "npm:^7.2.0" + "@turf/projection": "npm:^7.2.0" + "@turf/rhumb-bearing": "npm:^7.2.0" + "@turf/rhumb-distance": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/2dabee1f300120e9e63e92fa35b621039fbca945cc017f27308eb4ac8c34e48eae43a157d7e1b129643d4678f831c15096e7159f247ace0269ba61695226317b + languageName: node + linkType: hard + "@turf/polygon-to-line@npm:^6.5.0": version: 6.5.0 resolution: "@turf/polygon-to-line@npm:6.5.0" @@ -6409,6 +6721,18 @@ __metadata: languageName: node linkType: hard +"@turf/polygon-to-line@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/polygon-to-line@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/b840b218e631a252655d233b2c569607d4d3e8d3715a1eab7d26394e4acc1f325b736837d2a82e5c4f678600b2ddc32004782ed3825ca5b1027dce12a4e4cde9 + languageName: node + linkType: hard + "@turf/projection@npm:^6.5.0": version: 6.5.0 resolution: "@turf/projection@npm:6.5.0" @@ -6420,6 +6744,19 @@ __metadata: languageName: node linkType: hard +"@turf/projection@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/projection@npm:7.2.0" + dependencies: + "@turf/clone": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/33893789dc362878e900c476196955e7e23866c70a72d49d1b0705a8a02121f25283580d610bdf627a0909ae016bf3864fac93c51c21a5ecefb7749b2e16221d + languageName: node + linkType: hard + "@turf/rewind@npm:^5.1.5": version: 5.1.5 resolution: "@turf/rewind@npm:5.1.5" @@ -6446,6 +6783,21 @@ __metadata: languageName: node linkType: hard +"@turf/rewind@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/rewind@npm:7.2.0" + dependencies: + "@turf/boolean-clockwise": "npm:^7.2.0" + "@turf/clone": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/9375c4d5d1b94f81da834f0ff0ce0bcb7d05f08dd569c31207c82b43ba458411ba4e1b8fe7a1bd61dad6b415ed19c42626ba8a891d92c16350674e56631250ee + languageName: node + linkType: hard + "@turf/rhumb-bearing@npm:^6.5.0": version: 6.5.0 resolution: "@turf/rhumb-bearing@npm:6.5.0" @@ -6456,6 +6808,18 @@ __metadata: languageName: node linkType: hard +"@turf/rhumb-bearing@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/rhumb-bearing@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/15ac8bbb73201d725e15905aff7ba70f728aa77cb502047d6f06ea61f7ae1deaaa2e99330c03d00cd14440cd0d5cdcb5ddd52b5cb11353f147cb164cd0f75079 + languageName: node + linkType: hard + "@turf/rhumb-destination@npm:^6.5.0": version: 6.5.0 resolution: "@turf/rhumb-destination@npm:6.5.0" @@ -6466,6 +6830,18 @@ __metadata: languageName: node linkType: hard +"@turf/rhumb-destination@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/rhumb-destination@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/e8314190e3f74f398e4557de3bb1cbbb357bcc65dd18436055fd8acf1953827e5542034f8932209ce683c0649259e7f075359c9b68e94d9214e5628716a12949 + languageName: node + linkType: hard + "@turf/rhumb-distance@npm:^6.5.0": version: 6.5.0 resolution: "@turf/rhumb-distance@npm:6.5.0" @@ -6476,6 +6852,18 @@ __metadata: languageName: node linkType: hard +"@turf/rhumb-distance@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/rhumb-distance@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/cdda83914535fdacd4bab56e6016442d49824cbe18d3216ffd114b6bfe5501f3780cbbc25c9bd2c4ddcea7f6b2b207104d60cbb05c518f72633f64a3579a2206 + languageName: node + linkType: hard + "@turf/transform-rotate@npm:^6.5.0": version: 6.5.0 resolution: "@turf/transform-rotate@npm:6.5.0" @@ -6492,6 +6880,24 @@ __metadata: languageName: node linkType: hard +"@turf/transform-rotate@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/transform-rotate@npm:7.2.0" + dependencies: + "@turf/centroid": "npm:^7.2.0" + "@turf/clone": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@turf/rhumb-bearing": "npm:^7.2.0" + "@turf/rhumb-destination": "npm:^7.2.0" + "@turf/rhumb-distance": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/7c9e7f161eb69d3839ac065678c99ef15283d86c05c4af413e71157ee9fb65ac88e31113cc76a78802dbf16c00983e7513051f6d493273a3f58d0067588a49b0 + languageName: node + linkType: hard + "@turf/transform-scale@npm:^6.5.0": version: 6.5.0 resolution: "@turf/transform-scale@npm:6.5.0" @@ -6510,6 +6916,26 @@ __metadata: languageName: node linkType: hard +"@turf/transform-scale@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/transform-scale@npm:7.2.0" + dependencies: + "@turf/bbox": "npm:^7.2.0" + "@turf/center": "npm:^7.2.0" + "@turf/centroid": "npm:^7.2.0" + "@turf/clone": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@turf/rhumb-bearing": "npm:^7.2.0" + "@turf/rhumb-destination": "npm:^7.2.0" + "@turf/rhumb-distance": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/75d607ba16069d0256126a93c8150d9e45720621c093dd6421a1250cb997cf2858b5103ca1d451da5f7fbadaf312ef77fc59240cb10610565f15f924303f800e + languageName: node + linkType: hard + "@turf/transform-translate@npm:^6.5.0": version: 6.5.0 resolution: "@turf/transform-translate@npm:6.5.0" @@ -6523,6 +6949,21 @@ __metadata: languageName: node linkType: hard +"@turf/transform-translate@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/transform-translate@npm:7.2.0" + dependencies: + "@turf/clone": "npm:^7.2.0" + "@turf/helpers": "npm:^7.2.0" + "@turf/invariant": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@turf/rhumb-destination": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + tslib: "npm:^2.8.1" + checksum: 10c0/086f9b66984036b6a4efedd8e91b79e39247447f4e47253352594078d94608dbe537dc6d9aee0b3fb8de6881150752a0a82c68f6efe68ddf84b3821f14ced479 + languageName: node + linkType: hard + "@turf/union@npm:^6.5.0": version: 6.5.0 resolution: "@turf/union@npm:6.5.0" @@ -6534,6 +6975,19 @@ __metadata: languageName: node linkType: hard +"@turf/union@npm:^7.2.0": + version: 7.2.0 + resolution: "@turf/union@npm:7.2.0" + dependencies: + "@turf/helpers": "npm:^7.2.0" + "@turf/meta": "npm:^7.2.0" + "@types/geojson": "npm:^7946.0.10" + polyclip-ts: "npm:^0.16.8" + tslib: "npm:^2.8.1" + checksum: 10c0/fe2984e77147d1dcbd6484fe210ff6087f608de35974ab0b7e5e7ccc2070eab35f500335937d4fc2e759304bb88fa88c7eecb0913c2de6a2157d019c63cbd6a4 + languageName: node + linkType: hard + "@tybys/wasm-util@npm:^0.9.0": version: 0.9.0 resolution: "@tybys/wasm-util@npm:0.9.0" @@ -6702,7 +7156,7 @@ __metadata: languageName: node linkType: hard -"@types/geojson@npm:^7946.0.13": +"@types/geojson@npm:^7946.0.10, @types/geojson@npm:^7946.0.13": version: 7946.0.16 resolution: "@types/geojson@npm:7946.0.16" checksum: 10c0/1ff24a288bd5860b766b073ead337d31d73bdc715e5b50a2cee5cb0af57a1ed02cc04ef295f5fa68dc40fe3e4f104dd31282b2b818a5ba3231bc1001ba084e3c @@ -8620,6 +9074,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:^9.1.0": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 10c0/e17786545433f3110b868725c449fa9625366a6e675cd70eb39b60938d6adbd0158cb4b3ad4f306ce817165d37e63f4aa3098ba4110db1d9a3b9f66abfbaf10d + languageName: node + linkType: hard + "bin-links@npm:^4.0.4": version: 4.0.4 resolution: "bin-links@npm:4.0.4" @@ -16589,6 +17050,13 @@ __metadata: languageName: node linkType: hard +"jsts@npm:2.7.1": + version: 2.7.1 + resolution: "jsts@npm:2.7.1" + checksum: 10c0/57752f181eafef7af3f7e0b374ec0a820288bf0c9dc2d3a854643092331431d6f091a26c7a3947634a92cd64990004f4ddd750b0e95d7f8f6711e1d7bdc8237c + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -19675,6 +20143,25 @@ __metadata: languageName: node linkType: hard +"point-in-polygon-hao@npm:^1.1.0": + version: 1.2.4 + resolution: "point-in-polygon-hao@npm:1.2.4" + dependencies: + robust-predicates: "npm:^3.0.2" + checksum: 10c0/12badef8b15216acdae7d609a8aca1b916d6a9cac2f53ace2928e3b521bee57224489ea8fba41d001c0c05c50e64152c175e3d6583d8cad6fe7af929f082b49a + languageName: node + linkType: hard + +"polyclip-ts@npm:^0.16.8": + version: 0.16.8 + resolution: "polyclip-ts@npm:0.16.8" + dependencies: + bignumber.js: "npm:^9.1.0" + splaytree-ts: "npm:^1.0.2" + checksum: 10c0/8de02c32e566421875c70890fe6d3d7bd55a92fc39867446e65999e042c4632fb27ab1a7e106e96edd12d63b32a643f3a690d9a980aeda655a41ddf4e8750f5d + languageName: node + linkType: hard + "polygon-clipping@npm:^0.15.3": version: 0.15.7 resolution: "polygon-clipping@npm:0.15.7" @@ -22171,6 +22658,13 @@ __metadata: languageName: node linkType: hard +"splaytree-ts@npm:^1.0.2": + version: 1.0.2 + resolution: "splaytree-ts@npm:1.0.2" + checksum: 10c0/4c34573891a749055ffe22381ea841ae03dbf7b55a3ea4a1d7df5013bfbe128e79f6c468579358ec573734cdbdf5f77a97ae7185f155248eb8be58151428c85e + languageName: node + linkType: hard + "splaytree@npm:^3.1.0": version: 3.1.2 resolution: "splaytree@npm:3.1.2" @@ -22811,6 +23305,15 @@ __metadata: languageName: node linkType: hard +"sweepline-intersections@npm:^1.5.0": + version: 1.5.0 + resolution: "sweepline-intersections@npm:1.5.0" + dependencies: + tinyqueue: "npm:^2.0.0" + checksum: 10c0/587a597c75b787e61054ef88b98463af47f60855265b7829fa8acc5ebe68fb4bc3d148a80e9f72c69c16a0241bfed38d3fbbe93a735ea5a2276c00116adc5283 + languageName: node + linkType: hard + "symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" @@ -23150,7 +23653,7 @@ __metadata: languageName: node linkType: hard -"tinyqueue@npm:^2.0.3": +"tinyqueue@npm:^2.0.0, tinyqueue@npm:^2.0.3": version: 2.0.3 resolution: "tinyqueue@npm:2.0.3" checksum: 10c0/d7b590088f015a94a17132fa209c2f2a80c45158259af5474901fdf5932e95ea13ff6f034bcc725a6d5f66d3e5b888b048c310229beb25ad5bebb4f0a635abf2 @@ -23438,6 +23941,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0"