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

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

深入理解最强桌面地图控件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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题--- 字母大小写全排列

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归递归、搜索与回…

4种分布式Session的实现方式!老大直呼666...

前言公司有一个 Web 管理系统,使用 Tomcat 进行部署。由于是后台管理系统,所有的网页都需要登录授权之后才能进行相应的操作。起初这个系统的用的人也不多,为了节省资源,这个系统仅仅只是单机部署。后来随着用的人越来越多&#x…

回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案

回溯算法n皇后问题N-皇后问题 (N - Queens problem) The n – queen problem is the generalized problem of 8-queens or 4 – queen’s problem. Here, the n – queens are placed on a n * n chess board, which means that the chessboard has n rows and n columns and t…

超简单的分布式ID生成方案!美团开源框架介绍

目录阐述背景Leaf snowflake 模式介绍Leaf segment 模式介绍Leaf 改造支持 RPC阐述背景不吹嘘,不夸张,项目中用到 ID 生成的场景确实挺多。比如业务要做幂等的时候,如果没有合适的业务字段去做唯一标识,那就需要单独生成一个唯一的…

教你写Bug,常见的 OOM 异常分析

在《Java虚拟机规范》的规定里,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能。本篇主要包括如下 OOM 的介绍和示例:java.lang.StackOverflowErrorjava.lang.OutOfMemoryError: Java heap spacejava…

池化技术到达有多牛?看了线程和线程池的对比吓我一跳!

这是我的第 82 篇原创文章作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)情商高的人是能洞察并照顾到身边所有人的情绪,而好的文章应该让所有人都能看懂。尼采曾…

spearman相关性_Spearman的相关性及其在机器学习中的意义

spearman相关性This article is about correlation and its implication in the machine learning. In my previous article, I have discussed Pearson’s correlation coefficient and later we have written a code to show the usefulness of finding Pearson’s correlati…

被问哭了,一位小姐姐的阿里面经!(附部分答案)

这篇文章是一位 女读者 (加粗!太难得)的面试阿里的经历分享,虽然第二面就失败了,但是这样的经历对自己帮助应该还是很大的。下面的一些问题非常具有代表性,部分问题我简单做了修改(有些问题表述…

阿里《Java开发手册》最新嵩山版发布!

《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册,当前的版本是嵩山版。…

递归转化成非递归过程_8086微处理器中的递归和重入过程

递归转化成非递归过程As we all know that a procedure is a set of instruction written separately which can be used any time in the code when required. A normal procedure execution includes calling of the procedure, shifting the control of the processor to th…

漫谈软件研发特种部队之中的一个

特种部队,是指进行特殊任务的部队,具有编制灵活、人员精干、装备精良、机动高速、训练有素、战斗力强等特点。 特种部队最早出如今二战期间。德国于1939年9月1日的波兰战役中首次投入了一种被称为“勃兰登堡”部队的特种部队作为德国突击波兰的先锋&…

不要一把梭了,这才是SQL优化的正确姿势!|原创干货

这是我的第 83 篇原创文章作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)年少不知优化苦,遇坑方知优化难。——村口王大爷全文内容预览:我之前有很多…

PLSQL_性能优化系列10_Oracle Array数据组优化

2014-09-25 Created By BaoXinjian 一、摘要 集合是Oracle开发中经常遇到的情况,Oracle集合分为三种情况:索引表集合(index by table)、嵌套表集合(nested table)、可变集合(varry table)。 PL/SQL中没有数组的概念,他的集合数据类型和数组是…

IDEA 2020.2 重磅发布,动画级新功能预览!

Guide 关注了 IDEA 的官推,平时没事就会去看看有没有啥比较好的更新。今天下午看到IntelliJ IDEA 2020.2 都已经发布并且还支持了 Java15。然后,我就去官网简单看了一下新特性。单看新特性,这个新版本还是有一点香的。虽然我还木有升级到这个…

访问控制模型ACL和RBAC

2019独角兽企业重金招聘Python工程师标准>>> 1.ACL ACL是最早也是最基本的一种访问控制机制,它的原理非常简单:每一项资源,都配有一个列表,这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。当系统试图…

最常见并发面试题整理!(速度收藏)

前言并发编程是面试中必问的知识点之一,所以本文整理了一些最为常见的并发面试题,一起来看吧~1. synchronized的实现原理以及锁优化?synchronized的实现原理synchronized作用于「方法」或者「代码块」,保证被修饰的代码在同一时间…

JavaScript中的嵌套事件处理(在鼠标移动事件上)

Multiple event handling is the secret ingredient of dynamic WebPages seen now-a-days. 多重事件处理是当今动态网页的秘密组成部分。 Now, let’s get started... 现在&#xff0c;让我们开始吧... Example Code 范例程式码 <html lang"en"><head&…

皮尔逊相关性_皮尔逊的相关性及其在机器学习中的意义

皮尔逊相关性Today we would be using a statistical concept i.e. Pearsons correlation to help us understand the relationships between the feature values (independent values) and the target value (dependent value or the value to be predicted ) which will furt…

磊哥最近面试了好多人,聊聊我的感受!(附面试知识点)

这是我的第 84 篇原创文章作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;一些读者可能知道&#xff0c;磊哥前段时间又回来上班了&#xff0c;详见《磊哥又滚回职场了...》…

M4 宏处理器

2019独角兽企业重金招聘Python工程师标准>>> M4 宏处理器 Brian W. KernighanDennis M. Ritchie Bell LaboratoriesMurray Hill, New Jersey 07974 翻译&#xff1a;寒蝉退士 译者声明&#xff1a;译者对译文不做任何担保&#xff0c;译者对译文不拥有任何权利并且不…