Cesium 计算level

本文介绍如何使用Cesium.js获取地图当前层级及范围,包括获取渲染切片的层级、实现鹰眼功能以及计算当前Extent的方法。适用于需要根据不同地图层级加载不同服务的场景。

TL;DR

前因

因为三维本身大多数情况是一个有倾斜角度的场景,所以存在不同视距加载不同级别瓦片的情况,结合Q1和Q3可以得到官方或者level的方法,当然这里也并不是准确的说法,简单的说就是因为三维场景跟二维场景的差异,造成了在倾斜角会存在不同级别切片的问题,这里可以去看法克鸡丝的文章,而现实存在的问题是我们需要判断不同级别显示不同的服务,比如影像、倾斜摄影、模型以便减轻前端的数据加载量加快显示的速度,让用户看到当前级别的数据。

结果

    // get rendered tiles
    viewer.camera.moveEnd.addEventListener(function() {
   
   
        var tilesToRender = viewer.scene.globe._surface._tilesToRender;
        var level;
        if(tilesToRender.length != 0){
   
   
        	level = tilesToRender[0].level
        }
    });

前言

不知道有没有更好的方法,后续再补充

From

https://stackoverflow.com/questions/33502620/cesium-js-how-to-get-each-tiles-level

Q1 Cesium.js How to get each tiles’ level?

I am trying to get each tiles’ rectangle and level in current view, and use these information to do some ajax request.

Now I have already got all rectangles through:

var tileRecangles = [];
var tilesToRender = viewer.scene.globe._surface.tileProvider._tilesToRenderByTextureCount;
    if (Cesium.defined(tilesToRender)) {
   
   
        for (var j = 0, len = tilesToRender.length; j < len; j++) {
   
   
            var quadTrees = tilesToRender[j];
            if (Cesium.defined(quadTrees)) {
   
   
                for (var i = 0; i < quadTrees.length; i++) {
   
   
                    tileRecangles.push(quadTrees[i].rectangle);
                }
            }
        }
    }

The question is how to get the level for each tiles? The value in red circles of this screenshot
Thanks.

A1
I think it’s just quadTrees[i].level in the same place where you have quadTrees[i].rectangle.

Q2 Cesium随笔:鹰眼功能

https://www.jianshu.com/p/e6f3d171a2d1

A2 有一个同步的层级计算方法

//计算地图缩放等级
import Cesium from 'Cesium';
//启动鹰眼功能
function bindMinimap(cesiumViewer, funcWithCursorPos,windowWidth,windowHeight) {
   
   
    var handler = new Cesium.ScreenSpaceEventHandler(cesiumViewer.scene.canvas);
    handler.setInputAction(function(movement) {
   
   
        let dynamicPosition = undefined;
        let ray = cesiumViewer.camera.getPickRay(movement.endPosition);
        dynamicPosition = cesiumViewer.scene.globe.pick(ray, cesiumViewer.scene);
        let corners=getViewRect(cesiumViewer,cesiumViewer.scene.camera,windowWidth,windowHeight);
        if (Cesium.defined(dynamicPosition)) {
   
   
            
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值