深入理解最强桌面地图控件GMAP.NET --- SOSO地图
轉 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html
前三篇介紹了GMAP.NET的一些基本功能以及如何集成一個百度地圖。
深入理解最強桌面地圖控件GMAP.NET --- 初識
深入理解最強桌面地圖控件GMAP.NET --- 初用
深入理解最強桌面地圖控件GMAP.NET ---?百度地圖
?
雖然地圖在國內用得最多的是谷歌和百度,但任何互聯網產品都繞不過“騰訊”,
這一章就介紹如何在GMAP.NET中支持搜搜地圖。
?
如何在你的程序中使用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.SosoMapProvider;this.MainMap.DragButton = MouseButton.Left;this.MainMap.Zoom = 13;this.MainMap.MinZoom = 8;this.MainMap.MaxZoom = 24;?
GMAP.NET SOSO地圖的效果
普通地圖
衛星地圖
搜搜地圖加載原理
同樣,要理解如何加載soso地圖,也要理解下加載原理,我們用Chrome打開 map.soso.com,隨便定位一個地址,打開開發者工具:
可以發現,搜搜地圖也是根據url一張一張拼接而來的,以鏈接http://p3.map.soso.com/maptilesv2/11/102/75/1633_1200.png為例,每個參數的含義如下:
p0也是分布式站點的一個,p1,p2,p3都可以;
maptilesv2是版本號的東西,
11是縮放級別,
1633是鼠標所在地圖網格的X,1200是地圖網格的Y (關于地圖網格,參考下Google Tile's Engine Explaine),以后的理論章節會專門講這個東西。
102 = 1633/16后最接近的整數值,75 = 1200/16后最接近的整數值。
?
SOSOMapProvider
同上一篇百度地圖的操作流程一樣,也采用下面的流程添加SOSOMapProvider的支持。
1)添加abstract class?SosoMapProviderBase
由于搜搜也有普通地圖和衛星地圖,因此提供了一個有公共方法的抽象類,可以復用。
public abstract class SosoMapProviderBase : GMapProvider{public SosoMapProviderBase(){MaxZoom = null;RefererUrl = "http://map.soso.com";Copyright = string.Format("?{0} Tencent 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;}}protected override bool CheckTileImageHttpResponse(System.Net.HttpWebResponse response){var pass = base.CheckTileImageHttpResponse(response);if (!pass){return response.ResponseUri.AbsoluteUri.EndsWith(".png") || response.ResponseUri.AbsoluteUri.EndsWith(".JPG");}return true;}}?
2).SoSoMapProvider
主要是MakeTileImageUrl方法,就是根據搜索地圖加載原理來的:本質上就是要構造一個獲取圖片的url鏈接。如果是衛星地圖,只要將UrlFormat從
http://p0.map.soso.com/maptilesv2/{0}/{1}/{2}/{3}_{4}.png
替換成
http://p1.map.soso.com/sateTiles/{0}/{1}/{2}/{3}_{4}.jpg
即可。
public class SosoMapProvider: SosoMapProviderBase{public static readonly SosoMapProvider Instance;readonly Guid id = new Guid("30D069B3-F6A5-4feb-9B5E-84CBF1E34F34");public override Guid Id{get { return id; }}readonly string name = "SoSoMap";public override string Name{get{return name;}}static SosoMapProvider(){Instance = new SosoMapProvider();}public override PureImage GetTileImage(GPoint pos, int zoom){string url = MakeTileImageUrl(pos, zoom, LanguageStr);return GetTileImageUsingHttp(url);}static int[] _scope = new int[]{0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0, 7, 0, 7, 0, 15, 0, 15, 0, 31, 0, 31, 0, 63, 4, 59, 0, 127, 12, 115, 0, 225, 28, 227, 356, 455, 150, 259, 720, 899, 320, 469, 1440, 1799, 650, 929, 2880, 3589, 1200, 2069, 5760, 7179, 2550, 3709, 11520, 14349, 5100, 7999, 23060, 28689, 10710, 15429, 46120, 57369, 20290, 29849, 89990, 124729, 41430, 60689, 184228, 229827, 84169, 128886};string MakeTileImageUrl(GPoint pos, int zoom, string language){var f = zoom*4;var i = _scope[f++];var j = _scope[f++];var l = _scope[f++];var scope = _scope[f];if (pos.X >= i && pos.X <= j && pos.Y >= l && pos.Y <= scope){pos.Y = (long) (Math.Pow(2, zoom) - 1 - pos.Y);}//http://p0.map.soso.com/maptilesv2/11/102/74/1633_1198.pngstring url = string.Format(UrlFormat, zoom, Math.Floor((decimal)(pos.X / 16)), Math.Floor((decimal)(pos.Y / 16)), pos.X, pos.Y);Console.WriteLine("url:" + url);return url;}static readonly string UrlFormat = "http://p0.map.soso.com/maptilesv2/{0}/{1}/{2}/{3}_{4}.png";}?
總結
以上是生活随笔為你收集整理的深入理解最强桌面地图控件GMAP.NET --- SOSO地图的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 电脑批量加入域控制器脚本
- 下一篇: Hive的元数据表结构详解(转自lxw1
