| | |
| | | import { ToolBase } from '../ToolBase' |
| | | |
| | | const POINT_ENTITY_NAME = 'edit-polygon-point' |
| | | const DEFAULT_STYLE = { |
| | | fill: Cesium.Color.fromBytes(45, 140, 240, 99), |
| | | outline: Cesium.Color.fromBytes(45, 140, 240, 255), |
| | | } |
| | | const resolveStyle = style => ({ |
| | | fill: style?.fill || DEFAULT_STYLE.fill, |
| | | outline: style?.outline || DEFAULT_STYLE.outline, |
| | | }) |
| | | |
| | | const normalizePoints = points => |
| | | (points || []).map(point => ({ |
| | |
| | | })) |
| | | |
| | | export class EditPolygonTool extends ToolBase { |
| | | constructor(viewer) { |
| | | constructor(viewer, options = {}) { |
| | | super(viewer) |
| | | this.tooltip = new MapTooltip(viewer) |
| | | this.dataSource = null |
| | |
| | | this.positions = [] |
| | | this.isDragging = false |
| | | this.draggedIndex = -1 |
| | | this.style = resolveStyle(options?.style) |
| | | } |
| | | |
| | | start(points = []) { |
| | |
| | | () => new Cesium.PolygonHierarchy(this.positions), |
| | | false |
| | | ), |
| | | material: Cesium.Color.fromBytes(45, 140, 240, 99), |
| | | material: this.style.fill, |
| | | outline: false, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | show: new Cesium.CallbackProperty(() => this.positions.length >= 3, false), |
| | |
| | | }, false), |
| | | clampToGround: true, |
| | | width: 2, |
| | | material: Cesium.Color.fromBytes(45, 140, 240, 255), |
| | | material: this.style.outline, |
| | | show: new Cesium.CallbackProperty(() => this.positions.length >= 2, false), |
| | | }, |
| | | }) |
| | |
| | | point: { |
| | | pixelSize: 12, |
| | | color: Cesium.Color.WHITE, |
| | | outlineColor: Cesium.Color.fromBytes(45, 140, 240, 255), |
| | | outlineColor: this.style.outline, |
| | | outlineWidth: 2, |
| | | heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, |
| | | disableDepthTestDistance: Number.POSITIVE_INFINITY, |
| | |
| | | return scene.camera.pickEllipsoid(screenPosition, scene.globe.ellipsoid) |
| | | } |
| | | |
| | | setStyle(style) { |
| | | this.style = resolveStyle(style) |
| | | if (this.polygonEntity?.polygon) { |
| | | this.polygonEntity.polygon.material = this.style.fill |
| | | } |
| | | if (this.polylineEntity?.polyline) { |
| | | this.polylineEntity.polyline.material = this.style.outline |
| | | } |
| | | if (this.dataSource) { |
| | | this.dataSource.entities.values |
| | | .filter(entity => entity?.name === POINT_ENTITY_NAME) |
| | | .forEach(entity => { |
| | | if (entity?.point) { |
| | | entity.point.outlineColor = this.style.outline |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | |
| | | disableMapControl() { |
| | | const controller = this.viewer.scene.screenSpaceCameraController |
| | | controller.enableRotate = false |