cesiumjs中可定製多種圖層,能夠使用www上不少地圖提供商的圖層數據,也能夠使用本身的地圖數據。cesiumjs的地圖圖層本質上是一些瓦片數據。javascript
對於地圖瓦片數據,OGC(Open Geospatial Consortium開放地理聯盟)有不少標準,如TMS、WMTS、各個商業公司也有本身的內部標準。html
若是須要本身提供地圖圖層數據,就須要本身實現一個imageryProvider並賦予viewer的imageryProvider屬性。
java
好比樓主本地有一個支持WMTS1.0 的server提供的service,爲了使cesium能消費這個service提供的數據,樓主的WMTSImageryProvider.js實現以下:ide
var WMTSImageryProvider = function WMTSImageryProvider(description) { var trailingSlashRegex = /\/$/; var defaultCredit = new Cesium.Credit('WMTS'); description = Cesium.defaultValue(description, {}); var url = Cesium.defaultValue(description.url, 'http://localhost:88/wmts'); if (!trailingSlashRegex.test(url)) { } this._url = url; this._fileExtension = Cesium.defaultValue(description.fileExtension, 'png'); this._proxy = description.proxy; this._tileDiscardPolicy = description.tileDiscardPolicy; this._tilingScheme = new Cesium.WebMercatorTilingScheme({ numberOfLevelZeroTilesX : 1, numberOfLevelZeroTilesY : 1 }); this._tileWidth = 256; this._tileHeight = 256; this._minimumLevel = Cesium.defaultValue(description.minimumLevel, 0); this._maximumLevel = Cesium.defaultValue(description.maximumLevel, 17); this._extent = Cesium.defaultValue(description.extent, this._tilingScheme.extent); this._rectangle = Cesium.defaultValue(description.rectangle, this._tilingScheme.rectangle); this._errorEvent = new Cesium.Event(); this._ready = true; var credit = Cesium.defaultValue(description.credit, defaultCredit); if (typeof credit === 'string') { credit = new Cesium.Credit(credit); } this._credit = credit; }; //這個函數須要本身實現特定地圖服務的url拼接,這裏使用的是WMTS1.0的傳統URL風格 function buildImageUrl(imageryProvider, x, y, level) { var zoom = level + 1; var url = imageryProvider._url ; url += '?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile'; url += '&LAYER=' + ''; url += '&STYLE=' + ''; url += '&TILEMATRIXSET=' + 'YN_SAT'; url += '&TILEMATRIX=' + zoom ; url += '&TILEROW=' + y ; url += '&TILECOL=' + x ; url += '&FORMAT=' + imageryProvider._fileExtension; var proxy = imageryProvider._proxy; if (Cesium.defined(proxy)) { url = proxy.getURL(url); } return url; } Cesium.defineProperties(WMTSImageryProvider.prototype, { url : { get : function() { return this._url; } }, proxy : { get : function() { return this._proxy; } }, tileWidth : { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('tileWidth must not be called before the imagery provider is ready.'); } return this._tileWidth; } }, tileHeight: { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('tileHeight must not be called before the imagery provider is ready.'); } return this._tileHeight; } }, maximumLevel : { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('maximumLevel must not be called before the imagery provider is ready.'); } return this._maximumLevel; } }, minimumLevel : { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('minimumLevel must not be called before the imagery provider is ready.'); } return this._minimumLevel; } }, tilingScheme : { get : function() { if (!this._ready) { throw new DeveloperError('tilingScheme must not be called before the imagery provider is ready.'); } return this._tilingScheme; } }, extent : { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('extent must not be called before the imagery provider is ready.'); } return this._extent; } }, rectangle : { get : function() { if (!this._ready) { throw new DeveloperError('rectangle must not be called before the imagery provider is ready.'); } return this._rectangle; } }, tileDiscardPolicy : { get : function() { if (!this._ready) { throw new Cesium.DeveloperError('tileDiscardPolicy must not be called before the imagery provider is ready.'); } return this._tileDiscardPolicy; } }, errorEvent : { get : function() { return this._errorEvent; } }, ready : { get : function() { return this._ready; } }, credit : { get : function() { return this._credit; } } }); WMTSImageryProvider.prototype.getTileCredits = function(x, y, level) { return undefined; }; WMTSImageryProvider.prototype.requestImage = function(x, y, level) { if (!this._ready) { throw new Cesium.DeveloperError('requestImage must not be called before the imagery provider is ready.'); } var url = buildImageUrl(this, x, y, level); return Cesium.ImageryProvider.loadImage(this, url); };
而後調用以下:函數
var viewer = new Cesium.Viewer('cesiumContainer',{ imageryProvider:new WMTSImageryProvider({ url : '/wmts', }) });
別忘了在HTML頁head裏包含進去(樓主未使用AMD規範):ui
<script type="text/javascript" src="js/CesiumUnminified/Cesium.js"></script> <script type="text/javascript" src="js/WMTSImageryProvider.js"></script>
以上就是一個簡單的擴充cesiumjs地圖圖層的例子。下一篇《cesiumjs開發實踐(四) 地形介紹》
this