使用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版球面墨卡托地图 . 》中的调用方法 也是可行的。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |