坐标系
坐标系总体分为两种:
- 地理坐标系,描述的是一个球面上的真实位置,单位是度,分,秒
- 投影坐标系:描述的是一个平面上的位置,单位是米,千米等等
地球近似
地球表面是凹凸不平的,有高山,有峡谷等等,过于复杂和多变,不利于描述,因此通常采用一个近似的模型来描述地球

大地水准面
假想海面静止,且延申至大陆,受到重力的影响下,形成一个不平滑过度的,凹凸不平的闭合曲面。它是最拟合地球的参考曲面了,需要注意的是大地水准面不等于海平面
以大地水准面来描述地球的话,是一个不规则的球形,可以近似为一个椭球体,成为地球椭球体
当我们使用地球椭球体来近似时,必然会出现一种状况,某些地方和椭球面贴合的较好,而某些地方贴合的较差。为了不同的目的,常常进行如下区分
- 地心大地坐标系:将椭球的球心放在地球的中心(质心)。例如 WGS84,GCJ-02
- 参心大地坐标系:为了使得局部更加贴合,将椭球的球心不放在地球的中心。例如 Beijing54
地理坐标系
地理坐标系可分为天文经纬度,大地经纬度,地心经纬度,GIS 中常用的是大地经纬度和地心经纬度

大地经纬度
- 经度:参考椭球面上某点的大地子午面与本初子午面间的两面角,东正西负;
- 纬度:参考椭球面上某点的法线与赤道平面的夹角,北正南负;
- 高: 某点沿法线方向到参考椭球面的距离
地心经纬度
- 经度:参考椭球面上某点的大地子午面与本初子午面间的两面角,东正西负;
- 纬度:参考椭球面上某点的法线与赤道平面的夹角,北正南负;
- 地心距: 某点与地心的距离
可以看出大地经纬度和地心经纬度区别不大,只是参考系不同
投影坐标系
由于椭球体无法完全展开为一个平面,当我们需要在平面上绘制的时候,就需要采用投影的方式,将 3D 转为 2D,再进行绘制。在投影的时候,不可避免的会产生变形,例如距离,比例,距离等变形

为了地图不同的用途,投影方式也不同,常用的投影方式如下
按照投影的变形分类
等角投影,等距投影,等积投影

按照投影的方法分类
圆柱投影,圆锥投影,方位投影

按照投影的轴分类
正轴投影,横轴投影,斜轴投影

高斯克吕格投影(GK 投影)

高斯克吕格投影为横轴等角切圆柱投影,是我国地图常用投影,存在如下特点
- 等角:局部形状不变形
- 中央经线无变形(非本初子午线,而是 GK 投影所选择的参考线),距离中央经线越远,形变越大
- 南北向距离在赤道以外会逐渐变形,变形量随着距离赤道的距离而增加。
墨卡托投影

墨卡托投影为正轴等角切圆柱投影,存在如下特点
- 等角:局部形状不变形
- 经纬度投影后均为直线,易于绘制
- 赤道不变形;距离赤道越远,面积变形越大(面积被放大)
- 无法完整显示高纬度,一般显示到 85 度
Web 墨卡托投影
web 墨卡托投影是 Google Map 在电子地图中所创造并使用的地图投影方法,是墨卡托投影地图的一个轻微变体,Web 墨卡托在所有比例尺下都使用球面公式,主要用于基于 Web 的地图程序,
- 对于小比例尺地图:它与标准的墨卡托用的公式一样
- 对于大比例尺地球:大比例尺的墨卡托地图通常使用投影的椭球面形式,这种差异在全球比例尺下是察觉不到的,但会导致局部地区的地图稍微偏离
// 投影,经纬度转投影坐标function lonLatToMeters(lon: number, lat: number) { const x = (EarthRadius * lon * Math.PI) / 180; const y = EarthRadius * Math.atanh(Math.sin((lat * Math.PI) / 180)); return [x, y];}
// 投影坐标转经纬度function metersToLonLat(x: number, y: number) { const lon = x / ((EarthRadius * Math.PI) / 180); const lat = (180 / Math.PI) * Math.atan2(Math.sinh(y / EarthRadius), Math.cos(lon));
return [lon, lat];}通用横轴墨卡托投影(UTM 投影)

通用横轴墨卡托投影是横轴等角切圆柱投影
是一种国际标准化的地图投影法,使用笛卡儿坐标系,标记南纬 80° 至北纬 84° 之间的所有位置
其他
常说的火星坐标是什么呢?
火星坐标说的就是 GCJ-02(国测局制定的坐标系),它时再 WGS84 的基础上,对经纬度进行了一次加密,目的是为了防止非法获取经纬度信息,从而造成隐私泄露。因此 GPS 得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了火星的感觉,在坊间也将 GCJ-02 戏称为火星坐标系
可以调用地图 API 或者使用其他三方库来进行转换