【无标题】

这段代码定义了一个用于 Cesium 地图的工具函数 getPosition,作用是获取指定三维 Cartesian3 坐标对应的经纬度、经度、最高高程(结合地形 / 模型高程和原始海拔)。以下是详细解析:

函数作用

根据输入的三维空间坐标(Cartesian3),计算该点的经纬度,并取地形 / 模型的实际高程原始海拔中的最大值,最终返回包含经纬度、最高高程的结果。

逐行解析

1. 函数定义
复制代码
export function getPosition(this: Cesium.Viewer, c3: Cesium.Cartesian3): { longitude: number, latitude: number, altitude: number, height: number }
  • this: Cesium.Viewer:指定函数的 this 上下文为 Cesium viewer 实例(地图视图对象)。
  • c3: Cesium.Cartesian3:输入参数,三维空间坐标(Cesium 中表示位置的常用类型)。
  • 返回值:包含经纬度(longitude/latitude)、最高高程(altitude)、预留字段(height)的对象。
2. 将三维坐标转换为地理坐标(弧度)
复制代码
const cartographic = this.scene.globe.ellipsoid.cartesianToCartographic(c3)
  • cartesianToCartographic:将 Cartesian3 三维坐标转换为 Cartographic 地理坐标(包含经度、纬度、海拔,单位为弧度和米)。
  • this.scene.globe.ellipsoid:地球椭球体对象(用于坐标转换的基准)。
3. 将弧度转换为度(经纬度)
复制代码
const longitude = Cesium.Math.toDegrees(cartographic.longitude)
const latitude = Cesium.Math.toDegrees(cartographic.latitude)
  • Cesium.Math.toDegrees:将弧度转换为度(经纬度通常以度为单位展示)。
  • longitude/latitude:最终的经度和纬度(度)。
4. 计算世界坐标与屏幕坐标
复制代码
const worldPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, cartographic.height);
const screenPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(this.scene, worldPosition);
  • fromDegrees:将经纬度和海拔转换回世界坐标(Cartesian3),确保坐标基于原始海拔。
  • wgs84ToWindowCoordinates:将世界坐标转换为屏幕坐标(像素位置),用于后续拾取模型 / 地形表面。
5. 处理屏幕坐标无效的情况
复制代码
if (!screenPosition) {
  return { longitude, latitude, altitude: cartographic.height, height: 0 }
}
  • 如果屏幕坐标获取失败(如点在视野外),直接返回原始海拔作为高程。
6. 拾取模型 / 地形表面的实际高程
复制代码
const modelSurfacePosition = this.scene.pickPosition(screenPosition);
  • pickPosition:根据屏幕坐标拾取场景中模型或地形表面的三维坐标(考虑实际模型高度或地形起伏)。
7. 计算最高高程并返回结果
复制代码
if (modelSurfacePosition) {
  const modelposition = Cesium.Cartographic.fromCartesian(modelSurfacePosition);
  const height = modelposition.height; // 模型/地形表面的实际高程
  return { longitude, latitude, altitude: Math.max(cartographic.height, height), height: 0 }
} else {
  return { longitude, latitude, altitude: cartographic.height, height: 0 }
}
  • 若拾取到模型 / 地形表面坐标,将其转换为地理坐标并提取高程(height)。
  • Math.max(cartographic.height, height):取原始海拔与模型 / 地形高程中的最大值作为最终高程(altitude)。
  • 若未拾取到表面坐标,返回原始海拔。

核心逻辑总结

该函数的核心是融合 "原始坐标海拔" 和 "模型 / 地形实际高程",确保获取的高程是该点的最高值(例如:当点位于建筑物上方时,取建筑物顶部高程而非地面海拔)。

适用场景:需要精确获取地表或模型表面高程的交互(如点击拾取、坐标标注等)。

注意事项

  • pickPosition 依赖场景中的模型或地形数据,若场景中无模型且未加载地形,可能返回 undefined,此时会默认使用原始海拔。

  • 返回值中的 height 字段当前固定为 0,可能是预留用于扩展(如存储相对高度等)。

    export function getPosition(this: Cesium.Viewer, c3: Cesium.Cartesian3): { longitude: number, latitude: number, altitude: number, height: number } {
    const cartographic = this.scene.globe.ellipsoid.cartesianToCartographic(c3)
    const longitude = Cesium.Math.toDegrees(cartographic.longitude)
    const latitude = Cesium.Math.toDegrees(cartographic.latitude)

    复制代码
    const worldPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, cartographic.height);
    const screenPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(
      this.scene,
      worldPosition
    );
    // console.log(longitude, latitude, '海拔', cartographic.height);
    if (!screenPosition) {
      return { longitude, latitude, altitude: cartographic.height, height: 0 }
    }
    const modelSurfacePosition = this.scene.pickPosition(screenPosition);
    if (modelSurfacePosition) {
      const modelposition = Cesium.Cartographic.fromCartesian(modelSurfacePosition);
      const height = modelposition.height;
      return { longitude, latitude, altitude: Math.max(cartographic.height, height), height: 0 }
    } else {
      return { longitude, latitude, altitude: cartographic.height, height: 0 }
    }

    }

获取坐标在地图中所有物体的做高点。可以获取3dtiles模型含高程数据的模型

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄1 天前
JavaScript 隐式全局变量解析
javascript