Cesium计算近似当前层级(2D地图概念)&&计算当前Extent

Posted hpugisers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cesium计算近似当前层级(2D地图概念)&&计算当前Extent相关的知识,希望对你有一定的参考价值。

下面分享两个计算层级和Extent的代码,废话不多说直接上代码:

一、计算当前Extent(前提一定要有tile图层)

viewer.clock.onTick.addEventListener(function () 
    west = south = 999;
    east = north = -999;
// 获取要渲染切片封装对象,一个切片封装对象有多个切片
    var tilesToRender = viewer.scene.globe._surface.tileProvider._tilesToRenderByTextureCount;

    if (Cesium.defined(tilesToRender)) 
        var numArrays = tilesToRender.length;
        for (var j = 0; j < numArrays; ++j) 
            var quadtrees = tilesToRender[j];
            if (Cesium.defined(quadtrees)) 
                var numTrees = quadtrees.length;
                for (var i = 0; i < numTrees; ++i) 
                    var rectangle = quadtrees[i].rectangle;
                    west = Math.min(west, rectangle.west);
                    south = Math.min(south, rectangle.south);
                    east = Math.max(east, rectangle.east);
                    north = Math.max(north, rectangle.north);
                
            
        
    

二、计算当前层级(来源于stackexchange)

在这里首先说明一个问题,就是cesium加载切片图层的时候,它会混合层级加载,不像二维地图,当前层级都一致(附录代码可以调试查看),通过拉伸镜头对地球的距离,发现拉伸远近与与二维地图有以下 的关系:

 z      altitude (metres)
-----   -----------------
 3          10311040
 4           5932713
 5           2966357
 6           1483178
 7            741589
 8.6          243624
11.35          36310
13.85           6410
15.26           2411
17.01            717
18.27            214
19.6             119
20.77             50
21                44

有了对应关系如何得到通过数据进行拟合曲线,可以用一些软件例如orgin8.0或者spass,这里有一个国外在线模拟函数模拟
整理可得到以下函数:

function altitudeToZoom(altitude) 
    var A = 40487.57;
    var B = 0.00007096758;
    var C = 91610.74;
    var D = -40467.74;

    return D+(A-D)/(1+Math.pow(altitude/C, B));

这样算出来层级不是整数,如果你想要整数可以替换为

Math.round(D +(AD)/(1 + Math.pow(altitude / C,B))

附录代码:

    // cesium initialization
    var viewer = new Cesium.Viewer('cesiumContainer', 
            sceneMode : Cesium.SceneMode.COLUMBUS_VIEW,
            imageryProvider: new Cesium.TileCoordinatesImageryProvider(
                tilingScheme : new Cesium.WebMercatorTilingScheme()
            ),
            baseLayerPicker : false,
            terrainProvider: new Cesium.EllipsoidTerrainProvider(
                tilingScheme : new Cesium.WebMercatorTilingScheme()
            )
        );

    // get rendered tiles
    viewer.camera.moveEnd.addEventListener(function() 
        var tilesToRender = viewer.scene.globe._surface._tilesToRender;
    );

以上是关于Cesium计算近似当前层级(2D地图概念)&&计算当前Extent的主要内容,如果未能解决你的问题,请参考以下文章

Cesium:APP实现存在的问题

Cesium产品体系

cesium学习--初识

Cesium简介以及离线部署运行

cesium编程入门界面介绍及小控件隐藏

cesium czml 3d模型动画