maptalks 如何加載 ArcGIS 瓦片圖層

最近須要加載 ArcGIS 瓦片圖層,運行官網加載 ArcGIS 瓦片圖層的 demo 是沒有問題的。若是把 ArcGIS 瓦片圖層 URL 換成是自已發佈的 ArcGIS 地圖服務,發現加載不出來,而服務自己提供的 ArcGIS API 卻能夠加載出來。究竟是哪裏的問題呢,因而便試着寫了個自定義擴展方法 ArcGISTileLayer 用來加載 ArcGIS 瓦片圖層。html

一、分析 ArcGIS API 的 URLgit

打開瀏覽器的 Networkgithub

發現 URL 參數是由 dpi 、bboxSR、imageSR、size、transparent、format、f 、bbox 幾個參數構成。多分析幾條 URL 數據會發現,URL 參數中 dpi 、bboxSR、imageSR、size、transparent、format、f 這幾個參數是固定不變的。只有 bbox 在變更。那麼,若是咱們手動計算 bbox 並拼接參數,是否是就能夠實現加載 ArcGIS 瓦片圖層了。瀏覽器

 二、編寫第一個版本 ,核心代碼以下 ( 完整代碼 )測試

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 ) 都是須要根據服務動態計算的。this

三、完善版本url

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 地圖服務,成功加載。spa

相關文章
相關標籤/搜索