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

  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)

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

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

  1. if(isSeen==false){
  2. if(i>0){
  3. var bhl =height_lerp[i-1];
  4. var bht = height_tile[i-1];
  5. var ht =height_tile[i];
  6. var hl = height_lerp[i];
  7. if((bhl-bht)>=0){
  8. if((hl-ht)<0){
  9. //先找到 先真后假 为入点
  10. var obj ={'points':[pArray[i-1],pArray[i]],'index':i,type:'in'}
  11. objArray.push(obj);
  12. };
  13. }
  14. else {
  15. //先假后真 为出点
  16. if((hl-ht)>=0){
  17. var obj ={'points':[pArray[i-1],pArray[i]],'index':i,type:'out'}
  18. objArray.push(obj);
  19. }
  20. };
  21. }
  22. }

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

  1. //在第二点处放置一个label说明一些信息
  2. var entity = viewer.entities.add({
  3. label : {
  4. name: 'tongshifenxi',
  5. show : false,
  6. showBackground : true,
  7. font : '14px monospace',
  8. horizontalOrigin : Cesium.HorizontalOrigin.LEFT,
  9. verticalOrigin : Cesium.VerticalOrigin.BOTTOM,
  10. pixelOffset : new Cesium.Cartesian2(15, -10)
  11. }
  12. });
  13. entity.position = p[1];
  14. entity.label.show = true;
  15. 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));
  16. var length_h = Math.abs(degree2.height-degree1.height);
  17. var length = Math.sqrt(Math.pow(length_ping,2)+Math.pow(length_h,2));
  18. console.log(degree1);
  19. var text =
  20. '起点坐标: ' + (' (' + degree1.longitude)+ '\u00B0' +',' +(degree1.latitude)+ '\u00B0'+',' +degree1.height+')' +
  21. '\n终点坐标: ' + (' (' + degree2.longitude)+ '\u00B0' +',' +(degree2.latitude)+ '\u00B0'+',' +degree2.height+')' +
  22. '\n垂直距离: ' + ' ' + length_h +
  23. '\n水平距离: ' + ' ' + length_ping +
  24. '\n空间距离: ' + ' ' + length +
  25. '\n是否可视: ' + ' ' + '否';
  26. entity.label.text =text;
  1. if(!start){
  2. //从头开始
  3. var index =temp.index;
  4. var model = viewer.entities.add({
  5. name: 'polyline',
  6. polyline: {
  7. positions: Cesium.Cartesian3.fromDegreesArrayHeights([
  8. pArray[0][0],pArray[0][1],pArray[0][2],
  9. pArray[index][0],pArray[index][1],pArray[index][2]
  10. ]),
  11. width: 5,
  12. material: Cesium.Color.RED
  13. }
  14. });
  15. start = index;
  16. }
  17. //起点为start 暂时不会用到如果只是显示可视线段和不可视线段的话
  18. if(start){
  19. console.log(pArray[start][0],pArray[start][1],pArray[start][2],
  20. pArray[num][0],pArray[num][1],pArray[num][2]);
  21. var model = viewer.entities.add({
  22. name: 'polyline',
  23. polyline: {
  24. positions: Cesium.Cartesian3.fromDegreesArrayHeights([
  25. pArray[start][0],pArray[start][1],pArray[start][2],
  26. pArray[num][0],pArray[num][1],pArray[num][2]
  27. ]),
  28. width: 5,
  29. material: Cesium.Color.BLUE
  30. }
  31. });
  32. break;
  33. }

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

