基于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版本地图引擎

相关文章
相关标签/搜索