我们看一下天地图经纬度地图的参数
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;
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版球面墨卡托地图 . 》中的调用方法 也是可行的。