基於gmap.net製做離線地圖下載器

一、gmap.net 源碼下載http://greatmaps.codeplex.com/html

二、Gmap.net基本使用。下載源碼後源碼結構以下圖所示:web

製做下載器須要用到的兩個庫是gmap.net.coregmap.net.windowsforms兩個庫,編譯後能夠把多餘的工程刪掉,新建一個DownMap工程。sql

而後將gmap.net.coregmap.net.windowsforms兩個庫添加到DownMap下,將工具欄中GmapControl的控件拖到窗體中,而後load事件中添加如下幾個參數運行後能看到相應地圖顯示了。數據庫

三、下載器編制做。其實gmap.net自己已自帶下載工能,只是離線圖片下載到sqlit中,現將其擴展一下,支持多種方式存儲。最終界面以下圖所示,界面什麼的都是次要的只要懂得原理便可windows

gmap自帶不少地圖數據源,但缺乏國內地圖數據源,擴展一個像高德地圖數據源也很是簡單,其餘數據源也相似,百度有點特殊。下面擴展一個高德數據源。在gmap.net.core中添加一個amap文件夾,瀏覽器

AMapProviderBase代碼:app

public abstract class AMapProviderBase : GMapProvider { public AMapProviderBase() { MaxZoom = null; RefererUrl = "http://www.XX.com/"; Copyright = string.Format("©{0} XX Corporation, ©{0} NAVTEQ, ©{0} Image courtesy of NASA", DateTime.Today.Year); } public override PureProjection Projection { get { return MercatorProjection.Instance;//高德採用webMercator投影 
 } } GMapProvider[] overlays; public override GMapProvider[] Overlays { get { if (overlays == null) { overlays = new GMapProvider[] { this }; } return overlays; } } }

 

AMapProvider 代碼:dom

 

 1  public class AMapProvider : AMapProviderBase  2  {  3         public override string ToString()  4  {  5             return "AMap";  6  }  7 
 8         public static readonly AMapProvider Instance;  9 
10         readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");//每一個數據源有不一樣的ID
11         public override Guid Id 12  { 13             get { return id; } 14  } 15 
16         readonly string name = "高德地圖--柵格"; 17         public override string Name 18  { 19             get
20  { 21                 return name; 22  } 23  } 24         static AMapProvider() 25  { 26             Instance = new AMapProvider(); 27  } 28 
29         public override PureImage GetTileImage(GPoint pos, int zoom) 30  { 31             
32             string url = MakeTileImageUrl(pos, zoom, LanguageStr); 33             return GetTileImageUsingHttp(url); 34            
35 
36  } 37 
38         string MakeTileImageUrl(GPoint pos, int zoom, string language) 39  { 40             int serviceIndex = 0; 41             Random rd = new Random(); 42             serviceIndex = rd.Next(1, 4); 43             //string url = string.Format(UrlFormat, zoom, pos.X, pos.Y, Uri);
44             string url = string.Format(UrlFormat, pos.X, pos.Y, zoom, "0" + serviceIndex); 45             return url; 46  } 47 
48 
49         static readonly string UrlFormat = "http://webst{3}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={0}&y={1}&z={2}"; 50 
51  } 52 }

 

 

 

UrlFormat說明:ide

用瀏覽器打高德地圖按F12監視一下就能獲取到相應URL,而後替換到UrlFormat中便可。工具

 

而後在GMapProviders中添加剛新增的數據源:

public static readonly AMapProvider AMap = AMapProvider.Instance;

 

而後修改gmapControl1.mapprovider=GMapProviders.AMap;

運行後能看到相應高德地圖底圖了

當你按住alt鍵畫下載區域(this.mapControl1.SelectedArea)或根據行政區域(計算多邊形最小外接矩形)獲得一個下載區域時會獲得一個相應矩形:

 

獲得這個矩形(this.mapControl1.SelectedArea)的左上角座標和右下角座標去計算相應要下載的瓦片,具體接口

GPoint topLeft = _provider.Projection.FromPixelToTileXY(_provider.Projection.FromLatLngToPixel(rect.LocationTopLeft, Convert.ToInt32(level))); GPoint rightBottom = _provider.Projection.FromPixelToTileXY(_provider.Projection.FromLatLngToPixel(rect.LocationRightBottom, Convert.ToInt32(level))); //_provider當前選擇的mapProvider,rect爲當前選擇的區域,level爲選擇等級 //載循環獲取瓦片:

 for (long x = (topLeft.X); x <= (rightBottom.X); x++) { for (long y = (topLeft.Y); y <= (rightBottom.Y); y++) {//這裏實現下載得到圖片:
 PureImage img = GMaps.Instance.GetImageFrom(_provider, new gpoint(x,y), level, out ex);//接下載就能夠自行存儲了。(能夠存到文件夾啊數據庫啊等等)Level/x_y.png}
 }

 

四、gmap使用離線地圖(將瓦片發佈在IIS中):

首先在MapProviders中的XXXProvider.CS代碼最後面都能看到UrlFormat字段。替換你本身的路徑便可。

例如我發佈在IIS路徑爲 http://192.168.1.92:80/szmap/ 

那麼將urlFormat的路徑代替爲

http://192.168.1.92:80/szmap/{z}/{x}_{y}.png

便可。

 

四、固然下載的瓦片也能夠對接在openlayer和leaflet等開源的webgis中,

 

以上就是所有步驟,但願對您有所幫助。若是凝問能夠聯繫我。

最後在展現一下我自主研發的引擎:WPF&winform版本地圖引擎

相關文章
相關標籤/搜索