Google Maps地图投影全解析

原文出处:http://www.cnblogs.com/LionGG/archive/2009/04/20/1439905.html

 

Google Maps、Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体。建议先对地图投影知识做一个基本的了解,《地图投影为什么》。

 

什么是墨卡托投影?

墨卡托(Mercator)投影,又名"等角正轴圆柱投影",荷兰地图学家墨卡托(Mercator)在1569年拟定,假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假想地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的"墨卡托投影"绘制出的世界地图。从球到平面,肯定有个转换公式,这里就不再罗列。

 

Google们为什么选择墨卡托投影?

墨卡托投影的"等角"特性,保证了对象的形状的不变行,正方形的物体投影后不会变为长方形。"等角"也保证了方向和相互位置的正确性,因此在航海和航空中常常应用,而Google们在计算人们查询地物的方向时不会出错。

墨卡托投影的"圆柱"特性,保证了南北(纬线)和东西(经线)都是平行直线,并且相互垂直。而且经线间隔是相同的,纬线间隔从标准纬线(此处是赤道,也可能是其他纬线)向两级逐渐增大。

但是,"等角"不可避免的带来的面积的巨大变形,特别是两极地区,明显的如格陵兰岛比实际面积扩大了N倍。不过要是去两极地区探险或可靠的同志们,一般有更详细的资料,不会来查看网络地图的,这个不要紧。

 

为什么是圆形球体,而非椭球体?

这说来简单,仅仅是由于实现的方便,和计算上的简单,精度理论上差别0.33%之内,特别是比例尺越大,地物更详细的时候,差别基本可以忽略。

 

Web墨卡托投影坐标系:

以整个世界范围,赤道作为标准纬线,本初子午线作为中央经线,两者交点为坐标原点,向东向北为正,向西向南为负。

X轴:由于赤道半径为6378137米,则赤道周长为2*PI*r = 20037508.3427892,因此X轴的取值范围:[-20037508.3427892,20037508.3427892]。

Y轴:由墨卡托投影的公式可知,同时上图也有示意,当纬度φ接近两极,即90°时,y值趋向于无穷。这是那些"懒惰的工程师"就把Y轴的取值范围也限定在[-20037508.3427892,20037508.3427892]之间,搞个正方形。

懒人的好处,众所周知,事先切好静态图片,提高访问效率云云。俺只是告诉你为什么会是这样子。因此在投影坐标系(米)下的范围是:最小(-20037508.3427892, -20037508.3427892 )到最大 (20037508.3427892, 20037508.3427892)。

 

对应的地理坐标系:

按道理,先讲地理坐标系才是,比如球体还是椭球体是地理坐标系的事情,和墨卡托投影本关联不大。简单来说,投影坐标系(PROJCS)是平面坐标系,以米为单位;而地理坐标系(GEOGCS)是椭球面坐标系,以经纬度为单位。具体可参考《坐标系、坐标参照系、坐标变换、投影变换》。

经度:这边没问题,可取全球范围:[-180,180]。

纬度:上面已知,纬度不可能到达90°,懒人们为了正方形而取的-20037508.3427892,经过反计算,可得到纬度85.05112877980659。因此纬度取值范围是[-85.05112877980659,85.05112877980659]。其余的地区怎么办?没事,企鹅们不在乎。

因此,地理坐标系(经纬度)对应的范围是:最小(-180,-85.05112877980659),最大(180, 85.05112877980659)。至于其中的Datum、坐标转换等就不再多言。

 

相关坐标计算:

关于Google Maps等的组织方式——地图瓦片金字塔,估计我在这里重复一遍这玩意,怕也是没人看了。尽管原理都一样,但具体到写不同厂商不同数据源的代码时,你会发现,可缩放级别数不一样,最小级别不一样,编码方式不一样,比如Google的QRST,微软的四叉树,OSGeo的TMS等。

然而,你或许也不必这么麻烦,因为这些算法在网络上早已遍布朝野,你尽可从他人博客中获取,或是从开源软件里学习。这本身都不是秘密,微软自己也是公布的。

