基于Cesium三维地图项目记录_通视分析功能的实现##

实现了剖面分析功能之后,下面来看看如何实现通视分析,还是基本按照之前的思路实现;

  1. 了解软件LocaScape是怎么实现的;
    网址如下:http://www.locaspace.cn/V3.0/help.jsp

从描述中可以看出,用户交互需要点击地形图或者3DTileset模型上的两个点,通过方法获得两点坐标,然后判断这两点(带有高度坐标)间是否可透视;

  1. 解决判断可否透视方法的思路
    1)模拟从A点到B点的一条射线,判断这条射线和地形或者模型是否有相交,如果有则透视,无,则不透视;
    评价:这个方法从思路上是可行的,在Cesium中射线也是可以模拟出来的,不过射线和其他物体的相交检测只限于 规则图形,如平面、直线、球体、椭球体等,无法将射线与地形或模型做相交检测;所以这种思路作罢
    2)对A点和B点之间的这条线做插值求出插值后的点数组,这些点数组的坐标高程与对应相同经纬度坐标处的高程比较可用来判断射线是否相交;
    评价:插值求数组是可行的,高程的比较也可以实现,最终的数据展示也可以通过计算得出,故该方案可行;

  2. 执行方案,完成透视分析
    1)首先根据起终点坐标进行插值,得到插值后的点数组(p[0]、p[1]是起终点坐标笛卡尔积cartesian)

var rad1 = Cesium.Cartographic.fromCartesian(p[0]);
var rad2 = Cesium.Cartographic.fromCartesian(p[1]);
var degree1 = {longitude:rad1.longitude / Math.PI * 180,latitude:rad1.latitude / Math.PI * 180,height:rad1.height};
var degree2 = {longitude:rad2.longitude / Math.PI * 180,latitude:rad2.latitude / Math.PI * 180,height:rad2.height};
for(var i=0;i<num;i++)
{
Cesium.Cartesian3(pl_x[i],pl_y[i],pl_height[i]);
//插值经纬度数组 和 插值高程数组、切片实际高程数组
lon[i]=Cesium.Math.lerp(degree1.longitude,degree2.longitude,0.01*(i+1));
lat[i]=Cesium.Math.lerp(degree1.latitude,degree2.latitude,0.01*(i+1));
height_lerp[i]=degree1.height-(degree1.height-degree2.height)*0.01*(i+1);
}

以上坐标数组存储插值点的经纬度和高程数据;
2)遍历数组,判断插值点高程和模型高程的大小,若模型高程大,则未交叉,否则存在交叉;(模型高程值目前可求出但计算方法效果不好,后期需要改进)同时记录插值点是要相交的点还是已经相交要不相交的点,分别记为入点和出点;专门用objArray数组记录下来;

