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

相关文章
相关标签/搜索