(转)深入理解最强桌面地图控件GMAP.NET ---搜狗(sougou地图)

这应该是我集成国内地图的最后一篇了,以后如果有精力会继续分析Google地图,Bing地图,Yahoo地图,Ovi地图。

同时,会尽快将离线地图的使用以及数据存储部分分享出来。

前面的相关文章链接:

深入理解最强桌面地图控件GMAP.NET --- 原理篇

深入理解最强桌面地图控件GMAP.NET --- SOSO地图

深入理解最强桌面地图控件GMAP.NET --- 百度地图

深入理解最强桌面地图控件GMAP.NET --- 初用

深入理解最强桌面地图控件GMAP.NET --- 初识

如何在你的程序中使用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.SogouMapProvider;
this.MainMap.DragButton = MouseButton.Left;
this.MainMap.Zoom = 13;
this.MainMap.MinZoom = 8;
this.MainMap.MaxZoom = 24;

GMAP.NET 搜狗地图的效果

普通地图

卫星地图

搜狗地图加载原理

要理解如何加载搜狗地图,也要理解下加载原理,我们用Chrome打开 http://map.sogou.com/,随便定位一个地址,打开开发者工具:

可以看到Tile的地址如下:http://p2.go2map.com/seamless1/0/174/717/3/1/744_212.png

分析下Url链接参数:

http://p2.go2map.com/seamless1/0/174是固定的

717=729-缩放级别(Zoom)

3=网格横坐标/200最接近的整数值=Math.Floor(x/200)。

1=网格纵坐标/200最接近的整数值=Math.Floor(y/200)。

744是网格横坐标。

212是网格纵坐标。

反正上面这些参数我也是东拼西凑了很多资料来的,确实搜狗的很诡异。

下面我们看看如何在GMAP.NET中实现搜狗地图吧。

SogouMapProvider

1)添加abstract class SougouMapProviderBase

由于搜狗地图也有普通地图和卫星地图,因此提供了一个有公共方法的抽象类,可以复用。

