zoukankan      html  css  js  c++  java
  • 基于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版本地图引擎

  • 相关阅读:
    HHHOJ #153. 「NOI模拟 #2」Kotomi
    HHHOJ #151. 「NOI模拟 #2」Nagisa
    Luogu P5298 [PKUWC2018]Minimax
    Luogu P5368 [PKUSC2018]真实排名
    Luogu P5408 【模板】第一类斯特林数·行
    Codechef December Challenge 2019 Division 1
    AtCoder Grand Contest 040
    CSP2019游记(翻车记)
    Codeforces Round #594 (Div. 1)
    AtCoder Grand Contest 039
  • 原文地址:https://www.cnblogs.com/Noproblem/p/8484863.html
Copyright © 2011-2022 走看看