基於gmap.net制作離線地圖下載器


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

2、Gmap.net基本使用。下載源碼后源碼結構如下圖所示:

制作下載器需要用到的兩個庫是gmap.net.coregmap.net.windowsforms兩個庫,編譯后可以把多余的工程刪掉,新建一個DownMap工程。

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

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

gmap自帶很多地圖數據源,但缺少國內地圖數據源,擴展一個像高德地圖數據源也非常簡單,其他數據源也類似,百度有點特殊。下面擴展一個高德數據源。在gmap.net.core中添加一個amap文件夾,

AMapProviderBase代碼:

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 代碼:

 

 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說明:

用瀏覽器打高德地圖按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}

}

 

4、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

即可。

 

4、當然下載的瓦片也可以對接在openlayer和leaflet等開源的webgis中,

 

以上就是全部步驟,希望對您有所幫助。如果凝問可以聯系我。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM