繼續我們之前的載入各類地圖資料之旅,今天我們要載入的地圖資料是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