《Tiles à la Google Maps》 用交互性地方式可得到任一Tile的边界范围,各种流行编码方式等。该页面的链接都非常有价值,部分也是本文写作的重要参考。作者用python完成了下列坐标之间转换算法:经纬度(出现在KML中的坐标,WMS的BBOX参数等),平面坐标XY(米,Web Mercator投影坐标系),金字塔的XYZ(即X轴的位置,Y轴的位置,和缩放级别ZoomLevel),每个Tile的编码Key值(QRST或0123等)。转换时,还需要注意两个概念,Ground Resolution和Map Scale。

 

 

Ground Resolution,地面分辨率,类似Spatial Resolution(空间分辨率),我们这里主要关注用象元(pixel size)表示的形式:一个像素(pixel)代表的地面尺寸(米)。以Virtual Earth为例,Level为1时,图片大小为512*512(4个Tile),那么赤道空间分辨率为:赤道周长/512。其他纬度的空间分辨率则为 纬度圈长度/512,极端的北极则为0。Level为2时,赤道的空间分辨率为 赤道周长/1024,其他纬度为 纬度圈长度1024。很明显,Ground Resolution取决于两个参数,缩放级别Level纬度latitude ,Level决定像素的多少,latitude决定地面距离的长短。地面分辨率的公式为,单位:米/像素:

ground resolution = (cos(latitude * pi/180) * 2 * pi * 6378137 meters) / (256 * 2level pixels)

 

Map Scale,即地图比例尺,小学知识,图上距离比实地距离,两者单位一般都是米。Ground Resolution的计算中,由Level可得到图片的像素大小,那么需要把其转换为以米为单位的距离,涉及到DPI(dot per inch),暂时可理解为类似的PPI(pixelper inch),即每英寸代表多少个像素。256 * 2level / DPI 即得到相应的英寸inch,再把英寸inch除以0.0254转换为米。实地距离仍旧是:cos(latitude * pi/180) * 2 * pi * 6378137 meters; 因此比例尺的公式为,一般都化为1XXX,无单位:

map scale = 256 * 2level / screen dpi / 0.0254 / (cos(latitude * pi/180) * 2 * pi * 6378137)

= 1 : (cos(latitude * pi/180) * 2 * pi * 6378137 * screen dpi) / (256 * 2level * 0.0254)

 

其实,Map Scale 和 Ground Resolution存在对应关系,毕竟都和实地距离相关联,两者关系:map scale = 1 : ground resolution * screen dpi / 0.0254 meters/inch

《Virtual Earth Tile System》列举了Virtual Earth在赤道上,Level、像素数、地面分辨率、地图比例尺的对应关系,同时本文也简单介绍了Mercator投影和上述两个概念,推荐。

 

此外,《Addressing Google Maps image tiles》应用程序,输入经纬度和缩放级别,即可缩放到相应的Google Maps位置,而且可以显示出查找过程的QRST。JavaScript实现的算法,也可以抓下来和《Tiles à la Google Maps》对比下,从经纬度到到Tile编码的转换。

 

WKT形式表示

Google Maps和Virtual Earth等的流行程度不用多讲,然而他们所使用的Web Mercator或Spherical Mercator在很长一段时间内并没有被EPSG的投影数据库所接纳。EPSG认为它不能算作科学意义上的投影,所以只是给了一个EPSG:900913的标号(SRID),这个标号游离在EPSG常规标号范围之外。(EPSG、SRID是什么?参见《EPSG 、SRID》。)

 

到了2008年5月(据SharpGIS同学), EPSG恍然明白,不管椭球体还是球体,其实都是对地球的模拟,只是精确程度上的差别,没有本质上的不同。或者是不得不接受广泛的事实标准,接纳了这个投影,定义投影坐标系PROJCS的名字为"Popular Visualisation CRS / Mercator",SRID为EPSG:3785;地理坐标系GEOGCS的名字为"Popular Visualisation CRS",SRID为"EPSG:4055"。这些标号已经进入"正常范围"。(PS:这个Visualisation 是英式英语写法?)

 

PROJCS 的WKT《Well Known Text》写法如下,GEOGCS、Datum等的WKT表示参见《Spherical/Web Mercator: EPSG code 3785》。附带说一句,Web Mercator在ESRI公司的编号(ESRI叫它Well Known ID?)暂时是102113,或许偶尔用得到。

