maptalks 如何加載 ArcGIS 瓦片圖層

最近須要加載 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

相關文章
相關標籤/搜索