1.Web墨卡托空间参考

1.1.什么是Web墨卡托

墨卡托投影,又称正轴等角圆柱投影,由荷兰地图学家墨卡托(G.Mercator)于1569年创拟。假设地球被套在一个圆柱中,赤道与圆柱相切,然后在地球中心放一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,就形成以一幅墨卡托投影的世界地图。

Web墨卡托以经纬度0,0点为中心点,向东向北为正,向西向南为负。赤道半径为6378137米,则赤道周长为2*pi*r = 2*20037508.3427892,因此X轴的取值范围为-20037508.3427892至20037508.3427892。

经纬度转Web墨卡托坐标计算公式:

var earthRad = 6378137.0;

var x = lng * Math.PI / 180 * earthRad;

var a = lat * Math.PI / 180;

var y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));

由墨卡托投影的公式可知,当纬度lat接近两极,即90°时,y值趋向于无穷。为了使用方便,就把Y轴的取值范围也限定在-20037508.3427892至20037508.3427892之间,形成一个正方形。

Web墨卡托转经纬度公式:

var lng = x / 20037508.34 * 180;

var lat = y / 20037508.34 * 180;

lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

通过公式反算回来。可得到纬度85.05112877980659。因此Web墨卡托显示的数据纬度范围是-85.05112877980659至85.05112877980659。

1.2.互联网地图为什么会选择Web墨卡托

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

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

简单直观。

1.3.Web墨卡托有什么缺点

“等角”不可避免的带来的面积的巨大变形,特别是两极地区。例如非洲的面积是格林兰岛的13倍多。但在Web墨卡托下,非洲的大小和格林兰岛面积差不多。

2.谷歌瓦片的组织方式

谷歌地图使用的是Web墨卡托空间参考。瓦片从0级开始,顺序号从左上角开始,X方向向右增加,Y方向向下增加。逐层分割,越来越细。Web墨卡托全球就是一个正方形,体现在谷歌地图上,就是0级别的256*256像素的一张图片。谷歌地图0级只有一个瓦片。

每个瓦片在下一级的时候,都会被分割成4块。每个瓦片的像素大小为256*256。使用行、列以及级别号就可以确定一个瓦片,所以我们在访问地图的时候,原理也是计算出要加载的瓦片的级别以及行列号,通过这三个参数去服务器获取对应的瓦片。

3.各种坐标以及之间的换算

在使用谷歌地图的时候,我们会用到很多种坐标,并且在坐标之间进行互相转换。主要有瓦片行列号、像素坐标、投影坐标、经纬度坐标等。

3.1.行列号

行列号比较好理解,就是该瓦片在于本级别瓦片中,是第几行,第几列。

3.2.像素坐标

像素坐标是指把每个级别的瓦片当成一个大的图像来看,那么每个点都是一个像素,该像素在这个大图片上的行列号,就是其像素坐标。

例如0级,就是一张256*256的图片,左上角点像素坐标为0,0,右下角像素坐标为255,255。例如1级,由四张瓦片组成,为一张512*512的大图片,中心点的像素坐标,也就是经纬度的0,0点坐标就是255,255。

一个点在不同的级别中,值是不一样的。例如经纬度0,0点,在0级像素坐标是127,127,在1级,像素坐标为255,255,2级为511,511。

3.3.投影坐标

投影坐标就是地图上的点在Web墨卡托下的坐标值。这个值可以通过换算公式由经纬度换算出来。和经纬度一样,同一个地点,无论在哪个瓦片级别中,其投影坐标值都是一样的。

3.4.经纬度坐标

经纬度是我们最常用的坐标,经纬度和投影坐标类似,并一一对应,不过在Web墨卡托下,纬度的显示范围为-85至85。

3.5.坐标换算

经纬度转Web墨卡托有固定的计算公式,转换的时候直接套公式即可。我们在访问地图的时候,经常会计算某个经纬度点位于某个级别下哪个瓦片上。也就是根据经纬度求各个级别下对应的瓦片行列号。

经纬度转瓦片行列号的思路:

1、  根据级别获取该级别下行和列是有多少瓦片a=Math.Pow(2,n);

2、  把经纬度转换成Web墨卡托坐标x,y;

3、  计算每个瓦片在Web墨卡托坐标系下跨多少米b=20037508.3427892*2/a;

