• FGMap学习之加载51地图


    继续我们之前的加载各类地图数据之旅,今天我们要加载的地图数据是51地图。51地图的数据和其它的编码方式很不一样,中间有特定的一个算法,根据坐标值可以转换为对应的唯一ID值,当然,这个算法是在前辈的基础上得来的,具体为什么这么写,我也没有看明白。只是通过这种方式,可以把51的地图加载进来,代码如下:

    package com.fgmap.maps.examples
    {
    	import com.fgmap.maps.Copyright;
    	import com.fgmap.maps.CopyrightCollection;
    	import com.fgmap.maps.LatLng;
    	import com.fgmap.maps.LatLngBounds;
    	import com.fgmap.maps.TileLayerBase;
    	import com.fgmap.maps.interfaces.ICopyrightCollection;
    	
    	import flash.display.DisplayObject;
    	import flash.display.Loader;
    	import flash.events.IOErrorEvent;
    	import flash.geom.Point;
    	import flash.net.URLRequest;
    	
    	public class LingtuTileLayer extends TileLayerBase
    	{
    		private var mapMinZoom:int = 1;	//最小显示等级
    		private var mapMaxZoom:int = 18;//最大显示等级
    		
    		private const imgURL:String = "http://cache2.51ditu.com/";
    
    		public function LingtuTileLayer(tileSize:Number)
    		{
    			var copyrightCollection:CopyrightCollection = new CopyrightCollection();
    			
    			super(copyrightCollection, mapMinZoom, mapMaxZoom, 1);	//调用父类的方法
    			
    			//创建一个自己的版权说明
    			copyrightCollection.addCopyright(
    				new Copyright("LingtuData",
    					new LatLngBounds(new LatLng(-180, -90),
    						new LatLng(180, 90)),  0,
    					"51地图数据"));
    		}
    		
    		//覆盖加载地图数据的方法,这个很重要,地图数据从这里读取
    		override public function loadTile(tilePos:Point, zoom:Number):DisplayObject {
    			var testLoader:Loader = new Loader();
    			
    			var strURL:String = "";
    
    			//51地图是从左下角开始为0,0的,所以这里的Y需要翻转一下
    			tilePos.y = Math.pow(2,zoom - 1) - (tilePos.y - 1);
    			strURL = getTileUrl(tilePos,zoom);
    			
    			//trace("x:" + tilePos.x + ",y:" + tilePos.y + ",url:" + strURL);
    			
    			var urlRequest:URLRequest;
    			urlRequest =  new URLRequest(strURL);	//没有地图时显示的内容
    			
    			testLoader.load(urlRequest);
    			testLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    			
    			return testLoader;
    		}
    		
    		private function getTileUrl(p:Point, zoom:int) : String
    		{
    			var bx:Number = p.x;
    			var by:Number = p.y;
    			
    			var nGrade:Number = Math.ceil((zoom - 5) / 4);
    			var nPreRow:int = 0;
    			var nPreCol:int = 0;
    			var nPreSize:int = 0;
    			var path:String = "";
    			for (var i:int = 0; i < nGrade; ++i) {
    				var nSize:int = 1 << 4 * (nGrade - i);
    				var nRow:int = parseInt((bx - nPreRow * nPreSize) / nSize + "");
    				var nCol:int = parseInt((by - nPreCol * nPreSize) / nSize + "");
    				path = path + ((nRow > 9 ? (nRow) : ("0" + nRow)) + "" + (nCol > 9 ? (nCol) : ("0" + nCol)) + "/");
    				nPreRow = nRow;
    				nPreCol = nCol;
    				nPreSize = nSize;
    			} 
    
    			var id:Number = (((bx)&((1<<20)-1))+(((by)&((1<<20)-1))*Math.pow(2,20))+(((zoom)&((1<<8)-1))*Math.pow(2,40)));
    			
    			return imgURL + zoom + "/" + path + id + ".png";
    		}
    		
    		private function getZoomFactor (zoom:int):Number {
    			return Math.pow(2, (18 - zoom)) * 256
    		}
    		
    		//出错处理
    		private function ioErrorHandler(event:IOErrorEvent):void {
    			trace("ioErrorHandler: " + event);
    		}
    	}
    }
    


    这里需要注意几个地方:

    1.51地图的图片存放规则是从左下开始编号,即左下角为0,0开始,往右X逐渐增加,往上Y逐渐增加(Y方向正好与Google是相反的)。

    2.地图在放大的时候,会出现向下的偏移。

    3.目前只是地图图片的加载,经纬度换算并未实现,所以如果和Google Map相叠加的话,图片会不一致。

    完成的效果图如下:

    如果想看更多的效果图,可以参看 地图大集合 http://www.cnblogs.com/liongis/archive/2011/05/30/2063834.html

  • 相关阅读:
    c++中的const关键字
    用类模板实现容器存储自定义数据类型(类似于STL里面的vector)
    用类模板实现容器存储普通数据类型(类似于STL里面的vector)
    pgmpy包的安装,以及conda的安装
    【SQL语言】SQL语言基础02
    【win7系统】win7系统常遇到的一些问题
    【博客收集】一些关于个人博客、程序员书单、程序资源、学习方法的博文(持续更新中~)!
    【分享】一些好的网站与技术博客
    【ORACLE】Oracle 忘记用户名和密码的和用户被锁定的解决办法
    【ORACLE】SQL Developer 与 PL/SQL Developer与SQL PLUS的使用问题
  • 原文地址:https://www.cnblogs.com/liongis/p/2063858.html
Copyright © 2020-2023  润新知