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

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

发布时间:2020-12-15 04:23:32 所属栏目:百科 来源:网络整理
导读:我们看一下天地图经纬度地图的参数 http://t0.tianditu.com/vec_c/wmts?request=GetCapabilitiesservice=wmts 该文件中我们可以获得该WMTS服务详细信息: 首先是坐标系,之前发布1.5的版本中坐标为WGS84,本次2.0版本为 EPSG::4490,即国家2000坐标系。 ? ??

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

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版球面墨卡托地图 . 》中的调用方法 也是可行的。

(编辑:李大同)

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

    推荐文章
      热点阅读