if(isSeen==false){if(i>0){var bhl =height_lerp[i-1];var bht = height_tile[i-1];var ht =height_tile[i];var hl = height_lerp[i];if((bhl-bht)>=0){if((hl-ht)<0){//先找到 先真后假 为入点 var obj ={'points':[pArray[i-1],pArray[i]],'index':i,type:'in'}objArray.push(obj);};}else {//先假后真 为出点if((hl-ht)>=0){var obj ={'points':[pArray[i-1],pArray[i]],'index':i,type:'out'}objArray.push(obj);}};}
}

3)根据结果在Cesium球体中显示出来,下面代码为不可透视情况下编辑页面展示的代码,第一段表示用label标签显示水平距离、垂直距离、空间距离、起终点坐标信息、是否可视;
第二段代码表示,对于可视的视线线段用红色表示,不可视的视线线段用蓝色表示;

//在第二点处放置一个label说明一些信息
var entity = viewer.entities.add({label : {name: 'tongshifenxi',show : false,showBackground : true,font : '14px monospace',horizontalOrigin : Cesium.HorizontalOrigin.LEFT,verticalOrigin : Cesium.VerticalOrigin.BOTTOM,pixelOffset : new Cesium.Cartesian2(15, -10)}
});
entity.position = p[1];
entity.label.show = true;
var length_ping = Math.sqrt(Math.pow(p[0].x-p[1].x,2)+Math.pow(p[0].y-p[1].y,2)+Math.pow(p[0].z-p[1].z,2));
var length_h = Math.abs(degree2.height-degree1.height);
var length = Math.sqrt(Math.pow(length_ping,2)+Math.pow(length_h,2));
console.log(degree1);
var text ='起点坐标: ' + ('   (' + degree1.longitude)+ '\u00B0' +',' +(degree1.latitude)+ '\u00B0'+',' +degree1.height+')' +'\n终点坐标: ' + ('   (' + degree2.longitude)+ '\u00B0' +',' +(degree2.latitude)+ '\u00B0'+',' +degree2.height+')' +'\n垂直距离: ' + '   ' + length_h +'\n水平距离: ' + '   ' + length_ping +'\n空间距离: ' + '   ' + length +'\n是否可视: ' + '   ' + '否';
entity.label.text =text;
if(!start){//从头开始var index =temp.index;var model = viewer.entities.add({name: 'polyline',polyline: {positions: Cesium.Cartesian3.fromDegreesArrayHeights([                     pArray[0][0],pArray[0][1],pArray[0][2],pArray[index][0],pArray[index][1],pArray[index][2]]),     width: 5,material: Cesium.Color.RED}});start = index;}
//起点为start 暂时不会用到如果只是显示可视线段和不可视线段的话
if(start){console.log(pArray[start][0],pArray[start][1],pArray[start][2],pArray[num][0],pArray[num][1],pArray[num][2]);var model = viewer.entities.add({name: 'polyline',polyline: {positions: Cesium.Cartesian3.fromDegreesArrayHeights([                     pArray[start][0],pArray[start][1],pArray[start][2],pArray[num][0],pArray[num][1],pArray[num][2]]),     width: 5,material: Cesium.Color.BLUE}});break;
}

至此,透视分析的功能就实现啦~

基于Cesium的通视分析的实现相关推荐

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

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

  2. Cesium针对DEM和3Dtiles通视分析(两个点之间是否能看见)

    Cesium通视分析 tip:利用两点间的插值计算,点A到点B之间,直线距离的高度是否大于地形高度为依据判断是否通视. 1.3Dtiles 的通视 const startPoint = car3ToL ...

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

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

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

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

  5. 基于 React hooks + Typescript + Cesium 实现日照分析并封装对应 SunShineAnalysis 类

    文章目录 效果截图 功能介绍 实现思路 实现步骤 封装 SunShineAnalysis 类 使用 其他设置 效果截图 先上截图: 功能介绍 基于 React hooks + Typescript + ...

  6. Cesium通视分析

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

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

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

  8. [cesium] | 视域分析 | 基于cesium的可视域效果

    效果 说明 基于cesium的可视域 有需要的自提 插件地址:传送门 在线访问:传送门2

  9. Cesium可视域分析

    继续开始Cesium的学习之旅. 文章目录 一.简介 二.代码实现 2.1相关参数 2.2实现过程 一.简介 因为也没查到关于可视域分析的明确定义,所以就按自己的话来说一下了.对三维空间而言,可视域分 ...

最新文章

  1. 中国17种稀土有啥军事用途?没它们,美军技术优势将归零
  2. css不换行属性_那些不常见,但却非常实用的 css 属性
  3. K3删除物料时提示“物料在存货表-物料中....”
  4. node和npm版本更新
  5. std::reserve和std::resize的区别
  6. mongodb查询内嵌文档
  7. LeetCode 258. 各位相加
  8. Java运行环境的配置(JDK和JRE)
  9. android ndk 下载安装(ubuntu)
  10. 获取计算机特征码,如何查看计算机特征码
  11. 优秀的博客地址-冰冻三尺非一日之寒
  12. 我的世界如何制作一个空岛服务器,我的世界1.7.10 God 世界空岛服务器
  13. 股票的交易原理是怎样的?
  14. Android12之OpenSL ES基础数据结构总结(十)
  15. 逆向学习路线(推荐书籍)
  16. FFmpeg的HEVC解码器源码简单分析:概述
  17. python蜂鸣器_Micropython之蜂鸣器1
  18. 计算机表格判断是否合格操作,关于一些刚开始接触计算机的基础知识(2)
  19. 理论力学中的 动量定理、动量矩定理、动能定理
  20. http.client.InvalidURL: nonnumeric port: 'yourport' 运行报错 求大神指点。。。。。。实在是不知道怎么弄了

热门文章

  1. 在 CentOS 上安装 CPU 温度监控软件(lm_sensors)
  2. 运行shell脚本报错:“syntax error near unexpected token 的解决方法”
  3. python 读取文本并转换为字典_遇见的python问题--如何将文件里的内容转换成字典类型...
  4. 【深度学习】NLP基础--词向量(从One-hot到Word2Vec)
  5. 三维空间中两直线交点
  6. 租用直播用服务器要注意的几个方面
  7. 关于位截断里面ffff8000的计算
  8. gis信息可视化之一Leaflet组件介绍
  9. AOC 27G2 评测
  10. 我和嵌入式的那些事儿