1. 程式人生 > >Ceisum官方教程2 -- 專案例項(workshop)

Ceisum官方教程2 -- 專案例項(workshop)

原文地址:https://cesiumjs.org/tutorials/Cesium-Workshop/
概述
我們很高興歡迎你加入Cesium社群!為了讓你能基於Cesium開發自己的3d 地圖專案,這個教程將從頭到尾講解一個基礎的Cesium程式的開發過程。這個教程將用到很多重要的CesiumAPI,但是並不是所有的(CesiumJS有很多很多功能)。我們目標是教會你基於Cesium做開發的基本原則和工具,在你的專案裡能舉一反三,解決其他問題。
我們建立一個簡單的程式去視覺化紐約市的一些地理位置。我們將載入各種型別各種樣式的二維和三維資料,並且建立若干個相機位置,並且展示一些使用者互動的UI。最後,做為一個高科技地圖,我們載入了一個無人機三維模型,充分利用3d視覺化的優勢去觀察一些地理位置。
在完成教程後,你對Cesium的功能會有幾個基本概念,包括配置viewer、載入資料、建立各種樣式的幾何體、使用3d tiles(三維模型切片)、控制相機、增加滑鼠互動事件。
在這裡插入圖片描述


帶互動的視覺化紐約城地理位置
步驟
再開發前的幾個必備步驟:

訪問這個頁面確認你的電腦環境適合Cesium Cesium Viewer. 如果沒有看到地球? 點這個連結 Troubleshooting.
安裝Node.js.
下載教程程式碼 workshop code。使用git clone 或者手動下載zip並解壓縮。
在cmd命令列下,使用cd命令定位到 cesium-workshop目錄下.
執行 npm install。
執行 npm start。

控制檯應該輸出下面資訊:

在這裡插入圖片描述
workshop執行
在這裡插入圖片描述
注意不能關閉控制檯視窗,開發中需要保證這個程序執行著。
下一步, 在瀏覽器裡開啟 localhost:8080。你應該能看到我們的程式已經運行了。
注意
這個教程裡提到的workshop是基於cesium1.45開發的,裡面的地形伺服器已經失效了,導致cesium載入並不成功,使用這個程式碼看不到效果。
在這裡插入圖片描述


workshop已經執行不起來了
解決方法也很簡單,我們使用Cesium最新版1.51裡的檔案替換到如下目錄
在這裡插入圖片描述
替換cesium庫
再次重新整理頁面,就可以了,效果如下:
在這裡插入圖片描述
替換cesiumjs庫後的載入效果
程式目錄
在程式根目錄下,有如下檔案和資料夾. 這個程式已經被設計為儘可能的簡單,只包含cesiumjs的庫。

Source/ : 我們專案的程式碼。

ThirdParty/ : 外部js庫,目前只包含cesium。

LICENSE.md : 我們專案的說明條款。

index.html : 主頁,包含專案程式程式碼和頁面結構。

server.js : 簡單的基於nodejs的http伺服器。

CesiumJS是完全相容現代javascript 庫和框架,所以放心大但的使用。

下面是一些示例:

Cesium and webpack 教程展示了使用webpack整合cesium去更高效的開發web專案。
React整合
CesiumJS和Threejs整合

頁面結構
下來我們看看index.html。為cesium的控制元件建立div,以及一些輸入元素。我們注意到,Cesium的控制元件就是一個普通的div,它可以被css樣式設定,並且和其他div互動。

有一些關鍵的行:
引入CesiumJS
受限在html的標籤內引用cesium.js。這個定義了Cesium物件,並且包含整個CesiumJS的庫。
在這裡插入圖片描述
為了減小開發的專案最終的js檔案大小,當然你也可以包含ThirdParty/Cesium/Source/目錄下的獨立的Cesium原始碼模組。不過我們為了簡單的測試API,我們直接包含了整個CesiumJS庫。
HTML結構
在HTML的body部分,有一個div為了建立Cesium控制元件。
在這裡插入圖片描述
為了在div建立成功後再執行其他程式碼,可以再HTML的body部分增加script標籤去引用js檔案。
在這裡插入圖片描述
頁面樣式
使用index.css檔案定義了HTML元素的樣式,可以在HTML的head元素裡引用它。
在這裡插入圖片描述
Cesium的所有小控制元件下面這個CSS來定義樣式。需要在index.css之前引用。
在這裡插入圖片描述
我們的頁面已經有了基本樣式,並且我們在index.css設定的樣式可以覆蓋Cesium預設的控制元件樣式。
工作流程
步驟如下:

使用你最擅長的文字編輯器(推薦sublime)開啟 Source/App.js,並且清空裡面內容。
把檔案Source/AppSkeleton.js的內容拷貝到 Source/App.js。
確認你的http服務還在 cesium-workshop 目錄執行著。
使用你的瀏覽器開啟 localhost:8080.推薦使用chrome,但是現在瀏覽器都可以. 你應該能看到一個黑色背景。
在程式碼裡去掉註釋,儲存 Source/App.js,重新整理瀏覽器,應該有些效果改變了。

還有問題? 那你先跟著sandcastle去做一個沒有UI的簡單程式:

完整的程式碼
註釋的程式碼

下來我們真正開始。
建立Viewer
Cesium的最基礎物件就是 Viewer, 一個具有很多功能的3d地球的黑盒子. 使用下面的程式碼建立viewer並附著到id為 “cesiumContainer”`的div上。
在這裡插入圖片描述
這簡單的一行程式碼實際包含了很多內容,成功後你應該能看見基礎的地球,像下面一樣:
在這裡插入圖片描述
基礎地球

預設情況下這個場景能處理滑鼠和觸控事件。 試下下面的相機控制方法:
左鍵單擊和拖拽 - 沿著地球表面平移(調整相機位置).

右鍵單擊和拖拽 - 相機放大縮小(調整相機距離).

滾輪 - 相機放大縮小(調整相機距離).

中間按下和拖拽 - 圍繞地球表面旋轉相機(調整相機方向)。
除了地球, Viewer還預設包含了一些有用的控制元件:

在這裡插入圖片描述
Cesium控制元件

Geocoder : 地理位置查詢定位控制元件,預設使用bing地圖服務.

HomeButton : 預設相機位置。

SceneModePicker : 3D、2D和哥倫布模式的切換按鈕.

BaseLayerPicker : 選擇地形、影像等圖層。

NavigationHelpButton : 顯示預設的相機控制提示.

Animation : 控制場景動畫的播放速度.

CreditsDisplay : 展示資料版權屬性。

Timeline : 時間滾動條。

FullscreenButton : 全屏切換。

可以傳遞一個options物件做為配置引數,去控制上面這些控制元件的顯示或者不顯示。對於示例程式碼,刪除第一行,開啟後面幾行的註釋,程式碼如下:
在這裡插入圖片描述
這幾行程式碼建立了一個不包含選擇指示器(selection indicators),基礎底圖選擇控制元件的viewer。完整的options配置看文件Viewer 。
影像圖層
影像是Cesium程式一個關鍵元素。它是覆蓋在地表的各種不同精度的影象集合。根據相機的朝向和距離,Cesium將請求和渲染不同LOD或者縮放級別下的影象。

Cesium支援多個影像圖層同時載入、刪除、排序和調整。

Cesium為影像圖層提供了大量方法,類似調整顏色、混合等。下面是Sandcastle中的一些示例程式碼:

影像圖層基本效果
影像圖層調整顏色
調整影像圖層順序
影像的螢幕分割(捲簾效果)

Cesium提供了多種影像資料來源 多用影像資料來源 。
支援的格式:

WMS
TMS
WMTS (with time dynamic imagery)
ArcGIS
Bing Maps
Google Earth
Mapbox
Open Street Map

Cesium預設使用Bing map的影像圖層。這個影像圖層經常用來做demo演示。為了使用這個影像,需要建立一個Cesium ion賬戶,並且生成一個訪問token。

(譯者注:考慮到國內的環境,修改了官方的示例,直接載入谷歌地圖的影像)
在這裡插入圖片描述
執行後有如下效果:
在這裡插入圖片描述
新增谷歌底圖效果

後續教程還有一篇專門講影像圖層的 影像圖層教程.
地形圖層
Cesium支援漸進流式載入和渲染全球高精度地形,並且包含海、湖、河等水面效果。相對2D地圖,山峰、山谷等其他地形特徵的更適宜在這種3D地球中展示。和影像圖層一樣,Cesium需要在服務端預先把地形資料處理為切片形式,在客戶端基於當前相機位置去請求和渲染地形切片。

下面是一些示例和地形資料集以及配置選項:

ArcticDEM : 高精度北極地形。

PAMAP Terrain : 高精度賓夕法尼亞州地形

地形配置 : 地形配置和格式

地形誇張 : 使地形起伏差異更大

支援的格式:

Quantized-mesh, Cesium團隊定義的不規則地形三角網格式。
Heightmap
Google Earth Enterprise

為了增加一個地形資料,我們需要建立一個 CesiumTerrainProvider, 設定一個url以及很少的幾個配置項,然後把這個provider設定到 viewer.terrainProvider.

這裡,我們使用 Cesium全球地形,這個資料儲存在Cesium ion伺服器上,已經預設到你的賬戶裡的“My Assets”中。這種前提下,我們使用createWorldTerrain輔助函式去建立 Cesium全球地形 .
在這裡插入圖片描述
requestWaterMask 和 requestVertexNormals 兩個選項都是可選的,他們告知Cesium去請求額外的水面資料和光照資料。 預設都為false.
最終,我們有了地形效果,我們可能需要再寫一行程式碼,確保地形以下的物體不可見。
在這裡插入圖片描述
紐約的地表非常平,可以漫遊到其他地方去瀏覽. 為了明顯看到效果,可以到珠峰附近去檢視。
在這裡插入圖片描述
珠峰地形
後續有一個地形的詳細教程 地形教程.場景配置為了我們的viewer的展示時間和空間正確,需要一些更多的配置。這部分主要和 viewer.scene打交道, 這個類控制了我們的viewer中所有的圖形元素。
使用下面這句話,開啟全球光照,光照方向依據太陽方向。
在這裡插入圖片描述
隨著時間的變化,光照方向也在變換。如果縮小後,我們能看到一部分的地球是黑色的,因為這部分此時晚上。

在初始化檢視之前,先學下基本的cesium 型別:

Cartesian3 : 三維笛卡爾(直角)座標 – 當用來表示位置的時候,這個座標指在地固座標系(Earth fixed-frame (ECEF))下,相對地球中心的座標位置,單位是米。

Cartographic :使用經緯度(弧度)和高度(WGS84地球高程)描述的三維座標 。

HeadingPitchRoll :

在ENU(East-North-Up)座標系中,相對座標軸的旋轉(弧度)。Heading 相對負z軸(垂直向下). Pitch 相對負y軸. Roll相對正x軸.

Quaternion :使用四維座標描述的三維旋轉。

這是在Cesium的scene中擺放物件的基本型別,Cesium提供了一系列的方便的轉換函式。具體請檢視cesium文件。

現在,我們把相機定位到我們資料所在的位置–紐約。
相機控制
Camera 是 viewer.scene的一個屬性,用來控制當前可見範圍。使用Cesium Camera API 我們可以直接設定相機的位置和朝向。
一些最常用的方法:

Camera.setView(options) : 立即設定相機位置和朝向。

Camera.zoomIn(amount) : 沿著相機方向移動相機。

Camera.zoomOut(amount) : 沿著相機方向遠離

Camera.flyTo(options) : 建立從一個位置到另一個位置的相機飛行動畫。

Camera.lookAt(target, offset) : 依據目標偏移來設定相機位置和朝向。

Camera.move(direction, amount) : 沿著direction方向移動相機。

Camera.rotate(axis, angle) : 繞著任意軸旋轉相機。

更詳細的可以去學習下面兩個示例:

Camera API示例

自定義相機控制

我們測試一個方法,把相機位置放置到紐約。分別使用一個 Cartesian3表示位置,一個HeadingPitchRoll表示朝向。
在這裡插入圖片描述
使用一個js物件儲存相機的引數,設定後,相機此時是垂直俯視曼哈頓(Manhattan)。

事實上,我們可以使用這個view引數來更改home按鈕的效果。與其設定地球的預設檢視引數,我們還不如重寫這個按鈕,點選之後飛行到曼哈頓。可以通過其他引數來調節動畫過程,並且可以設定一個事件監聽取消預設的飛行過程,然後呼叫新的flyto()函式飛到我們設定的位置:
在這裡插入圖片描述
參看這篇教程學習更多相機操作方法 camera教程.
時間控制
下來,我們通過配置viewer的 時鐘(Clock) 和時間線(Timeline) 去控制場景中的時間流逝。
時鐘(clock)API教程.

Cesium使用 JulianDate 描述某個時刻,這個時間儲存了自從公元前4712年1月1日中午的天數。為了提高精度,這個類裡分開儲存了時刻的日期部分和時刻的秒部分。為了數學運算的安全和閏秒(leap seconds)的問題,這個時刻是按照國際原子時標準(International Atomic Time standard)儲存的。
下面是一些關於scene中時間的配置選項:
在這裡插入圖片描述
上述程式碼設定了場景動畫播放速率,開始和結束時間,並且設定為迴圈播放。並且設定了時間線控制元件在合適的時間範圍。使用這個 示例 去試驗更多時間設定
初始化配置完成了,當你執行程式碼,能看到如下效果
在這裡插入圖片描述
初始化程式
Entities載入和樣式配置
上面我們程式裡已經添加了viewer 、影像圖層、地形圖層。下來重點說專案裡的示例點位資料(the sample geocache data)。

為了更方便的視覺化,Cesium支援流行的向量格式GeoJson和KML,同時也支援我們團隊定義的一種格式 CZML.
無論最初是什麼格式,所有的空間向量資料在Cesium裡都是使用Entity 相關API去展示的。Entity API 使用了靈活高效的視覺化渲染方式。 Entity是一種對幾何圖形做空間和時間展示的資料物件。sandcastle 裡提供了很多簡單的entity。

為了能快速的學習Entity API,建議先花點時間去讀下 空間資料視覺化教程 。
下面一些使用Entity API的示例:

Polygon
Polyline
Billboard
Label

一旦你已經理解了Entity是什麼東西,使用Cesium載入資料就很容易理解了。為了讀取資料檔案,需要根據你的資料格式建立一個合適的 DataSource ,它將負責解析你配置的url裡的資料,然後建立一個[EntityCollection]用來儲存從資料里加載的每一個Entity 。DataSource 只是定義一些介面,依據資料格式的不同會有不同的解析過程。比如,KML使用KmlDataSource。如下面程式碼:
在這裡插入圖片描述
這段程式碼使用 KmlDataSource.load(optinos) 來從KML檔案中讀取點位資料。 對於KmlDataSource,camera 和 canvas 選項必須要配置。clampToGround 選項控制資料是否貼地, 貼地效果是最常見的向量資料視覺化效果,保證資料緊貼地形起伏,而不是僅僅相對WGS84絕對球表面。
因為資料是非同步載入的,所以這個函式實際返回一個 Promise , 最後使用KmlDataSource 儲存我們新建立的Entity。
Promise 是一種非同步處理機制,這裡的“非同步”是指需要在.then函式裡操作資料,而不是直接在 .load函式之後立即操作。為了能在scene中使用這些載入的entity,只有當這個promise的then回撥中才可以把KmlDataSource新增到 viewer.datasources。
在這裡插入圖片描述
這些新加入到場景的entity預設有很多功能。單擊它們會在 Infobox 顯示屬性, 雙擊它相機轉換為居中觀察模式(look at). 使用HOME按鈕或者infobox旁邊的相機按鈕可以停止這種模式。下來我們來自定義樣式。
KML和CZML格式,在檔案內有明確的樣式定義。為了學習,我們手動去建立樣式。資料載入之後,我們依據這個 示例 遍歷所有entity修改或者增加屬性。我們的POI點預設都是使用 Billboards 和 Labels 顯示, 根據下面的程式碼來修改某些entity的顯示樣式:
在這裡插入圖片描述
通過調整錨點(anchor point)來改進顯示效果,並且為了避免雜亂刪除了文字標註(labels),最後設定了 displayDistanceCondition 控制只顯示和相機一定距離內的點.
在這裡插入圖片描述
關於distanceDisplayCondition,可以學習下 sandcastle 示例.
下來,我們改進下 Infobox 。Infobox的標題欄顯示的是entity的name屬性, 它的內容顯示的是description屬性(使用HTML文字顯示)。

你發現我們這個資料預設的description屬性沒什麼意義,我們把這個屬性更改為顯示每個點的經緯度。

首先我們把entity的position屬性轉換為Cartographic,然後把經度和緯度構造一個HTML的table並賦值到description屬性裡。 現在單擊我們的點在 Infobox 會顯示一個格式規整的資訊。
在這裡插入圖片描述
最後效果:
在這裡插入圖片描述
修改description屬性
或許把每個POI點所在的行政區展示出來非常有用。我們試著通過一個GeoJson檔案來建立NYC的所有行政區域多邊形。載入GeoJson和上面載入KML基本沒什麼區別,只是使用 GeoJsonDataSource 。和前面一樣,也必須在promise的then函式裡把資料新增到viewer.datasources 中,資料才能顯示。
在這裡插入圖片描述
下來設定多邊形資料的樣式。和上面調整billboard樣式一樣,我們設定行政區域多邊形也必須在資料完全載入後去做。下來設定多邊形資料的樣式。和上面調整billboard樣式一樣,我們設定行政區域多邊形也必須在資料完全載入後去做。
在這裡插入圖片描述
首先,我們重新設定每個entity的name屬性和行政區的名稱相同。原始的GeoJson檔案有一個neighborhood的屬性。Cesium使用entity.properties來儲存GeoJson的屬性。所以我們這麼設定:
在這裡插入圖片描述
為了避免所有多邊形顏色都相同,可以使用一個隨機顏色 Color去設定每個多邊形的 ColorMaterialProperty屬性。
在這裡插入圖片描述
最後,我們再建立一個基本的文字標註 Label。 為了保證顯示效果清晰,我們設定了一個 disableDepthTestDistance 確保這個標註不會被其他物件蓋住。

可是,Label需要通過entity.position屬性設定位置。但是Polygon 是有一個positions列表組成的邊界,我們使用這個positions列表的中心點來計算。

在這裡插入圖片描述
最終效果:
在這裡插入圖片描述
多邊形的文字標註

最後,增加一個無人機飛躍城市上空的高科技效果。

因為飛行路徑只是一系列帶著時間屬性的位置點,我們通過CZML 檔案來載入。CZML是一種在Cesium裡描述時序圖形場景的檔案格式。它包含折線(lines)、點(points)、圖示(billboards)、模型(models)和其他圖形元素,以及他們隨時間變化的屬性。如同Google Earth的KML,CZML通過一種描述性語言(基於json格式)來儲存Cesium大部分的功能。
我們得CZML檔案定義一個包含不同時刻得一個位置列表Entity(預設顯示為一個point)。在Entity API中有一些處理時間序列資料的屬性型別。參考下面的示例:

Property Types 示例
在這裡插入圖片描述
這個CZML中使用 Path去展示無人機軌跡, 以及一個展示不同時刻位置的屬性.。使用插值演算法把一個路徑的離散點連結為一個連續的折線。
我們繼續改進下無人機的顯示樣式。我們可以用一個三維模型去表示我們的無人機,並把它設定到entity上,而不是僅僅用一個簡單的點。

三維模型示例
三維模型帶顏色示例

Cesium支援載入glTF格式的三維模型格式。glTF是一個由Cesium團隊和 Khronos group一起開發的開源三維模型格式,這種格式儘量減少傳輸和實時處理過程中的模型資料量。如果沒有glTF模型,我們提供了一個 線上轉換工具 把DAE,obj等格式轉為glTF。
我們載入一個效果不錯的,又帶動畫的無人機模型 Model :
在這裡插入圖片描述
現在我們的模型看起來還不錯,不像最初那個簡單的點效果,這個無人機模型有方向,但是效果有點奇怪,並沒有朝向無人機的前進方向。幸好,Cesium提供了VelocityOrientationProperty ,這個會根據entity的位置點資訊和時間來自動計算朝向。
在這裡插入圖片描述
現在我們的無人機模型朝向正確了。我們還可以改進下無人機飛行效果。Cesium依據離散點,使用線形插值構造了一條折線,雖然遠處看不明顯,但是這些折線段讓路徑看著不自然。有一些插值配置選項:插值示例
為了飛行路徑更平滑,可以如下修改配置 :
在這裡插入圖片描述
在這裡插入圖片描述
平滑的飛行路徑

3D Tiles
我們的團隊有時候描述Cesium像一個使用真實世界資料的三維遊戲引擎。可是,載入真實世界的資料要比遊戲引擎的資料困難很多,主要因為真實資料有非常高得解析度,而且要求精確得視覺化。幸好,Cesium和開源社群合作開發了3D Tiles格式。它是一個流式載入海量各種型別得空間三維資料的 開放協議 。
使用一種類似Cesium的地形和影像資料切片技術,3d tiles格式使原先那些不可能做視覺化互動的大模型資料能夠展示出來,包括建築物資料、CAD(或者BIM)模型,點雲,傾斜模型。

3D Tiles 偵錯程式 ,它是一個能夠檢視各種3d tile後臺資訊的除錯工具。

這是一些不同型別的3d tile模型資料:

傾斜模型
BIM資料
點雲
所有型別

這個專案中,使用 Cesium3DTileset 類新增整個紐約的真實建築物模型,改進了視覺化效果的真實性。
在這裡插入圖片描述
你會發現這些建築物的高度好像不正確。這個可以簡單修正下。通過一個 modelMatrix,我們可以調整這個資料的位置。
把資料當前的包圍球轉為Cartographic,就能計算出模型現在相對於地面的偏移,然後增加這個偏移值,然後重設modelMatrix:
在這裡插入圖片描述
現在我們有了110萬個建築物模型。

3D Tiles 支援使用3D Tiles樣式語言去對一部分資料進行樣式配置。

3D Tiles的樣式依據一個表示式,根據Cesium3DTileFeature模型屬性去修改某一部分甚至某一棟建築物的顏色(RGB和透明度)。這些元素屬性(feature property)通常儲存在每個模型切片的batchtable中。元素屬性可以是任意屬性,比如高度,名稱,座標,建立日期等等。樣式語言使用JSON格式定義,並且支援JavaScript的表示式(a small subset of JavaScript augmented)。另外,樣式語言提供了一些內建的函式,支援數學計算。
Cesium3DTileStyle示例如下:
在這裡插入圖片描述
這個樣式只是簡單的讓紐約的所有建築都可見。把它設定到 city.style就可以看到視覺化效果。
在這裡插入圖片描述
在這裡插入圖片描述
預設效果
下面這個樣式讓模型半透明:
在這裡插入圖片描述
在這裡插入圖片描述
半透明效果
所有元素使用相同樣式只是小兒科。我們可以使用屬性對每個元素設定不同樣式。下面是一個依據建築高度去著色的示例:
在這裡插入圖片描述
在這裡插入圖片描述
依據高度著色
為了在這些樣式之間切換,我們增加一點點程式碼去監聽HTML的輸入框變化:
在這裡插入圖片描述
如果想學習更多關於3D Tiles如何配置樣式,請檢視這個 示例。
一些其他3D Tiles的示例:

格式
傾斜模型

樣式配置

如果你有各種三維資料需要轉換為3D tiles,請下載我們的CesiumLab。

互動
最後,我們新增一些滑鼠互動。我們改進下效果,當滑鼠劃過的時候,高亮圖示。 為了做出這個效果,我們使用拾取技術(picking),它能夠根據一個螢幕上的畫素位置返回三維場景中的物件資訊。
有好幾種拾取:

Scene.pick : 返回視窗座標對應的圖元的第一個物件。

Scene.drillPick :返回視窗座標對應的所有物件列表。

Globe.pick : 返回一條射線和地形的相交位置點。

這是一些示例:

拾取示例

3D Tiles 物件拾取

因為我們想實現滑鼠滑過的高亮效果,首先需要建立一個滑鼠事件處理器。 ScreenSpaceEventHandler是可以處理一系列的使用者輸入事件的處理器. ScreenSpaceEventHandler.setInputAction()``](/Cesium/Build/Documentation/ScreenSpaceEventHandler.html#setInputAction) 監聽某型別的使用者輸入事件 – [ScreenSpaceEventType`使用者輸入事件型別,做為一個引數傳遞過去。這裡我們設定一個回撥函式來接受滑鼠移動事件:
在這裡插入圖片描述
下來我們寫高亮函式。我們可以在回撥函式裡獲得一個視窗座標,並傳遞到pick()方法裡。 如果拾取到一個billboard物件,我們就知道目前滑鼠在一個圖示上了。然後使用我們前面學過的相關Entity介面,去修改它的樣式做高亮效果。
在這裡插入圖片描述
高亮樣式設定成功了。可是,當滑鼠不在圖示上,這個高亮樣式依然有效。為了解決這個問題,我們使用一個變數來儲存上次的高亮圖示,當滑鼠不在它上面的時候,恢復它原來的樣式。
這是包含高亮和不高亮完整功能的程式碼:
在這裡插入圖片描述
好了,我們添加了完整的圖示entity的滑鼠互動響應。
在這裡插入圖片描述
滑鼠互動

