前一篇介紹了GMAP.NET的理論基礎,這篇介紹如何集成高德地圖。高德地圖自從為IOS6提供地圖后,目前已經被大眾所熟知了。
在我集成國內地圖的經驗來看,也是最符合墨卡托投影法的。
前面的相關文章鏈接:
深入理解最強桌面地圖控件GMAP.NET --- SOSO地圖
如何在你的程序中使用GMAP.NET 高德地圖
要使用以下代碼,建議看看初用篇,具體代碼如下所示。
this.MainMap.Position = new PointLatLng(double.Parse(ConfigurationManager.AppSettings["defaultLat"]),double.Parse(ConfigurationManager.AppSettings["defaultLng"])); this.MainMap.MapProvider.Area = new RectLatLng(30.981178, 105.351914, 2.765142, 4.120995); this.MainMap.BoundsOfMap = new RectLatLng(30.981178, 105.351914, 2.765142, 4.120995); this.MainMap.Manager.Mode = AccessMode.CacheOnly; this.MainMap.MapProvider = GMapProviders.AMapProvider; this.MainMap.DragButton = MouseButton.Left; this.MainMap.Zoom = 13; this.MainMap.MinZoom = 8; this.MainMap.MaxZoom = 24;
GMAP.NET 高德地圖的效果
普通地圖
衛星地圖
高德地圖加載原理
要理解如何加載高德地圖,也要理解下加載原理,我們用Chrome打開 http://www.amap.com/,隨便定位一個地址,打開開發者工具:
可以看到Tile的地址如下:http://webrd03.is.autonavi.com/appmaptile?x=1629&y=849&z=11&lang=zh_cn&size=1&scale=1&style=7
我們分析下Url鏈接參數:
http://webrd03.is.autonavi.com/appmaptile是固定的
&lang=zh_cn&size=1&scale=1&style=7也是固定的
x=1629是網格的橫坐標,y=849是網格的縱坐標,橫縱坐標的生成原理已經在原理篇有描述了,這里就不再贅述了。
z=11是當前的縮放級別。
所以高德地圖是相對簡單和規范的。
下面我們看看如何在GMAP.NET中實現高德地圖吧。
AMapProvider
同百度地圖的操作流程一樣,也采用下面的流程添加AMapProvider的支持。
1)添加abstract class AMapProviderBase
由於高德地圖也有普通地圖和衛星地圖,因此提供了一個有公共方法的抽象類,可以復用。
public abstract class AMapProviderBase : GMapProvider { public AMapProviderBase() { MaxZoom = null; RefererUrl = "http://www.amap.com/"; Copyright = string.Format("©{0} 高德 Corporation, ©{0} NAVTEQ, ©{0} Image courtesy of NASA", DateTime.Today.Year); } public override PureProjection Projection { get { return MercatorProjection.Instance; } } GMapProvider[] overlays; public override GMapProvider[] Overlays { get { if (overlays == null) { overlays = new GMapProvider[] { this }; } return overlays; } } }
2).AMapProvider
主要是MakeTileImageUrl方法,就是根據搜索地圖加載原理來的:本質上就是要構造一個獲取圖片的url鏈接(如:http://webrd03.is.autonavi.com/appmaptile?x=1629&y=849&z=11&lang=zh_cn&size=1&scale=1&style=7)。
public class AMapProvider : AMapProviderBase { public static readonly AMapProvider Instance; readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88"); public override Guid Id { get { return id; } } readonly string name = "AMap"; public override string Name { get { return name; } } static AMapProvider() { Instance = new AMapProvider(); } public override PureImage GetTileImage(GPoint pos, int zoom) { string url = MakeTileImageUrl(pos, zoom, LanguageStr); return GetTileImageUsingHttp(url); } string MakeTileImageUrl(GPoint pos, int zoom, string language) { //http://webrd04.is.autonavi.com/appmaptile?x=5&y=2&z=3&lang=zh_cn&size=1&scale=1&style=7 string url = string.Format(UrlFormat, pos.X, pos.Y, zoom); Console.WriteLine("url:" + url); return url; } static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7"; }