PROJCS["Popular Visualisation CRS / Mercator",
    GEOGCS[
"Popular Visualisation CRS",
        DATUM[
"Popular_Visualisation_Datum",
            SPHEROID[
"Popular Visualisation Sphere",6378137,0,
                AUTHORITY[
"EPSG","7059"]],
            TOWGS84[
0,0,0,0,0,0,0],
            AUTHORITY[
"EPSG","6055"]],
        PRIMEM[
"Greenwich",0,
            AUTHORITY[
"EPSG","8901"]],
        UNIT[
"degree",0.01745329251994328,
            AUTHORITY[
"EPSG","9122"]],
        AUTHORITY[
"EPSG","4055"]],
    UNIT[
"metre",1,
        AUTHORITY[
"EPSG","9001"]],
    PROJECTION[
"Mercator_1SP"],
    PARAMETER[
"central_meridian",0],
    PARAMETER[
"scale_factor",1],
    PARAMETER[
"false_easting",0],
    PARAMETER[
"false_northing",0],
    AUTHORITY[
"EPSG","3785"],
    AXIS[
"X",EAST],
    AXIS[
"Y",NORTH]]

 

附记:这个问题算是老问题,费这么多时间,主要就是分享,毕竟自己还算是相当明白。也是看见有人不懂乱说,写篇文章纠正下。当然谁都会犯错误,包括我这篇是否100%正确,你也可以质疑。起这个题目其实不是本意,因为它不科学,甚至EPSGINFORMATION_SOURCE字段写的都是Microsoft,只不过国内Google更火些,SEO一下。

这篇文章除了参考文中所列链接外, MicrosoftGoogleEPSGOGC等组织相关的说明外,Charlie SavageSharpGISNelson John等博客也是非常重要的来源,在此致以谢意。

 

 

转载于:https://www.cnblogs.com/bluespot/archive/2009/05/25/1488845.html

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

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

相关文章

java内存模型 创建类_JVM内存模型及String对象内存分配

昨天看了一篇关于《Java后端程序员1年工作经验总结》的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型。1、JVM运行时数据区域关于JVM内存模型之前也了解过一些,也是看过…

微信小程序数据拼接_微信小程序 数据预拉取

数据预拉取预拉取能够在小程序冷启动的时候通过微信后台提前向第三方服务器拉取业务数据,当代码包加载完时可以更快地渲染页面,减少用户等待时间,从而提升小程序的打开速度 。使用流程1. 配置数据下载地址登录小程序 MP 管理后台,…

给ULWOW 写的广告效果(缓动切换)

应 幽狼魔兽 站长所托,写了一个 广告切换效果(点击查看DEMO) 形式是常见的形式,但是在功能上有一定的拓展。 主要功能: 1,自动检测广告图片个数 生产广告序列 2,缓动切换,仿原版FLA…

java ecdh秘钥交换_DH密钥交换和ECDH原理(转)

下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理。1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g。2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个私有的数字a&am…

生活GOOGLE,GOOGLE生活

从上网起就知道GOOGLE的了,不过那个时候傻乎乎的就知道新浪和搜狐,随着网龄的慢慢增长对互联网也慢慢的了解的了,就发现其实生活中慢慢的离不开很多的东西,电脑天天在用,可是今天让我感触最深的是GOOGLE无处不在&#…

python爬虫源代码_零基础自学爬虫(5)B站有哪些爬虫的视频学习资源-附Python源代码...

前几天看到有人提问:。b站哪个python爬虫视频讲的较好?谢谢各位能解答一下。? 于是顺手写了一个小爬虫,把数据爬了下来。 今天有空放一下源代码。数据源,是在B站搜索框直接搜索“爬虫”,并选择按收藏排序。…

tcl手机 手写java_TCL魔法手指V2.0 (使笔记本Synaptics触摸板变身为手写板)

TCL魔法手指功能概述识别率最高:最新的识别核心,识别率达到99.3%,并配合目前最好的多字切分技术,可流畅的连笔书写,随意的倒插笔书写,完全尊重您的书写习惯。无需特殊硬件:只要您的笔…

用VBA去除Excel工作表保护密码

