前几篇介绍了一些国内地图的案例,

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

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

我们以Google地图为例,这章介绍下地图加载的原理。

投影(Projection)

谷歌地图采用的是墨卡托投影法,这里转载(http://www.cnblogs.com/willwayer/archive/2010/06/11/1756446.html) 下墨卡托投影的定义:墨卡托(Mercator)投影,又名“等角正轴圆柱投影”,荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被 围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即 赤道)的“墨卡托投影”绘制出的世界地图。从球到平面,有个转换公式,这里就不再罗列。

可以看到, 谷歌将整个地图被铺成了一张偌大的正方形,所以只要将这个偌大的正方形按照图层分成若干的小图就可以了。

图层(Zoom)和图片(Tile)

在墨卡托投影法的基础上,整个谷歌地图被分为18层(Zoom):0~17。每次操作(缩放)谷歌地图的时候,都会将可见区域的图层的图片加载进来,所以,每个图层都是由一张张图片组成的,

下面Chrome浏览器的开发工具就可以看到:

每张图片称为Tile, 代码中经常可以看到这个变量,每一图层的图片数量Tiles = 2 pow (2*Zoom)。

那么第一个图层的图片数量为: 2 pow (2*0) = 1

第2个图层的图片数量为 2 pow(2*1) = 4

.....

第17个图层的图片数量为 2 pow (2 * 17) = 17179869184

经纬度(Lat,Lng)和网格(Grid)

那么,谷歌是如何根据当前的视图来获取图片的呢?谷歌的做法(其他地图也一样)是将地图根据墨托卡投射法分成若干的网格,每个网格都是一张图片。

那么只要将当前的经纬度转换成网格就可以。具体的公式就不列了,懒得看,这里有段代码,

TileCoordinate locationCoord(double lat, double lon, int zoom) ,lat,lon就是当前经纬度,zoom就是图层,最后就只要知道row和colum就可以了。

public class TileCoordinate {
public TileCoordinate(double row, double column, int zoom) { this.row = row; this.column = column; this.zoom = zoom; } public double row; public double column; public int zoom; } static TileCoordinate locationCoord(double lat, double lon, int zoom) {   if (System.Math.Abs(lat) > 85.0511287798066)     return null;   double sin_phi = System.Math.Sin(lat * System.Math.PI / 180);   double norm_x = lon / 180;   double norm_y = (0.5 * System.Math.Log((1 + sin_phi) / (1 - sin_phi))) / System.Math.PI;   double tileRow = System.Math.Pow(2, zoom) * ((1 - norm_y) / 2);   double tileColumn = System.Math.Pow(2, zoom) * ((norm_x + 1) / 2);   return new TileCoordinate(tileRow, tileColumn, zoom); }

好的,拿到这个row和column有什么用呢,我们看一个例子:

http://mt2.google.cn/vt/lyrs=m@205000000&hl=zh-CN&gl=CN&src=app&x=22&y=12&z=5&s=Galile,返回的图片如下:

其中x=22, y=12就是前面提到的row和col,而z=5就是当前的缩放级别(图层),其他的参数都是表示版本和状态的,相对固定。

上面的原理讲完了,国内的地图或许稍有不同,但大致思路都是一致的。

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

转载于:https://www.cnblogs.com/plRobotics-RD-Center/p/4008904.html

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

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

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/18/2865700.html 前几篇介绍了一些国内地图的案例, 深入理解最强桌面地图控件G ...

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

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

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

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/15/2859028.html 前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百 ...

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

    前三篇介绍了GMAP.NET的一些基本功能以及如何集成一个百度地图. 深入理解最强桌面地图控件GMAP.NET --- 初识 深入理解最强桌面地图控件GMAP.NET --- 初用 深入理解最强桌面地 ...

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

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己的项目 ...

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

    这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很多政府项目.保密项目.或者由于种种原因不能上网的项目的需求. 本章主要分成三个方面介绍:演示.生成离线地图.Demo代码. 一.演 ...

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

    转 http://www.cnblogs.com/enjoyeclipse/archive/2013/01/29/2882254.html 这章会介绍GMAP.NET的核心功能之一:离线地图.这个功能 ...

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

    http://www.cnblogs.com/enjoyeclipse/archive/2013/01/31/2882254.html 介绍GMAP.NET的核心功能之一:离线地图.这个功能可以满足很 ...

  9. 深入理解最强桌面地图控件GMAP.NET --- 街景地图(StreetView)

    很久没有更新博客了,今天无事把GMAP.NET的代码又重新翻了翻,看到了街景地图的例子. 街景地图是谷歌最早提出来的,我不知道谷歌的街景地图是如何实现的,在这个例子中,运用了WPF 3D的原理,对街景 ...

最新文章

  1. 用WMI修改计算机名和IP
  2. [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
  3. spark 应用程序性能优化:12 个优化方法
  4. 架构之美—软件架构6大步骤(开篇)
  5. 代码注释(图案:小狗)
  6. mysql 事件计划_mysql 事件计划
  7. Csharp: create Transparent Images in winform
  8. 解决异常MySQLNonTransientConnectionException: Communications link failure during rollback().
  9. Microsemi Libero使用技巧4——使用命令行模式下载程序
  10. 图灵的遗产和后继者们的责任
  11. asp毕业设计—— 基于asp+access的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统
  12. 《知识产权知识产权信用管理规定》解读问答
  13. 编译原理:FIRST集与FOLLOW集
  14. 如何获取这台电脑上登陆过的全部QQ号,
  15. 大牛讲解信号与系统以及数字信号处理
  16. 最全的硬盘修复专题帖1(转贴)
  17. 兆骑科创创新创业服务平台,海内外高层次人才引进,活动赛事
  18. 独立按键之长按、短按、单击、双击
  19. 基于Android P版本PKMS详解二
  20. keil中c语言bit怎么用,关于keil多c文件工程中bit变量的声明定义问题

热门文章

  1. cron每2天跑一次_直购直测,进口新极光每2年或34000公里才需要保养一次?
  2. java私有变量和_java – 大内部类和私有变量
  3. 小爱同学100个奇葩回复_小米小爱音箱Pro开箱评测,看到的不仅是全面升级更是小米loT的高速发展...
  4. 笔记本连接显示器后没有声音_电脑用HDMI外界显示器后,没有声音
  5. eclipse启动发生Failed to load JNI shared library
  6. oracle系统实验,实验1 启动Oracle系统
  7. 目标检测第1步:如何在Windows 10下安装MiniConda?
  8. windows上搭建NFS服务器
  9. hash地址_redis中的hash扩容、渐进式rehash过程
  10. java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...