Cesium作為一個開源的WebGlobe解決方案已經很牛了,不過因為開發的資料不多,很多功能不知道怎么實現。下面記錄下自己獲取Cesium當前場景范圍的方法(2維中對應的是extent)。
extent其實對我們有用的也就是左上角和右下角坐標,於是首先應該想辦法實現的是獲取場景左上角和右下角的經緯度坐標。
接下來說下point1和point2獲取方法。
我沒有發現Cesium有直接獲取范圍的方法,不過根據經驗,場景范圍在三維中應該從Camera來獲取,Cesium倒是有個獲取Camera范圍的方法,就是獲取up和right的坐標,但是獲取出來的結果不是經緯度,使用cameraToWorldCoordinatesPoint也無法轉換成需要用的數據,於是放棄。
后來看到了getPickRay這個方法,官方解釋是Create a ray from the camera position through the pixel at windowPosition
in world coordinates.大體意思是能夠通過屏幕坐標轉換成經緯度坐標。屏幕坐標的話,我們可以通過div位置來獲取,這樣屏幕的左上角坐標和右下角坐標是可以很容易獲取到的。
以下是獲取point1和point2的詳細代碼:
var pt1 = new Cesium.Cartesian2(0,0); var pt2= new Cesium.Cartesian2(500,500); var pick1= viewer.scene.globe.pick(viewer.camera.getPickRay(pt1), viewer.scene); var pick2= viewer.scene.globe.pick(viewer.camera.getPickRay(pt2), viewer.scene); //將三維坐標轉成地理坐標 var geoPt1= viewer.scene.globe.ellipsoid.cartesianToCartographic(pick1); var geoPt2= viewer.scene.globe.ellipsoid.cartesianToCartographic(pick2); //地理坐標轉換為經緯度坐標 var point1=[geoPt1.longitude / Math.PI * 180,geoPt1.latitude / Math.PI * 180]; var point2=[geoPt2.longitude / Math.PI * 180,geoPt2.latitude / Math.PI * 180];
以上是只是個人工作學習中記錄下的一些過程,如果有更好的實現方案,請各位留言指教O(∩_∩)O~