国内主要地图瓦片坐标系定义及计算原理

作者 CntChen 关注

2016.05.10 20:05* 字数 3144 阅读 1571评论 0喜欢 9

本文将介绍瓦片坐标相关知识,并提供高德地图、百度地图、谷歌地图的经纬度坐标与瓦片坐标的相互转换方法和类库。

背景

互联网地图服务商的在线地图都通过瓦片的方式提供,称为瓦片地图服务。最常见的地图瓦片是图片格式的,现在有的地图服务商也提供了矢量的瓦片数据,然后在用户端使用Canvas渲染成图片,如node-canvas实现百度地图个性化底图绘制。
在进行地图开发时,为获取特定经纬度所在区域的瓦片和获取瓦片上像素点对应的经纬度,经常需要进行经纬度坐标与瓦片坐标、像素坐标的相互转换。本文将介绍瓦片坐标相关知识,并提供高德地图、百度地图、谷歌地图的经纬度坐标与瓦片坐标的相互转换方法和转换类库--tile-lnglat-transform。

主要经纬度坐标系

国际标准的经纬度坐标是WGS84,Open Street Map、外国版的Google Map都是采用WGS84;高德地图使用的坐标系是GCJ-02;百度地图使用的坐标系是BD-09。高德地图和百度地图都提供了在线的单向坐标转换接口,将其他坐标系换化到自己的坐标系,但这种转换受限于http url请求字段长度和网络请求延迟,批量处理并不实用。离线相互转换可以通过开源JavaScript库coordtransform实现,误差在10米左右。
虽然各地图服务商经纬度坐标系不同,但某一互联网地图的经纬度坐标与瓦片坐标相互转换只与该地图商的墨卡托投影和瓦片编号的定义有关,跟地图商采用的大地坐标系标准无关。

墨卡托投影

使用经纬度表示位置的大地坐标系虽然可以描述地球上点的位置,但是对于地图地理数据在二维平面内展示的场景,需要通过投影的方式将三维空间中的点映射到二维空间中。地图投影需要建立地球表面点与投影平面点的一一对应关系,在互联网地图中常使用墨卡托投影。墨卡托投影是荷兰地理学家墨卡托于1569年提出的一种地球投影方法,该方法是圆柱投影的一种。投影的更多内容,可以查看地图投影的N种姿势。

墨卡托投影示意图.jpg

据我了解,各大地图服务商都采用了Web Mercator进行投影,瓦片坐标系的不同主要是投影截取的地球范围不同、瓦片坐标起点不同。

值得注意的是:

  • 墨卡托投影并不是一种坐标系,而是为了在二维平面上展示三维地球而进行的一种空间映射。所以在GIS地图和互联网地图中,虽然用户看到的地图经过了墨卡托投影,但依然使用经纬度坐标来表示地球上点的位置。
  • 在地图绘制和地图可视化时,就需要将地图数据使用投影的方式来呈现。

瓦片切割和瓦片坐标

对于经过墨卡托投影为平面的世界地图,在不同的地图分辨率(整个世界地图的像素大小)下,通过切割的方式将世界地图划分为像素为$256\times256$的地图单元,划分成的每一块地图单元称为地图瓦片。
地图瓦片具有以下特点:

  • 具有唯一的瓦片等级(Level)和瓦片坐标编号(tileX, tileY)。
  • 瓦片分辨率为256*256。
  • 最小的地图等级是0,此时世界地图只由一张瓦片组成。
  • 瓦片等级越高,组成世界地图的瓦片数越多,可以展示的地图越详细。
  • 某一瓦片等级地图的瓦片是由低一级的各瓦片切割成的4个瓦片组成,形成了瓦片金字塔。

瓦片切割(瓦片金字塔).jpg

高德地图瓦片坐标

坐标系定义

