From fb39a7bb69cc55d2e1ce61d47e0677aa40540f95 Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Fri, 30 Jan 2026 16:20:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
applications/drone-command/src/utils/cesium/shapeTools/edit/EditEllipseTool.js | 105 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 87 insertions(+), 18 deletions(-)
diff --git a/applications/drone-command/src/views/areaManage/partition/shapeTools/edit/EditEllipseTool.js b/applications/drone-command/src/utils/cesium/shapeTools/edit/EditEllipseTool.js
similarity index 66%
rename from applications/drone-command/src/views/areaManage/partition/shapeTools/edit/EditEllipseTool.js
rename to applications/drone-command/src/utils/cesium/shapeTools/edit/EditEllipseTool.js
index c3b2904..228eae3 100644
--- a/applications/drone-command/src/views/areaManage/partition/shapeTools/edit/EditEllipseTool.js
+++ b/applications/drone-command/src/utils/cesium/shapeTools/edit/EditEllipseTool.js
@@ -24,6 +24,36 @@
lat: point.lat ?? point.latitude,
}))
+const resolveLngLat = point => {
+ if (!point) return null
+ const lng = point.lng ?? point.longitude
+ const lat = point.lat ?? point.latitude
+ if (Number.isFinite(lng) && Number.isFinite(lat)) {
+ return { lng: Number(lng), lat: Number(lat), height: Number(point.height) || 0 }
+ }
+ return null
+}
+
+const resolveCartesian = point => {
+ if (!point) return null
+ if (Number.isFinite(point.x) && Number.isFinite(point.y) && Number.isFinite(point.z)) {
+ return new Cesium.Cartesian3(point.x, point.y, point.z)
+ }
+ const lngLat = resolveLngLat(point)
+ if (!lngLat) return null
+ return Cesium.Cartesian3.fromDegrees(lngLat.lng, lngLat.lat, lngLat.height || 0)
+}
+
+const resolveCartographic = point => {
+ if (!point) return null
+ if (Number.isFinite(point.x) && Number.isFinite(point.y) && Number.isFinite(point.z)) {
+ return Cesium.Cartographic.fromCartesian(point)
+ }
+ const lngLat = resolveLngLat(point)
+ if (!lngLat) return null
+ return Cesium.Cartographic.fromDegrees(lngLat.lng, lngLat.lat, lngLat.height || 0)
+}
+
export class EditEllipseTool extends ToolBase {
constructor(viewer, options = {}) {
super(viewer)
@@ -40,22 +70,43 @@
this.style = resolveStyle(options?.style)
}
- start(points = []) {
- const normalized = normalizePoints(points)
- const bounds = getBoundsFromLngLats(normalized)
- const center = getCenterFromBounds(bounds)
- if (!center) return
- this.centerCartesian = Cesium.Cartesian3.fromRadians(center.longitude, center.latitude)
- const eastWest = getMetersBetween(
- new Cesium.Cartographic(bounds.west, center.latitude),
- new Cesium.Cartographic(bounds.east, center.latitude)
- )
- const northSouth = getMetersBetween(
- new Cesium.Cartographic(center.longitude, bounds.south),
- new Cesium.Cartographic(center.longitude, bounds.north)
- )
- this.semiMajor = Math.max(1, eastWest / 2)
- this.semiMinor = Math.max(1, northSouth / 2)
+ start(data = []) {
+ const inputPoints = Array.isArray(data?.points) ? data.points : data
+ const meta = data?.meta || null
+ const metaCenter = resolveCartesian(meta?.center)
+ if (metaCenter) {
+ this.centerCartesian = metaCenter
+ const centerCarto = Cesium.Cartographic.fromCartesian(metaCenter)
+ const majorFromMeta = Number.isFinite(meta?.semiMajor) ? Number(meta.semiMajor) : 0
+ const minorFromMeta = Number.isFinite(meta?.semiMinor) ? Number(meta.semiMinor) : 0
+ const majorPoint = resolveCartographic(meta?.majorPoint)
+ const minorPoint = resolveCartographic(meta?.minorPoint)
+ const majorDistance =
+ majorFromMeta || (majorPoint ? getMetersBetween(centerCarto, majorPoint) : 0)
+ const minorDistance =
+ minorFromMeta || (minorPoint ? getMetersBetween(centerCarto, minorPoint) : 0)
+ if (majorDistance > 0) this.semiMajor = Math.max(1, majorDistance)
+ if (minorDistance > 0) this.semiMinor = Math.max(1, minorDistance)
+ if (this.semiMinor > this.semiMajor) this.semiMinor = this.semiMajor
+ }
+
+ if (!this.centerCartesian || !this.semiMajor || !this.semiMinor) {
+ const normalized = normalizePoints(inputPoints)
+ const bounds = getBoundsFromLngLats(normalized)
+ const center = getCenterFromBounds(bounds)
+ if (!center) return
+ this.centerCartesian = Cesium.Cartesian3.fromRadians(center.longitude, center.latitude)
+ const eastWest = getMetersBetween(
+ new Cesium.Cartographic(bounds.west, center.latitude),
+ new Cesium.Cartographic(bounds.east, center.latitude)
+ )
+ const northSouth = getMetersBetween(
+ new Cesium.Cartographic(center.longitude, bounds.south),
+ new Cesium.Cartographic(center.longitude, bounds.north)
+ )
+ this.semiMajor = Math.max(1, eastWest / 2)
+ this.semiMinor = Math.max(1, northSouth / 2)
+ }
this.dataSource = new Cesium.CustomDataSource('edit-ellipse')
this.viewer.dataSources.add(this.dataSource)
@@ -113,7 +164,16 @@
this.dragType = null
this.enableMapControl()
const positions = buildEllipsePositions(this.centerCartesian, this.semiMajor, this.semiMinor)
- this.notify('getPolygonPositions', positions)
+ this.notify('getPolygonPositions', {
+ positions,
+ meta: {
+ center: this.centerCartesian,
+ majorPoint: this.getAxisPoint(this.semiMajor, 0),
+ minorPoint: this.getAxisPoint(0, this.semiMinor),
+ semiMajor: this.semiMajor,
+ semiMinor: this.semiMinor,
+ },
+ })
}
createEntities() {
@@ -172,7 +232,16 @@
getPositions() {
if (!this.centerCartesian) return []
- return buildEllipsePositions(this.centerCartesian, this.semiMajor, this.semiMinor)
+ return {
+ positions: buildEllipsePositions(this.centerCartesian, this.semiMajor, this.semiMinor),
+ meta: {
+ center: this.centerCartesian,
+ majorPoint: this.getAxisPoint(this.semiMajor, 0),
+ minorPoint: this.getAxisPoint(0, this.semiMinor),
+ semiMajor: this.semiMajor,
+ semiMinor: this.semiMinor,
+ },
+ }
}
getAxisPoint(eastMeters, northMeters) {
--
Gitblit v1.9.3