Flex离线地图和在线谷歌地图实现<完整版>

在前面文章“Flex离线地图和在线谷歌地图实现” 中粗略的实现了基于arggis的离线和在线加载谷歌地图。

代码很多地方引用了内部的方法导致不能很好的运行,下面将呈现完整的实现。

GoogleMapLayer代码

package cn.showclear.gis
{
	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;
	
	/**
	 *  自定义MapLayer,实现了离线地图和在线谷歌地图的加载。 
	 * @author LuLihong
	 * @date 2013-10-24
	 * 
	 */
	public class GoogleMapLayer extends TiledMapServiceLayer	
	{
		private var _tileInfo:TileInfo=new TileInfo();
		/**
		 * 离线地图路径 
		 */
		private var _gisDir:String = "F:\\map\\googlemaps\\roadmap";
		/**
		 * 是否离线模式 
		 */
		private var isOffMode:Boolean = true;
		
		public function GoogleMapLayer() {
			super();
			buildTileInfo();
			setLoaded(true);
		}
		
		override public function get fullExtent():Extent {
			return new Extent(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787, spatialReference);
		}
		
		override public function get initialExtent():Extent {
			return new Extent(-20037508.342787, -20037508.342787, 20037508.342787, 20037508.342787, spatialReference);
		}
		
		override public function get spatialReference():SpatialReference {
			return new SpatialReference(102113);
		}
		
		override public function get tileInfo():TileInfo {
			return _tileInfo;
		}
		
		//获取矢量地图
		override protected function getTileURL(level:Number, row:Number, col:Number):URLRequest {
			return new URLRequest(fmtURL(level, row, col));
		}
		
		private function fmtURL(level:Number, row:Number, col:Number):String {
			if (isOffMode) {
				return _gisDir + "\\" + level + "\\" +  col + "\\" + row + ".png";
			} else {
				return "http://mt"+(col%4)+".google.cn/vt/v=w2.114&hl=zh-CN&gl=cn&" + "x=" + col + "&" + "y=" + row + "&" + "z=" + level+ "&s=";
			}
		}
		
		private function buildTileInfo():void {
			_tileInfo.height=256;  
			_tileInfo.width=256;  
			_tileInfo.origin=new MapPoint(-20037508.342787, 20037508.342787);  
			_tileInfo.spatialReference = spatialReference;  
			_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)  
			];
		}
	}
}

MapDemo代码

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" 
			   xmlns:esri="http://www.esri.com/2008/ags" 
			   xmlns:gis="cn.showclear.gis.*">
	<fx:Script>
		<![CDATA[
			import com.esri.ags.events.MapEvent;
			import com.esri.ags.geometry.MapPoint;
			import com.esri.ags.utils.WebMercatorUtil;
			
			private function maploadHandler(event:MapEvent):void 	{
				esriMap.centerAt(fmtMapPoint(120.1,30.2));  //设置中心点, 杭州西湖三塘映月岛
				esriMap.level = 12;	//设置级别
			}
			
			/**
			 * 将经纬度坐标转换为墨卡托坐标
			 */
			private static function fmtMapPoint(lng:Number, lat:Number) : MapPoint {
				return WebMercatorUtil.geographicToWebMercator(new MapPoint(lng, lat)) as MapPoint;
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	
	<esri:Map id="esriMap" logoVisible="false"  
		openHandCursorVisible="false"
		scaleBarVisible="true"
		zoomSliderVisible="false" 
		load="maploadHandler(event)" >
		<gis:GoogleMapLayer id="googleMapLayer"/>
	</esri:Map>
</s:Application>


离线地图文件格式:F:\map\googlemaps\roadmap\1\1\0.png

源代码:Flex离线地图和在线谷歌地图实现源代码,只要1点积分,我相信我提供的知识绝对不止1分



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值