Cesium入門開發(fā)

一种吸、概述

套用官網(wǎng)的介紹,CesiumJS是一個(gè)開放源代碼JavaScript庫呀非,用于創(chuàng)建具有最佳性能坚俗,精度,視覺質(zhì)量和易用性的世界一流的3D地球和地圖岸裙。

其實(shí)猖败,就是數(shù)據(jù)可視化,Cesium支持2D降允、3D地圖地形渲染恩闻,它也提供了可以托管3D切片內(nèi)容的云平臺(tái),開發(fā)者可以自定義自己的3D數(shù)據(jù)模型數(shù)據(jù)上傳到該平臺(tái)來使用渲染剧董。

二幢尚、使用
  1. 去到官網(wǎng)
QQ截圖20200529104507.jpg
  1. 下載資源
QQ截圖20200529104650.jpg
  1. 資源目錄
QQ截圖20200529105228.jpg
三、簡單代碼使用
  1. 引入資源

我的項(xiàng)目使用了vue框架翅楼,所以在index.html引入js文件尉剩,頁面layer.vue中使用inport引入css樣式文件

    // index.html
    <script src="./static/gispage/Source/Cesium.js"></script>
    
    // layer.vue
    import "./utils/widgets.css"

layer.vue頁面添加一個(gè)div id為cesiumContainer

<div id="cesiumContainer"></div>
  1. js代碼也只需要一行就可以初始化一個(gè)地圖
this.viewer = new Cesium.Viewer('cesiumContainer');

運(yùn)行項(xiàng)目,就可以看到一個(gè)地球呈現(xiàn)

QQ截圖20200529112447.jpg
  1. 接下來就可以修改參數(shù)來呈現(xiàn)自己需要的效果了
this.viewer = new Cesium.Viewer('cesiumContainer', {
    timeline : false, // 是否顯示時(shí)間軸
    scene3DOnly : true, // 設(shè)置為true時(shí)毅臊,將僅以3D渲染每個(gè)幾何體實(shí)例以節(jié)省GPU內(nèi)存理茎。
    animation : false, // 是否創(chuàng)建動(dòng)畫小器件,左下角儀表
    homeButton : false, // 是否顯示Home按鈕
    geocoder : false, // 是否顯示geocoder小器件,右上角查詢按鈕
    navigationHelpButton : false, // 是否顯示右上角的幫助按鈕
    infoBox : false, // 是否顯示信息框
    fullscreenButton : false, // 是否顯示全屏按鈕
    selectionIndicator : false, // 是否顯示選取指示器組件
    sceneMode : Cesium.SceneMode.SCENE3D, // 初始場(chǎng)景模式
    baseLayerPicker : false, // 是否顯示圖層選擇器
    imageryProvider : new Cesium.UrlTemplateImageryProvider({
        url : 'https://yoururl/{z}/{x}/{y}.png', // 加載基礎(chǔ)圖層
        proxy : new Cesium.DefaultProxy('/proxy/')
    }),//圖像圖層提供者功蜓,僅baseLayerPicker設(shè)為false有意義
});

/**
 * 設(shè)置鏡頭視角, 定位經(jīng)緯度(113.2,23.1) 高度為2千公里
 * heading宠蚂、pitch和roll就是鏡頭相對(duì)于xyz軸的角度
 * 以下參數(shù)為向下俯視地球
 */
this.viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(113.36824706049,23.127818196783, 2000),
    orientation: {
        heading : Cesium.Math.toRadians(0),
        pitch : Cesium.Math.toRadians(-90),
        roll : Cesium.Math.toRadians(0)
    }
});

呈現(xiàn)出來的地圖就是這樣的效果式撼,如果你設(shè)置了自己的底圖服務(wù),也就是設(shè)置了 imageryProvider 參數(shù)求厕,就可以看到自己的發(fā)布的底圖啦


