forked from drone/command-center-dashboard

罗广辉
2025-04-02 e1699c4851f6ca397cd0ad1ff63f32c737654836
src/utils/cesium/mapUtil.js
@@ -1,5 +1,5 @@
import * as Cesium from 'cesium';
import * as turf from '@turf/turf';
import * as Cesium from 'cesium'
import * as turf from '@turf/turf'
export const getLngLatDistance = (lat1, lng1, lat2, lng2) => {
  const radLat1 = (lat1 * Math.PI) / 180.0
@@ -11,8 +11,8 @@
    Math.asin(
      Math.sqrt(
        Math.pow(Math.sin(a / 2), 2) +
        Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2),
      ),
               Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)
         )
    )
  s = s * 6378.137 // EARTH_RADIUS;
  s = Math.round(s * 10000) / 10000
@@ -20,7 +20,7 @@
}
// 获取限polyline长度
export const getPolylineLength = (entity) => {
export const getPolylineLength = entity => {
  let length = 0
  // 获取Polyline的所有顶点位置
@@ -88,11 +88,7 @@
  // const distance = new Cesium.EllipsoidGeodesic(startCartesianPosition, endCartesianPosition, ellipsoid)
  // return distance
  const { longitude, latitude, height } = end
  const cartographic = Cesium.Cartographic.fromDegrees(
    longitude,
    latitude,
    height,
  )
   const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height)
  const cartesianPosition = ellipsoid.cartographicToCartesian(cartographic)
  const haeHeight = ellipsoid.cartesianToCartographic(cartesianPosition).height
  return haeHeight
@@ -102,10 +98,7 @@
export const cartesian3Convert = (cartesian3Position, viewer) => {
  // 转换为经纬度
  const ellipsoid = viewer.scene.globe.ellipsoid
  const cartographicPosition = Cesium.Cartographic.fromCartesian(
    cartesian3Position,
    ellipsoid,
  )
   const cartographicPosition = Cesium.Cartographic.fromCartesian(cartesian3Position, ellipsoid)
  const longitude = Cesium.Math.toDegrees(cartographicPosition.longitude)
  const latitude = Cesium.Math.toDegrees(cartographicPosition.latitude)
  const height = cartographicPosition.height
@@ -124,10 +117,7 @@
// Cesium Cartesian2 转正常经纬度
export const cartesian2Convert = (position, viewer) => {
  const ellipsoid = viewer.scene.globe.ellipsoid
  const c3Position = viewer.scene.globe.pick(
    viewer.camera.getPickRay(position),
    viewer.scene,
  )
   const c3Position = viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene)
  const c2Postion = ellipsoid.cartesianToCartographic(c3Position)
  const longitude = Cesium.Math.toDegrees(c2Postion.longitude)
  const latitude = Cesium.Math.toDegrees(c2Postion.latitude)
@@ -136,11 +126,7 @@
// 根据经纬度获取距离
export const getLnglatDist = (lng1, lat1, lng2, lat2) => {
  const start = new Cesium.Cartesian3.fromDegrees(
    Number(lng1),
    Number(lat1),
    0,
  )
   const start = new Cesium.Cartesian3.fromDegrees(Number(lng1), Number(lat1), 0)
  const end = new Cesium.Cartesian3.fromDegrees(Number(lng2), Number(lat2), 0)
  return Cesium.Cartesian3.distance(start, end)
}
@@ -150,8 +136,8 @@
 * @param coordinateList {Array<Array<Object>>} [[{lat, lng}]]
 * @return { Object } {lat lng}
 */
export const getCenterPoint = (coordinateList) => {
  coordinateList = coordinateList.map((item) => {
export const getCenterPoint = coordinateList => {
   coordinateList = coordinateList.map(item => {
    const [lng, lat] = item
    return [{ lat, lng }]
  })
@@ -217,9 +203,7 @@
    const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude)
    // 获取地形数据的Promise
    const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [
      cartographic,
    ])
      const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [cartographic])
    // 使用 Cesium.when 处理 Promise
    promise
@@ -255,17 +239,14 @@
    const terrainProvider = viewer?.terrainProvider
    // 创建 Cartographic 对象
    const cartographics = data.map((item) => {
      const cartographics = data.map(item => {
      const [lng, lat] = item?.['Point']?.['coordinates']?.['#text'].split(',')
      return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
    })
    // 获取地形数据的Promise
    const promise = Cesium.sampleTerrainMostDetailed(
      terrainProvider,
      cartographics,
    )
      const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics)
    // 使用 Cesium.when 处理 Promise
    promise
@@ -275,7 +256,8 @@
          const longitude = Cesium.Math.toDegrees(item.longitude)
          const latitude = Cesium.Math.toDegrees(item.latitude)
          let FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height)
               let FinalHeight =
                  Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height)
          if (droneHeight) {
            FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + droneHeight
@@ -316,20 +298,15 @@
    const cesiumSamplePoints = []
    for (let i = 0; i < turfSamplePoints.features.length; i++) {
      const coord = turfSamplePoints.features[i].geometry.coordinates
      cesiumSamplePoints.push(
        Cesium.Cartographic.fromDegrees(coord[0], coord[1]),
      )
         cesiumSamplePoints.push(Cesium.Cartographic.fromDegrees(coord[0], coord[1]))
    }
    // 获取地形数据的Promise
    const promise = Cesium.sampleTerrainMostDetailed(
      terrainProvider,
      cesiumSamplePoints,
    )
      const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cesiumSamplePoints)
    promise
      .then(function (updatedPositions) {
        const newPosition = updatedPositions.map((item) => Number(item.height))
            const newPosition = updatedPositions.map(item => Number(item.height))
        resolve(Math.max(...newPosition))
      })
@@ -340,10 +317,10 @@
}
// 展示当前的高度
export const getWaylineShowHeight = (positions) => {
export const getWaylineShowHeight = positions => {
  const { lng, lat } = getCenterPoint(positions)
  let maxDist = 0
  positions.forEach((item) => {
   positions.forEach(item => {
    const [lng1, lat1] = item
    let pointsDist = getLnglatDist(lng1, lat1, lng, lat)
    if (pointsDist > maxDist) {
@@ -358,7 +335,7 @@
}
// 获取当前面是否有交叉点
export const isIntersection = (coordinates) => {
export const isIntersection = coordinates => {
  const polyDikuai = turf.polygon([coordinates])
  const result = turf.kinks(polyDikuai)
  const resultFeatures = result.features