Cesium量算-贴地形距离

查了很多贴地距离计算的,但试了下都测不准,还是自己写一个吧。
找了个地形比较夸张的地方测试了下,贴地距离比直线距离将近多两百米

主要思路:

  1. 起始点转成制图坐标(Cesium.Cartographic),用制图坐标的经纬度做插值,生成一组插值坐标
  2. 通过Cesium.sampleTerrainMostDetailed 获取每个插值在地形表面上的采样点,采样点也是Cesium.Cartographic,但此时是有高度的,正是我们需要的。
  3. 遍历采样点,每两个点计算出一个距离,把这些距离加起来就是总的贴地形距离。可以想象出插值量越大就会越精准,但计算时间会越长。
/*** @description 计算贴地形距离* @param {Cesium.Viewer} viewer* @param {Cesium.Cartesian3} start* @param {Cesium.Cartesian3} end* @returns {number}*/
function getTerrainDistance(viewer, start, end) {return new Promise((resolve) => {//制图坐标插值(不贴附地形)let lerpArray = [];//插值数量,我这里根据两点间直线距离来插,每1米插一下,插的越多越精准let splitNum = parseInt(Cesium.Cartesian3.distance(start, end));let startCartographic = Cesium.Cartographic.fromCartesian(start);let startDegrees = [startCartographic.longitude, startCartographic.latitude];let endCartographic = Cesium.Cartographic.fromCartesian(end);let endDegrees = [endCartographic.longitude, endCartographic.latitude];lerpArray.push(new Cesium.Cartographic(startDegrees[0], startDegrees[1]));for (let i = 1; i <= splitNum - 1; i++) {let x = Cesium.Math.lerp(startDegrees[0], endDegrees[0], i / splitNum);let y = Cesium.Math.lerp(startDegrees[1], endDegrees[1], i / splitNum);lerpArray.push(new Cesium.Cartographic(x, y));}//地形细节采样:传入 目标地形 和 制图坐标插值组(不贴附地形) 获取 贴地形的制图坐标插值组 再计算距离Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, lerpArray).then((cartographicArr) => {getDetailedTerrainDistance(cartographicArr).then((distance) => {resolve(distance);});});});
}/*** @description 根据制图坐标计算距离* @param {Array.<Cesium.Cartographic>} cartographicArr 制图坐标数组* @returns {number} 距离值*/
function getDetailedTerrainDistance(cartographicArr) {return new Promise((resolve) => {let terrainDistance = 0;cartographicArr.map((currentCartographic, index) => {if (index == cartographicArr.length - 1) {return;}let nextCartographic = cartographicArr[index + 1];let currentPosition = Cesium.Cartesian3.fromRadians(currentCartographic.longitude, currentCartographic.latitude, currentCartographic.height);let nextPosition = Cesium.Cartesian3.fromRadians(nextCartographic.longitude, nextCartographic.latitude, nextCartographic.height);terrainDistance += Cesium.Cartesian3.distance(currentPosition, nextPosition);});resolve(terrainDistance);});
}

Cesium量算-贴地形距离相关推荐

  1. 超图Cesium量算

    Cesium.MeasureHandler 提供面积量算.距离量算.高度量算功能. new Cesium.MeasureHandler(viewer, mode) 其中mode值可以为: Cesium ...

  2. Cesium中获取地形三角网并进行土方计算

    三角网获取 Cesium渲染地形时,以 QuadtreePrimitive 管理地形四叉树,四叉树的每一块瓦片用 QuadtreeTile 来实现.因此 QuadtreeTile 中存储了渲染地形所需 ...

  3. 从零开始vue使用cesium开发3d地形terrainProvider(二)

    从零开始vue使用cesium通过nginx发布3d地形数据并展示(续二)_yinzisang的博客-CSDN博客 基本上大型项目都得使用nginx来发布服务(切片数据太大),因为我们这是测试demo ...

  4. Cesium 生成terrain地形数据----CTB方式及步骤

    后记:如果你只是需要将tif处理成terrain,而不是学习处理过程,可以直接使用这个简单的工具:CesiumLab.不需要拼接成一个TIF,也不需要处理No-Data,地形功能免费.如果对你有用,点 ...

  5. cesium 根据经纬度与距离计算另一个经纬度

    /** * * @param {*} lng 经度 122 * @param {*} lat 纬度 24 * @param {*} brng 方位角 0~360度 * @param {*} dist ...

  6. cesium 设置时间_Cesium之地形制作与合并

    前言 我相信使用过Cesium的小伙伴一定不会陌生CesiumLab,将DEM数据导入CesiumLab的地形切片模块工具,设置一下切片参数,喝杯咖啡,等待任务完成,然后发布服务,最后使用API调用服 ...

  7. Cesium之地形(1)

    更新于2017/5/31 Cesium地形简介 Cesium支持多种地形格式和服务,Cesium的母公司AGI提供了两份免费使用的地形数据,一个叫"STK World Terrain&quo ...

  8. Cesium开发基础篇 | 02加载地形数据

    Cesium中的地形图层类 前面我们主要学习了cesium内置接口如何操作影像数据,但是在一些应用场景中我们需要操作地形数据,例如模拟逼真的三维场景.与高程相关的一些空间分析和计算等.Cesium提供 ...

  9. Cesium基本使用,包括加载影像,地形,模型等,设置地图样式

    加载球体 1.下载cesium包https://download.csdn.net/download/weixin_39150852/20303629,在html里引入 <link href=& ...

最新文章

  1. 用Python分析了1w场吃鸡数据,原来吃鸡要这么玩!
  2. 机器学习模型越来越大,开发者应该如何部署?
  3. 腾讯云发布智慧能源四大新品,携手合作伙伴共建智慧能源生态圈
  4. centos 6.8安装git_RPM包的卸载与安装,包含依赖包卸载
  5. 查询所有_学会DSUM函数,轻松搞定所有的数据查询与数据求和
  6. ActionItemBadge:在actionbar上显示badge数字提示
  7. CeontOS7安装ansible
  8. C++输入输出流学习笔记
  9. 爬虫scrapy框架安装使用
  10. [转载]未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。
  11. Linux SHELL 命令入门题目(一)
  12. 计算机物联网软件工程,关于计算机物联网的应用分析
  13. Mac电脑查看JDK文档,CHM格式文档阅读
  14. 21天学通C语言-学习笔记(6)
  15. LCD12864(ST7565P)字符汉字显示(STM32F103)
  16. Java中各种读写文件的方法
  17. 远程RPC调用用于js逆向
  18. 使用TIBCO Rendezvous发送hello world,实现监听和发送
  19. 使用 WebSocket 实现一个网页版的聊天室(摸鱼更隐蔽)
  20. HBuilder快捷键整理集合

热门文章

  1. html页面解析 成dom树,将网页解析成dom树的几种方法
  2. yocto(二)——bitbake工作流程
  3. java中的静态是什么?怎么用?
  4. 云原生是什么?细数云原生的5大特征
  5. Android 时间轴的实现
  6. 奇偶页不同页眉页脚设置
  7. IP、网关、端口、网段、子网掩码概念区别
  8. 进程间各种通信方式的C++实现
  9. 【mysql】limit实现分页
  10. error LNK1207:-XXX.pdb”中的 PDB 格式不兼容;请删除并重新生成