zoukankan      html  css  js  c++  java
  • 地图大集合

    地图大集合,包括:Google地图、Google地形、BING地图、MabABC地图、QQ地图、百度地图、搜狗地图、51地图。现在还有E都市和Mapbar地图未加载进来,继续增加中。。。。。

    之前有提到过国内的地图服务,其实都是仿Google Map一样的瓦片式地图服务,只是每个服务商的地图编码规则不一样,或者数据偏移不一样,所以会造成没有一个统一的平台可以加载各类的地图数据。所以根据这个原理我在FGMap上实现了加载合类地图的想法,后面会给出加载各数数据的实现方式。先上图:

    我们从Google Map开始:

    地形图:

    微软的BING地图:

    MapABC地图:

    QQ地图:

    百度地图:

    搜狗地图:

    最后一个51地图:

    之前应该写过其它几类地图加载的方法,这里就不再叙述了,今天写一下搜狗和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 SogouTileLayer extends TileLayerBase
    	{
    		private var mapMinZoom:int = 1;	//最小显示等级
    		private var mapMaxZoom:int = 18;//最大显示等级
    		private var tileUrls:Array = [
    			"http://p0.go2map.com/seamless1/0/174/", 
    			"http://p1.go2map.com/seamless1/0/174/",
    			"http://p2.go2map.com/seamless1/0/174/", 
    			"http://p3.go2map.com/seamless1/0/174/"];
    
    		public function SogouTileLayer(tileSize:Number)
    		{
    			var copyrightCollection:CopyrightCollection = new CopyrightCollection();
    			
    			super(copyrightCollection, mapMinZoom, mapMaxZoom, 1);	//调用父类的方法
    			
    			//创建一个自己的版权说明
    			copyrightCollection.addCopyright(
    				new Copyright("BaiduData",
    					new LatLngBounds(new LatLng(-180, -90),
    						new LatLng(180, 90)),  0,
    					"搜狗地图数据"));
    		}
    		
    		//覆盖加载地图数据的方法,这个很重要,地图数据从这里读取
    		override public function loadTile(tilePos:Point, zoom:Number):DisplayObject {
    			var testLoader:Loader = new Loader();
    			
    			zoom = zoom - 1;
    			
    			var offsetX:Number = Math.pow(2,zoom);
    			var offsetY:Number = offsetX - 1;
    			
    			var numX:Number = tilePos.x - offsetX;
    			var numY:Number = (-tilePos.y) + offsetY;
    			
    			zoom = zoom + 1;
    			
    			var l:int = 729 - zoom;
    			if (l == 710) l = 792;
    			
    			var blo:Number = Math.floor(numX / 200);
    			var bla:Number = Math.floor(numY / 200);
    			
    			var los:String,las:String,blos:String,blas:String;
    			if (numX < 0) 
    				los = "M" + ( - numX);
    			else 
    				los = "" + numX;
    			if (numY < 0) 
    				las = "M" + ( - numY);
    			else 
    				las = "" + numY;
    			if (blo < 0) 
    				blos = "M" + ( - blo);
    			else 
    				blos = "" + blo;
    			if (bla < 0) 
    				blas = "M" + ( - bla);
    			else 
    				blas = "" + bla;
    			
    			var x:String = numX.toString().replace("-","M");
    			var y:String = numY.toString().replace("-","M");
    			
    			var num:int = (tilePos.x + tilePos.y) % tileUrls.length;
    			
    			var strURL:String = "";
    			strURL = tileUrls[num] + l + "/" + blos + "/" + blas + "/" + x + "_" + y + ".GIF";
    			
    			var urlRequest:URLRequest;
    			urlRequest =  new URLRequest(strURL);	//没有地图时显示的内容
    			
    			testLoader.load(urlRequest);
    			testLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
    			
    			return testLoader;
    		}
    		
    		private function getZoomFactor (zoom:int):Number {
    			return Math.pow(2, (18 - zoom)) * 256
    		}
    		
    		//出错处理
    		private function ioErrorHandler(event:IOErrorEvent):void {
    			trace("ioErrorHandler: " + event);
    		}
    	}
    }
    


     

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

    当然,以上只是介绍加载地图的方法,因为各地图服务商使用的数据偏移是不一样的,所以会存在着一个坐标换算的过程,目前还没有实现这一步,所以如果把所有的图都叠在一起的话,显示会有问题,所以只能简独进行显示。

    如果有朋友如果实现各类数据间的数据转换的话,欢迎赐教!

    本示例只用于学习使用,如果大家需要使用各地图商的数据的话,还请与这些公司联系。

  • 相关阅读:
    201521123069 《Java程序设计》 第13周学习总结
    201521123069 《Java程序设计》 第12周学习总结
    网络15软工个人作业5--软件工程总结
    个人作业4--alpha阶段个人总结
    软工网络15个人作业3——案例分析
    软件工程网络15结对编程作业1
    201521123004《软件工程》个人阅读作业2-提问题
    201521123004《软件工程》个人阅读作业1
    Java课程设计—学生成绩管理系统(201521123004-林艺如)
    201521123004 《Java程序设计》第 14 周学习总结
  • 原文地址:https://www.cnblogs.com/liongis/p/2063834.html
Copyright © 2011-2022 走看看