Cesium通视分析

tip:利用两点间的插值计算,点A到点B之间,直线距离的高度是否大于地形高度为依据判断是否通视。

  • 1、3Dtiles 的通视
const startPoint = car3ToLatLon(points[0]);
const endPoint = car3ToLatLon(points[1]);
// const h_asc = (startPoint.height >= endPoint.height) ? false : true; //两个点 哪个点高
const pointSum = this.pointsNum
let cartesians = new Array(pointSum), offset;
for (let i = 0; i < pointSum; ++i) {offset = i / (pointSum - 1)cartesians[i] = Cesium.Cartesian3.lerp(points[0], points[1], offset, new Cesium.Cartesian3())
}
const cartesians_clone = cartesians.map(d => d.clone())
//启动异步 Scene#clampToHeight查询3Dtitle下的位置信息高度等。
this.viewer.scene.clampToHeightMostDetailed(cartesians).then((clampedCartesians: Cesium.Cartesian3[])=> {// 可视终点let line_s_index = 0, position_updated:any,p_update_degree, p_degree, heightArr = [], entityHeightArr = []const length = clampedCartesians.length-1for (let i = 1; i < length; i++) {const position_updated = clampedCartesians[i];p_update_degree = car3ToLatLon(position_updated)p_degree = car3ToLatLon(cartesians_clone[i])heightArr.push(p_degree.height)entityHeightArr.push(p_update_degree.height)}this.heightArr = heightArrthis.entityHeightArr = entityHeightArrfor (let i = 1; i < length; i++) {position_updated = clampedCartesians[i];// 会有找不到的情况if(!line_s_index && position_updated) {p_update_degree = car3ToLatLon(position_updated)p_degree = car3ToLatLon(cartesians_clone[i])if (p_update_degree.height > p_degree.height) {line_s_index = i;break;}}}let line_e_index = line_s_index;if (callback) {this.isTrue = !!line_s_indexconst labelText = `起点坐标:${startPoint.lon.toFixed(2)} | ${startPoint.lat.toFixed(2)}| ${startPoint.height.toFixed()}\n终点坐标:${endPoint.lon.toFixed(2)} | ${endPoint.lat.toFixed(2)}| ${endPoint.height.toFixed()}\n通视结果: ${line_s_index > 0 ? '否' : '是'}`callback({'line_s_end': cartesians_clone[line_s_index],'line_e_start': cartesians_clone[line_e_index],'labelResult': labelText})}
})


可以看到直线上每一个点的高度都比3D tiles上的高度高,顾能够看到。

2、基于DEM通视

tip:同理,比较地形上的高度,与线段上的高度。

// 获取经纬度const startPoint = car3ToLatLon(points[0]);const endPoint = car3ToLatLon(points[1]);// const h_asc = (startPoint.height >= endPoint.height) ? false : true; //两个点 哪个点高const pointSum = this.pointsNumlet pts:[number,number,number][] = []let cartesians = new Array(pointSum);let offset, x, y, height;for (let i = 0; i< pointSum; ++i) {offset = i / (pointSum - 1)x = Cesium.Math.lerp(startPoint.lon, endPoint.lon, offset)y = Cesium.Math.lerp(startPoint.lat, endPoint.lat, offset)height = Cesium.Math.lerp(startPoint.height, endPoint.height, offset)pts.push([x, y, height])//使用提供的笛卡尔坐标计算t处的线性插值或外推(开始点,结束点,插值多少,存储在哪)cartesians[i] = Cesium.Cartesian3.lerp(points[0], points[1], offset, new Cesium.Cartesian3())}const cartesians_clone = cartesians.map(d => d.clone())const terrainProvider = Cesium.createWorldTerrain() //加载高程地址 可以是自定义的const positions = pts.map(d=> Cesium.Cartographic.fromDegrees(...d))//根据地形算某经纬点的高度//查询完成后,可解析为提供的位置列表的承诺。这个 如果地形提供商的`availability`属性未定义,则promise将拒绝const promise:any = Cesium.sampleTerrainMostDetailed(terrainProvider, positions);(<any>Cesium).when(promise, (updatedPositions: any)=> {//可视终点let line_s_index = 0, position_updated = null, heightArr:number[] = [], entityHeightArr = [];const length = updatedPositions.length-1for (let i = 1; i < length; i++) {const position_updated = updatedPositions[i]entityHeightArr.push( position_updated.height)heightArr.push(pts[i][2])}this.heightArr = heightArrthis.entityHeightArr = entityHeightArrfor (let i = 1; i < length; i++) {position_updated = updatedPositions[i]if(!line_s_index && position_updated && position_updated.height > pts[i][2]) {line_s_index = ibreak;}}let line_e_index = line_s_index;if (callback) {this.isTrue = !!line_s_indexconst labelText = `起点坐标:${startPoint.lon.toFixed(2)} | ${startPoint.lat.toFixed(2)}| ${startPoint.height.toFixed()}\n终点坐标:${endPoint.lon.toFixed(2)} | ${endPoint.lat.toFixed(2)}| ${endPoint.height.toFixed()}\n通视结果: ${line_s_index > 0 ? '否' : '是'}`callback({'line_s_end': cartesians_clone[line_s_index],'line_e_start': cartesians_clone[line_e_index],'labelResult': labelText})}})


  • 当然插值越多,计算出来的结果就越接近准确值。