public abstract class SogouMapProviderBase : GMapProvider
    {
        public SogouMapProviderBase()
        {
            MaxZoom = null;
            RefererUrl = "http://map.sougou.com";
            Copyright = string.Format("©{0} Sogou 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)添加SougouMapProvider

public class SogouMapProvider: SogouMapProviderBase
    {
        public static readonly SogouMapProvider Instance;

        readonly Guid id = new Guid("7E2A0100-7A75-4c49-A2C9-EE1C73947E10");
        public override Guid Id
        {
            get { return id; }
        }

        readonly string name = "SohuMap";
        public override string Name
        {
            get
            {
                return name;
            }
        }

        static SogouMapProvider()
        {
            Instance = new SogouMapProvider();
        }

        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)
        {
            zoom = zoom - 1;
            var offsetX = Math.Pow(2, zoom);
            var offsetY = offsetX - 1;

            var numX = pos.X - offsetX;
            var numY = -pos.Y + offsetY;

            zoom = zoom + 1;

            var zoomLevel = 729 - zoom;
            if (zoomLevel == 710)
            {
                zoomLevel = 792;
            }

            var blo = Math.Floor(numX/200);
            var bla = Math.Floor(numY/200);
            string blos, blas;
            if (blo < 0)
            {
                blos = "M" + (-blo);
            }
            else
            {
                blos = blo.ToString();
            }

            if (bla < 0)
            {
                blas = "M" + (-bla);
            }
            else
            {
                blas = bla.ToString();
            }

            var x = numX.ToString().Replace("-","M");
            var y = numY.ToString().Replace("-","M");

            //http://p1.go2map.com/seamless1/0/174/720/0/0/95_25.png
string url = string.Format(UrlFormat, "1",  zoomLevel, blos, blas, x, y);
            Console.WriteLine("url:" + url);
            return url;
        }

        static readonly string UrlFormat = "http://p{0}.go2map.com/seamless1/0/174/{1}/{2}/{3}/{4}_{5}.png";
    }

原文链接:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2880791.html

时间: 2024-10-30 21:20:42

(转)深入理解最强桌面地图控件GMAP.NET ---搜狗(sougou地图)的相关文章

(转)深入理解最强桌面地图控件GMAP.NET --- 原理篇

前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图加载的原理. 投影(Projection) 谷歌地图采用的是墨卡托投影法,这里转载(http://www.cnblogs.com/willwayer/archive/2010/06/11/1756446.html) 下墨卡托投影的定义:墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地

(转)深入理解最强桌面地图控件GMAP.NET ---高德地图

前一篇介绍了GMAP.NET的理论基础,这篇介绍如何集成高德地图.高德地图自从为IOS6提供地图后,目前已经被大众所熟知了. 在我集成国内地图的经验来看,也是最符合墨卡托投影法的. 前面的相关文章链接: 深入理解最强桌面地图控件GMAP.NET --- 原理篇 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地图控件GMAP.NET --- 初识 如

(转)深入理解最强桌面地图控件GMAP.NET --- 百度地图

GMAP.NET支持了Google, Bing, Ovi, Openstreetmap, Yahoo,GIS等多种地图,但国内的地图支持得比较少. 不过没有关系,我们可以为GMAP.NET添加百度地图的支持,只要了解了地图加载的原理,就很容易集成进来, 最重要的是,它是支持离线的,也就是说利用GMAP.NET,我们可以制作各种离线地图供我们桌面应用程序使用, 这也是我为什么称之为最强地图控件的原因. 如何在你的程序中使用GMAP.NET百度地图 整个代码已经提交到 http://ypmap.go

(转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图

前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图. 深入理解最强桌面地图控件GMAP.NET --- 初识 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地图控件GMAP.NET --- 百度地图 虽然地图在国内用得最多的是谷歌和百度,但任何互联网产品都绕不过“腾讯”, 这一章就介绍如何在GMAP.NET中支持搜搜地图. 如何在你的程序中使用GMAP.NET SOSO地图 国内的地图都差不多,我觉得做得最好的是高德,下一篇会结合理论章节讲讲为什么,至少

深入理解最强桌面地图控件GMAP.NET ---离线地图

enjoyeclipse 深入理解最强桌面地图控件GMAP.NET ---离线地图 这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网的项目的需求. 本章主要分成三个方面介绍:演示.生成离线地图.Demo代码. 一.演示 地图显示 地图缩放后还可以显示 网络是断了的 二.生成离线地图 前面已经演示了Demo,这个部分说如何生成离线地图,也就是Data.gmdb.GMAP.NET提供了集中缓存方式,MySQL,SQLLite,MSS

(转)深入理解最强桌面地图控件GMAP.NET ---离线地图

这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网的项目的需求. 本章主要分成三个方面介绍:演示.生成离线地图.Demo代码. 一.演示 地图显示 地图缩放后还可以显示 网络是断了的 二.生成离线地图 前面已经演示了Demo,这个部分说如何生成离线地图,也就是Data.gmdb.GMAP.NET提供了集中缓存方式,MySQL,SQLLite,MSSQL,Postgre等等, 默认是使用SQLLite的,这部分以后再分析. 1. 启

(转)深入理解最强桌面地图控件GMAP.NET --- 初识

背景 最近有个项目是需要在WPF客户端上实现离线地图,虽然以前接触过Web和Android的在线地图,但是对于离线地图确实是无法下手.后来在博客园看到了很多关于GMAP.NET的介绍,并应用了GMAP.NET在项目中,因此很快实现了离线地图的功能. 下面这段话摘自项目原地址(http://greatmaps.codeplex.com/),是介绍GMAP.NET的: GMap.NET is great and Powerful, Free, cross platform, open source

(转)深入理解最强桌面地图控件GMAP.NET --- 初用

上一篇介绍了GMAP.NET的基本概念和一些Demo的截图,这一章主要介绍我们的代码如何使用GMAP.NET. 1.下载 http://greatmaps.codeplex.com/releases/view/20235 2.编译GMAP.NET工程 3.在项目中引用 我的项目是用的WPF,因此需要引用GMAP.NET Core和GMap.NET.WindowsPresentation两个dll. 4.GMapControl 1)UserControl.xaml 创建一个UserControl,

【高德地图API】从零开始学高德JS API(二)地图控件与插件——测距、圆形编辑器、鼠标工具、地图类型切换、鹰眼鱼骨

摘要:无论是控件还是插件,都是在一级API接口的基础上,进行二次开发,封装的一系列更加便于开发者使用,减少开发者工作量的二级API接口.除了官方通用的鱼骨.鹰眼控件,还有大量官方开发的地图插件,类似谷歌的lib.当然本文还会介绍自定义插件的使用. ------------------------------------------------------------------------------------------------- 第一部分 控件 目前官方支持的控件包含:缩放控制条-地图