4、  计算行列号索引Math.Ceiling ((x+20037508.3427892)/ b)-1;

计算公式如下:

var earthRad = 6378137.0;

var x = lng * Math.PI / 180 * earthRad;

var a = lat * Math.PI / 180;

var y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));

var i= Math.Ceiling ((x+20037508.3427892)/( 20037508.3427892*2/ Math.Pow(2,n)))-1;

var j= Math.Ceiling (-(y-20037508.3427892)/( 20037508.3427892*2/ Math.Pow(2,n)))-1;

根据级别和行列号获取其左上角点的经纬度思路。

1、  根据级别获取该级别下行和列是有多少瓦片a=Math.Pow(2,n);

2、  得到Web墨卡托坐标;

3、  把Web墨卡托坐标转换成经纬度。

计算公式如下。

var x=-20037508.3427892+i*20037508.3427892*2 / Math.Pow(2,n);

var y=20037508.3427892-j*20037508.3427892*2 / Math.Pow(2,n);

var lng = x / 20037508.34 * 180;

var lat = y / 20037508.34 * 180;

lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

4.瓦片访问和下载

4.1.瓦片访问

谷歌地图瓦片主要靠级别和行列号以及地图类型访问。如果不清楚地址,可以访问一下谷歌地图,然后通过浏览器的开发者模式,捕捉到地图瓦片的地址,找到行列号以及级别位置,进行替换即可。现在访问谷歌地图需要打开VPN。

标记红色框的地址为:https://khms3.google.com/kh/v=930?x=12&y=3&z=4,这个地址是比较容易理解的,x为行号,y为列号、z为级别,访问的时候用自己需要的参数替换这三个参数即可。其他类型的地图,例如地形等,可以参考这种方式获取其地址。

国内也有一些网站,把google地图瓦片下载下来,在国内发布,这样即时不用VPN也可以访问到,大家可以自己去搜索下,获取地址的方式类似。

4.2.瓦片下载

有时候我们需要把一些瓦片下载下来,在自己的系统中内网发布,或者拼接成大图做其他处理。主要有以下步骤:

(1)根据下载范围以及要下载的级别,获取每级别下载的行列号范围;

(2)使用代码,循环每个下载单元,拼接瓦片地址,把瓦片下载到本地,下载代码可以在网上搜索;

(3)如果只是使用瓦片,那直接在Web服务器上发布即可,常用的WebGIS平台,例如ArcGIS API、OpenLayers以及Cesium等都有访问谷歌地图瓦片的API;

(4)如果想拼接成大图,每个瓦片的Web墨卡托范围我们是可以计算出来的,写代码,把每个瓦片转换成Web墨卡托坐标,把瓦片组个拼接起来即可。

