From c53aab006b9db28e62381dba4fca4d77ec3566b0 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Sat, 17 Jan 2026 15:36:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 applications/drone-command/src/utils/cesium/adminBoundary.js |   88 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/applications/drone-command/src/utils/cesium/adminBoundary.js b/applications/drone-command/src/utils/cesium/adminBoundary.js
new file mode 100644
index 0000000..381dc7d
--- /dev/null
+++ b/applications/drone-command/src/utils/cesium/adminBoundary.js
@@ -0,0 +1,88 @@
+import * as Cesium from 'cesium'
+import jaGeojsonRaw from '@/assets/geojson/ja.geojson?raw'
+
+const DEFAULT_OPTIONS = {
+	strokeColor: '#00F9EC',
+	strokeWidth: 2,
+	fillColor: '#FFFFFF',
+	fillAlpha: 0.05,
+	labelFont: '14px Source Han Sans CN',
+	labelFill: '#FFFFFF',
+	labelOutline: '#18305C',
+	labelOutlineAlpha: 1,
+	zoomTo: true,
+}
+
+export const loadJaAdminBoundary = async (viewer, options = {}) => {
+	if (!viewer) return null
+	const config = { ...DEFAULT_OPTIONS, ...options }
+	const geojson = JSON.parse(jaGeojsonRaw)
+
+	const boundarySource = await Cesium.GeoJsonDataSource.load(geojson, {
+		stroke: Cesium.Color.fromCssColorString(config.strokeColor),
+		strokeWidth: config.strokeWidth,
+		fill: Cesium.Color.fromCssColorString(config.fillColor).withAlpha(config.fillAlpha),
+		clampToGround: true,
+	})
+	viewer.dataSources.add(boundarySource)
+
+	const lineSource = new Cesium.CustomDataSource('jaBoundaryLineSource')
+	boundarySource.entities.values.forEach(entity => {
+		const polygon = entity.polygon
+		if (!polygon) return
+		const hierarchy = polygon.hierarchy?.getValue?.(viewer.clock.currentTime)
+		const positions = hierarchy?.positions
+		if (!positions?.length) return
+		lineSource.entities.add({
+			polyline: {
+				positions,
+				clampToGround: true,
+				width: config.strokeWidth,
+				material: Cesium.Color.fromCssColorString(config.strokeColor),
+			},
+		})
+	})
+	viewer.dataSources.add(lineSource)
+
+	const labelSource = new Cesium.CustomDataSource('jaBoundaryLabelSource')
+	geojson.features?.forEach(feature => {
+		const name = feature?.properties?.name
+		const point = feature?.properties?.centroid || feature?.properties?.center
+		if (!name || !Array.isArray(point) || point.length < 2) return
+		labelSource.entities.add({
+			position: Cesium.Cartesian3.fromDegrees(point[0], point[1]),
+			label: {
+				text: name,
+				font: config.labelFont,
+				fillColor: Cesium.Color.fromCssColorString(config.labelFill),
+				outlineColor: Cesium.Color.fromCssColorString(config.labelOutline).withAlpha(
+					config.labelOutlineAlpha
+				),
+				outlineWidth: 2,
+				style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+				verticalOrigin: Cesium.VerticalOrigin.CENTER,
+				horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+				disableDepthTestDistance: Number.POSITIVE_INFINITY,
+			},
+		})
+	})
+	viewer.dataSources.add(labelSource)
+
+	if (config.zoomTo) {
+		await viewer.flyTo(boundarySource, {
+			duration: 0,
+			offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-75), 0),
+		})
+	}
+
+	return { boundarySource, lineSource, labelSource }
+}
+
+export const removeJaAdminBoundary = (viewer, sources) => {
+	if (!viewer || !sources) return
+	const { boundarySource, lineSource, labelSource } = sources
+	if (boundarySource) viewer.dataSources.remove(boundarySource)
+	if (lineSource) viewer.dataSources.remove(lineSource)
+	if (labelSource) viewer.dataSources.remove(labelSource)
+}

--
Gitblit v1.9.3