最近須要加載 ArcGIS 瓦片圖層,運行官網加載 ArcGIS 瓦片圖層的 demo 是沒有問題的。若是把 ArcGIS 瓦片圖層 URL 換成是自已發佈的 ArcGIS 地圖服務,發現加載不出來,而服務自己提供的 ArcGIS API 卻能夠加載出來。究竟是哪裏的問題呢,因而便試着寫了個自定義擴展方法 ArcGISTileLayer 用來加載 ArcGIS 瓦片圖層。javascript
一、分析 ArcGIS API 的 URLhtml
打開瀏覽器的 Networkjava
發現 URL 參數是由 dpi 、bboxSR、imageSR、size、transparent、format、f 、bbox 幾個參數構成。多分析幾條 URL 數據會發現,URL 參數中 dpi 、bboxSR、imageSR、size、transparent、format、f 這幾個參數是固定不變的。只有 bbox 在變更。那麼,若是咱們手動計算 bbox 並拼接參數,是否是就能夠實現加載 ArcGIS 瓦片圖層了。git
二、編寫第一個版本 ,核心代碼以下 ( 完整代碼 )github
var defaultArcParams = {
dpi: '90',
bboxSR: '4326',
imageSR: '4326',
size: '512,512',
transparent: true,
format: 'png32',
f:'image'
};
ArcGISTileLayer.prototype.getTileUrl = function getTileUrl(x, y, z) {
var res = this.getSpatialReference().getResolution(z),
tileConfig = this._getTileConfig(),
tileExtent = tileConfig.getTilePrjExtent(x, y, res);
var max = tileExtent.getMax(),
min = tileExtent.getMin();
var bbox = [min.x, min.y, max.x, max.y].join(',');
var url = _TileLayer.prototype.getTileUrl.call(this, x, y, z);
return url + getParamString(defaultArcParams, url, false) + '&bbox=' + bbox;
};
複製代碼
把官網的 demo 改造下,發現果真能夠順利加載 ArcGIS 瓦片圖層,心中一陣高興,原來加載 ArcGIS 瓦片圖層這麼簡單。立刻把本身發佈的 ArcGIS 地圖服務試下,發現加載不了。從新分析下 ArcGIS API 的 URL,最終發現只有 dpi 、transparent、format、f 這四個參數是不變,其餘的參數 bboxSR ( EPSG )、imageSR( EPSG )、size ( 切片大小 )、bbox( tileExtent ) 都是須要根據服務動態計算的。瀏覽器
三、完善版本測試
var defaultArcParams = {
dpi: '90',
transparent: true,
format: 'png32',
f:'image'
};
ArcGISTileLayer.prototype.getTileUrl = function getTileUrl(x, y, z) {
var res = this.getSpatialReference().getResolution(z),
tileConfig = this._getTileConfig(),
tileExtent = tileConfig.getTilePrjExtent(x, y, res);
var max = tileExtent.getMax(),
min = tileExtent.getMin();
var bbox = [min.x, min.y, max.x, max.y].join(',');
var pro = this.getSpatialReference().getProjection()
var srid = pro.code.split(':').pop();
this.arcParams['bboxSR'] = srid;
this.arcParams['imageSR'] = srid;
var tileSize = this.getTileSize();
this.arcParams['size'] = tileSize.width + ',' + tileSize.height;
var url = _TileLayer.prototype.getTileUrl.call(this, x, y, z);
return url + getParamString(this.arcParams, url, false) + '&bbox=' + bbox;
};
複製代碼
測試下本身發佈的 ArcGIS 地圖服務,成功加載。this