三维地球Cesium.js的研究

好久没写东西了,刚刚前段时间有个业务需求是要用到cesium,百度了很多文章,总算实现了想要的效果,先记录了一下,以备后用。
先上图:
在这里插入图片描述
如上图所示,就是需要实现的效果。
一、下载cesium
这一点就不多说了,这里给出下载链接:cesium
二、关于ysc
ysc其实我也不太熟悉,但它却是是一个不错的东西,因为我需要的效果刚好在这里面有例子,只不过我改造了一下(其实就是加了点鼠标事件代码)。
ysc网站
三、开始
首先需要引入一些必要的js文件,如下

<script type="text/javascript" src="Build/Cesium/Cesium.js"></script>
<script type="text/javascript" src="ysc/ysc.js"></script>
<script type="text/javascript" src="echart/echarts.min.js"></script>

对了,这里用到了echarts,因为地图上的色块就是用echarts做的。
一些必要的样式:

<style type="text/css">
		@import url(Build/Cesium/Widgets/widgets.css);
        body{
            position: relative;
        }
	      html, body, #cesiumContainer {
	          width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
	      }
       #cesiumContainer,#bubble1{
            position: absolute;
       }
       .bubble{
        background-color: rgba(0,0,0,.3);
        top:0;left:82%;
        display:flex;
        flex-direction: column;
        width: auto;
        padding: 10px;
        visibility: hidden;
        border-radius: 4px;
       }
       #tableContainer{
        display:flex;
        flex-direction: column;
        height:auto
       }
	</style>

接下来就是“干货”了!

  • cesium的基础配置
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIzMWU5ZmI1Ny0wNTkwLTRmYjktYjdhMy03MWFhYTQ5ODgzYjgiLCJpZCI6MTI4MDYsInNjb3BlcyI6WyJhc3IiLCJnYyJdLCJpYXQiOjE1NjE5Njc4ODZ9.zsl7Ko6RFIvpvphyPMcCzqlMbNOw4ipOXOfkFMKsKTw';
var data = [];//这里是需要展示数据,就不在这里给出了
var scene = viewer.scene;
//隐藏版本信息
viewer._cesiumWidget._creditContainer.style.display="none";
var promise = Cesium.GeoJsonDataSource.load('chongqing2.json');
promise.then(function(dataSource){
    viewer.dataSources.add(dataSource);
    var entities = dataSource.entities.values;
    var colorHash = {};
    for (var i = 0; i < entities.length; i++) {
        var entity = entities[i];
        var name = entity.name;
        var color = colorHash[name];
        if (!color) {
            color = Cesium.Color.fromRandom({
                alpha:0.5
            });
            colorHash[name] = color;
        }
        entity.polygon.material = color;
        entity.polygon.outline = false;
        entity.polygon.extrudedHeight = Math.random()*10000.0;
        for (var j = 0; j < data.length; j++) {
            if (name == data[j]['name']) {
                entity.data = data[j];
            }
        }
    }
});
option = {
            title: {
                text: '',
                subtext: '',
                left: 'center'
            },
            GLMap: {},
            tooltip: {
                trigger: 'item',
                formatter : function(params) {
                  var result = '';
                  result += '<span style="font-size:16px;font-weight:bold;">'+ params.name +'</span><br/>';
                  result += '林业用地:' + params.data.land + "万公顷" + '<br/>';
                  result += '森林面积:' + params.data.area + "万公顷" + '<br/>';
                  result += '森林覆盖率:' + params.data.coverage + "%" + '<br/>';
                  result += '活力木蓄积:' + params.data.accumulate + "万立方米" + '<br/>';
                  result += '森林公园:' + params.data.park + "个" + '<br/>';
                  result += '自然保护区:' + params.data.reserve + "个";
                  return result;
                }
            },
            series: [
                {
                    name: '重庆市地图',
                    type: 'map',
                    mapType: '重庆', // 自定义扩展图表类型
                    itemStyle:{
                        normal:{borderColor: 'white',label:{show:false}},
                        emphasis:{label:{show:true}}
                    },
                }
            ]
        }

以上就是基础的一些设置。
关键代码在这里:

ysc.echartsCombineCesium(viewer,option);

上面的代码的作用就是将cesium和echarts结合起来。
下面是真正的应用,也就是鼠标移动到目标区域后,弹出一个信息框,就是刚开始的效果图。
我也不细说了,直接上代码

