Cesium中級教程1 - 空間數據可視化(一)

Cesium中文網:http://cesiumcn.org/ | 國內快速訪問:http://cesium.coinidea.com/
本教程將教讀者如何使用Cesium的實體(Entity)API繪制空間數據,如點、標記、標簽、線、模型、形狀和物體。不需要Cesium的先驗知識,但是如果讀者完全沒有這方面的經驗,那么讀者可能希望從“新手入門中文教程(原創)”開始學習。

什么是實體(Entity)API?

Cesium具有豐富的用于空間數據的API,可以分為兩類:面向圖形開發人員的低級API(通常稱為原始(Primitive)API)和用于數據驅動的可視化的高級API(稱為實體(Entity)API)。

原始API的主要目標是暴露手頭執行任務所需的最小抽象量。它希望我們像圖形程序員一樣思考,并使用圖形術語。它的結構是為給定的可視化類型提供最有性能和靈活性的實現,而不是為了API的一致性。加載一個模型不同于創建一個廣告牌,兩者都與創建多邊形完全不同。每種類型的可視化都有其獨特的特征。此外,它們各自具有不同的性能特征,并且需要遵循不同的最佳實踐。雖然它功能強大且靈活,但大多數應用程序都比Primitive API提供的抽象級別更高。原始API的主要目標是開放手頭當前研發工作的所需的最小抽象量。它希望我們像圖形程序員一樣思考,并使用圖形術語。它的結構是為給定的可視化類型提供最有性能和靈活性的實現,而不是為了API的一致性。加載一個模型不同于創建一個廣告牌(Billboard ),兩者都與創建多邊形完全不同。每種類型的可視化都有其獨特的特征。此外,它們各自具有不同的性能特征,并且需要遵循不同的最佳實踐。雖然它功能強大且靈活,但大多數應用程序都提供比Primitive API的抽象級別更高的服務接口。

實體API的目的是公開一組設計一致的高級對象,這些對象將相關的可視化和信息聚合到一個統一的數據結構中,我們稱之為實體。它讓我們專注于展示我們的數據,而不是擔心可視化的潛在機制。它還提供了易于構建復雜的、時間動態可視化的構造,這種可視化方式與靜態數據自然相適應。雖然實體API實際上在背后使用了原始API(Primitive API),但這是我們(幾乎)永遠不必關注的實現細節。通過將各種啟發式應用到我們提供的數據,實體API能夠提供靈活的、高性能的可視化,同時公開一致的、易于學習和易于使用的接口。

我們的第一個實體

學習實體API的基本方法之一是通過查看一些代碼。為了讓事情簡單化,我們將在CesiumSandcastle的Hello World例子中構建。如果讀者在本地開發Cesium,可以自由地使用自己的應用程序。

假設我們想從經度和緯度的列表中添加一個美國州懷俄明的多邊形。(懷俄明之所以被選中是因為它是一個簡單的多邊形)我們可以把下面的代碼復制粘貼到Sandcastle去做:

var viewer = new Cesium.Viewer('cesiumContainer');

var wyoming = viewer.entities.add({
  name : 'Wyoming',
  polygon : {
    hierarchy : Cesium.Cartesian3.fromDegreesArray([
                              -109.080842,45.002073,
                              -105.91517,45.002073,
                              -104.058488,44.996596,
                              -104.053011,43.002989,
                              -104.053011,41.003906,
                              -105.728954,40.998429,
                              -107.919731,41.003906,
                              -109.04798,40.998429,
                              -111.047063,40.998429,
                              -111.047063,42.000709,
                              -111.047063,44.476286,
                              -111.05254,45.002073]),
    height : 0,
    material : Cesium.Color.RED.withAlpha(0.5),
    outline : true,
    outlineColor : Cesium.Color.BLACK
  }
});

viewer.zoomTo(wyoming);

點擊運行按鈕(或者F8)能看到下面的圖像:

image

因為我們的一個目標是讓Cesium的代碼易于理解,希望這是不言自明的。我們創建了Viewer widget,它充當幾乎所有Cesium應用程序的基礎,然后通過viewer.entities.add. 添加一個新的Entity。我們傳遞的需add的對象只是一個提供初始值的選項參數。返回值是實際的實體實例。最后,我們調用 viewer.zoomTo 以確保實體處于視圖中。
有很多實體選項可用,但是現在我們指定polygon內部的半透明紅色和邊界的黑色輪廓。我們也給實體一個“Wyoming 懷俄明”的顯示名稱。

形狀和物體

有了創建多邊形的基本知識,并且由于實體API的同質性,我們現在可以通過簡單地使用Sandcastle中的示例作為參考來創建各種圖形。下面是支持的形狀和物體的完整列表。

image

材質和輪廓

不管它們的幾何定義如何,所有形狀和物體都有一組共同的屬性來控制它們的外觀。fill屬性是一個布爾值,它指定是否填充了表面的內部,而outline屬性控制形狀的邊緣是否被輪廓化。
fill設為truematerial屬性決定填充物是什么。在接下來的例子中,讓我們創建一個半透明的藍色橢圓。默認情況下,filltrueoutlinefalse,所以我們只需要指定material

var entity = viewer.entities.add({
  position: Cesium.Cartesian3.fromDegrees(-103.0, 40.0),
  ellipse : {
    semiMinorAxis : 250000.0,
    semiMajorAxis : 400000.0,
    material : Cesium.Color.BLUE.withAlpha(0.5)
  }
});
viewer.zoomTo(viewer.entities);

var ellipse = entity.ellipse; // For upcoming examples

Image

我們也可以將材質指定為一個圖片鏈接:

ellipse.material = '//cesiumjs.org/tutorials/images/cats.jpg';
image

在上述兩種情況下,在賦值時自動為我們創建一個ColorMaterialProperty屬性或ImageMaterialProperty屬性。對于更復雜的材料,我們需要自己創建一個材料屬性實例。目前,實體形狀和物體支持顏色、圖像、棋盤、條紋和網格材料。

棋盤

ellipse.material = new Cesium.CheckerboardMaterialProperty({
  evenColor : Cesium.Color.WHITE,
  oddColor : Cesium.Color.BLACK,
  repeat : new Cesium.Cartesian2(4, 4)
});
image

條紋

ellipse.material = new Cesium.StripeMaterialProperty({
  evenColor : Cesium.Color.WHITE,
  oddColor : Cesium.Color.BLACK,
  repeat : 32
});
image

網格

ellipse.material = new Cesium.GridMaterialProperty({
  color : Cesium.Color.YELLOW,
  cellAlpha : 0.2,
  lineCount : new Cesium.Cartesian2(8, 8),
  lineThickness : new Cesium.Cartesian2(2.0, 2.0)
});
image

輪廓

fill屬性不同,outline沒有相應的材料,而是依賴于兩個獨立的outlineColoroutlineWidth屬性。outlineWidth只適用于非Windows系統,如Android、iOS、Linux和OS X。這是由于WebGL是如何在Windows上的所有三個主要瀏覽器引擎中實現所限制的。

ellipse.fill = false;
ellipse.outline = true;
ellipse.outlineColor = Cesium.Color.YELLOW;
ellipse.outlineWidth = 2.0;
image

折線

折線是一種特殊情況,因為它們沒有填充或輪廓屬性。相反,他們依靠專門的材料來代替顏色。由于這些特殊材料,不同寬度和輪廓寬度的折線將對所有系統起作用。

var entity = viewer.entities.add({
    polyline : {
        positions : Cesium.Cartesian3.fromDegreesArray([-77, 35,
                                                        -77.1, 35]),
    width : 5,
    material : Cesium.Color.RED
}});
viewer.zoomTo(viewer.entities);

var polyline = entity.polyline // For upcoming examples
image

折線輪廓

polyline.material = new Cesium.PolylineOutlineMaterialProperty({
    color : Cesium.Color.ORANGE,
    outlineWidth : 3,
    outlineColor : Cesium.Color.BLACK
});
image

折現光暈

polyline.material = new Cesium.PolylineGlowMaterialProperty({
    glowPower : 0.2,
    color : Cesium.Color.BLUE
});
image

高度與擠壓

覆蓋在地球上的所有形狀,當前是圓、橢圓、多邊形和矩形,也可以放置在海拔高度或擠壓成一個物體。在這兩種情況下,形狀或物體仍然符合其下方的地球曲率。

對于高度,我們所要做的就是在相應的圖形對象上設置高度屬性,對于上面列出的所有形狀都是一樣的。這可能是提到Cesium總是使用米、弧度和秒作為單位的好時機,除非函數明確地表示了其他情況,比如Cartesian3.fromDegrees。下面的代碼行將多邊形提升到地球上方250000米處。

wyoming.polygon.height = 250000;

image

將形狀擠壓成物體同樣容易,我們只需要設置extrudedHeight屬性。物體將在heightextrudedHeight之間產生。如果heightundefined,則物體從0開始。為了創造一個物體從200000米開始,延伸到250000米,我們可以使用下面的代碼。這當然意味著物體本身是50000米高。

wyoming.polygon.height = 200000;
wyoming.polygon.extrudedHeight = 250000;
image

Cesium中文網交流QQ群:807482793

Cesium中文網:http://cesiumcn.org/ | 國內快速訪問:http://cesium.coinidea.com/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容