Supermap/Cesium 開發心得----定位

SuperMap的WebGL是基於開源JS庫Cesium作的修改而造成的產品,理論上用起來大同小異,若是在有不同的地方再看,基本上仍是與Cesium的接口名稱和結構是同樣的。html

定位方法有基於Cesium.Camera類(SuperMap/Cesium),它不須要去單首創建這個,由於他是Cesium.viewer的Member成員之一,直接使用建立好的view容器,使用view.camera就能夠拿到web

也可使用Cesium.Viewer類作定位,方法下文會提到webgl

定位方法一(Camera.setView(_Object))

這個方法是直接定位到該位置, 參數用Obj構造{destination:,orientation:, endTransform}ui

destination

相機在WGS84世界座標系中的最終位置,或是自頂向下視圖中可見的矩形區域。便可以是一個點座標({Cartesian3}格式點座標)或一個四至範圍({Rectangle}格式)spa

Cartesian3格式構造點

有不少方法,我最經常使用的是.net

  • 從弧度轉Cartesian3的Cesium.Cartesian3.fromRadians方法(SuperMap/Cesium)
  • 從WGS-84座標轉Cartesian3的Cesium.Cartesian3.fromDegrees方法(SuperMap/Cesium)
     viewer.camera.setView({ destination:Cesium.Cartesian3.fromDegrees(116.4139265527,39.8865940599,100), orientation:{ pitch: -0.3870743833538963, roll: 0.00004766518822663102, heading:5.71581666483758, } });

Rectangle格式構造四至範圍

有不少方法,我最經常使用的是code

  • 直接構造矩形範圍:new Cesium.Rectangle(west, south, east,north)方法(SuperMap/Cesium),須要注意的是,四個參數的單位是弧度,範圍是[-PI,PI]和[-PI/2,PI/2]
     viewer.camera.setView({
                destination:Cesium.Rectangle(1.9911131841002994,0.6863576116684447,2.0676847898509436, 0.7171078891208857),
                orientation:{
                    pitch: -0.3870743833538963,
                    roll: 0.00004766518822663102,
                    heading:5.71581666483758,
            }
        });
  • 使用WGS-84座標去構造Cesium.Rectangle.fromDegrees(west, south, east, north, result)方法(SuperMap/Cesium),四個參數的範圍是[-180.0, 180.0]和[-90.0, 90.0]

定位方法二(Camera.flyTo(_Object))

Camera.flyTo(_Obj)方法的參數和setView其實差很少,它注重的是飛行體驗,飛往目的地有一個過程,也就是其中的duration參數,它以秒爲單位,表徵飛行持續時間。若是省略,由飛行距離計算合理的持續時間。orm

viewer.camera.flyTo({
    destination : Cesium.Cartesian3.fromDegrees(-122.19, 46.25, 5000.0),
    orientation : {
        heading : Cesium.Math.toRadians(175.0),
        pitch : Cesium.Math.toRadians(-35.0),
        roll : 0.0
    },
    duration:3     //飛行到目的地花費時間3秒
})

定位方法3(Viewer.flyTo(target, options))

在cesium中viewer.flyTo和Camera.flyTo的區別挺大,咱們一般會用camera來定位,但當須要加上一個傾斜角的時候,可能定位的結果就和預想的區別很大server

這個時候,就能夠制定一個目標去,例如定位建立的Entity實體htm

loactionTectEntity = viewer.entities.add({
            name: 'locationRectangle',
            id: 'locationRectangle',
            rectangle: {
                coordinates: Cesium.Rectangle(1.9911131841002994,0.6863576116684447,2.0676847898509436, 0.7171078891208857),
                material: Cesium.Color.GREEN.withAlpha(1.0),
                height: 10.0,
                outline: false
            }
        });
        var flyPromise = viewer.flyTo(loactionTectEntity, {
            duration: 5,
            offset: new Cesium.HeadingPitchRange(0.0, Cesium.Math.toRadians(-20.0))
        });

具體方法能夠參考Cesium中定位方法使用,他寫的很詳細,也很清楚,本文再也不贅述,只作整理

相關文章
相關標籤/搜索