ysc.mouseMove(viewer,function(e,obj){
            if (obj == undefined) {
                $("#bubble1").hide();
                viewer.entities.removeAll();
                return;
            }
            $("#bubble1").show();
            viewer.entities.removeAll();
            var position = scene.pickPosition(e.endPosition); //单击位置
            var positionObj = scene.pick(e.endPosition);//选中的对象
            //将笛卡尔坐标转化为经纬度坐标
            var cartographic = Cesium.Cartographic.fromCartesian(positionObj);
            var longitude = Cesium.Math.toDegrees(cartographic.longitude);
            var latitude = Cesium.Math.toDegrees(cartographic.latitude);
            var height = cartographic.height;
			//这一块就是信息框上展示的数据
            var name = obj.id.data.name;
            var land = obj.id.data.land;
            var area = obj.id.data.area;
            var coverage = obj.id.data.coverage;
            var accumulate = obj.id.data.accumulate;
            var park = obj.id.data.park;
            var reserve = obj.id.data.reserve;

 			//这的大致作用是计算信息框的位置
            var cartesian = scene.globe.pick(camera.getPickRay(e.endPosition), scene);
            var cartographic = scene.globe.ellipsoid.cartesianToCartographic(cartesian);
            var picks = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, cartesian);
            var bubble = document.getElementById("bubble1");
           //设置弹出框位置
            bubble.style.left = e.endPosition.x-70+"px";             
            var divheight = bubble.offsetHeight;
            var divy = e.endPosition.y - divheight -50;//50px为.bubble:after--20x50
            bubble.style.top = divy + "px";            
            bubble.style.visibility = "visible"; //visibility: "hidden" 
            
            _position = e.endPosition;
            _cartesian = cartesian;
            _pm_position = { x: picks.x, y: picks.y }
            //渲染处信息框
            var en = viewer.entities.add(new Cesium.Entity({
                id:obj.id._id,
                name: "位置信息",
                billboard: {
                    image: 'images/location4.png',
                    width: 30,
                    height: 40,
                },
                description: createDescription(Cesium, table,name, [land, area,coverage,accumulate,park,reserve])
            }));
        });

信息框出来后还要随着鼠标的移动跟着移动,代码如下:

/***
       * 弹出框随漫游移动
        */
        var _pm_position_2;
        //每帧渲染结束监听
        viewer.scene.postRender.addEventListener(function (e) {
 
            if (_pm_position != _pm_position_2) {
                _pm_position_2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, _cartesian);
                var popw = document.getElementById("bubble1").offsetWidth;
                var poph = document.getElementById("bubble1").offsetHeight;
 
                var trackPopUpContent_ = window.document.getElementById("bubble1");
                //trackPopUpContent_.style.visibility = "visible";
                trackPopUpContent_.style.left = _pm_position_2.x-70+"px";
                trackPopUpContent_.style.top = _pm_position_2.y - (poph + 50) + "px";
            }
        });


        viewer.flyTo(promise);
        viewer.camera.setView({
            destination : Cesium.Cartesian3.fromDegrees(117.16, 32.71, 15000000.0)
        });

好了,记录到此算是结束了,写得不好,只怪当初语文没学好o(╥﹏╥)o

### 回答1: 铯传感器体积例子是指铯原子钟中的长寿命铯原子的体积。铯传感器是一种基于铯原子的气体放电灯原理制作的,用来测量时间和频率的高精度仪器。铯原子钟通过使用微波信号来激发铯原子,将其从基态激发到激发态,然后衰减回到基态时会发出特定的电磁辐射。铯传感器的体积决定了铯原子所占的空间大小,以及铯传感器所能够测量的频率范围。一般来说,铯原子的体积越大,其测量的精度也就越高,但同时体积也越大,使得仪器的制作和操作都更加困难。铯传感器的体积也与其应用领域有关,例如在卫星导航中需要使用小型化的传感器,而在地面实验室中则可以使用更大的铯原子钟。因此,对于不同的应用领域,铯传感器的体积可以有所不同。总体来说,铯传感器体积的具体大小需要考虑到测量精度、制作难度和应用要求等多个方面的因素。 ### 回答2: Cesium Sensor Volumes(铯传感器体积)是指在铯传感器中测得的体积的示例。铯传感器是一种用于测量和监测空间中特定物体的存在和位置的设备,常用于无人机、卫星、雷达等系统中。 铯传感器体积的示例可以是指特定物体或区域的测量结果。例如,一个铯传感器可以测量一辆车的体积,并生成一个数据集,显示该车在三维空间中的准确体积。这对于汽车制造商在生产过程中进行质量控制和尺寸测量非常有用。 另一个示例可以是铯传感器在无人机上使用,用于监测特定区域的体积。传感器可以测量无人机周围的空间,以确定特定区域的大小和形状,例如建筑物、森林或农田。这对于城市规划师、林业管理者和农业专家来说都是非常有用的,可以帮助他们了解和评估各种地理区域的特征和潜在用途。 总之,铯传感器体积的示例可以是具体物体或区域的测量结果,有助于提供关于特定空间对象尺寸和形状的准确数据。这些数据可以应用于各种领域,例如制造、城市规划和自然资源管理,以实现更好的质量控制和有效的决策制定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的灵魂是bug!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值