Cesium针对DEM和3Dtiles通视分析(两个点之间是否能看见)相关推荐

  1. 【python量化】如何分析两段时间序列之间的相关性

    作者:Andrew Chung 公众号:WealthQuant 链接: https://www.zhihu.com/question/23525783/answer/956912446 已获得作者授权 ...

  2. 典型相关分析如何分析两组变量的关系

    前言 我们在分析两组变量之间的相关性时,比如X=[X1,X2,...,Xm]X=[X_1,X_2,...,X_m]和Y=[Y1,Y2,...,Yn]Y=[Y_1,Y_2,...,Y_n],最原始的方法 ...

  3. 基于Cesium的通视分析的实现

    基于Cesium三维地图项目记录_通视分析功能的实现## 实现了剖面分析功能之后,下面来看看如何实现通视分析,还是基本按照之前的思路实现: 了解软件LocaScape是怎么实现的: 网址如下:http ...

  4. Cesium空间分析、Cesium通视分析

    Cesium空间分析.Cesium通视分析 实现效果 关键代码 实现效果 直线通视分析 圆形通视分析 关键代码 //开始分析startnalysis() {// 计算射线的方向,目标点left 视域点 ...

  5. Cesium通视分析

    通视分析是什么呢?就是将起点和终点连成一条线,判断这条线与场景之间是否有交点,如果有交点,就返回第一个交点,起点--交点创建绿polyline实体,交点--终点创建红色实体,绿线为可视区域,红线为不可 ...

  6. [cesium] 三维空间分析模块,基础的通视分析,坡度分析,淹没分析,视域分析等

    效果 通视分析 环视分析 (基于碰撞点) 坡度分析 基于地形 淹没分析 基于polygon拔高 视域分析 挖地分析 方量分析 以及测控过境分析等, 代码示例,后面重构过 /*** 通视分析*/ imp ...

  7. Cesium空间分析-通视分析

    进入正题,前段时间做了一个通视分析的功能. 功能很简单:给定"观察点"与"目标点",判断两点之间是否有"阻碍点",并能够计算出阻碍点.效果如 ...

  8. 360视域分析 cesium_Cesium-空间分析之通视分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  9. GIS—DEM与数字地形分析

    DEM:在数学中定义为二维空间的连续函数:H=f(x,y).对点的高程取样然后用矩阵表示.等间距连续的采样可能会错失很多重要的地形特征点. 优点:数据结构简单:便于在GIS环境下处理与显示. 缺点:数 ...

最新文章

  1. iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序
  2. ASIO协程彻底转变你的思维
  3. 利用 Arthas 精准定位 Java 应用 CPU 负载过高问题
  4. 百度关键词排名查询源码_章丘百度霸屏总部,关键词排名腾沃云
  5. 1 数列分块入门_怎样用通俗易懂的语言让小学 OIer 理解并能初步运用线段树?...
  6. 北京创客空间_世界上最大的创客空间,可增强开放安全性等
  7. react-native ios打包和Android打包
  8. 汇编指令中英文释义 ASCII码字符表
  9. C#的Access数据库的连接类
  10. 使用Alize等工具构建说话人识别平台
  11. 初识大数据 小孩子都懂的大数据
  12. windows系统自带cmd命令下载文件(类似linux的wget下载文件)
  13. BackTrack5(BT5)安装教程及BT5支持网卡列表
  14. Win10 CMD命令大全
  15. 全局快门和卷帘快门的区别
  16. 用javascript制作简易的QQ登录网页
  17. 《梁宁·产品思维30讲》
  18. 难以置信!一篇文章就梳理清楚了 Python OpenCV 的知识体系
  19. hapi_带有节点和Hapi后端的Angular文件上传
  20. 用户输入一个列表和两个整数作为下标,然后使用切片获取并输出列表中结余两个下标之间的元素组成的子列表。例如,用户输入 [1,2,3,4,5,6]和2,5,程序输出[3,4,5]。

热门文章

  1. 卷积的拉普拉斯变换等于拉普拉斯变换的乘积
  2. vivo手机mitmproxy安全证书安装
  3. 安卓wifi测速android,WiFi测速管家
  4. 华为v5服务器安装2012系统,裸金属服务器安装v5
  5. 数据营销“教父”宋星十年倾心之作,让数据真正赋能企业
  6. C++ 模板中的类型获取(一)
  7. win10如何截屏_win10使用技巧分享!
  8. Android Apk瘦身方案1——R.java文件常量内联
  9. C语言求1到100的和(for循环语句)
  10. QtCreator编译错误: -1: error: [debug/main.o] Error 1 问题的解决办法