網上目前有兩種獲取當前Camera的四至范圍的方法
方法一 這種方法是最通用的,即使在哥倫布視角(2.5D下依舊能准確獲取值)
function getCurrentExtent() { // 范圍對象 var extent = {}; // 得到當前三維場景 var scene = viewer.scene; // 得到當前三維場景的橢球體 var ellipsoid = scene.globe.ellipsoid; var canvas = scene.canvas; // canvas左上角 var car3_lt = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, 0), ellipsoid); // canvas右下角 var car3_rb = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(canvas.width, canvas.height), ellipsoid); // 當canvas左上角和右下角全部在橢球體上 if (car3_lt && car3_rb) { var carto_lt = ellipsoid.cartesianToCartographic(car3_lt); var carto_rb = ellipsoid.cartesianToCartographic(car3_rb); extent.xmin = Cesium.Math.toDegrees(carto_lt.longitude); extent.ymax = Cesium.Math.toDegrees(carto_lt.latitude); extent.xmax = Cesium.Math.toDegrees(carto_rb.longitude); extent.ymin = Cesium.Math.toDegrees(carto_rb.latitude); } // 當canvas左上角不在但右下角在橢球體上 else if (!car3_lt && car3_rb) { var car3_lt2 = null; var yIndex = 0; do { // 這里每次10像素遞加,一是10像素相差不大,二是為了提高程序運行效率 yIndex <= canvas.height ? yIndex += 10 : canvas.height; car3_lt2 = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(0, yIndex), ellipsoid); } while (!car3_lt2); var carto_lt2 = ellipsoid.cartesianToCartographic(car3_lt2); var carto_rb2 = ellipsoid.cartesianToCartographic(car3_rb); extent.xmin = Cesium.Math.toDegrees(carto_lt2.longitude); extent.ymax = Cesium.Math.toDegrees(carto_lt2.latitude); extent.xmax = Cesium.Math.toDegrees(carto_rb2.longitude); extent.ymin = Cesium.Math.toDegrees(carto_rb2.latitude); } // 獲取高度 extent.height = Math.ceil(viewer.camera.positionCartographic.height); return extent; }
方法二 使用Cesium自帶的方法,但是我使用下來發現,在哥倫布視角下不能獲取值,值是undefined
viewer.camera.computeViewRectangle()