高德地图瓦片坐标与Google Map、Open Street Map相同。高德地图的墨卡托投影截取了纬度(约85.05ºS, 约85.05ºN)之间部分的地球,使得投影后的平面地图水平方向和垂直方向长度相等。将墨卡托投影地图的左上角作为瓦片坐标系起点,往左方向为X轴,X轴与北纬85.05º重合且方向向左;往下方向为Y轴,Y轴与东经180º(亦为西经180º)重合且方向向下。瓦片坐标最小等级为0级,此时平面地图是一个像素为256*256的瓦片。在某一瓦片层级Level下,瓦片坐标的X轴和Y轴各有2^Level个瓦片编号,瓦片地图上的瓦片总数为2^Level*2^Level。

高德地图Level=2的瓦片坐标编号情况.jpg

如上图所示,此时X方向和Y方向各有4个瓦片编号,总瓦片数为16。中国大概位于高德瓦片坐标的(3,1)中。

坐标转换图解

高德地图坐标转换图解.png

从高德地图坐标转换图解中可以看出,高德地图的坐标转换具有以下特点:

  • 所有坐标转换都在某一瓦片等级下进行,不同瓦片等级下的转换结果不同。
  • 经纬度坐标可以直接转换为瓦片坐标和瓦片像素坐标。
  • 瓦片像素坐标需要结合其瓦片坐标才能得到该像素坐标的经纬度坐标。

坐标转换公式

方法参考:Slippy map tilenames

  • 经纬度坐标(lng, lat)转瓦片坐标(tileX, tileY):
  • 经纬度坐标(lng, lat)转像素坐标(pixelX, pixelY)
  • 瓦片(tileX, tileY)的像素坐标(pixelX, pixelY)转经纬度坐标(lng, lat)

百度地图瓦片坐标

坐标系定义

百度地图的瓦片坐标系定义与高德地图并不相同,其墨卡托投影的参数也不同。百度地图瓦片坐标以墨卡托投影地图中赤道与0º经线相交位置为原点,沿着赤道往左方向为X轴,沿着0º经线向上方向为Y轴。
百度瓦片坐标定义了另一种二维坐标系,称为百度平面坐标系。百度平面坐标系的坐标原点与百度瓦片坐标原点相同,以瓦片等级18级为基准,规定18级时百度平面坐标的一个单位等于屏幕上的一个像素。平面坐标与地图所展示的级别没有关系,也就是说在1级和18级下,同一个经纬度坐标的百度平面坐标都是一致的。

百度地图Level=2的瓦片坐标编号情况.jpg

此时X方向和Y方向各有4个瓦片编号,但是外围的某些瓦片只有部分区域有地图或完全没有地图。没有地图的区域也可以认为其瓦片是无效的,即百度地图中X方向或Y方向的有效瓦片不一定达到2^{Level}个。
中国大概位于百度瓦片坐标的(0,0)中。

坐标转换图解

百度地图坐标转换图解.png

从百度地图坐标转换图解中可以看出,百度地图的坐标转换具有以下特点:

  • 百度经纬度坐标与百度平面坐标可以直接相互转换,并且与瓦片地图等级无关。
  • 经纬度坐标需要先转换为平面坐标,然后才能在某一瓦片等级下转换为瓦片坐标和瓦片像素坐标。
  • 瓦片像素坐标需要结合其瓦片坐标才能得到该像素坐标的平面坐标,然后再转换为经纬度坐标。

坐标转换公式

方法参考:百度地图API详解之地图坐标系统
发现百度JavaScript API的一个bug:百度JavaScript API中经纬度坐标转瓦片坐标bug

  • 经纬度坐标(lng, lat)转平面坐标(pointX, pointY)
    百度经纬度坐标与百度平面坐标的相互转换,并没有公开的公式,需要通过百度地图的API实现。
    主要代码为:

    // Bmap为百度JavaScript API V2.0的地图对象
    lnglatToPoint(longitude, latitude) {let projection = new BMap.MercatorProjection();let lnglat = new BMap.Point(longitude, latitude);let point = projection.lngLatToPoint(lnglat);return {pointX: point.x,pointY: point.y};
    }
  • 平面坐标(pointX, pointY)转经纬度坐标(lng, lat)
    也需要通过百度地图的API实现。
    主要代码为:

    pointToLnglat(pointX, pointY) {let projection = new BMap.MercatorProjection();let point = new BMap.Pixel(pointX, pointY);let lnglat = projection.pointToLngLat(point);return {lng: lnglat.lng,lat: lnglat.lat};
    }
  • 平面坐标(pointX, pointY)转瓦片坐标(tileX, tileY)

  • 平面坐标(pointX, pointY)转像素坐标(pixelX, pixelY)
  • 瓦片(tileX, tileY)的像素坐标(pixelX, pixelY)转平面坐标(pointX, pointY)
  • 经纬度坐标与瓦片坐标、像素坐标的相互转换,以平面坐标为中间量进行转换。

吐槽

百度地图JavaScript的代码非常奇葩,非常迷惑:
经纬度类是Point,平面坐标类是Pixel
经纬度转平面坐标是lngLatToPoint,接收一个Point对象,返回一个Pixel对象。
平面坐标转经纬度坐标是在pointToLngLat,接收Pixel对象,返回一个Point对象。
WTF!

转换类库

本文笔者根据前文介绍的经纬度坐标与瓦片坐标、像素坐标相互转换规则,编写了一个JavaScript类库--tile-lnglat-transform,提供了高德地图、百度地图、谷歌地图的经纬度坐标与瓦片坐标的相互转换。该模块是使用了UMD模块打包方式,可以在node和broswer中使用。
类库地址:https://github.com/CntChen/tile-lnglat-transform
该类库的详细信息及使用方法请在项目主页中查看。

瓦片地图等级范围

  • 瓦片地图等级范围反映了地图可缩放的程度。
  • 虽然最小的瓦片等级是0,但是部分地图并不提供0级或其他较小瓦片等级的地图,因为此时的世界地图将会很小,不能铺满用户设备窗口。

经过实际测试,各地图服务商的瓦片等级和测试链接如下:

  • 百度图片瓦片的层级是[3~18]

    http://online1.map.bdimg.com/onlinelabel/?qt=tile&x=49310&y=10242&z=18

  • 百度主页的层级是[3~19]

    http://map.baidu.com/

  • 高德图片瓦片的层级是[1~19]

    http://wprd03.is.autonavi.com/appmaptile?style=7&x=427289&y=227618&z=19

  • 高德地图官网介绍的高德地图层级:

    获取当前地图缩放级别,在PC上,默认取值范围为[3,18];在移动设备上,默认取值范围为[3-19]

  • 谷歌地图瓦片层级是[0~21]

    http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=1709157&y=910472&z=21&s=Galil

需注意的问题

  • 瓦片像素坐标的起始点

    • 高德地图、谷歌地图的瓦片坐标起点在左上角,像素坐标(pixelX, pixelY)在瓦片中的起点为左上角。
    • 百度地图中,像素坐标(pixelX, pixelY)的起点为左下角。

参考资料

瓦片地图服务

https://en.wikipedia.org/wiki/Tile_Map_Service

node-canvas实现百度地图个性化底图绘制

http://www.cnblogs.com/well1010/articles/baidu-map-node-canvas.html

tile-lnglat-transform

https://github.com/CntChen/tile-lnglat-transform

coordtransform

https://github.com/wandergis/coordtransform

地图投影的N种姿势

http://blog.sina.com.cn/s/blog_517eed9f0102w4rm.html

Web Mercator

https://en.wikipedia.org/wiki/Web_Mercator

Slippy map tilenames

http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

百度地图API详解之地图坐标系统

http://www.cnblogs.com/jz1108/archive/2011/07/02/2095376.html

百度JavaScript API中经纬度坐标转瓦片坐标bug

http://cntchen.github.io/2016/05/09/百度JavaScirpt%20%20API中经纬度坐标转瓦片坐标bug/

高德地图层级

http://lbs.amap.com/api/javascript-api/reference/map/

国内主要地图瓦片坐标系定义及计算原理相关推荐

  1. ROC的定义与计算原理

    ROC的定义与计算原理 这个链接说的很详细 点击查看ROC曲线的定义与计算原理 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用M ...

  2. GIS开发:国内互联网地图的坐标系

    "导航电子地图在公开出版.销售.传播.展示和使用前,必须进行空间位置技术处理." " 导航电子地图空间位置技术处理应由国务院测绘行政主管部门指定的机构采用国家规定的方法统 ...

  3. 瓦片坐标系、经纬度、像素坐标的转换

    参考: 国内主要地图瓦片坐标系定义及计算原理 Slippy map tilenames coordtransform 坐标转换 点击查询瓦片信息 node-canvas实现百度地图个性化底图绘制

  4. WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍

    1. 背景 1.1 地图瓦片之前 在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的地理范围传送到服务端,服务器端将地理范围内的地理数据都查询出来,然后在服务端按照预先定义的专题地图 ...

  5. 瓦片地图服务与地图瓦片原理

    本文字数:9099字 预计阅读时间:25分钟 这里,首先我们从概念出发,搞清楚瓦片地图服务以及地图瓦片的原理,读起来似乎有点拗口,但是从字面上看得出它们必定拥有着区别与联系,前者是WebGIS中的一个 ...

  6. GIS开发二:批量下载和拼接地图瓦片

    文章目录 1.简介 1.1 Web墨卡托投影 1.2 经纬度坐标系 1.3 瓦片定义 1.4 瓦片编号 1.5 瓦片和像素 1.6 瓦片计算公式 1.7 网络地图服务(WMS) 1.8 切片地图服务( ...

  7. 车载GNSS/INS/LiDAR坐标系定义与理解

    目录 一.基本坐标系 1.1 地心惯性坐标系(Inertial coordinate system,i系) 1.2 地心地固坐标系(Earth-Centered, Earth-Fixed,e系) 1. ...

  8. 地图瓦片切片方案汇总

    文章目录 前言 地图切片 主流切片方案 谷歌XYZ TMS QuadTree 百度XYZ 天地图 总结 前言 我们日常使用的地图都是经过web墨卡托(参考这里)形成的平面地图,地图就变为平面的一张地图 ...

  9. 翻译:Bing地图瓦片体系

    Bing Maps Tile System Bing地图瓦片体系 原文链接:http://msdn.microsoft.com/en-us/library/bb259689.aspx Bing Map ...

最新文章

  1. Codeforces round 1083
  2. 分享我对领域驱动设计(DDD)的学习成果
  3. RequestToViewNameTranslator
  4. @async 没有异步_javascript之异步函数
  5. 转行 AI 成为技术大牛,你需要理解这两项技术!
  6. 购买二手房时 众多购房者忽视办理土地证过户
  7. Vc++安装包_Visual C++ 6.0中文版安装包下载及win11安装教程
  8. html文件嵌入到reportlab,Django Reportlab使用HTML
  9. Postman下载与安装操作步骤【超详细】
  10. 怎么修改u盘的图标 如何修改移动硬盘图标
  11. 怎么缩小gif动图的体积?三步快速压缩gif体积
  12. 二叉树由遍历确定一棵树
  13. 操作系统:动态分区存储(首次适应算法、最佳适应算法)
  14. vue的entries和nextTick
  15. 英伟达 Nano 新手必读:Jetson Nano 深度学习算法模型基准性能测评
  16. 无人机,diyDrones,3dr,pixhawk,Chris Anderson, 这几个概念是什么关系?
  17. J: Participate in E-sports [大数牛顿迭代判断是否是平方数]
  18. 百度地图 - 绘制驾车路线图
  19. 【技术分享】一封伪造邮件引发的研究
  20. 招商银行面试问题20200416

热门文章

  1. Salesforce 单点登录
  2. 推荐使用多年的这些高效的工具网站,每一个都值得收藏
  3. 如何定义性能”提升“了多少?
  4. 第一章 51单片机开发入门知识介绍
  5. 老苹果手机,密码锁忘了,Apple ID密码也忘了怎么办?
  6. paddle第十九期3天训练营3.14-day2
  7. 工业相机的帧频和行频是什么意思?
  8. 轻松洁净地面,还能自动清洗烘干拖布,只需一台追觅扫拖机器人
  9. extjs 4.1 用户管理界面设计
  10. 被“短信嗅探”盯上 一觉醒来一无所有?