diff --git a/packages/screen/src/map/services/createEntityService.js b/packages/screen/src/map/services/createEntityService.js index c5ac8dc..08e8bb0 100644 --- a/packages/screen/src/map/services/createEntityService.js +++ b/packages/screen/src/map/services/createEntityService.js @@ -95,6 +95,86 @@ export function createEntityService(deps) { return id }, + /** + * 添加广告牌(Billboard)实体到地图 + * @param {Object} opts - 配置选项 + * @param {string} [opts.id] - 实体 ID,不提供则自动生成 + * @param {string} [opts.layerId] - 图层 ID,不提供则使用默认图层 + * @param {Array} opts.position - 位置 [经度, 纬度] 或 [经度, 纬度, 高度],高度默认为 0 + * @param {string} opts.image - 图片 URL 或路径 + * @param {number} [opts.width=32] - 图片宽度(像素) + * @param {number} [opts.height=32] - 图片高度(像素) + * @param {boolean} [opts.clampToGround=true] - 是否贴地 + * @param {Cesium.VerticalOrigin} [opts.verticalOrigin] - 垂直对齐方式 + * @param {Array|Cesium.Cartesian2} [opts.pixelOffset] - 像素偏移 [x, y] + * @param {number} [opts.disableDepthTestDistance] - 禁用深度测试的距离 + * @param {Object} [opts.properties] - 自定义属性 + * @returns {Promise} 返回实体 ID + */ + async addBillboard(opts) { + const o = opts || {} + + // 验证必需参数 + if (!Array.isArray(o.position) || o.position.length < 2) { + throw new Error('addBillboard 需要提供 position 参数 [经度, 纬度] 或 [经度, 纬度, 高度]') + } + + const image = o.image || o.icon + if (!image) { + throw new Error('addBillboard 需要提供 image 或 icon 参数') + } + + // 确保 position 包含高度,如果没有则默认为 0 + const position = o.position.length === 2 + ? [o.position[0], o.position[1], 0] + : o.position + + const ds = await this._ensureVectorLayer(o.layerId) + const id = o.id || uid('billboard') + + // 处理像素偏移 + let pixelOffset + if (o.pixelOffset instanceof Cesium.Cartesian2) { + pixelOffset = o.pixelOffset + } else if (Array.isArray(o.pixelOffset)) { + pixelOffset = new Cesium.Cartesian2( + o.pixelOffset[0] || 0, + o.pixelOffset[1] || 0 + ) + } else if (o.pixelOffset && typeof o.pixelOffset === 'object') { + pixelOffset = new Cesium.Cartesian2( + o.pixelOffset.x || 0, + o.pixelOffset.y || 0 + ) + } else { + pixelOffset = new Cesium.Cartesian2(0, 0) + } + + const ent = new Cesium.Entity({ + id, + position: degToCartesian(position), + billboard: { + image, + width: o.width || 32, + height: o.height || 32, + verticalOrigin: o.verticalOrigin || Cesium.VerticalOrigin.BOTTOM, + heightReference: + o.clampToGround === false + ? Cesium.HeightReference.NONE + : Cesium.HeightReference.CLAMP_TO_GROUND, + disableDepthTestDistance: + typeof o.disableDepthTestDistance === 'number' + ? o.disableDepthTestDistance + : Number.POSITIVE_INFINITY, + pixelOffset, + }, + properties: o.properties || {}, + }) + + ds.entities.add(ent) + return id + }, + removeEntity(entityId) { if (!entityId) return false for (const id in store.layers) { diff --git a/packages/screen/src/views/cockpit/api/emergencyForce.js b/packages/screen/src/views/cockpit/api/emergencyForce.js new file mode 100644 index 0000000..5d34c9c --- /dev/null +++ b/packages/screen/src/views/cockpit/api/emergencyForce.js @@ -0,0 +1,65 @@ +/** + * 应急力量相关 API + * @module api/emergencyForce + */ + +import { request } from '@shared/utils/request' + +/** + * 获取应急力量点位列表 + * + * @param {Object} [config={}] - 额外的 axios 配置 + * @param {AbortSignal} [config.signal] - 用于取消请求的信号 + * @param {Object} [config.params] - 查询参数 + * @returns {Promise} 返回应急力量点位数据 + * + * @example + * // 基本用法 + * const data = await fetchEmergencyForceList() + * + * @example + * // 带取消信号 + * const controller = new AbortController() + * const data = await fetchEmergencyForceList({ signal: controller.signal }) + * // 取消请求 + * controller.abort() + */ +export function fetchEmergencyForceList(config = {}) { + return request({ + url: '/snow-ops-platform/xqyjllb/list', + method: 'GET', + ...config + }) +} + +/** + * 根据 rid 获取应急力量详细信息 + * + * @param {string|number} rid - 应急力量记录的唯一标识 + * @param {Object} [config={}] - 额外的 axios 配置 + * @param {AbortSignal} [config.signal] - 用于取消请求的信号 + * @returns {Promise} 返回应急力量详细数据 + * + * @example + * // 基本用法 + * const detail = await fetchEmergencyForceDetail('123') + * + * @example + * // 带取消信号 + * const controller = new AbortController() + * const detail = await fetchEmergencyForceDetail('123', { signal: controller.signal }) + * // 取消请求 + * controller.abort() + */ +export function fetchEmergencyForceDetail(rid, config = {}) { + if (!rid) { + return Promise.reject(new Error('rid 参数不能为空')) + } + + return request({ + url: '/snow-ops-platform/xqyjllb/getById', + method: 'GET', + params: { rid }, + ...config + }) +} diff --git a/packages/screen/src/views/cockpit/assets/img/遮罩层.png b/packages/screen/src/views/cockpit/assets/img/遮罩层.png new file mode 100644 index 0000000..016ffbd Binary files /dev/null and b/packages/screen/src/views/cockpit/assets/img/遮罩层.png differ diff --git a/packages/screen/src/views/cockpit/assets/legendTool/储备中心icon定位.png b/packages/screen/src/views/cockpit/assets/legendTool/储备中心icon定位.png new file mode 100644 index 0000000..8b3b258 Binary files /dev/null and b/packages/screen/src/views/cockpit/assets/legendTool/储备中心icon定位.png differ diff --git a/packages/screen/src/views/cockpit/assets/legendTool/应急中心icon定位.png b/packages/screen/src/views/cockpit/assets/legendTool/应急中心icon定位.png new file mode 100644 index 0000000..cb65a1a Binary files /dev/null and b/packages/screen/src/views/cockpit/assets/legendTool/应急中心icon定位.png differ diff --git a/packages/screen/src/views/cockpit/assets/legendTool/预置点icon定位.png b/packages/screen/src/views/cockpit/assets/legendTool/预置点icon定位.png new file mode 100644 index 0000000..3b51221 Binary files /dev/null and b/packages/screen/src/views/cockpit/assets/legendTool/预置点icon定位.png differ diff --git a/packages/screen/src/views/cockpit/components/CockpitLayout.vue b/packages/screen/src/views/cockpit/components/CockpitLayout.vue index 506bfae..4d518c7 100644 --- a/packages/screen/src/views/cockpit/components/CockpitLayout.vue +++ b/packages/screen/src/views/cockpit/components/CockpitLayout.vue @@ -2,25 +2,52 @@
-
- - -
- -
+ +
-
-
- - + + + + +
+
+ + +
+ + + +
+ + +
+ + + + + +
diff --git a/packages/screen/src/views/cockpit/components/EmergencyForceTooltip.vue b/packages/screen/src/views/cockpit/components/EmergencyForceTooltip.vue new file mode 100644 index 0000000..67e531a --- /dev/null +++ b/packages/screen/src/views/cockpit/components/EmergencyForceTooltip.vue @@ -0,0 +1,296 @@ + + + + + diff --git a/packages/screen/src/views/cockpit/components/MapCenter.vue b/packages/screen/src/views/cockpit/components/MapCenter.vue index 8520dd6..7bd5fe4 100644 --- a/packages/screen/src/views/cockpit/components/MapCenter.vue +++ b/packages/screen/src/views/cockpit/components/MapCenter.vue @@ -5,7 +5,7 @@
-
+