Google地图瓦片的更多相关文章

  1. 使用QT开发GoogleMap瓦片显示和下载工具(2)——Google地图瓦片投影和获取网址解析

    这篇主要说的是Google地图采用的投影方式,瓦片划分方式以及如何从给定的经纬度获取瓦片的数据的网址.所有资料均来自于网络,并亲自试验可行. Google地图投影 首先是地图投影问题,因为地球本身是一 ...

  2. Python爬取地图瓦片

    由于要在内网开发地图项目,不能访问在线的地图服务了,就想把地图瓦片下载下来,网上找了一些下载器都是需要注册及收费的,否则下载到的图都是打水印的,如下: 因为地图瓦片就是按照层级.行.列规则组织的一张张 ...

  3. Google 地图切片URL地址解析

    一.Google地图切片的投影方式及瓦片索引机制 1.地图投影 Google地图采用的是Web墨卡托投影(如下图),为了方便忽略了两极变形较大的地区,把世界地图做成了一个边长等于赤道周长的正方形(赤道 ...

  4. Google Maps瓦片(tile)地图文件下载(1-11层级)

    整理硬盘时,发现一份去年下载的谷歌地图瓦片文件,整理并分享给大家. 地图来源:Google Maps(应该是国内谷歌地图) 采集时间:2017年6月 采集范围:0-6层级世界范围:7-11层级中国范围 ...

  5. MBTiles地图瓦片管理工具

    采用C#+GMap.NET+MBTiles数据库来实现. 具有以下功能: 1)  支持单个文件追加到mbtiles数据库. 2)  支持批量导入Google切片组织的地图瓦片. 3)  支持直接对MB ...

  6. 使用Nodejs+mongodb开发地图瓦片服务器

    原先地图瓦片服务器采用的是arcgisserver发布的地图服务并进行切片,但ags发布的地图服务很占内存,发布太多的话服务器压力很大.再一个就是ags价太高了. 学习Nodejs之后,发现这是一个可 ...

  7. 在VC/MFC中嵌入Google地图——图文并茂

    近期须要实验室须要将在无人机地面站中嵌入地图,在网上找了非常多资料,最终有些眉目了, 首先.做这个须要用到的知识有.MFC控件.MFC类库.JavaScript脚本语言.Google API.Goog ...

  8. 隐藏 google 地图 Logo 隐藏 百度 地图 Logo

    Google 地图 var isFirstLoad=true; //地图瓦片加载完成之后的回调 google.maps.event.addListener(map, 'tilesloaded', fu ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(13)、图层扩展方式加载Google地图

    1.前言 http://mt2.google.cn/vt/lyrs=m@225000000&hl=zh-CN&gl=cn&x=420&y=193&z=9& ...

  10. Google地图路线规划

    Google地图路线规划: 需求:给定的两点之间Google地图路径规划和详情. 代码实现: //map定义省略 var directionsDisplay = new google.maps.Dir ...

随机推荐

  1. [Python]-sklearn模块-机器学习Python入门《Python机器学习手册》-02-加载数据:加载数据集

    <Python机器学习手册--从数据预处理到深度学习> 这本书类似于工具书或者字典,对于python具体代码的调用和使用场景写的很清楚,感觉虽然是工具书,但是对照着做一遍应该可以对机器学习 ...

  2. ES6中的箭头函数与普通函数的区别

    箭头函数与普通函数的区别 1.语法上更加简洁.清晰 基本语法: // 关于箭头函数的参数 // 如果箭头函数没有参数,直接写一个括号即可 let fun1 = () => { console.l ...

  3. Windows SMTP服务器的中继列表

    今天在一台Windows 2019的SMTP服务器上想增加一个匿名中继的客户端地址.登录到服务器后发现原来的设置丢失了,而且原来的允许列表也不见了.界面变成了这样. https://www.cnblo ...

  4. Html飞机大战(十七): 优化移动端

    好家伙,继续优化,   好家伙,我把我的飞机大战发给我的小伙伴们玩 期待着略微的赞赏之词,然后他们用手机打开我的给他们的网址 然后点一下飞机就炸了. 游戏体验零分 (鼠标点击在移动端依旧可以生效) 好 ...

  5. 【学习笔记】Vin-Mono论文阅读笔记(一)

    VINS-Mono 概述 VINS-Mono VINS-Mono是由一个单目相机和一个低成本IMU组成的鲁棒通用的单目视觉惯性系统.通过融合预积分的IMU测量值和特征观测值来获得高精度的视觉惯性里程计 ...

  6. Kubernetes 多租户:多租户介绍

    多租户集群由多个用户和/或工作负载共享,这些用户和/或工作负载被称为"租户".多租户集群的运营方必须将租户彼此隔离,以最大限度地减少被盗用的租户或恶意租户可能对集群和其他租户造成的 ...

  7. 使用scrapy爬取长安有妖气小说

    目标网站:https://www.snwx3.com/txt/434282.html 第一章地址:https://www.snwx3.com/book/434/434282/92792998.html ...

  8. 记一次批量更新整型类型的列 → 探究 UPDATE 的使用细节

    开心一刻 今天,她给我打来电话 她:你明天陪我去趟医院吧 我:怎么了 她:我怀孕了,陪我去打胎 我:他的吗 她:嗯 我心一沉,犹豫了片刻:生下来吧,我养! 她:他的孩子,你不配养! 我:我随孩子姓 需 ...

  9. .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现

    在最新版的 .NET 平台中,微软在逐步放弃 System.Drawing.Imaging ,给出的理由如下: System.Drawing命名空间对某些操作系统和应用程序类型有一些限制. 在Wind ...

  10. IDEA对数据库、表、记录的(增删改查可视化操作)、数据库安全性问题的演示

    对数据库的增删改查 新增数据库 修改数据库 删除数据库 对表的增删改查 新增表 修改表 删除表 对记录的增删改查 数据库安全性问题的演示 演示脏读 ​ 一个事物里面读到了另外一个事物没有提交的数据: ...