吉安感知网项目-前端
shuishen
2026-02-03 89380e6260a75d1d3b94de687ebcc2f50d50659d
packages/utils/map/index.js
@@ -1,24 +1,6 @@
import * as Cesium from 'cesium'
// 获取正射影像4至点
export function getOrthoImageBoundaryPoints (data) {
   const arr = JSON.parse(data)
   if (arr.length !== 4) return undefined
   const west = Math.min(arr[0], arr[2])
   const east = Math.max(arr[0], arr[2])
   const south = Math.min(arr[1], arr[3])
   const north = Math.max(arr[1], arr[3])
   return Cesium.Rectangle.fromDegrees(
      west,
      south,
      east,
      north
   )
}
import { MapTooltip } from './MapTooltip'
import { DrawPolygon } from './DrawPolygon'
/**
 * 飞到中心点并且所有点在可视范围
 *  @param positionsData 二维数组,每项为 [lon, lat] 或 三维数组 [lon, lat, height]
@@ -26,7 +8,7 @@
 *  @param multiple 缩放倍数-默认为4
 *  @param pitch 俯仰角-默认为-90
 */
export function flyVisual({ positionsData, viewer, multiple = 4, pitch = -90 }) {
function flyVisual({ positionsData, viewer, multiple = 4, pitch = -90 }) {
   if (!Array.isArray(positionsData) || positionsData.length === 0) return
   // 如果是一个点,加两个点方便后续生成外包围盒
@@ -79,3 +61,47 @@
      },
   })
}
// 批量获取点数组经纬度对应高度信息
const getPointPositionsHeight = (data, viewer, droneHeight = null) => {
   return new Promise((resolve, reject) => {
      if (!data || !data.length) {
         resolve([])
         return
      }
      // 假设 viewer 已经初始化并且 terrainProvider 是有效的
      const terrainProvider = viewer?.terrainProvider
      // 创建 Cartographic 对象
      const cartographics = data.map(item => {
         const { lng, lat } = item
         return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
      })
      // 获取地形数据的Promise
      const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics)
      // 使用 Cesium.when 处理 Promise
      promise
         .then(function (updatedPositions) {
            //  是一个数组,包含更新后的 Cartographic 对象
            const newPosition = updatedPositions.map((item, index) => {
               const longitude = Cesium.Math.toDegrees(item.longitude)
               const latitude = Cesium.Math.toDegrees(item.latitude)
               let pointData = {
                  ...data[index],
                  longitude,
                  latitude,
                  ASL: Number(item.height),
                  customHeight: Number(item.height),
               }
               if (droneHeight) pointData.TH = Number(item.height) + Number(droneHeight)
               return pointData
            })
            resolve(newPosition)
         })
         .catch(function (error) {
            console.log('获取高程时发生错误:', error)
            resolve(data.map(item => ({ ...item, ASL: 0, customHeight: 0, longitude: item.lng, latitude: item.lat })))
         })
   })
}
export { MapTooltip, flyVisual, getPointPositionsHeight, DrawPolygon }