文章中相關范例下載路徑:https://yunpan.cn/cByQqkANWN7Pu 訪問密碼 823d
Cesium中提供了多種ImageryProvider方式,來滿足用戶的實際需求,但作為天朝的一份子,可惜的是,看似很多,但最終的選擇卻又是捉襟見肘。如果是國內數據,個人認為天地圖的不錯,其他的地圖都有偏移,但天地圖的數據在國外有欠缺,假如你有一個模型數據或者地形數據,恰好是國外的某一個城市,比如馬賽等,天地圖就滿足不了這種場景,而Bing的地圖則面臨Key,國內數據清晰度等問題,而Google的數據則有很多不確定性,所以,除非很難有一種影像服務來實現一種大而全的效果。這不是技術問題,在此提出,就看實際中智者見智了。
影像服務綜述
我們回到Cesium的影像服務上,如下是Cesium中BaseLayerPicker控件提供的各類影像服務:
如上可以看到,主要是Bing、Mapbox以及OpenStreetMap,以及ESRI四家地圖服務,包括影像,影像+注記以及矢量三種形式。個人而言,Bing的地圖不錯,算是大而全,但需要Key,感覺偶爾會抽風,Mapbox是我非常喜歡的一家公司,很文藝,但和OSM一樣,訪問速度欠佳,而ESRI偶爾會有訪問權限的問題,也不太適合作為全球級別的影像服務。其他幾個要么我沒用過,要么感覺不走尋常路。一不小心全給否的節奏。
Cesium目前支持的影像服務類型有:
- ArcGisMapServerImageryProvider
支持ArcGIS Online和Server的相關服務 - BingMapsImageryProvider
Bing地圖影像,可以指定mapStyle,詳見BingMapsStyle類 - createOpenStreetMapImageryProvider
OSM影像服務,根據不同的url選擇不同的風格 - createTileMapServiceImageryProvider
看文檔是根據MapTiler規范,貌似是可以自己下載瓦片,發布服務,類似ArcGIS影像服務的過程 - GoogleEarthImageryProvider
企業級服務,沒有用過 - ImageryProvider
基類,所有的影像服務最終都基於此類,如果你需要擴展新的Provider也會繼承該類 - MapboxImageryProvider
Mapbox影像服務,根據mapId指定地圖風格 - SingleTileImageryProvider
單張圖片的影像服務,適合離線數據或對影像數據要求並不高的場景下 - UrlTemplateImageryProvider
指定url的format模版,方便用戶實現自己的Provider,比如國內的高德,騰訊等影像服務,url都是一個固定的規范,都可以通過該Provider輕松實現。而OSM也是通過該類實現的。 - WebMapServiceImageryProvider
符合WMS規范的影像服務都可以通過該類封裝,指定具體參數實現 - WebMapTileServiceImageryProvider
服務WMTS1.0.0規范的影像服務,都可以通過該類實現,比如國內的天地圖 - TileCoordinatesImageryProvider
渲染每一個瓦片的圍,方便調試 - GridImageryProvider
渲染每一個瓦片內部的格網,了解每個瓦片的精細度
創建影像服務
ArcGisMapServerImageryProvider
Cesium提供了ArcGisMapServerImageryProvider,可以方便的加載ArcGIS online和Server上的數據。
首先獲取該影像服務的地址,下面以ESRI_Imagery_World_2D為例,WGS1984坐標系,全球范圍,只需要指定url,就可以在Cesium下快速加載該服務。
備注:在不通過控件指定影像服務時,需要指定baseLayerPicker為false,否則會報錯。
BingMapsImageryProvider
Cesium中提供了BingMapsImageryProvider。使用方式和ArcGIS一樣簡單,代碼如下:
其中可以指定mapStyle,選擇多種風格,目前Cesium中支持AERIAL、AERIAL_WITH_LABELS、ROAD、ORDNANCE_SURVEY、COLLINS_BART五種。
createOpenStreetMapImageryProvider
Cesium中提供了加載OpenStreetMap的Provider,代碼如下:
另外,Cesium還提供了基於OSM的另外兩個服務地址,可供加載:watercolor、toner。在三維影像服務中,因為LOD的策略,可能會出現相鄰的Tile中Z值不相同,大部分情況下不會導致問題,但有時候,可能相交處是文字,則可能會出現半個字的問題。因此,在三維中加載矢量的影像服務,還是有不少局限性的。
MapboxImageryProvider
Cesium提供了MapBox的加載方式,個人認為MapBox的地圖非常清新,還是一個不錯的選擇。同時提供了mapbox.satellite、mapbox.streets、mapbox.streets-basic三種風格,代碼如下:
SingleTileImageryProvider
如果你對影像數據沒有過多要求,或者是在離線環境下,SingleTileImageryProvider應該能夠滿足你的需要,只需要一張本地的圖片,就可以創建影像服務。代碼如下:
url可以是相對該頁面的相對路徑,也可以是一個http的鏈接形式。因為該Provider僅支持經緯度投影,圖片寬高比最好為2:1,否則會有拉伸。
另外,我們還可以在這個Provider上多做一些文章,比如搞一張透明的圖片,達到一些虛幻的效果,或者在近地面實現一種類似平面的瀏覽效果,畢竟2D和3D在相機,數據單位上是有區別的。
比如隱藏地球主體后,疊加一些矢量面,突出主題.代碼如下:
至此,Cesium中默認支持的影像服務,我們都有所涉及,並對最常用的這五類做了專門介紹和事例,下篇會基於Cesium提供的基類擴展Google,Baidu,天地圖等影像服務,以及實際應用中的一些問題,比如多地圖疊加,地圖范圍以及性能等。