Cesium應用篇:2影像服務(下)


文章中相關范例下載路徑:https://yunpan.cn/cByQqkANWN7Pu 訪問密碼 823d

      上篇主要介紹了Cesium自帶的影像Provider ,在本篇中,我們主要涉及到如何擴展這些服務,能夠支持天地圖,Google Maps等自定義影像服務。

擴展影像服務

天地圖影像服務

      以國內數據的范疇來看,個人認為最佳,一來是數據內容和完整性,二來是不用許可無偏移,三來瀏覽速度還是很不錯,國內其他影像服務能夠滿足這三點的並不多。

      天地圖影像服務都是全球范圍,分為墨卡托投影和經緯度兩種坐標系,后者標識的是CGCS2000坐標系,對我這樣的非專業人士,我等同於WGS84。另外,天地圖提供了中英文的注記,也是很不錯的。

      首先我們看一下墨卡托投影的全球影像圖,遵循WMTS規范,服務URL如下:

http://t0.tianditu.com/img_w/wmts

      首先,通過天地圖的GetCapabilities信息,獲取其相關的參數,重要信息如下:

clip_image002

      通過紅框處,我們可以知道,該WMTS服務的url,Layer的Name,Style,Format以及TileMatrixSet等關鍵屬性的值。有了這些屬性,我們就可以通過WebMapTileServiceImageryProvider構造出天地圖的Provider,代碼如下:

clip_image004

      創建天地圖不麻煩,但如何更好的創建呢?比如輪詢機制,我們知道天地圖提供了't0','t1','t2','t3','t4','t5','t6','t7'8個域名,服務端TCP最大鏈接數是有限制的,輪詢機制下瓦片下載的速度更有保證,很可惜,盡管Cesium提供了subdomains的屬性,但需要把url按照format的方式來指定參數 ,所以我們需要稍微調整一下構建過程,把我們需要的參數都format到url中 ,代碼如下:

clip_image006

      盡管這個url確實很長,自己手動拼這樣一個url是要花一點時間,不過畢竟在性能上得到了優化,也算是勞有所得。

      看上去天地圖大功告成了,別着急,還有最后一個地方要交代清楚。剛才我們都是用的墨卡托投影,而Cesium大多也是默認Provider是按照墨卡托投影的,但天地圖也提供了經緯度的影像服務,雖然疊到地球上都一個樣子,但空穴不回來風的,肯定有它存在的價值(經緯度的價值稍后再說),那我們看看經緯度的天地圖如何加載?

      和前面的思路完全一樣,但在創建Provider時需要同時構建tilingScheme,指定其為經緯度坐標系即可,代碼如下:

clip_image008

      創建經緯度的天地圖需要注意兩個地方,一個是tilingScheme,指定為經緯度,另一個就是tileMatrixLabels,因為level是從1開始(而不是0),所以需要指定每一層級的索引號。

Google Map影像服務

      坦白說,GoogleMap的影像服務有些不實用,國內限制多,需要申請key,而且,關鍵是水印太多,每一個Tile都會有水印,但我們還是再次提供一下。創建GM和創建ArcGIS比較類似。

      首先,GM的url格式如下:

http://maps.googleapis.com/maps/api/staticmap?maptype=satellite&center={y},{x}&zoom={level}&size=256x256&key={key}

      指定中心點和級別,以及key。Key需要個人申請,而中心點和級別則需要根據xyz的行列號自己來計算,在googlemap的范例里面已經實現,此處不介紹實現思路,有興趣的可以看代碼注釋。基於這個類,可以很簡單的加載Google Map影像服務,當然,你要申請自己的Key:

clip_image010

      通過Cesium自帶的Provider以及擴展的Provider,基本上涵蓋了所有的Provider,至於沒有涵蓋的,其實現思路也都如出一轍,但除了百度地圖。因為其行列號是從經緯度(0,0)開始的,所以存在一個墨卡托xyz到百度xyz的映射過程,我在baidu.html中也實現了該Provider,不過你可以看到,沒法用,所以一筆帶過。

      除此之外,Cesium在新版本中還提供了TileCoordinatesImageryProvider和GridImageryProvider兩個Provider,個人認為這兩個主要為開發人員提供的,如果有興趣可以參考Cesium自帶范例,也提醒一下TileCoordinatesImageryProvider默認是按照墨卡托投影的,如果你需要經緯度的瓦片切分方式,則需要指定tilingScheme屬性,和經緯度的天地圖屬於同一個問題。而其實現看上去很專業,其實是在Canvas中繪制成一個Image,然后作為Tile貼到球上去的,也算是二維和三維一個很好的結合效果展現,讓我想起了風向圖。

常見問題

多個Provider疊加

      這是一個非常基本的功能,畢竟很難用一個Provider滿足用戶的業務要求,比如有一個全球影像,但同時有一副全美人口密度專題圖,是否能夠疊加上去?

      看似簡單,其實里面涉及到很多細節問題,疊加順序涉及到渲染隊列的優先級,兩幅影像的投影不一致怎么辦?如果全美人口密度專題圖不是全球范圍,只是美國范圍,這樣疊加是否能夠准確?

      Cesium很好的解決了這些實際中的問題,簡單說每一個Provider都對應一個tilingScheme,支持經緯度和墨卡托兩種投影方式,默認是全球范圍,用戶也可以指定其范圍,Cesium內部會根據這些參數來實現疊加效果。可以指定每一個ImagerLayer的Style。

clip_image012

       ImageryLayerCollection類是一個圖層管理器,可以調整多個圖層之間的順序,添加和刪除等。詳細內容可以查看Cesium接口文檔或本章的MultiProvider.html范例。

性能

      剛才說了,支持經緯度和墨卡托兩種方式,而且效率都很不錯,那我們該如何選擇呢?當然是有什么就用什么了,但相比而言,經緯度的效率要快一些。可惜墨卡托的影像更豐富一些。為什么經緯度的效率高,這要牽扯到地形數據,以及動態投影的計算,后面在介紹Cesium地形原理時,會詳細的闡述,這里我們只需要知道這個性能考慮因素就可以了。

水印

clip_image014

      有很多人希望去掉這個,很簡單,在js中添加這句話即可(可參考MultiProvider.html范例):

clip_image015


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM