深入理解最強桌面地圖控件GMAP.NET --- SOSO地圖


前三篇介紹了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.png
            string 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";
    }

 


免責聲明!

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



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