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