Cesium量算-贴地形距离
Cesium量算-贴地形距离
查了很多贴地距离计算的,但试了下都测不准,还是自己写一个吧。
找了个地形比较夸张的地方测试了下,贴地距离比直线距离将近多两百米
主要思路:
- 起始点转成制图坐标(Cesium.Cartographic),用制图坐标的经纬度做插值,生成一组插值坐标
- 通过Cesium.sampleTerrainMostDetailed 获取每个插值在地形表面上的采样点,采样点也是Cesium.Cartographic,但此时是有高度的,正是我们需要的。
- 遍历采样点,每两个点计算出一个距离,把这些距离加起来就是总的贴地形距离。可以想象出插值量越大就会越精准,但计算时间会越长。
/*** @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量算-贴地形距离相关推荐
- 超图Cesium量算
Cesium.MeasureHandler 提供面积量算.距离量算.高度量算功能. new Cesium.MeasureHandler(viewer, mode) 其中mode值可以为: Cesium ...
- Cesium中获取地形三角网并进行土方计算
三角网获取 Cesium渲染地形时,以 QuadtreePrimitive 管理地形四叉树,四叉树的每一块瓦片用 QuadtreeTile 来实现.因此 QuadtreeTile 中存储了渲染地形所需 ...
- 从零开始vue使用cesium开发3d地形terrainProvider(二)
从零开始vue使用cesium通过nginx发布3d地形数据并展示(续二)_yinzisang的博客-CSDN博客 基本上大型项目都得使用nginx来发布服务(切片数据太大),因为我们这是测试demo ...
- Cesium 生成terrain地形数据----CTB方式及步骤
后记:如果你只是需要将tif处理成terrain,而不是学习处理过程,可以直接使用这个简单的工具:CesiumLab.不需要拼接成一个TIF,也不需要处理No-Data,地形功能免费.如果对你有用,点 ...
- cesium 根据经纬度与距离计算另一个经纬度
/** * * @param {*} lng 经度 122 * @param {*} lat 纬度 24 * @param {*} brng 方位角 0~360度 * @param {*} dist ...
- cesium 设置时间_Cesium之地形制作与合并
前言 我相信使用过Cesium的小伙伴一定不会陌生CesiumLab,将DEM数据导入CesiumLab的地形切片模块工具,设置一下切片参数,喝杯咖啡,等待任务完成,然后发布服务,最后使用API调用服 ...
- Cesium之地形(1)
更新于2017/5/31 Cesium地形简介 Cesium支持多种地形格式和服务,Cesium的母公司AGI提供了两份免费使用的地形数据,一个叫"STK World Terrain&quo ...
- Cesium开发基础篇 | 02加载地形数据
Cesium中的地形图层类 前面我们主要学习了cesium内置接口如何操作影像数据,但是在一些应用场景中我们需要操作地形数据,例如模拟逼真的三维场景.与高程相关的一些空间分析和计算等.Cesium提供 ...
- Cesium基本使用,包括加载影像,地形,模型等,设置地图样式
加载球体 1.下载cesium包https://download.csdn.net/download/weixin_39150852/20303629,在html里引入 <link href=& ...
最新文章
- 用Python分析了1w场吃鸡数据,原来吃鸡要这么玩!
- 机器学习模型越来越大,开发者应该如何部署?
- 腾讯云发布智慧能源四大新品,携手合作伙伴共建智慧能源生态圈
- centos 6.8安装git_RPM包的卸载与安装,包含依赖包卸载
- 查询所有_学会DSUM函数,轻松搞定所有的数据查询与数据求和
- ActionItemBadge:在actionbar上显示badge数字提示
- CeontOS7安装ansible
- C++输入输出流学习笔记
- 爬虫scrapy框架安装使用
- [转载]未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。
- Linux SHELL 命令入门题目(一)
- 计算机物联网软件工程,关于计算机物联网的应用分析
- Mac电脑查看JDK文档,CHM格式文档阅读
- 21天学通C语言-学习笔记(6)
- LCD12864(ST7565P)字符汉字显示(STM32F103)
- Java中各种读写文件的方法
- 远程RPC调用用于js逆向
- 使用TIBCO Rendezvous发送hello world,实现监听和发送
- 使用 WebSocket 实现一个网页版的聊天室(摸鱼更隐蔽)
- HBuilder快捷键整理集合