博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
地图大集合
阅读量:4502 次
发布时间:2019-06-08

本文共 5945 字,大约阅读时间需要 19 分钟。

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

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

我们从Google Map开始:

2011053022553564.png

地形图:

2011053022561390.png

微软的BING地图:

2011053022565032.png

MapABC地图:

2011053022573844.png

QQ地图:

2011053022583470.png

百度地图:

2011053022590481.png

搜狗地图:

2011053022594411.png

最后一个51地图:

2011053023003475.png

之前应该写过其它几类地图加载的方法,这里就不再叙述了,今天写一下搜狗和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);		}	}}

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

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

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

转载于:https://www.cnblogs.com/liongis/archive/2011/05/30/2063834.html

你可能感兴趣的文章
Cocos2d-x 3.0 编译出错 解决 error: expected &#39;;&#39; at end of member declaration
查看>>
Ubuntu12.04下载Repo
查看>>
python基础教程_学习笔记10:异常
查看>>
MATLAB——scatter的简单应用
查看>>
linux下复制粘贴快捷键
查看>>
什么是对象
查看>>
记录开发小程序
查看>>
WinSock服务程序
查看>>
巴西柔术第五课:过腿
查看>>
文件的操作
查看>>
网上图书商城项目学习笔记-007登录功能实现
查看>>
关于mysql的级联删除(之前好多人咨询过我)
查看>>
Linux环境下的C/C+基础调试技术2——程序控制
查看>>
wpf动画同步闪烁
查看>>
3.16上午 复习雅思核心词+新单词100个
查看>>
Html5 部分特性
查看>>
前端工具集合记录
查看>>
浅析负载均衡的6种算法,Ngnix的5种算法
查看>>
OpenCV——图像修补
查看>>
自定义 DateTime 格式字符串
查看>>