相機模式
為了炫耀我們的無人機飛行,我們來實驗下相機模式。在兩種相機模式下可以簡單的切換:

自由模式 :預設的相機控制方式
無人機模式 : 以一個固定距離跟隨無人機

自由模式下不需要任何程式碼。無人機跟隨模式下,我們使用viewer內建的跟隨函式,確保相機一直居中觀察無人機。這種模式下,即便物件是移動的,相機也能和目標之間保持一個固定的偏移距離。只需要簡單的設定

viewer.trackedEntity。

切換到自由模式,只需要把viewer.trackedEntity 設定為undefined,然後可以使用camera.flyTo()返回到初始位置。

這是相機模式程式碼:
在這裡插入圖片描述
只需要把這個函式繫結到HTML元素的change事件上。
在這裡插入圖片描述
當我們雙擊entity的時候,就會自動進行跟隨模式。如果使用者通過點選跟蹤無人機,新增一些處理去自動更新UI介面:
在這裡插入圖片描述
我們可以通過介面自由切換相機模式了:
在這裡插入圖片描述
相機模式
其他
剩下的程式碼我們增加一些其他的視覺化效果。如同前面提到的HTML元素互動方式,我們可以新增陰影的切換介面,以及行政區多邊形的可見性控制。

首先,簡單的控制下行政區劃的可見性。通常,通過設定Entity.show 屬性來隱藏entity。可是,這個僅僅設定一個entity,我們希望一次性控制所有行政區劃面的可見性。

