http://www.cnblogs.com/chenyuming507950417/
Flex加載google地圖、百度地圖以及天地圖作底圖
一 Flex加載Google地圖作底圖
(1)幫助類GoogleLayer.as
/* * 根據輸入的地圖類型加載Google地圖(by chenyuming) */ package Layers { 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 GoogleLayer extends TiledMapServiceLayer { private var _tileInfo:TileInfo=new TileInfo(); private var _baseURL:String=""; private var MapStyle:String=""; public function GoogleLayer(mapStyle:String) { this.MapStyle=mapStyle; super(); buildTileInfo(); setLoaded(true); } override public function get fullExtent():Extent { return new Extent(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787, new SpatialReference(102113)); } override public function get initialExtent():Extent { return new Extent(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787, new SpatialReference(102113)); } override public function get spatialReference():SpatialReference { return new SpatialReference(102113); } override public function get tileInfo():com.esri.ags.layers.supportClasses.TileInfo { return _tileInfo; } override protected function getTileURL(level:Number, row:Number, col:Number):URLRequest { var s:String = "Galileo".substring(0, ((3 * col + row) % 8)); var url:String =""; if (this.MapStyle == "Vector")//獲取矢量地圖 { url = "http://mt" + (col % 4) + ".google.com/vt/lyrs=m@158000000&hl=zh-CN&gl=cn&" + "x=" + col + "&" + "y=" + row + "&" + "z=" + level + "&" + "s=" + s; } else if (this.MapStyle == "Terrain")//獲取地形圖 { url = "http://mt" + (col % 4) + ".google.cn/vt/lyrs=t@131,r@227000000&hl=zh-CN&gl=cn&" + "x=" + col + "&" + "y=" + row + "&" + "z=" + level + "&" + "s=" + s; } else if (this.MapStyle == "Image")//獲取影像地圖 { url = "http://mt" + (col % 4) + ".google.com/vt/lyrs=s&hl=en&gl=en&" + "x=" + col + "&" + "y=" + row + "&" + "z=" + level + "&" + "s=" + s; } else if (this.MapStyle == "POI")//獲取道路等POI,和影像地圖配合使用 { url = "http://mt" + (col % 4) + ".google.com/vt/imgtp=png32&lyrs=h@169000000&hl=zh-CN&gl=cn&" + "x=" + col + "&" + "y=" + row + "&" + "z=" + level + "&" + "s=" + s; } return new URLRequest(url); } public function set url(vals:String):void { this._baseURL = vals; } private function buildTileInfo():void { _tileInfo.height=256; _tileInfo.width=256; _tileInfo.origin=new MapPoint(-20037508.342787, 20037508.342787); _tileInfo.spatialReference=new SpatialReference(102113); _tileInfo.lods = [ new LOD(0, 156543.033928, 591657527.591555), new LOD(1, 78271.5169639999, 295828763.795777), new LOD(2, 39135.7584820001, 147914381.897889), new LOD(3, 19567.8792409999, 73957190.948944), new LOD(4, 9783.93962049996, 36978595.474472), new LOD(5, 4891.96981024998, 18489297.737236), new LOD(6, 2445.98490512499, 9244648.868618), new LOD(7, 1222.99245256249, 4622324.434309), new LOD(8, 611.49622628138, 2311162.217155), new LOD(9, 305.748113140558, 1155581.108577), new LOD(10, 152.874056570411, 577790.554289), new LOD(11, 76.4370282850732, 288895.277144), new LOD(12, 38.2185141425366, 144447.638572), new LOD(13, 19.1092570712683, 72223.819286), new LOD(14, 9.55462853563415, 36111.909643), new LOD(15, 4.77731426794937, 18055.954822), new LOD(16, 2.38865713397468, 9027.977411), new LOD(17, 1.19432856685505, 4513.988705), new LOD(18, 0.597164283559817, 2256.994353), new LOD(19, 0.298582141647617, 1128.497176) ]; } public function lon2Mercator(px:int):int { var x:int = px * 20037508.34 / 180; return x; } public function lat2Mercator(py:int):int { var y:int; y = Math.log(Math.tan((90 + py) * Math.PI / 360)) / (Math.PI / 180); y = y * 20037508.34 / 180; return y; } } }
(2)引用方法
//加載google地圖 var baseLayer:GoogleLayer = new GoogleLayer("Image") baseMap.addLayer(baseLayer);
二 Flex加載百度地圖作底圖
(1)幫助類BaiduLayer.as
/* * 根據輸入的地圖類型加載百度地圖(by chenyuming) */ package Layers { 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; import flashx.textLayout.formats.Float; public class BaiduLayer extends TiledMapServiceLayer { //成員變量 private var _tileInfo:TileInfo = new TileInfo(); private var _wkid:int = 102100; private var cornerCoordinate:Number = 20037508.3427892; private var _mapStyle:String = "Image"; private var _initialExtent:Extent; public function BaiduLayer(mapStyle:String) { this._mapStyle = mapStyle; super(); buildTileInfo(); // to create our hardcoded tileInfo setLoaded(true); // Map will only use loaded layers } // 全屏范圍 override public function get fullExtent():Extent { return new Extent(-cornerCoordinate, -cornerCoordinate, cornerCoordinate, cornerCoordinate, new SpatialReference(_wkid)); } // 初始化范圍 (左下角坐標,右上角坐標) override public function get initialExtent():Extent { return new Extent(5916776.8, 1877209.3, 19242502.6, 7620381.8, new SpatialReference(102100)); } // 空間參考系 override public function get spatialReference():SpatialReference { return new SpatialReference(_wkid); } override public function get tileInfo():TileInfo { return _tileInfo; } override protected function getTileURL(level:Number, row:Number, col:Number):URLRequest { var zoom:int = level - 1; var offsetX:int = Math.pow(2, zoom) as int; var offsetY:int = offsetX - 1; var numX:int = col - offsetX; var numY:int = (-row) + offsetY; zoom = level + 1; var num:int = (col + row) % 8 + 1; var url:String = null; if (_mapStyle == "Vector") //獲取矢量地圖 { url = "http://q"+num+".baidu.com/it/u=x="+numX+";y="+ numY + ";z=" + zoom + ";v=013;type=web&fm=44"; } else if (_mapStyle == "Image") //影像地圖 { url = "http://q"+num+".baidu.com/it/u=x="+numX+";y="+numY+";z="+zoom+";v=009;type=sate&fm=46"; } else if (_mapStyle == "POI") //獲取道路等POI,和影像地圖配合使用 { url = "http://q"+num+".baidu.com/it/u=x="+numX+";y="+numY+";z="+zoom+";v=013;type=trans&fm=47"; } return new URLRequest(url); } // 自定義方法,定義地圖縮放等級 private function buildTileInfo():void { _tileInfo.height=256; _tileInfo.width=256; _tileInfo.origin=new MapPoint(-cornerCoordinate, cornerCoordinate); _tileInfo.spatialReference=new SpatialReference(_wkid); _tileInfo.lods = [ new LOD(0, 156543.033928, 591657527.591555), new LOD(1, 78271.5169639999, 295828763.795777), new LOD(2, 39135.7584820001, 147914381.897889), new LOD(3, 19567.8792409999, 73957190.948944), new LOD(4, 9783.93962049996, 36978595.474472), new LOD(5, 4891.96981024998, 18489297.737236), new LOD(6, 2445.98490512499, 9244648.868618), new LOD(7, 1222.99245256249, 4622324.434309), new LOD(8, 611.49622628138, 2311162.217155), new LOD(9, 305.748113140558, 1155581.108577), new LOD(10, 152.874056570411, 577790.554289), new LOD(11, 76.4370282850732, 288895.277144), new LOD(12, 38.2185141425366, 144447.638572), new LOD(13, 19.1092570712683, 72223.819286), new LOD(14, 9.55462853563415, 36111.909643), new LOD(15, 4.77731426794937, 18055.954822), new LOD(16, 2.38865713397468, 9027.977411), new LOD(17, 1.19432856685505, 4513.988705), new LOD(18, 0.597164283559817, 2256.994353), new LOD(19, 0.298582141647617, 1128.497176) ]; } } }
(2)引用方法
//加載百度地圖 var baseLayer:BaiduLayer = new BaiduLayer("Image"); var POILayer:BaiduLayer = new BaiduLayer("POI"); baseMap.addLayer(baseLayer); baseMap.addLayer(POILayer);
三 Flex加載天地圖作底圖(經緯度投影)
(1)幫助類TianDiTuLayer.as
/* * 根據輸入的地圖類型加載天地圖(by chenyuming) * 注意:投影類型為經緯度 */ package Layers { import com.esri.ags.SpatialReference; import com.esri.ags.geometry.Extent; import com.esri.ags.geometry.MapPoint; import com.esri.ags.layers.ArcGISDynamicMapServiceLayer; import com.esri.ags.layers.TiledMapServiceLayer; import com.esri.ags.layers.supportClasses.LOD; import com.esri.ags.layers.supportClasses.TileInfo; import flash.net.URLRequest; import flash.sampler.Sample; public class TianDiTuLayer 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; private var _mapStyle:String=""; public function TianDiTuLayer(mapStyle:String,serviceMode:String = "KVP",imageFormat:String = "tiles") { this._mapStyle=mapStyle;//設置地圖類型 this._serviceMode = serviceMode; this._imageFormat = imageFormat; super(); this._tileInfo = new TileInfo(); this._initExtent = null; this.buildTileInfo(); setLoaded(true); } 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; } //根據不同地圖類型加載不同WMTS服務 override protected function getTileURL(level:Number, row:Number, col:Number) : URLRequest { if(this._mapStyle == "ImageBaseMap")//獲取影像地圖(底圖) { _baseURL = "http://t0.tianditu.com/img_c/wmts"; _layerId = "img"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "ImageCNNote")//獲取影像地圖(中文注記) { _baseURL = "http://t0.tianditu.com/cia_c/wmts"; _layerId = "cia"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "ImageENNote")//獲取影像地圖(英文注記) { _baseURL = "http://t0.tianditu.com/eia_c/wmts"; _layerId = "eia"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "TerrainBaseMap")//獲取地形圖(底圖) { _baseURL = "http://t0.tianditu.com/ter_c/wmts"; _layerId = "ter"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "TerrainCNNote")//獲取地形圖(中文注記) { _baseURL = "http://t0.tianditu.com/cta_c/wmts"; _layerId = "cta"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "TerrainENNote")//獲取地形圖(英文注記) { //暫無 } else if(this._mapStyle == "VectorBaseMap")//獲取矢量圖(底圖) { _baseURL = "http://t0.tianditu.com/vec_c/wmts"; _layerId = "vec"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "VectorCNNote")//獲取矢量圖(中文注記) { _baseURL = "http://t0.tianditu.com/cva_c/wmts"; _layerId = "cva"; _tileMatrixSetId = "c"; } else if(this._mapStyle == "VectorENNote")//獲取矢量圖(英文注記) { _baseURL = "http://t0.tianditu.com/eva_c/wmts"; _layerId = "eva"; _tileMatrixSetId = "c"; } 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) ]; } } }
(2)引用方法
//加載天地圖(經緯度投影) var baseLayer:TianDiTuLayer = new TianDiTuLayer("VectorBaseMap")//天地圖底圖 var CNNoteLayer:TianDiTuLayer = new TianDiTuLayer("VectorCNNote");//中文注記 baseMap.addLayer(baseLayer); baseMap.addLayer(CNNoteLayer);
四 Flex加載天地圖作底圖(球面墨卡托投影)
(1)幫助類TianDiTuLayerMercator.as
/* * 根據輸入的地圖類型加載天地圖(by chenyuming) * 注意:投影類型為球形墨卡托 */ package Layers { import com.esri.ags.SpatialReference; import com.esri.ags.geometry.Extent; import com.esri.ags.geometry.MapPoint; import com.esri.ags.layers.ArcGISDynamicMapServiceLayer; import com.esri.ags.layers.TiledMapServiceLayer; import com.esri.ags.layers.supportClasses.LOD; import com.esri.ags.layers.supportClasses.TileInfo; import flash.net.URLRequest; import flash.sampler.Sample; public class TianDiTuLayerMercator extends TiledMapServiceLayer { private var _tileInfo:TileInfo; private var _baseURL:String; private var _baseURLs:Array; private var _initExtent:String; private var _layerId:String; private var _mapStyle:String=""; public function TianDiTuLayerMercator(mapStyle:String) { this._mapStyle=mapStyle;//設置地圖類型 super(); this._tileInfo = new TileInfo(); this._initExtent = null; this.buildTileInfo(); setLoaded(true); } override public function get fullExtent() : Extent { return new Extent(-20037508.3427892,-20037508.3427892, 20037508.3427892,20037508.3427892, new SpatialReference(3857)); } public function set initExtent(initextent:String):void { this._initExtent = initextent; } override public function get initialExtent() :Extent { if (this._initExtent == null) return new Extent(8397502.3, 2660018.1, 15003861.0, 5509344.0, new SpatialReference(3857)); var coors:Array = this._initExtent.split(","); return new Extent(Number(coors[0]), Number(coors[1]), Number(coors[2]) ,Number(coors[3]), new SpatialReference(3857)); } override public function get spatialReference() : SpatialReference { return new SpatialReference(3857); } override public function get tileInfo() : TileInfo { return this._tileInfo; } //根據不同地圖類型加載不同WMTS服務 override protected function getTileURL(level:Number, row:Number, col:Number) : URLRequest { _baseURL = "http://t0.tianditu.com"; if(this._mapStyle == "ImageBaseMap")//獲取影像地圖(底圖) { _layerId = "img_w"; } else if(this._mapStyle == "ImageCNNote")//獲取影像地圖(中文注記) { _layerId = "cia_w"; } else if(this._mapStyle == "ImageENNote")//獲取影像地圖(英文注記) { _layerId = "eia_w"; } else if(this._mapStyle == "TerrainBaseMap")//獲取地形圖(底圖) { _layerId = "ter_w"; } else if(this._mapStyle == "TerrainCNNote")//獲取地形圖(中文注記) { _layerId = "cta_w"; } else if(this._mapStyle == "TerrainENNote")//獲取地形圖(英文注記) { //暫無 } else if(this._mapStyle == "VectorBaseMap")//獲取矢量圖(底圖) { _layerId = "vec_w"; } else if(this._mapStyle == "VectorCNNote")//獲取矢量圖(中文注記) { _layerId = "cva_w"; } else if(this._mapStyle == "VectorENNote")//獲取矢量圖(英文注記) { _layerId = "eva_w"; } var urlRequest:String =_baseURL+"/DataServer?T="+_layerId+"&x="+col+"&y="+row+"&l="+level; return new URLRequest(urlRequest); } //切片信息 private function buildTileInfo() : void { this._tileInfo.height = 256; this._tileInfo.width = 256; this._tileInfo.origin = new MapPoint(-20037508.3427892,20037508.3427892,new SpatialReference(3857)); this._tileInfo.spatialReference = new SpatialReference(3857); this._tileInfo.lods = new Array(); this._tileInfo.lods = [ new LOD(1 ,77664.761018562790697674418604651, 2.958293554545656E8), new LOD(2 ,38832.380509281395348837209302326, 1.479146777272828E8), new LOD(3 ,19416.190254640697674418604651163, 7.39573388636414E7), new LOD(4 ,9708.0951273203488372093023255814, 3.69786694318207E7), new LOD(5 ,4854.0475636601744186046511627907, 1.848933471591035E7), new LOD(6 ,2427.0237818300872093023255813953, 9244667.357955175), new LOD(7 ,1213.5118909150436046511627906977, 4622333.678977588), new LOD(8 ,606.75594545752180232558139534884, 2311166.839488794), new LOD(9 ,303.37797272876090116279069767442, 1155583.419744397), new LOD(10,151.68898636438045058139534883721, 577791.7098721985), new LOD(11, 75.844493182190225290697674418605, 288895.85493609926), new LOD(12, 37.922246591095112645348837209302, 144447.92746804963), new LOD(13, 18.961123295547556322674418604651, 72223.96373402482), new LOD(14, 9.4805616477737781613372093023256, 36111.98186701241), new LOD(15, 4.7402808238868890806686046511628, 18055.990933506204), new LOD(16, 2.3701404119434445403343023255814, 9027.995466753102), new LOD(17, 1.1850702059717222701671511627907, 4513.997733376551), new LOD(18, 0.59253510298586113508357558139535, 2256.998866688275) ]; } } }
(2)引用方法
//加載天地圖(球面墨卡托投影) var baseLayer:TianDiTuLayerMercator = new TianDiTuLayerMercator("ImageBaseMap")//天地圖底圖 var CNNoteLayer:TianDiTuLayerMercator = new TianDiTuLayerMercator("ImageCNNote");//中文注記 baseMap.addLayer(baseLayer); baseMap.addLayer(CNNoteLayer);
五 天地圖WMTS服務
作者:助你軟件工作室
出處:http://www.cnblogs.com/chenyuming507950417/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。