GIS
(Geographic Information System
):地理信息系统
规范的定义
有这么一个联盟,叫OGC
(Open Geospatial Consortium
),这个联盟/组织定义了很多关于互联网地图的规则。 然后,开发者,企业,组织机构依照这个规则进行地理信息系统的开发。
大地测量学 (Geodesy
)
大地水准面 (
geoid
)大地水准面是海洋表面在排除风力、潮汐等其它影响,只考虑重力和自转影响下的形状,这个形状延伸过陆地,生成一个密闭的曲面。虽然我们通常说地球是一个球体或者椭球体,但是由于地球引力分布不均(因为密度不同等原因),大地水准面是一个不规则的光滑曲面。虽然不规则,但是可以近似地表示为一个椭球体,这个椭球体被称为参考椭球体(
Reference ellipsoid
)参考椭球体(
Reference ellipsoid
)参考椭球体是一个数学上定义的地球表面,它近似于大地水准面。因为是几何模型,可以用长半轴、短半轴和扁率来确定。我们通常所说的经度、纬度以及高度都以此为基础。
一方面,我们对地球形状的测量随着时间迁移而不断精确,另一方面,因为大地水准面并不规则,地球上不同地区往往需要使用不同的参考椭球体,来尽可能适合当地的大地水准面。当前世界范围内更普遍使用的是WGS
所定义的参考椭球。
坐标系统
有了参考椭球体这样的几何模型后,就可以定义坐标系来进行描述位置,测量距离等操作,使用相同的坐标系,可以保证同样坐标下的位置是相同的,同样的测量得到的结果也是相同的。
坐标系统类型
地理坐标系统(
Geographic coordinate system
)地理坐标系一般是指由经度、纬度和高度组成的坐标系,能够标示地球上的任何一个位置。前面提到了,不同地区可能会使用不同的参考椭球体,即使是使用相同的椭球体,也可能会为了让椭球体更好地吻合当地的大地水准面,而调整椭球体的方位,甚至大小。这就需要使用不同的大地测量系统(
Geodetic datum
)来标识。投影坐标系统(
Projected coordinate systems
)地理坐标系是三维的,我们要在地图或者屏幕上显示就需要转化为二维,这被称为投影(
Map projection
)。 常用的投影有:- 等矩矩形投影(
Platte Carre
):投影后图像被拉长,不适合航海使用,适合栅格图展示 - 墨卡托投影(
Mercator
):投影后高纬度图形被严重放大,两极的失真变大,但是却更容易计算。
- 等矩矩形投影(
常见坐标系统
标准的
GPS
坐标系:WGS84
,原始坐标体系。一般用国际标准的GPS
记录仪记录下来的坐标,都是GPS
的坐标火星坐标系:
gcj02
(高德地图、腾讯地图),它是在国际标准坐标WGS-84
上进行的一次加密,火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图、导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的。国家大地坐标系:
CGCS2000
(天地图),我们其实很多时候直接用WGS84
的坐标来代替CGCS2000
坐标。因为CGCS2000
的定义与WGS84
实质一样。采用的参考椭球非常接近。扁率差异引起椭球面上的纬度和高度变化最大达0.1mm
。当前测量精度范围内,可以忽略这点差异。可以说两者相容至cm
级水平,但若一点的坐标精度达不到cm
水平,则不认为CGCS2000
和WGS84
的坐标是相容的。百度坐标系:
bd09II
(百度地图)。由于国内的电子地图都要至少使用火星坐标进行一次加密,百度直接就任性一些,直接自己又研究了一套加密算法,来了个二次加密,这就是我们所熟知的百度坐标(BD-09
)。
谷歌(使用
GCJ02
和WGS84
):国内版经纬度用的GCJ02
,国外版用的是WGS84
,通常【GPS
设备获取到的原始经纬度和国外的地图厂商使用的都是WGS-84
坐标系】,此外它的EPSG
编号为EPSG:4326
。
WGS84
、GCJ02
、BD09
都是地理坐标系,球面坐标,单位为度,这种坐标方便在地球上定位,但是不方便展示和进行面积距离计算,我们印象中的地图都是平面的。所以就有了另外一种坐标系:平面坐标系,它是通过投影的方式从地理坐标系中转换过来,所以也称为投影坐标系,通常单位为米。
投影坐标系根据投影方式的不同存在多种,在 Web
开发的场景里通常使用的是 伪墨卡托投影(球体墨卡托),它基于墨卡托投影,把地理坐标系投影成正方形,这是通过舍弃了南北 85.051129
纬度以上的地区实现的,因为它是正方形,所以可以不断被划分为更多更小的正方形以显示更清晰的细节。很明显,伪墨卡托坐标系是非常显示数据,但是不适合存储数据的,通常我们使用地理坐标系存储数据,使用伪墨卡托显示数据。
坐标系统编号
EPSG
的英文全称是European Petroleum Survey Group
,中文名称为欧洲石油调查组织。
EPSG
是大地基准面、空间参考系统、地球椭球体、坐标转换和相关度量单位的公共注册中心,它为每个坐标系都分配有一个编码,常见的编号有:
EPSG:4326
:WGS84
EPSG:4490
:CGCS2000
EPSG:3857
:伪墨卡托投影
GCJ02
、BD:09
没有被EPSG
收录,在高德、百度等服务厂商中都是使用自己的坐标系,无需转换,但是如果需要在openlayers
等地图工具需要自行转换。
坐标系之间的转换
使用 gcoord
插件对不同坐标系的坐标进行转换:
安装:
npm i gcoord --save
使用:
import gcoord from 'gcoord';
var result = gcoord.transform(
[116.403988, 39.914266], // 经纬度坐标
gcoord.WGS84, // 当前坐标系
gcoord.BD09 // 目标坐标系
);
console.log(result); // [122.99395597, 44.99804071]
我们通常所说的坐标系转换通常是指各个厂商之间的地理坐标系转换,很少涉及投影坐标系。如我们需要将全球通用的wgs84
坐标系的经纬度[116.403988, 39.914266]
转换为百度地图的BD09
则可以使用上述方式进行转换。
我们在常见坐标系统最后两段说过,地理坐标系是三维的,它的经纬度信息只适合存储,在web
场景中我们需要将地理坐标系经纬度坐标转换为投影坐标系坐标。所以有以下两种情况需要转换到投影坐标系坐标:
- 自动转换:在各个地图厂商如高德、百度中,厂商默认使用对应的坐标系统,可以直接使用经纬度定位,因为在厂商在
api
内部进行了处理,自动将地理坐标系的经纬度坐标转换为投影坐标系坐标,简化了地图使用者的使用难度。 - 手动转换:在使用
openlayers
等开源库创建地图应用时,我们通常需要加载第三方地图切片数据,这些数据可能来自百度、高德这些厂商,他们使用的地理坐标系不同,需要我们手动转换经纬度到对应的坐标系下。openlayers
一般也不会自动将经纬度转换为投影坐标系坐标,需要手动转换。
投影坐标系的转换:
一般观点认为,投影坐标系EPSG:3857
是全球的,在使用GCJ02
等加偏地理坐标系时,需要先转换为EPSG:4326
地理坐标系统,再转为EPSG:3857
,gcoord
工具内部就是这样操作的。实际上由于GCJ02
坐标在中国大陆使用较为广泛,地图厂商在提供服务时往往直接处理GCJ02
经纬度坐标。直接从GCJ02
坐标转换为Web
墨卡托投影不会引入显著的偏差。所以在使用gcoord
工具将GCJ02
转换为EPSG:3857
投影坐标系时,实际应该使用如下方式进行转换:
// 将GCJ02视为WGS84,使用此算法进行直接转换
gcoord.transform(
coordinate, // 经纬度坐标
gcoord.WGS84, // 当前坐标系
gcoord.EPSG3857 // 目标坐标系
);
// 而不是使用如下方式,该方式会将 GCJ02 先转换为 WGS84 再转为 EPSG3857
gcoord.transform(
coordinate, // 经纬度坐标
gcoord.GCJ02, // 当前坐标系
gcoord.EPSG3857 // 目标坐标系
);
常用的地图数据源格式
image
:图片类型vector
:矢量类型,不随放大程度改变而失真shapefile
svg
GeoJSON
XML
KML
GML
tile
切片
在实际的互联网地图应用过程中,人们发现简单的图片和矢量图形不能够满足我们的需求,就比如我想从全世界的地图中找到我的家,如果只是一张图片的话,那这张图片得多大啊!
如果一张地图包含了庞大的数据,分辨率又高,将会占用非常大的容量,服务器支撑不起来,所有有了一种解决方法:切片。
所谓切片,是指把我们原始的地图切成很多方片,就是拼图里面一格一格的那种图片,我们想看哪就加载哪,不想看就不加载。这样做的话就打打提高了加载效率。加快了浏览速度。并且现在很多地图服务器的切片是有缓存的,能保证下次请求更快捷。
无论是图片数据也好,矢量数据也好,现在都能够实现这种切片原理了。
服务
WMS
(web map service
):网络地图服务,图片格式的地图数据被封装成了叫做WMS
的服务,只是一张图,可以通过将参数传递给服务,服务即时生成对应的图片资源。服务也可以将地图切分为瓦片,使用TMS
的方式编号,提供瓦片式的服务,在这种情况下,WMS
瓦片服务的URL
通常包含了瓦片行列编号、图层、样式、格式等参数,服务器根据请求参数生成相应的瓦片图像。WFS
(web feature service
):网络要素服务,数据为矢量图形,不会失真,可交互和编辑,改变形状,暂时没有对应的切片服务。WMTS
(web map tile service
):网络地图切片服务,将图片切片后的的服务,与WMS
的区别是它基于瓦片的请求,每个请求只需指定特定瓦片的行列编号和样式等信息。不会根据请求的参数即时生成对应的图像,提高了加载效率。
类似
WMTS
切片方式的还有一种切片规则:TMS
(tiled map service
),与WMTS
不同是,他的小切片地图是正方形的,而WMTS
的切片可以是矩形的。另外就是他们的金字塔横纵坐标是相反的。