可以像這個示例一樣,把所有行政區entity放在一個父entity中,或者通過設定EntityCollection的 show 屬性來控制。只需要設定一次neighborhoods.show屬性即可控制所有entity的可見性。
在這裡插入圖片描述
如同切換陰影一樣:
在這裡插入圖片描述
因為3D Tiles資料可能不是瞬間載入,可以新增一個載入指示器,當所有切片都載入後隱藏。
在這裡插入圖片描述
接下來
恭喜!你已經成功完成了CesiumJS專案。在Cesium的培訓過程中,請隨意使用我們提供的程式碼去測試和開發。我們很高興歡迎你加入Cesium社群,並且期望看到你基於CesiumJS開發的酷炫程式。
開發資源
為了你的Cesium開發事業,我們鼓勵你訪問下面的資源:

官方文件 : 完整的CesiumAPI文件,包含一些示例程式碼

Sandcastle :一個所見即所得的編碼環境,包含大量的程式碼示例.

官方教程 :詳細描述基於Cesium開發的方方面面。

官方論壇 : Cesium相關問題的主要討論平臺.

Cesium實驗室 : 中國最專業的Cesium的討論學習QQ群:595512567。

一旦有問題,上面的資源可能有你的答案。

在cesiumjs.org展示你的專案
我們很樂意去分享所有Cesium社群建立的酷炫專案。遍佈世界的的開發者建立了很多有意思的我們從來沒考慮過的專案。一旦你的專案準備分享給全世界,請跟我們聯絡放到[CesiumJS示例頁面] (https://cesiumjs.org/demos)。具體請閱讀 這個部落格提交你的專案示例。
在這裡插入圖片描述
中國最專業的Cesium開發者社群