一、概念(百度百科)
地图投影(Map Projection),即把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法。书面概念化定义:地图投影就是指建立地球表面(或其他星球表面或天球面)上的点与投影平面(即地图平面)上点之间的一一对应关系的方法。即建立之间的数学转换公式。它将作为一个不可展平的曲面即地球表面投影到一个平面的基本方法,保证了空间信息在区域上的联系与完整。这个投影过程将产生投影变形,而且不同的投影方法具有不同性质和大小的投影变形。
二、原理(百度百科)
由于投影的变形,地图上所表示的地物,如大陆、岛屿、海洋等的几何特性(长度、面积、角度、形状)也随之发生变形。每一幅地图都有不同程度的变形;在同一幅图上,不同地区的变形情况也不相同。地图上表示的范围越大,离投影标准经纬线或投影中心的距离越长,地图反映的变形也越大。因此,大范围的小比例尺地图只能供了解地表现象的分布概况使用,而不能用于精确的量测和计算。地图投影的实质就是将地球椭球面上的地理坐标转化为平面直角坐标。用某种投影条件将投影球面上的地理坐标点一一投影到平面坐标系内,以构成某种地图投影
三、常见投影方式
除了上面这几种方式还有一种特别常见的投影方式就是经纬度直投,这个网上的资料很少大致意思就是等间隔划分出多个小方块(实际上有点像梯形),然后直接平铺成一个平面
三、常见投影投影坐标系
1.经纬度投影
这个投影是最常见的,但也是最容易忽略的,实际上我们看到的网络上的WGS84的坐标系实际上就是经纬度投影,有些人可能不明白了,WGS84不是地理坐标系么,为什么变成投影坐标系了?那么假设它不是投影坐标系,一个三维球的坐标怎么展示在一个二维地图的平面上呢?如果想明白了这个问题就知道为什么好多平台的WGS84坐标系的地图为什么能显示在二维地图上了。通常来说经纬度投影使用的是经纬度直投的方式,但是像WGS84这种全球通用的坐标系,为了考虑一些地形复杂的小国家和地区,通常会做一些纠偏和微调,所以一般来说经纬度投影是一种基于经纬度直投的复杂投影,甚至有些地区会结合其它投影方式一起使用,这种投影综合来说拟合是比较好。像天地图底图的的经纬度投影也大致是这种方式,用EPSG:4326的方式就能直接加载
2.墨卡托投影
墨卡托投影在实际的开发工作中一般很少用到,至少我几乎没用用到过,用到的好多都是墨卡托的变种。
经典的墨卡托投影一般是指等角正轴切圆柱投影,可以看下图
从上面图片可以看出来,赤道附近的变形几乎是0,但是纬度越高,它的变形也越严重,特别是快到南北极的时候,根本就没法投影到平面上,所以我们见到的好多墨卡托的投影的南北极都是别消减了一部分的(大致是南北纬85°到90°),
也好在南北极没有国家,也没有人提意见,不然就炸开锅了。
2.1 web墨卡托
经典的墨卡托投影是基于地球是个椭球体的,但好多地图厂商是比较懒的,特别是互联网上的,于是为了少一些复杂的运算,把地球当做一个正球体,于是就衍生出了web墨卡托,它由谷歌开创,又叫伪墨卡托投影,球面墨卡托,原理和经典墨卡托一样,操作和运算上简单了很多,并且拥有墨卡托永远等角的优点,在互联网上运用非常广泛,比如天地图、
2.2 高斯克里格
高斯-克吕格投影是横轴墨卡托投影的变种,与墨卡托投影类似,但不同之处在于高斯-克吕格的圆柱体沿经线而不是赤道接触球体或椭圆体。
从上面图片可以看出来,在圆柱和球挨着的地方变形很少,越靠近挨着的那个线,变形就越小,扩展的想一下,对全球的经度划分的细致一点儿,每隔几度就投影出一块区域,那么投影出来的平面误差就比较小了,然后就制定了投影带的这一概念,每隔3或者6度就做一个分度带。高斯-克吕格投影在长度和面积上变形很小,中央经线无变形,自中央经线向投影带边缘,变形逐渐增加,变形最大之处在投影带内赤道的两端。由于其投影精度高,变形小,而且计算简便(各投影带坐标一致,只要算出一个带的数据,其他各带都能应用),但是它也有一个缺点,因为离中央经线越远误差越大,不太适合大范围的地图展示,因此经常在大比例尺地形图中应用,比如用来表示某某市地图,某某县地图。。
2.3 UTM投影
全程是通用横轴墨卡托(Universal Transverse Mercator, UTM),其实质是等角横割圆柱投影,它是以圆柱为投影面,使圆柱割于地球椭球体的两条等高圈上,然后按等角条件,将中央经线两侧各一定范围内的经纬线投影到圆柱面上,再将其展成平面而得。
UTM投影和高斯克吕格投影的区别:(引用地址)
(1)中央经线长度比不同,UTM投影是0.9996,而高斯-克吕格投影是1。
(2)带的划分相同,而带号的起算不同。
(3)对于中、低纬度地区,UTM投影的变形优于高斯-克吕格投影。
(4)西方国家(美、英、德、法)多采用UTM投影作为国家基本地形图投影,东方国家(中、苏、蒙、朝)多采用高斯-克吕格投影作为国家基本地形图投影。
四、切片方案
在浏览器中访问在线的底图一般是访问的是地图的切片,也就是说对地图做缓存,分层级存成一块一块的小图片,其规则一般符合四叉树。
这个切片的规则和投影息息相关,一般常见的网络底图切片分为两大类,一是经纬度投影的切片方案,而是墨卡托的切片方案
4.1主流墨卡托投影方案
我上面有讲到,好多互联网地图厂商因为web墨卡托等角的优点以及其处理的便捷性而选择使用墨卡托投影,投影的南北极削减的那15度也不是随意定的,而是削减后的平面的高宽刚好是个正方形,方便做一层一层的四叉树分隔。使用墨卡托切片最经典的就是谷歌地图XYZ,在openlayers中使用XYZ的加载方式可以直接加载,然后还有TMS、QuadTree 其方式大致类似,只不过编号的顺序不一样,详见下图
4.2主流经纬度投影切片
我们都知道经纬度的划分是经度一共是360度,纬度一共是180度,所以一般经纬度直投的话,地图是个2:1的长方形
如果还按照墨卡托的那种四叉树的话不是太合适,天地图就在四叉树的基础上做了一次改进,在第一级的情况下显示两个瓦片
对比天地图的第一级的墨卡托切片(和谷歌的墨卡托一致)
4.2.1 切片分辨率
一般最常用的切片方案就是谷歌的web墨卡托切片方案,大致思路就是计算某个瓦片(一般是256*256)一个像素代表的距离,因为是个正方形,所以经度和纬度计算起来都一样,计算方法如下
var projectionExtent = projection.getExtent();
const size = getWidth(projectionExtent) / 256;
let maxZoom = Number(this.maxZoom) || 22
var resolutions = new Array(maxZoom);
for (var z = 0; z < resolutions.length; ++z) {
resolutions[z] = size / Math.pow(2, z);
}
但是当切片方案遇到EPSG:4326时就有了一个争议,就像上面的图片一样,它是个长方形,经度分辨率是360/256,纬度分辨率是180/256,处理这个问题就大致分为了两派,一个是谷歌和arcgis的派系,它们以经度为准,而geoserver派系的的则以纬度为准,以经度为准的话和其他的切图分辨率就一样了,以纬度为准的话计算方式如下
var resolution = 0.703125;
let maxZoom = Number(this.maxZoom) || 22
var resolutions = new Array(maxZoom);
resolutions[0] = resolution;
for (var z = 1; z < resolutions.length; z++) {
resolution = resolution / 2;
resolutions[z] = resolution;
}
其中0.703125是纬度180/256得来的