使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版本经纬度地图

5 篇文章 0 订阅
4 篇文章 0 订阅

我们看一下天地图经纬度地图的参数

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

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

首先是坐标系,之前发布1.5的版本中坐标为WGS84,本次2.0版本为EPSG::4490,即国家2000坐标系。

   数据范围是:-180.0 -90.0(左下角) 180.0 90.0(右上角)
    片的左上角坐标即原点是:90.0 (纬度)-180.0(经度)
    图层名:vec
  数据格式:tiles
  切片矩阵识别c
   服务模式:KVP
    上述参数非常有用,在调用时需要设置。
    此外还有各个级别切片的详细信息。
    
    下面具体谈一下如何使用agslib加载天地图经纬度地图。
   ArcGIS提供的agslib开发包中提供了esri:WMTSLayer 来调用WMTS服务,但我们调用时,<esri:WMTSLayer serviceMode="KVP" imageFormat="tiles" tileMatrixSetId="c" style="default" layerId="vec" url="http://t0.tianditu.com/vec_c/wmts"/>,地图可以正常显示,当我们将鼠标当前位置的屏幕坐标转换成地图坐标时,却发现北京地区的经纬度竟然是400,-200,很显然是不正确的。应该是和天地图切片的参数有关。
  因此,我们还需要通过继承TiledMapServiceLayer类,自定义获取地图的方法。这里我们定义了类:WMTSCLayer,具体代码如下:
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 WMTSCLayer extends TiledMapServiceLayer
	{
		private var _tileInfo:TileInfo;		
		private var _baseURL:String;
		private var _baseURLs:Array;
		private var _initExtent:String;
		private var _serviceMode:String;
		private var _imageFormat:String;
		private var _layerId:String;
		private var _tileMatrixSetId:String;
		
		public function WMTSCLayer()
		{
			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 serviceMode(pserviceMode:String):void
		{
			_serviceMode = pserviceMode;
		}
		public function set imageFormat(pimageFormat:String):void
		{
			_imageFormat = pimageFormat;
		}
		public function set layerId(playerId:String):void
		{
			_layerId = playerId;
		}
		public function set tileMatrixSetId(ptileMatrixSetId:String):void
		{
			_tileMatrixSetId = ptileMatrixSetId;
		}
		
		override public function get fullExtent() : Extent
		{
			return new Extent(-180, -90, 180, 90, new SpatialReference(4490));
		}
		
		public function set initExtent(initextent:String):void
		{
			this._initExtent = initextent;
		}
		override public function get initialExtent() :Extent
		{
			if (this._initExtent == null)
				return new Extent(70.0, 15.0, 135.0, 55.0, new SpatialReference(4490));    
			var coors:Array = this._initExtent.split(",");
			return new Extent(Number(coors[0]), Number(coors[1]), Number(coors[2]) ,Number(coors[3]), new SpatialReference(4490));
		}
		
		override public function get spatialReference() : SpatialReference
		{
			return new SpatialReference(4490);
		}
		
		override public function get tileInfo() : TileInfo
		{
			return this._tileInfo;
		}
		
		override protected function getTileURL(level:Number, row:Number, col:Number) : URLRequest
		{			
			var urlRequest:String =_baseURL+ "/wmts?Service=WMTS&Request=GetTile&Version=1.0.0" +
				"&Style=Default&Format="+_imageFormat+"&serviceMode="+_serviceMode+"&layer="+_layerId +
				"&TileMatrixSet="+_tileMatrixSetId+"&TileMatrix=" + level + "&TileRow=" + row + "&TileCol=" + col;
			return new URLRequest(urlRequest);	
		}
		
		private function buildTileInfo() : void
		{
			this._tileInfo.height = 256;
			this._tileInfo.width = 256;
			this._tileInfo.origin = new MapPoint(-180, 90);
			this._tileInfo.spatialReference = new SpatialReference(4490);
			this._tileInfo.lods = new Array();
			this._tileInfo.lods = [
                             new LOD(1 , 0.703125,    2.958293554545656E8), 
                             new LOD(2 , 0.351563,    1.479146777272828E8), 
                             new LOD(3 , 0.175781,    7.39573388636414E7),  
                             new LOD(4 , 0.0878906,   3.69786694318207E7),  
                             new LOD(5 , 0.0439453,   1.848933471591035E7), 
                             new LOD(6 , 0.0219727,   9244667.357955175),   
                             new LOD(7 , 0.0109863,   4622333.678977588),   
                             new LOD(8 , 0.00549316,  2311166.839488794),   
                             new LOD(9 , 0.00274658,  1155583.419744397),   
                             new LOD(10, 0.00137329,  577791.7098721985),   
                             new LOD(11, 0.000686646,  288895.85493609926), 
                             new LOD(12, 0.000343323,  144447.92746804963), 
                             new LOD(13, 0.000171661,  72223.96373402482),  
                             new LOD(14, 8.58307e-005, 36111.98186701241),  
                             new LOD(15, 4.29153e-005, 18055.990933506204), 
                             new LOD(16, 2.14577e-005, 9027.995466753102),  
                             new LOD(17, 1.07289e-005, 4513.997733376551),  
                             new LOD(18, 5.36445e-006,, 2256.998866688275) 
			  ];
		}
	}
}
       WMTSCLayer 类中比较重要的方法:
buildTileInfo:依据wmts服务定义每一级切片的resolution和scale;
                           定义切片的原点、坐标系以及图片大小。
       getTileURL:获得当前位置的图片。
      
     最后我们看一下调用效果
     具体调用方法如下:
   <conponent:WMTSCLayer id="baseMap"  baseURL="
http://t0.tianditu.com/vec_c/wmts" serviceMode="KVP" imageFormat="tiles" tileMatrixSetId="c" layerId="vec"/> 
     不同图层的调用 需要修改baseURL、 tileMatrixSetId和layerId三个参数。比如地图注记图层应该这样调用
<  <conponent:WMTSCLayer  id="baseMapAno" baseURL="http://t0.tianditu.com/cva_c/wmts" serviceMode="KVP" imageFormat="tiles" tileMatrixSetId="c" layerId="cva"/> 
     
      经验证 代码中的方法:getTileURL修改成《使用ArcGIS Server for Flex API 开发包agslib加载天地图2.0版球面墨卡托地图 . 》中的调用方法 也是可行的。

 
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值