基于Cesium三维地图项目记录_通视分析功能的实现的更多相关文章

  1. 《WAP团队》作业四——基于原型的团队项目需求调研与分析

    基于原型的团队项目需求调研与分析 本项目是一个家教系统的实现,随着时代的进步,现今已经进入信息技术时代,越来越多的人注意到了教育的重要性.家长对于孩子的学习提高注意力,大家都不想自己的孩子输在起跑线上 ...

  2. 实验八 《Coderxiaoban团队》团队作业4:基于原型的团队项目需求调研与分析

    实验八 <Coderxiaoban团队>团队作业4:基于原型的团队项目需求调研与分析 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验八 团队作业4:基于 ...

  3. 《BUG创造队》第四次作业:基于原型的团队项目需求调研与分析

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验八 团队作业4:基于原型的团队项目需求调研与分析 团队名称 BUG创造队 作业学习目标 (1)体验以原型设计为基础的团队 ...

  4. [原创.数据可视化系列之二]使用cesium三维地图展示美国全球军事基地分布

    基于浏览器的三维地图还算是一个比较高冷的东西,最主要的技术难点是如何在浏览器上 多快好省 的显示三维数据,很遗憾,还真的没有太好的的方案,只能说还有可行的方案. 很久之前用过skyline,使用CS居 ...

  5. A_Pancers团队作业4—基于原型的团队项目需求调研与分析

    任务1:实施团队项目软件用户调研活动. (1)用户调研对象:我们的项目软件是基于安卓系统的音乐播放器,以设计出操作简单的音乐播放器为目的,所以本次用户调研的对象主要以身边的老人为主,对他们听音乐,听戏 ...

  6. 实验八 <FBG> 基于原型的团队项目需求调研与分析

    <FBG>团队项目原型设计:http://www.cnblogs.com/ymm3/p/9012534.html GitHub的链接地址:https://github.com/FBGfbg ...

  7. 《The One!》团队作业4:基于原型的团队项目需求调研与分析

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)体验以原型设计为基础的团队软件项目需求获取技巧与方法.(2)学习利用UML模 ...

  8. <Dare To Dream> 第四次作业:基于原型的团队项目需求调研与分析

    任务1:实施团队项目软件用户调研活动. (1)真实的用户调研对象:生科院大三学生 (2)利用实验七所开发的软件原型:网站原型链接 (3)要有除原型法之外的其他需求获取手段: 访谈法 开会研讨法 (4) ...

  9. 《Spring_four》团队作业4—基于原型的团队项目需求调研与分析

    (一)需求规格说明书github地址:https://github.com/gzyt/SRS (二)原型链接:http://www.cnblogs.com/lztxh/p/9011873.html ( ...

随机推荐

  1. TCP/IP读书笔记(4) IPv4和IPv6 路由选择

    TCP/IP读书笔记(4) IPv4和IPv6 路由选择 网络层是位于链路层之上,TCP/IP模型中网络层的核心协议是IP协议(Internet protocol). 目前主流的IP协议是IPv4(I ...

  2. 浏览器兼容的JS写法总结

    一.元素查找问题 1. document.all[name]   (1)现有问题:Firefox不支持document.all[name]   (2)解决方法:使用getElementsByName( ...

  3. Visual Studio Code搭建python开发环境

    开发Python的环境有很多,原来已经在vs2013上面搭建好python的开发环境了,但是vs2013每次启动都占太多内存(太强大了吧),这下出了vs code,既轻量又酷炫,正好拿来试一试开发py ...

  4. 讨论MMU

    MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制 ...

  5. cookie、session和java过滤器

    基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一 ...

  6. linux内核initrd文件自定义方法

    linux内核initrd文件自定义方法 重新编译内核后,可能加入了自定义的模块,就有可能需要修改init文件,而init文件就在initrd中,这里记录下操作步骤,以防遗忘. 1.  cp  /bo ...

  7. RFM模型及R语言实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 一.基本概念 根据美国数据库营销研究所Arth ...

  8. stm32开发之串口的调试

    总的函数如下 void USART1Configuration(void){    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Peri ...

  9. HTML中的select下拉框内容显示不全的解决办法

    HTML中的select下拉框内容显示不全的解决办法 今天,我遇到这样一个问题:查询栏中的下拉框中的内容过长,导致部分被覆盖了. 查询了一些资料,有的说用函数控制,有的说用事件控制,有的看不懂,有的实 ...

  10. Vue2.0结合webuploader实现文件分片上传

    Vue项目中遇到了大文件分片上传的问题,之前用过webuploader,索性就把Vue2.0与webuploader结合起来使用,封装了一个vue的上传组件,使用起来也比较舒爽. 上传就上传吧,为什么 ...