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);

轉自:http://www.cnblogs.com/chenyuming507950417/p/3343729.html







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章