后面会长期做Web GIS方面的前端开发工作,在这样的契机下,打算从头梳理下相关的知识做个整理。这篇文章是这个系列的第一篇文章,这个系列能更新多少篇文章还真说不准,哈哈。我并不是GIS方面专业的,只是作为一个对Web GIS有点了解的前端程序员,希望能和大家一起学习进步。
这篇文章打算介绍一些Web GIS方面的概念和名词,重点的包括投影平面地图、Web上的瓦片地图和坐标系。
什么是GIS
GIS全称是Geographic Information System,中文是地理信息系统。地理信息系统 (GIS) 是一个用于描绘地球和其他地理要素并突出其特征,从而显示和分析经空间配准的信息的系统,地图是主要载体。GIS 的目的在于创建、共享和应用基于地图的有用信息产品,这些信息产品能够支持所在组织的工作,以及创建和管理支持地理信息。简单的来说,GIS是一套基于地图,组织、展示和分析数据的系统。
平面地图是怎么来的
在现实世界中,地球近似于是一个球体,是三维的。但是我们平时看到的地图都是图2那种的平面地图,是二维的。将地球直接展开表面摊成一个平面的话,必然出现撕裂和褶皱。那么平面地图是怎么来的呢?
投影
将三维的地球表面映射到二维平面的过程就是地图的投影。而由于空间维度的降低,在投影的过程中,地图的扭曲和形变是无法避免的,因此,在绘制世界地图时,面积、方向和距离是无法全部顾及到。投影的规则有很多种,下面介绍google地图等在线地图都在用的墨卡托投影(Mercator Projection)。
墨卡托投影
墨卡托投影是圆柱投影的一种。想象一下,用一张巨大的纸卷成圆筒状包住地球,赤道和纸面相切。然后地球是一个透明的球体,在地球中心放置一个灯源,将投影到纸上的地图轮廓描绘下来,然后再摊开就成了平面地图。
在这种投影规则下的地图,赤道上投影出来的面积是完全真实的。然而,从赤道越往南北方向可以明显发现,投影出的图案发生了形变,纬度越高形变越大。极限情况下,对于南北极点来说,就变成了地图边缘的一条直线。(一般来说,这种投影的地图是不会显示极圈等高纬度地区的)
现实中南北极点相交的经线经过投影后变成了间距相等又相互平行的竖线。现实中纬度越高纬线周长越短的纬线经过投影后也变成了间距相等、相互平行并且等长的横线。虽然产生了一定的变化,但发生变化后更容易被人类理解。
投影规则有很多种,本文主要介绍Web上常用的墨卡托投影地图,其他的可以自行了解😃比如,还有一种常用于极地地区的等角正切方位投影。
缺点
墨卡托投影最大的问题就是纬度越高的地区,产生的形变越大。下面有个直观的例子。图6将美国区域描一个边,相同大小的区域如果在高纬度地区,会产生如图7一样的形变。这也是为什么很多文章里面会说“地图是错的”,“地图在欺骗你”等等,都是由于投影不可能完全顾及面积、距离和方向而产生了不同程度的形变导致的。
在这个网站上可以查看上面的例子链接:Compare Countries With This Simple Tool
最后还要强调一点墨卡托投影或者说大多数投影都存在的一个误区:地图上两点之间的距离未必是实际中的最短距离。例如从英国伦敦飞到美国西雅图的民航航线是这样的:
上图中的弧线是航班的真实路线。而在平面投影或地球仪上可以明显观察到,上图中这条弧线才是两座城市间的最近距离。这一切都是因为地图产生的形变。
Web上的地图
从上面知道了平面地图是经过投影变换而来,那么浏览器页面上的地图是怎么加载的呢?难道是保存了一张超级大的世界地图吗?那如果是一张地图,在不同层级展示的详略不同又是如何做到的呢?
瓦片地图
其实浏览器上地图使用的是瓦片地图,并不是保存了一张超级大的世界地图。瓦片地图是把平面地图切割成N个256*256像素的一小片一小片的地图, 然后在地图加载时一个方块一个方块的加载出来显示,最后拼凑成一个完整的世界地图。
瓦片是有层级的,这个和地图的层级也是对应的。最小地图等级是0,此时世界地图由一张瓦片组成,等级1时,由4张瓦片地图组成,等级每提升一级,都会把上一级中的一张地图分割成4个瓦片。最后形成了整个瓦片地图金字塔体系(如上图)。简单推算可知,第N层瓦片地图的数量是4N(N从0开始)。
为什么使用瓦片地图
- 传输效率高,减少服务器压力。预先将地图固定好等级,制作成图片存储在服务端,只需要返回对应等级图片即可,简单高效。
- 瓦片地图缓存高效
- 瓦片地图可以渐进加载
- 瓦片地图简单易用
瓦片编号
为了瓦片加载到正确的位置,首先就是要给瓦片地图进行编号。以谷歌/高德地图为例,一般是XYZ。Z表示层级,地图原点在屏幕左上角,向右是X的正方向,向下是Y的正方向。
不同地图的坐标系原点可能是不同的。
服务端存储
一般瓦片地图都存在服务器上,由服务器发布瓦片地图服务供前端调用。其实,瓦片的地图存储结构也比较简单,就是一堆文件夹下存了不同的图片。 第一层文件夹是层级,第二层文件夹下X的坐标,第二层文件夹里面就是用Y坐标命名的图片。
加载瓦片地图
一般会将地图绘制在canvas容器里,这里一般需要设置地图中心点和初始化层级。然后根据屏幕像素大小换算需要加载的瓦片地图,填充在正确位置。这里涉及到比较多的计算,平时开发中没必要自己手动计算,可以使用Npm上提供的各种库。想了解具体计算过程的可以点击参考文献了解。
坐标系
提到地图坐标系,可能第一个就会联想到GPS,经纬度这些日常生活中经常出现的概念。
参考椭球体
大地水准面是海洋表面在排除风力、潮汐等其它影响,只考虑重力和自转影响下的形状,这个形状延伸过陆地,生成一个密闭的曲面。虽然我们通常说地球是一个球体或者椭球体,但是由于地球引力分布不均(因为密度不同等原因),大地水准面是一个不规则的光滑曲面。虽然不规则,但是可以近似地表示为一个椭球体,这个椭球体被 称为参考椭球体(Reference ellipsoid)。参考椭球体(Reference ellipsoid)是一个数学上定义的地球表面,它近似于大地水准面。因为是几何模型,可以用长半轴、短半轴和扁率来确定。我们通常所说的经度、纬度以及高度都以此为基础。在这个几何模型的基础上,坐标系才得以确定。通常有两种坐标系 地理坐标系(geographic coordinate systems) 和 投影坐标系(projected coordinate systems)。
地理坐标系
EPSG是一个标准化的地理空间参考系统标识符集合,全称为“European Petroleum Survey Group”,即“欧洲石油调查组织”。2005年EPSG组织并入IOGP(International Association of Oil & Gas Producers),中文名称为国际油气生产者协会。EPSG 是将常用的坐标系、投影、地理坐标系等地理空间参考系统的名称、参数、定义等信息进行标准化,并赋予一个唯一编码。
经纬度
GPS上使用的经纬度,指的是WGS-84坐标系(World Geodetic System一1984 Coordinate System),1984年世界大地坐标系统,也是目前世界上最流行的地理坐标系统,它的EPSG编码是EPSG:4326。一般大家口头上说84坐标系或者4326都值得是经纬度这套坐标系。
中国地理坐标系
新中国成立以来,中国于上世纪50年代和80年代分别建立了1954年北京坐标系和1980西安坐标系,现行的是2000国家大地坐标系。
2000国家大地坐标系是全球地心坐标系在我国的具体体现,其原点为包括海洋和大气的整个地球的质量中心。2000国家大地坐标系采用的地球椭球参数如下:
长半轴 a=6378137m
扁率f=1/298.257222101
地心引力常数GM=3.986004418×1014m3/s2
自转角速度ω=7.292l15×10-5rad s-1
投影坐标系
在Web上,最流行的投影坐标系是 Web墨卡托,EPSG:3857是它的唯一编码。国外的 Google Maps,OpenStreetMap,Bing Map,ArcGIS 和 Heremaps 等都是使用这一坐标系,国内的百度地图、高德地图、腾讯地图和天地图等也是基于Web墨卡托,但是由于国内政策的原因,会有加密的要求。 在日常开发中,切换不同的地图,需要注意不同地图之间的坐标系转换。例如,Web内接入的是高德地图,功能是想要在地图上某个点打上一个标记。首先需要将经纬度转换成高德地图的坐标系才能正确标记。一般地图都会提供WSG84转换到自己坐标系的Api,但是不会提供反过来转换的Api。这部分可能会在后续开发过程中详细说明。
坐标系 | 别名 | 备注 |
---|---|---|
WGS-84坐标系 | 地心坐标系,GPS原始坐标体系 | |
GCJ-02 坐标系 | 国测局坐标,火星坐标系; | |
高德地图直接使用 | 国测局02年发布的坐标体系,它是一种对经纬度数据的加密算法,即加入随机的偏差。 | |
BD-09坐标系 | 百度地图使用 | 百度中国地图所采用的坐标系,由GCJ-02进行进一步的偏移算法得到。 |