360SDN.COM

Cesium高度解析及姿态与位置(orientation和position)、版权信息

来源:  2018-07-16 14:05:29    评论:0点击:

Cesium高度解析及姿态与位置(orientation和position)、版权信息
var viewer = new Cesium.Viewer('cesiumContainer', {
    shadows : true
});
//为true时,球体会有高程遮挡效果(在没有地形时候也会有高程遮挡效果)
viewer.scene.globe.depthTestAgainstTerrain = true;

var viewModel = {
    height: 0
};

Cesium.knockout.track(viewModel);
//获取左上角的toolbar
var toolbar = document.getElementById('toolbar');
Cesium.knockout.applyBindings(viewModel, toolbar);
//添加 3D Tiles,url是路径
var tileset = new Cesium.Cesium3DTileset({ url: Cesium.IonResource.fromAssetId(3883) });
//tileset的根已经准备就绪
tileset.readyPromise.then(function(tileset) {
    //在场景添加tileset
    viewer.scene.primitives.add(tileset);
    //zoomTo (target,offset)目标和偏移
    viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0.0, -0.5, tileset.boundingSphere.radius * 2.0));
}).otherwise(function(error) {
    //若没有加载成功,提示错误
    console.log(error);
});

Cesium.knockout.getObservable(viewModel, 'height').subscribe(function(height) {
    height = Number(height);
    if (isNaN(height)) {
        return;
        }
//地理位置
    var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, height);
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});





1.姿态与位置(orientation和position)

Orientation:
若以正北为参照。
Heading:初始方向为正北,正角度为向东旋转,即水平旋转,也叫偏航角
Pitch:正角度为平面之上,负角度为平面之下,即前后旋转,也叫俯仰角

Roll:左右旋转,也叫翻滚角

具体解释:http://blog.csdn.net/yuzhongchun/article/details/22749521

Position:
关于position有多种类型,如SampledPositionProperty类型,是一个含有多个样本点位置的对象,主要用于动态轨迹生成,通过插值算法对轨迹进行插值,其中setInterpolationOptions方法用来设置插值方法与程度,它的某一时间的位置可以用position.getValue()方法获得,参数是朱利安时间


2.实体(Entity)
model:
minimumPixelSize与maximumScale组合可以控制模型远近时候的大小
availability: 代表该实体存在的有效时间,如下所示,
availability : new Cesium.TimeIntervalCollection([new Cesium.TimeInterval({
        start : start,
        stop : stop

    })]),

 

3.图层(viewer.imageryLayers/viewer.scene. imageryLayers)
得到影像图层的集合,将其渲染到球体上,它是一个ImageryLayerCollection类型的,可以通过addImageryProvider()方法(返回值是ImageryLayer类型)进行添加,参数是各个provider(地图渲染引擎)。
viewer.imageryLayers.addImageryProvider(new Cesium.PieMapServerImageryProvider({
       url: '//localhost:8082/service/v1/tile?map=dongsha',
        enablePickFeatures: false

    }));

 

4.大气、光照、雾效等环境特效
光照: scene.globe.enableLighting
雾效:scene.fog.enabled

大气:scene.skyAtmosphere

 

5.相机控制
Scene.ScreenSpaceCameraController:根据鼠标修改相机的方位,在里面可以选择是否禁用鼠标缩放、旋转等功能

关于flyto和setView的方式详见例子camera.html

 

6.时间控制
获取当前时间 var time = viewer.clock.currentTime;
viewer.clock.onTick.addEventListener(function(clock){
//回调函数,时间变化就执行(即使停止时间轴仍然会执行。。。。)
})


JulianDate:代表天文朱利安时间,用的是世界协调时,比北京时间晚8个小时,它有clone方法,可避免时间被修改
var start = Cesium.JulianDate.fromDate(new Date(2015, 2, 25, 16));
var stop = Cesium.JulianDate.addSeconds(start, 360, new Cesium.JulianDate());//360是秒
viewer.clock.startTime = start.clone();
viewer.clock.stopTime = stop.clone();
viewer.clock.currentTime = start.clone();
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;//待研究

viewer.clock.multiplier = 1.0;//倍数

 

7.关于地形
viewer.scene.globe.depthTestAgainstTerrain = true;

为true时,球体会有高程遮挡效果(在没有地形时候也会有高程遮挡效果)。

 

8.模型属性设置
对于加入cesium中的模型,一般用entity。如若修改他们的属性,就可根据这两个类型向下寻找属性,不可修改它的私有属性。

获取单个模型,用entity.getById()

 

9.其他问题

 

①Geocoder地理查询17版本不支持,我用的23版本是可以查的,而且支持中文查询。如果必须用17的话,可以将23版本的BingMapsApi.js和GeocoderViewModel.js替换到17版本的相应位置。


 

贴地线

③去除版权信息

viewer._cesiumWidget._creditContainer.style.display = "none";

 

10.关于地图加载
①图层是都保存在viewer.scene. imageryLayers或viewer.imageryLayers这个数组中。
②图层加载流程:此为加载天地图方法
baseLayer = viewer.imageryLayers.addImageryProvider(
        new Cesium.WebMapTileServiceImageryProvider({
            url:  "http://t0.tianditu.com/cva_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cva&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles",
            layer: "tdtAnnoLayer",
            style: "default",
            format: "image/jpeg",
            tileMatrixSetID: "GoogleMapsCompatible",
            show: false
        }), 1);
以此为例,添加一个wmts服务, 先到viewer.js里面,走addImageryProvider方法,得到this.scene.imageryLayers;再到scene.js里面,得到this.globe.imageryLayers;再到globe.js里面,得到this._imageryLayerCollection;
③图层换级流程(过程太多,只写了一部分,后期继续跟进。。。):

当进行层级切换时,ImageryLayer.prototype. _createTileImagerySkeletons方法中有getLevelWithMaximumTexelSpacing方法,此方法是计算获得level层级。

  ImageryLayer.prototype._requestImagery中执行doRequest()方法,进入渲染引擎的requestImage方法,参数为x,y,level;接着走buildImageUrl方法,里面主要是拼接url,将拼接后的url传入ImageryProvider.loadImage方法中,然后进行加载。接着继续重复执行doRequest()方法。
为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权