地图大集合,包括: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); } } }
当然,以上只是介绍加载地图的方法,因为各地图服务商使用的数据偏移是不一样的,所以会存在着一个坐标换算的过程,目前还没有实现这一步,所以如果把所有的图都叠在一起的话,显示会有问题,所以只能简独进行显示。
如果有朋友如果实现各类数据间的数据转换的话,欢迎赐教!
本示例只用于学习使用,如果大家需要使用各地图商的数据的话,还请与这些公司联系。
作者:LionGIS
邮箱:liongis@163.com
QQ:1366940902
出处:http://liongis.cnblogs.com/
欢迎转载,请在文章页面明显位置给出原文链接。