(转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图
前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图。
深入理解最强桌面地图控件GMAP.NET --- 初识
深入理解最强桌面地图控件GMAP.NET --- 初用
深入理解最强桌面地图控件GMAP.NET --- 百度地图
虽然地图在国内用得最多的是谷歌和百度,但任何互联网产品都绕不过“腾讯”,
这一章就介绍如何在GMAP.NET中支持搜搜地图。
如何在你的程序中使用GMAP.NET SOSO地图
国内的地图都差不多,我觉得做得最好的是高德,下一篇会结合理论章节讲讲为什么,至少从GMAP.NET的角度讲讲为什么。
![](/assets/blank.gif)
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;
![](/assets/blank.gif)
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
由于搜搜也有普通地图和卫星地图,因此提供了一个有公共方法的抽象类,可以复用。
![](/assets/blank.gif)
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; } }
![](/assets/blank.gif)
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
即可。
![](/assets/blank.gif)
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"; }
![](/assets/blank.gif)
原文链接:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html
转载于:https://www.cnblogs.com/plRobotics-RD-Center/p/4008902.html
(转)深入理解最强桌面地图控件GMAP.NET --- SOSO地图相关推荐
- 深入理解最强桌面地图控件GMAP.NET --- SOSO地图
转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html 前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百 ...
- 深入理解最强桌面地图控件GMAP.NET ---高德地图
前一篇介绍了GMAP.NET的理论基础,这篇介绍如何集成高德地图.高德地图自从为IOS6提供地图后,目前已经被大众所熟知了. 在我集成国内地图的经验来看,也是最符合墨卡托投影法的. 前面的相关文章链接 ...
- 深入理解最强桌面地图控件GMAP.NET --- 百度地图
转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己的项目 ...
- (转)深入理解最强桌面地图控件GMAP.NET ---离线地图
这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网的项目的需求. 本章主要分成三个方面介绍:演示.生成离线地图.Demo代码. 一.演 ...
- 深入理解最强桌面地图控件GMAP.NET ---离线地图
转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.html 这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能 ...
- 入理解最强桌面地图控件GMAP.NET ---离线地图
http://www.cnblogs.com/enjoyeclipse/archive/2013/01/31/2882254.html 介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很 ...
- 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)
很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提出来的,我不知道谷歌的街景地图是如何实现的,在这个例子中,运用了WPF 3D的原理,对街景 ...
- (转)深入理解最强桌面地图控件GMAP.NET --- 原理篇
前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件GMAP.NET --- SOSO地图 深入理解最强桌面地图控件GMAP.NET --- 百度地图 我们以Google地图为例,这章介绍下地图 ...
- 深入理解最强桌面地图控件GMAP.NET --- 原理篇
转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/18/2865700.html 前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件G ...
最新文章
- 想学测试如何入门和学习软件测试?今天我就好好给你唠唠
- Ubuntu/Debian 系统切换Java(JVM),修改Java版本,JAVA_HOME
- //todo 的用处
- 哥德巴赫猜想(升级版)(洛谷-P1579)
- VXLAN配置实例(四)——VXLAN多租户网络隔离
- Initial Audio Trap Empire Heatup3 Expansion (HeatUp3通用音色库)
- Tableau 自定义调色板及应用全流程讲解【保姆级】
- win10系统怎样安装/更新独立显卡驱动
- PS三分钟扣图教程,并增强画质
- 利用OpenStreetMap获取城市路网数据
- java bks证书_jks bks 等的定义 如何将jks转化为bks的
- 微信小程序上传图像或者文件到阿里云oss
- 《introduction to information retrieval》信息检索学习笔记4 索引结构
- 中小学计算机教室设备维修记录,校园网与教室多媒体设备维修管理暂行办法
- Wireshark的基本使用
- 测试基础篇之(postman接口和Fiddler测试)
- C实现三子棋 人机对弈
- c++/c语言学习记录时间帖
- STM32中FLASH/System Memory/SRAM的区别
- HTML——em标签