(转)深入理解最强桌面地图控件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,一经查实,立即删除!

相关文章

运算符sizeof_C程序通过使用sizeof()运算符对数组元素进行计数

运算符sizeofsizeof() operator returns the total number of size occupied by a variable, since array is also a variable, we can get the occupied size of array elements. sizeof()运算符返回变量占用的大小总数,由于array也是变量,我们可以获取…

查看 端口占用情况

“开始”-->“运行”-->“cmd”打开命令提示符,(或win R)输入“netstat -ano”可以看到所有的连接。可能的话,在“windows任务管理器”找到PID对应的程序即可。如果没有PID项,可以在“windows任务管理器”选“查…

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…

丘处机《摄生消息论》(转)

来源:http://www.qiuchuji.org/?typeshowtopic&id11 遗憾的是没有找到好的翻译版本,并且文中好像有些错别字,没有原文也没法对照修改。 春季摄生消息 春三月,此谓发陈,天地俱生,万物以荣。夜臥早起&…

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍。 一、InputStreamReader类 InputStreamReader 将字节流转换为字符流。是字节流通向字符流的桥梁。假设不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK。 构造方法…

回溯算法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…

天气预报HTML代码

天气预报HTML代码<iframe height"200" src"http://weather.news.qq.com/inc/ss218.htm" frameborder"0" width"200" scrolling"no"></iframe><iframe width"420" scrolling"no" height&…

PHP源码安装及配置——以fastCGI的方式与httpd整合

在前一篇博文中介绍了LAMP的安装及配置。这里专门介绍PHP以fastCGI的方式与httpd整合的情况下&#xff0c;具体如何编译及配置。而且假定httpd、mysql均如前一篇博文介绍的安装配置完毕。php也采取一样版本的源码包php-5.6.1.tar.bz2。1. 编译安装php# tar xf php-5.6.1.tar.b…

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

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

高质量的c源代码

现在自由软件及开源软件越来越流行&#xff0c;有大量的附带源程序的软件可以使用&#xff0c;这给我们学习软件开发提供了更多方便。但另一方面&#xff0c;也使得找到高质量的软件越来越不易。Landon Curt Noll 推荐 阅读David Ingalls Bell 的源代码。fefe 网站很推崇D.J.Be…

Java LinkedList公共布尔提供(对象o)方法(带示例)

LinkedList公共布尔提供(对象o)方法 (LinkedList public boolean offer(Object o) method) This method is available in package java.util.LinkedList.offer(Object o). 软件包java.util.LinkedList.offer(Object o)中提供了此方法。 This method is used to adds a specifie…

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

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

elf文件格式实例解析

试验环境&#xff1a;archlinux 速龙3000&#xff08;即x86兼容32位处理器&#xff09; 必须软件&#xff1a;gcc binutils 参考资料&#xff1a; System V application binary interface ELF Format &#xff08;mirror txt format ) Hello,world in less than 20 bytes…

离散数学关系的性质_关系和关系的性质| 离散数学

离散数学关系的性质笛卡尔积(A * B不等于B * A) (Cartesian product (A*B not equal to B*A)) Cartesian product denoted by * is a binary operator which is usually applied between sets. It is a set of ordered pairs where the first member of the pair belongs to th…

HTML,,,音乐,html embed用法

第一种&#xff1a;在页面代码中的<head></head>之间加入<bgsound src"音乐url" loop"-1"> 这段代码。 在这里要说的是&#xff0c;“loop”中的数值是音乐循环的次数&#xff0c;可设置为任意正整数&#xff0c;若设为“-1”的话&#…

少年开始学习c#编程,过路的大神请担待!

这应该真正算开始学习编程&#xff0c; 安装好了 linux&#xff0c; 开通了博客员的博客&#xff0c; 同时今天也需要把sublime安好&#xff0c; 安装MonoDevelop Codeblocks mysql-workbench 配置好相应的c#的环境&#xff0c; 在linux下安装了vmware&#xff0c; 也安装了一个…

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

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

小型elf Hello,World程序

参考链接&#xff1a;http://timelessname.com/elfbin/ 环境要求&#xff1a;linux gcc nasm hexcurse&#xff08;用来修改elf文件内容&#xff09; 先尝试用C语言写"Hello,World"程序(名为chello.c)&#xff1a; #include <stdio.h> int main(void) {printf…

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…