QQ截圖20200529113808.jpg
三著隆、圖層疊加
addCesiumLayer(){
    /**
     * 疊加圖層 wms圖層
     */
    this.wms = new Cesium.WebMapServiceImageryProvider({
        url: '你的服務(wù)地址',     // 服務(wù)地址
        layers : '服務(wù)上的圖層名稱',           // 圖層名稱
        proxy : new Cesium.DefaultProxy("/proxy/"), // 跨域代理
        parameters : {
            CQL_FILTER : "COVERTYPE='室外'",        // 圖層過濾條件
            STYLES : "lte_enodeb_cell_gd_app",      // 圖層樣式
            service : 'WMS',
            FORMAT : 'image/png',                   // 圖片格式
            TRANSPARENT : true                      // 設(shè)置圖層背景透明,不設(shè)置默認(rèn)背景為白色
        },
        tileWidth : 256,                            // 圖層切片的寬度
        tileHeight : 256                            // 圖層切片的高度
    });
    // this.viewer.imageryLayers.addImageryProvider(this.wms);
    // addImageryProvider其實(shí)就等同于下面兩行代碼
    this.baseLayer = new Cesium.ImageryLayer(this.wms);
    this.viewer.imageryLayers.add(this.baseLayer);
},

可以看到自己添加的圖層


微信截圖_20200529115224.png
四呀癣、圖層點(diǎn)擊
bindClick(){
    this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
    this.handler.setInputAction((e) => {

        // 從相機(jī)位置到世界坐標(biāo)中windowPosition處的像素創(chuàng)建光線
        var ray = this.viewer.camera.getPickRay(e.position);

        // 3D笛卡爾點(diǎn)
        var cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);

        if(cartesian){
            var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
            if(cartographic){
                var xy = new Cesium.Cartesian2();   // 2D笛卡爾點(diǎn)

                // 相機(jī)的高度
                var cameraHeight = this.viewer.camera.positionCartographic.height;

                // 獲取當(dāng)前圖層的層級(jí)處于哪一級(jí)
                var level = getLevel(cameraHeight);

                // 是否準(zhǔn)備就緒
                if(this.wms.ready){

                    // 計(jì)算該圖塊位置的x美浦、y坐標(biāo)
                    xy = this.wms.tilingScheme.positionToTileXY(cartographic, level, xy);

                    var promise = this.wms.pickFeatures(xy.x,xy.y,level,cartographic.longitude,cartographic.latitude);

                    Cesium.when(promise, function (result) {
                        // 這個(gè)就是當(dāng)前點(diǎn)擊圖層的數(shù)據(jù)
                        console.log(result[0].properties);
                    })
                }
            }

        }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

},

// 事件也可以移除

unbindClick(){
    this.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
}

// 鼠標(biāo)事件
Cesium.ScreenSpaceEventType.LEFT_CLICK  // 左鍵單擊
Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK   // 雙擊
Cesium.ScreenSpaceEventType.LEFT_DOWN   // 左鍵按下
Cesium.ScreenSpaceEventType.LEFT_UP     // 左鍵抬起
Cesium.ScreenSpaceEventType.MIDDLE_CLICK    // 中鍵單擊
Cesium.ScreenSpaceEventType.MIDDLE_DOWN // 中鍵按下
Cesium.ScreenSpaceEventType.MIDDLE_UP   // 中鍵抬起
Cesium.ScreenSpaceEventType.MOUSE_MOVE  // 移動(dòng)
Cesium.ScreenSpaceEventType.PINCH_END   // 兩指事件在觸摸面上的結(jié)束
Cesium.ScreenSpaceEventType.PINCH_MOVE  // 兩指移動(dòng)
Cesium.ScreenSpaceEventType.PINCH_START // 兩指開始
Cesium.ScreenSpaceEventType.RIGHT_CLICK // 右鍵單擊
Cesium.ScreenSpaceEventType.RIGHT_DOWN  // 右鍵按下
Cesium.ScreenSpaceEventType.RIGHT_UP    // 右鍵抬起
Cesium.ScreenSpaceEventType.WHEEL       // 滾輪
// 獲取底圖層級(jí)
let getLevel = (height) => {
    if (height > 48000000) {
        return 0;
    } else if (height > 24000000) {
        return 1;
    } else if (height > 12000000) {
        return 2;
    } else if (height > 6000000) {
        return 3;
    } else if (height > 3000000) {
        return 4;
    } else if (height > 1500000) {
        return 5;
    } else if (height > 750000) {
        return 6;
    } else if (height > 375000) {
        return 7;
    } else if (height > 187500) {
        return 8;
    } else if (height > 93750) {
        return 9;
    } else if (height > 46875) {
        return 10;
    } else if (height > 23437.5) {
        return 11;
    } else if (height > 11718.75) {
        return 12;
    } else if (height > 5859.38) {
        return 13;
    } else if (height > 2929.69) {
        return 14;
    } else if (height > 1464.84) {
        return 15;
    } else if (height > 732.42) {
        return 16;
    } else if (height > 366.21) {
        return 17;
    } else {
        return 18;
    }
}
五、坐標(biāo)系及其之間的轉(zhuǎn)換

平面坐標(biāo)(屏幕坐標(biāo))

var position = { x: 113, y: 45 }

// 也可以
var position = new Cesium.Cartesian2(113, 45)

// 也可以通過點(diǎn)擊地圖项栏,獲取坐標(biāo)為e.position

平面坐標(biāo)轉(zhuǎn)三維坐標(biāo)(笛卡爾空間直角坐標(biāo)系)

var pick = this.viewer.camera.getPickRay(position)
var cartesian3 = this.viewer.scene.globe.pick(pick, this.viewer.scene);

三維坐標(biāo)轉(zhuǎn)地理坐標(biāo)(WGS84)

var dl = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian3)

