加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版球

发布时间:2020-12-15 04:23:29 所属栏目:百科 来源:网络整理
导读:和上篇《 使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版本经纬度地图 》一样,我们先看一下天地图球面墨卡托地图的参数 http://t0.tianditu.com/vec_w/wmts?request=GetCapabilitiesservice=wmts 该文件中我们可以获得该WMTS服务详细信息: ?

和上篇《使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版本经纬度地图》一样,我们先看一下天地图球面墨卡托地图的参数

http://t0.tianditu.com/vec_w/wmts?request=GetCapabilities&service=wmts

该文件中我们可以获得该WMTS服务详细信息:

?坐标系:EPSG::3857。

???数据范围是:-20037508.3427892 -20037508.3427892(左下角)?20037508.3427892 20037508.3427892(右上角)
???片的左上角:20037508.3427892 -20037508.3427892 ???
???图层名:vec
??数据格式:tiles
??切片矩阵识别w
???服务模式:KVP
??? 此外还有各个级别切片的详细信息,包括切片的左上角坐标,比例尺,图片大小。
????
??? 下面具体谈一下如何使用agslib加载天地图球面墨卡托地图。
?? ArcGIS提供的agslib开发包中提供了esri:WMTSLayer 来调用WMTS服务,但我们调用时,<esri:WMTSLayer serviceMode="KVP" imageFormat="tiles" tileMatrixSetId="w" style="default" layerId="vec" url="http://t0.tianditu.com/vec_w/wmts"/>,地图可以正常显示,当我们缩小地图时,发现地图右侧和下方有没有切片的蓝色区域,见图下方的图,

????仔细查看地图四至的坐标,发现左侧和上方都是正确的,分别为-20037508.3427892 和20037508.3427892,右侧和下方则分别是22******,-22******。应该是和天地图切片的参数有关。
???? 因此,我们还需要通过继承TiledMapServiceLayer类,自定义获取地图的方法。这里我们定义了类:WMTSWLayer,具体代码如下:
package com.conponents
{
	import com.esri.ags.SpatialReference;
	import com.esri.ags.geometry.Extent;
	import com.esri.ags.geometry.MapPoint;
	import com.esri.ags.layers.TiledMapServiceLayer;
	import com.esri.ags.layers.supportClasses.LOD;
	import com.esri.ags.layers.supportClasses.TileInfo;
	
	import flash.net.URLRequest;
	
	public class WMTSWLayer extends TiledMapServiceLayer
	{
		private var _tileInfo:TileInfo;		
		private var _baseURL:String;
		private var _initExtent:String;
		private var _layerId;
	
	
		public function WMTSWLayer()
		{
			this._tileInfo = new TileInfo();
			this._initExtent = null;
			this.buildTileInfo();
			setLoaded(true);
		}
		
		
		public function set baseURL(pbaseurl:String):void
		{
			_baseURL = pbaseurl;
		}
		public function set baseURLs(pbaseurls:Array):void
		{
			_baseURLs = pbaseurls;
		}
		
		public function set layerId(playerId:String):void
		{
			_layerId = playerId;
		}
		
		override public function get fullExtent() : Extent
		{
			return new Extent(-20037508.3427892,-20037508.3427892,20037508.3427892,new SpatialReference(3857));
		}
		
		public function set initExtent(initextent:String):void
		{
			this._initExtent = initextent;
		}
		override public function get initialExtent() :Extent
		{
			if (this._initExtent == null)
				return new Extent(-20037508.3427892,new SpatialReference(3857));    
			var coors:Array = this._initExtent.split(",");
			return new Extent(Number(coors[0]),Number(coors[1]),Number(coors[2]),Number(coors[3]),new SpatialReference(3857));
		}
		
		override public function get spatialReference() : SpatialReference
		{
			return new SpatialReference(3857);
		}
		
		override public function get tileInfo() : TileInfo
		{
			return this._tileInfo;
		}	
		override protected function getTileURL(level:Number,row:Number,col:Number) : URLRequest
		{			
			var urlRequest:String =_baseURL+"/DataServer?T="+_layerId+"&x="+col+"&y="+row+"&l="+level;
			return new URLRequest(urlRequest);	
		}
		
		private function buildTileInfo() : void
		{
			this._tileInfo.height = 256;
			this._tileInfo.width = 256;
			this._tileInfo.origin = new MapPoint(-20037508.3427892,new SpatialReference(3857));
			this._tileInfo.spatialReference = new SpatialReference(3857);
			this._tileInfo.lods = new Array();
			this._tileInfo.lods = [
				new LOD(1,77664.761018562790697674418604651,2.958293554545656E8),new LOD(2,38832.380509281395348837209302326,1.479146777272828E8),new LOD(3,19416.190254640697674418604651163,7.39573388636414E7),new LOD(4,9708.0951273203488372093023255814,3.69786694318207E7),new LOD(5,4854.0475636601744186046511627907,1.848933471591035E7),new LOD(6,2427.0237818300872093023255813953,9244667.357955175),new LOD(7,1213.5118909150436046511627906977,4622333.678977588),new LOD(8,606.75594545752180232558139534884,2311166.839488794),new LOD(9,303.37797272876090116279069767442,1155583.419744397),new LOD(10,151.68898636438045058139534883721,577791.7098721985),new LOD(11,75.844493182190225290697674418605,288895.85493609926),new LOD(12,37.922246591095112645348837209302,144447.92746804963),new LOD(13,18.961123295547556322674418604651,72223.96373402482),new LOD(14,9.4805616477737781613372093023256,36111.98186701241),new LOD(15,4.7402808238868890806686046511628,18055.990933506204),new LOD(16,2.3701404119434445403343023255814,9027.995466753102),new LOD(17,1.1850702059717222701671511627907,4513.997733376551),new LOD(18,0.59253510298586113508357558139535,2256.998866688275)  
			];
		}
	}
}

?????将上述代码和上篇使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版本经纬度地图 》中代码比较,主要是buildTileInfo和getTileURL有所不同。
_????? 缺少了_tileMatrixSetId、_imageFormat、_serviceMode等变量;
???? buildTileInfo方法中重新计算了每一级图层rsolution值,scale值是直接使用的wmts服务中的值;
???? getTileURL方法中的请求和之前的不同并没有使用 _tileMatrixSetId、_imageFormat、_serviceMode等参数。
??? 笔者经过测试若使用上篇WMTSCLayer中的getTileURL方法,显示效果和esri:WMTSLayer一样(见上图),地图右侧和下方会有蓝色的空白图片,但与esri:WMTSLayer不同的是,地图四至坐标发生了变化,左:-199*****,下:-199*****,右:199*****,上:199*****。显然坐标是不正确的。
?
?????具体WMTSWLayer图层的方法如下:
??? <conponents:WMTSWLayer id="baseMap"? baseURL=" http://t0.tianditu.com " layerId="vec_w"/>?
??? 注意 baseURL值和调用经纬度不同

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读