今天帮同事解决个EXCEL问题,现记在这,以作备忘 现象: 想要修改保护单元 格的内容,在使用“工具”菜单“保护”子菜单的“撤消工作表保护”命令,这时要求输入密码。 解决方案:网上找到一文http://www.excel1…

python连接数据库mysql错误1045_django 连接数据库出现1045错误的解决方式

根据菜鸟教程Django教程学习,运行"python manage.py migrate" 报错,出现django.db.utils.OperationalError: (1045, “Access denied for user ‘账号localhost (using password: YES)”)错误。这种错误指的是连接数据库时账号密码错误。1.只需…

MVC学习笔记1 MVC概述

MVC概述MVC三种角色– Model: 用于存储数据的组件(与领域模型概念不同)。– View: 根据Model数据进行内容展示的组件– Controller:接受并处理用户指令(操作Model),选择一个Vie…

python wxpython_python GUI wxPython

wxPython 安装 pip install wxPython (安装失败)推荐豆瓣镜像pip3 install -i https://pypi.douban.com/simple wxpythonC:\Users\dangzhengtao>pip3 install -i https://pypi.douban.com/simple wxpythonLooking in indexes: https://pypi.douban.com/simpleCollecting wxp…

java多个页面爬取_java爬取html页面(简易通用版)

项目环境ide:intellij IDEA 2017.2.5编程语言:java数据库:mysql管理工具:maven需要导包:mysql-connector-java,jsoup(解析html)等,如果要解析json可能还要导入gson的包。我把重要的依赖贴出来(默…

设计一个医院

源于个人网站:http://programmer.2008red.com/programmer/article_647_777_1.shtml 收到一封来自Exoweb的邮件,让去面试(败的很惨,呵呵。过了好长时间了,都忘记这事了,结果这公司来了邮件,说不能…

powerbi的功能介绍_Power BI:1分钟快速生成可视化报表

1.什么是Power BI ?Power BI 是微软推出的可视化工具,先来看看微软官方是怎么介绍的:使用用于自助服务和企业商业智能 (BI) 的统一、可扩展平台(该平台易于使用,可帮助获取更深入的数据见解),连…

易语言 java支持_开源Java客户端可以连接易语言服务器

我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后,都要先跟当前的客户端通信完之后才能再处理下一个连接请求。 这在并发比较多的情况下会严重影响程序的性能,为此,我们可以把它改为如下这种异步…

Javascript--File对象

描述: 提供对文件属性的访问.属性: 属性描述Attributes设置或返回文件或文件夹的属性DateCreated返回指定文件或文件夹的创建时间DateLastAccessed返回最近访问文件或文件夹的创建时间DateLastModified返回最后修改指定文件和文件夹的日期和日期Drive返回指定文件或文件夹所在的…

idea怎么调试jsp页面_解决idea的c标签错误

Hello,World.土土来啦!最近做jq项目,遇到各种各样的问题。首先就是c标签的错误。对,没错,就是这一串因为土土上学期学的是jsp,所以是在myeclipse做的,这学期就想在idea做后端。然后复制粘贴之前的项目的时候&#xff0…

[SlickEdit] SlickEdit支持目录别名FTP控件更新

有阵没写代码了,SlickEdit升级到2009还没怎么用过,Option面板改动得更像Eclipse了,反正IDE工具也不知道到底谁抄袭谁,只是Symbol Coloring设置太唬人了吧,,默认的symbol coloring总是出现字符偏移&#xff…

有一台服务器远程失败其他电脑可以_使用闲置电视盒子打造家庭网盘和远程下载器和小型服务器(二)...

使用闲置电视盒子打造家庭网盘和远程下载器系列(二)本系列分为五章一、综述二、电视盒子的root三、app的安装和服务器环境的搭建四、网盘系统的部署和使用五、远程下载系统搭建和实现昨天写了第一章,我这是首次写东西,没想到能得到这么多朋友关注&#x…

php echo 前后有字符串,php echo 输出字符串函数详解、多行输出方法

echo "abc";//字符串echo "abc$c";//字符串变量echo abc$c;//字符串 asd$c $c不是变量echo "abc"."de";echo "abc","de";echo $a;echo $a.$b;echo $a,$b;echo $a.$b.$c;echo $a,$b,$c;echo "abc{$c}de"…