地理坐標(biāo)轉(zhuǎn)經(jīng)緯度

var point = {
    x: dl.longitude / Math.PI * 180,
    y: dl.latitude / Math.PI * 180
}

經(jīng)緯度轉(zhuǎn)地理坐標(biāo)(弧度坐標(biāo)系Cartographic)

var cartographic = Cesium.Cartographic.fromDegrees(point.x,point.y)

Cesium入門幾天浦辨,還是有點(diǎn)收獲,期間雖然遇到很多問題沼沈,還是寫下來啦流酬!歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末列另,一起剝皮案震驚了整個(gè)濱河市芽腾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祭往,老刑警劉巖峭拘,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻润,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艰躺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門响巢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描滔,“玉大人,你說我怎么就攤上這事踪古『ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵伏穆,是天一觀的道長拘泞。 經(jīng)常有香客問我,道長枕扫,這世上最難降的妖魔是什么陪腌? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上诗鸭,老公的妹妹穿的比我還像新娘染簇。我一直安慰自己,他們只是感情好强岸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布锻弓。 她就那樣靜靜地躺著,像睡著了一般蝌箍。 火紅的嫁衣襯著肌膚如雪青灼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天妓盲,我揣著相機(jī)與錄音杂拨,去河邊找鬼。 笑死悯衬,一個(gè)胖子當(dāng)著我的面吹牛弹沽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筋粗,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贷币,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了亏狰?” 一聲冷哼從身側(cè)響起役纹,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暇唾,沒想到半個(gè)月后促脉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡策州,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瘸味,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够挂。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旁仿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽糖,到底是詐尸還是另有隱情枯冈,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布办悟,位于F島的核電站尘奏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏病蛉。R本人自食惡果不足惜炫加,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一瑰煎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俗孝,春花似錦酒甸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柬甥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間其垄,已是汗流浹背苛蒲。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绿满,地道東北人臂外。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像喇颁,于是被迫代替她去往敵國和親漏健。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355