GIS 坐标系相关基础概念简述

这是一个给非地信(Geographic Information System 或 Geo-Information system,GIS)专业但从事相关地信工作的技术人的简单入门,包括一些基本概念的简介。

首先这里推荐一个网站 ArcGIS Desktop 这是一个数字地图的工具网站,但它的文档十分完备且翻译质量良好,并对于相关知识体系的介绍清晰且权威。

以下正文按我自己的疑问和思路进行整理,笔记部分为我自己的理解。文中涉及所有专业术语来自地理信息技术学和测绘学,如有专业相关人员发现本文的错误请邮件联系我修改,十分感谢。

基础概念部分

什么是地理坐标系1

坐标系可使多个地理数据集使用公用位置进行集成。坐标系是一种用于表示地理要素、影像和观察值位置(例如公用地理框架内的 GPS 位置)的参照系统。

每个坐标系通过以下几方面定义:

  • 测量框架,分为地理(球面坐标从地心开始测量)或平面(地球的坐标投影到二维平面上)两种。
  • 测量单位(通常对于投影坐标系为英尺或米,对于经纬度为十进制度数)。
  • 投影坐标系的地图投影定义。
  • 其他测量系统属性,例如参考椭圆体、基准面和投影参数(诸如一条或多条标准纬线、中央子午线和 x 与 y 方向上可能的位移)。

笔记:这个定义告诉我们:坐标系并不是一个确定的 fomula,而是几个方面共同决定的约定。

坐标系的类型

GIS 中使用两种常用的坐标系类型:

  • 全局坐标系或球坐标系,例如经纬度。这些坐标系通常称为地理坐标系。
  • 基于地图投影的投影坐标系(例如横轴墨卡托投影、亚尔勃斯等积投影或罗宾逊投影),连同众多其他地图投影模型提供了各种将地球的球面地图投影到二维笛卡尔坐标平面的机制。投影坐标系有时称为地图投影。

坐标系(地理坐标系或投影坐标系)为定义真实世界的位置提供了框架。在 ArcGIS 中,坐标系作为将不同数据集中的地理位置自动集成到通用坐标框架中以供显示和分析的方法。

投影坐标系:建立一个参考系统,按照对应位置把椭球体投射到平面,再根据实际需要,划分为等角投影(地球面上的图形在投影后保持面积不变)、等积投影(地球面上的图形在投影后保持面积不变)、任意投影(既不具备等角性质,又没有等面积性质的投影。其中一特例是等距离投影,即该投影只在某些特定方向上没有变形)

pic

一副图形有地理坐标系统,但不一定含有投影坐标系统;如果有投影坐标系统那一定含有地理坐标系统。

笔记:大概意思就是--地理坐标系:以地球的球面坐标建立坐标系;投影坐标系:以地球的球面投影为平面建立平面坐标系。

为啥会有球面和平面两种表示方法?

投影坐标系在二维平面中进行定义。与地理坐标系不同,在二维空间范围内,投影坐标系的长度、角度和面积恒定。投影坐标系始终基于地理坐标系,而后者基于球体或旋转椭球体。2

笔记:
地球 -> 球面建模 -> 投影平面
数值化 -> 地理坐标系 -> 投影坐标系

起初在绘制第一张地图投影时,人们错误地以为大地是平坦的。后来这个假定得到了修订,地球被认为是完美的球体。十八世纪,人们开始意识到地球并不是完美的球体。此为制图旋转椭球体概念的萌芽阶段。

为更准确地表示地球表面上的位置,地图制作者研究了地球的形状(测地学),并形成了旋转椭球体的概念。基准面将旋转椭球体与地球表面的特定部分相关联。当前的基准面用于与整个地球表面更好地吻合。

以下是北美洲最常用的基准面:

  • 使用 Clarke 1866 旋转椭球体的北美洲基准面 (NAD) 1927
  • 使用大地参考系 (GRS) 1980 旋转椭球体的 NAD 1983
  • 使用 WGS 1984 旋转椭球体的世界坐标系 1984

更新的旋转椭球体基于卫星测量数据建立,比 19 世纪和 20 世纪早期建立的椭球体更为准确。

您会注意到术语“大地坐标系”和“基准面”被互换使用。

为精确制图而定义不同的旋转椭球体

北美洲数据一直都在使用 Clark 在 1866 年确定的旋转椭球体。Clarke 1866 旋转椭球体的长半轴为 6,378,206.4 米,短半轴为 6,356,583.8 米。

由于重力和地表要素存在差异,地球既不是完美的球体,也不是完美的旋转椭球体。卫星技术揭示了几种椭圆偏差;例如,南极比北极离赤道更近。根据卫星测绘确定的旋转椭球体正在替代早前使用的由地面测量确定的旋转椭球体。例如,北美洲新的标准旋转椭球体是 1980 大地参考系 (GRS 1980),其半径分别为 6,378,137.0 米和 6,356,752.31414 米。GRS 1980 旋转椭球体参数由国际大地测量与地球物理学联合会于 1979 年设立。

笔记:这也就解释了为什么会有好几种坐标系,因为人们对地球的建模其实一直存在问题,地球本身就不是完美球面或标准椭球面,所以基于这个模型的投影一定存在精度不足,因此需要不断进行建模修正导致下层概念也就是坐标系参数等发生变化。

球面和平面如何转换?

球面坐标转化为平面坐标的过程便称为投影。在 ArcGIS 中预定义了两套坐标系:地理坐标系(Geographic coordinate system)投影坐标系(Projected coordinate system)3

投影需要以下条件:

  • 球面坐标
  • 转化过程(也就是算法)

也就是说,要得到投影坐标就必须得有一个“拿来”投影的球面坐标,然后才能使用算法去投影。即每一个投影坐标系统都必须要求有 Geographic Coordinate System 参数。

关于投影……这是一个大概念,各学者有很多投影法,这里不列举,请参考 支持的地图投影的列表 | ArcGIS Desktop 这里,最常用的是墨卡托投影,这个链接文章有详细解释:常用坐标系及投影 - 知乎

基于以上概念,衍生出两个概念:

  1. 地理坐标:为球面坐标。 参考平面地是 椭球面。坐标单位:经纬度
  2. 大地坐标:为平面坐标。参考平面地是 水平面。坐标单位:米、千米等。

我国的常见的大地坐标系

  1. 建国初期,为满足国家经济建设和国防建设的急需,在天文大地网边布设边平差的基础上建立了1954 北京坐标系
  2. 20 世纪 80 年代,在全国天文大地网整体平差的基础上建成了1980 西安坐标系
  3. 20 世纪末至 21 世纪初,在中国地壳运动观测网络、全国 UPS 一/二级网和全国 UPSA/B 级网等整体平差的基础上又建成了新一代国家大地坐标系—2000 中国大地坐标系

地心坐标系又是啥?

以下内容来自百度百科:

20 世纪 50 年代之前,一个国家或一个地区都是在使所选择的参考椭球与其所在地区的大地水准面最佳拟合的条件下,按弧度测量方法来建立各自的局部大地坐标系的。由于当时除海洋上只有稀疏的重力测量外,大地测量工作只能在各个大陆上进行,而各大陆的局部大地坐标系间几乎没有联系。不过在当时的科学发展水平上,局部大地坐标系已能基本满足各国大地测量和制图工作的要求。但是,为了研究地球形状的整体及其外部重力场以及地球动力现象;特别是 50 年代末,人造地球卫星和远程弹道武器出现后,为了描述它们在空间的位置和运动,以及表示其地面发射站和跟踪站的位置,都必须采用地心坐标系。因此,建立全球地心坐标系(也称为世界坐标系)已成为大地测量所面临的迫切任务。

笔记:大地坐标系是各国根据自己需要制定的局部坐标参考,一般以境内某城市为基准面,所以这就造成世界范围内各国地图不通用、转换困难。军事上对于世界范围的整体建模有需求,所以出现了地心坐标系。

地理信息系统中的常见概念

WGS84 坐标系

全称,World Geodetic System-1984,既 1984 年的全球坐标系统。

美国 GPS 系统使用的是 WGS84 坐标系,受益于 GPS 系统的发展,现在全球用的最多的坐标系就是 WGS84 坐标系,它的 EPSG 编码是 4326。(EPSG 是大地基准面、空间参考系统、地球椭球体、坐标转换和相关度量单位的公共注册中心,它为每个坐标系都分配有一个编码)。

WGS84 坐标系是目前应用最为广泛的坐标系统,只要跟 GPS 定位相关,使用的都是 WGS84 坐标系,谷歌、OSM 也用的 WGS84 坐标系,很多软件(QGIS、ARCGIS)、前端脚本库(leaflet、mapbox、openlayer),在没有特别声明的时候,默认数据使用是 WGS84 坐标。

CGCS2000 坐标系

China Geodetic Coordinate System 2000,2000 国家大地坐标系,是我国当前最新的国家大地坐标系,它的 EPSG 编码为 4490。

相较于 WGS84,CGCS2000 坐标系的区别主要在于,它采用的是 2000 年的地球物理和大地测量的结果平差计算而设定的,坐标系 Z 轴指向历元 2000 的地球参考极方向,这些差异对高精数据有影响,但对于精度在 10m 以上的数据来说,这些差异可以忽略不计。

既非高精度的大多数情况下,我们可以认为 WGS84 坐标系=CGCS2000 坐标系。

GCJ02 坐标系

为了数据安全和保密,通过地形图非线性保密处理算法(俗称火星加密)加密过的 WGS84 坐标系,俗称国测局坐标系,或火星坐标系。

GCJ02 坐标系与 WGS84 坐标系之间的偏差大概在 50-700m 左右。

目前国内大部分地图底图和矢量数据(除了 LBS 服务的坐标数据,还包括 Android 手机的定位数据)都使用 GCJ02 坐标系,为了使 GCJ02 坐标系的底图与数据和 WGS84 坐标系的底图与数据适配,通常会使用坐标系纠偏算法,将坐标系统一。

各种形式的纠偏算法,JavaScript、Java、Python 等,都可以在网上搜索到,数据处理和 WebGis 开发,坐标系纠偏与数据融合统一是很重要的环节。

通过对原始数据和加偏后的数据进行分析,猜测加偏的算法大概是,使用克拉索夫斯基椭球的参数,将原始坐标对应经线和纬线上的偏差转为弧度后,与原始坐标相加,形成加偏坐标。

这个算法非常优秀,它既能保证 GCJ02 坐标系,相对于 WGS84 坐标系的线性单调性;又能保证 GCJ02 坐标系在伪距墨卡托投影下,相对于 WGS84 坐标系在伪距墨卡托投影下的线性单调性;既能保证数据在加偏后,仍能维持实际的空间相对位置,又能保证数据可以无损的纠偏回去。

GCJ02 坐标系是一种加密坐标系,目前国内大部分地图底图(高德、腾讯)和矢量数据(图商的 LBS 服务和 Android 手机的定位数据)都使用的是 GCJ02 坐标系,GCJ02 的加密算法非常精妙,地图底图和矢量数据在使用之前,需要将坐标系进行统一。

注:这段我全文复制粘贴了,因为火星坐标系是一个真的逆天的坐标系,用火星坐标系和地球的地图你是根本找不到位置的,要用火星坐标和火星建模才能等效找到地球上的相对位置。

BD09 坐标系

BD09 坐标系是百度地图使用的地心坐标系,2009 年,百度地图在 GCJ02 的基础上,做了二次加密,形成了 BD09 坐标系。

BD09 坐标系大概是先将 GCJ02 坐标转为极坐标后,添加一个常量做偏移值,再将偏移后的极坐标转回到直角坐标。

这种加偏算法,仅能保证相对于 GCJ02 坐标系的线性单调性,无法保证投影后的线性单调性,所以百度地图的墨卡托投影需要分区域进行。

因为在 GCJ02 坐标系的基础上,又做了一次加密,所以百度地图与其他地图的数据兼容性变得很不好。但作为国内硕果仅存的还在做街景的商业地图平台,加之其与 echart 开源 JavaScript 库的良好结合,我们很多时候,还需要使用百度地图,这时候,虽然麻烦,但还是需要对它的底图和数据进行坐标系统一。

BD09 坐标系是在 GCJ02 坐标系基础上二次加密而成,仅有百度地图在用,但百度地图有街景、有三维、有 echart,很多情况下,我们需要使用百度地图的底图和数据,这时候,就需要对坐标系进行统一了,百度地图 webAPI 和 JS API 都支持坐标系的转换。

城建坐标系

城建坐标多采用三度带的高斯-克吕格投影。同一坐标系下的大地坐标(即经纬度坐标 B,L)与其对应的高斯平面直角坐标(x,y)有严格的转换关系。

另:转换方法 如上海城建坐标转 84 坐标:这个方式是保密材料,涉及转换参数和纠偏参数,这些参数需要向上海测绘院申请,转换参数是涉密资料。

以上坐标系互相转换

这几个工具会比较好用:

coordtransform-js - npm

proj4 - npm

百度地图提供 WGS84、GCJ02 坐标系向 BD09 坐标系的转换 API:

百度地图 Web API 接口

以下方法未验证:

BD09、GCJ02、WGS84 坐标系之间的转换方法(python)

另外的问题:到底是经纬度还是纬经度?

最近用到的几个 Geo 相关库似乎对这个问题没什么统一规范,函数上标个注释就过去了。本来以为是地信专业的“太简单以至于没人提”的规范,但实际似乎并不是这么回事。所以突然较真的劲就上来了…

结论

先说结论吧,GeoJSON 规定 lnglat(经纬度),但也有 latlng 这种用法,所以这不是一个规范问题,只是一个约定问题。

GeoJSON 的 The GeoJSON Specification (RFC 7946) 中在 Position 这节是这么说的:

A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element.

先写经度的理由

先写经度的理由可以参考下面回答:

地理坐标是先写纬度还是经度? - 知乎

Why latitude/longitude and not the other way round? - Geographic Information Systems Stack Exchange

看看有哪些著名的 LngLat:

先写纬度的理由

那么问题来了,还是不少数据库和 JS Lib 先写纬度,为啥他们不按标准写呢?

比如 经纬度坐标格式 | ElasticSearch: 权威指南 | Elastic 中明确提到:

地理坐标点用字符串形式表示时是纬度在前,经度在后( "latitude,longitude" ),而数组形式表示时是经度在前,纬度在后( longitude,latitude )—顺序刚好相反。

其实,在 ElasticSearch 内部,不管字符串形式还是数组形式,都是经度在前,纬度在后。不过早期为了适配 GeoJSON 的格式规范,调整了数组形式的表示方式。

谷歌的软件也是纬度党:LatLng  |  Google Play services  |  Google Developers

腾讯地图: Class:基础类/LatLng - 腾讯地图 API

百度地图:androidsdk | 百度地图 API SDK 画线方法参数是 LatLng

历史上也有依据:

大约在公元前 600 年,腓尼基人首次使用纬度作为测量标准,使用极星作为参考。直到 1760 年哈里森航海天文钟发明后,经度才开始普遍使用。国际标准 ISO 6709 引用“纬度先于经度”。

你们不要再打了啦!

wiki 中有关于这个问题的解释:

Axis Order Confusion - OSGeo

https://wiki.osgeo.org/wiki/Axis_Order_Confusion#Coordinate_Systems

Coordinate Systems

From the perspective of a geographic software design three coordinate systems can potentially be addressed. Each differ either in the order of the coordinate tuple or in the direction of increasing values.

  1. Mathematical
  • Axis Order (X,Y)
  • Signed values, increase to the right und upwards
  1. Computer Graphics
  • Axis Order (X,Y)
  • Unsigned values increase to the bottom and to the right. The resulting graphics (often the screen > or window size) size is a limit
  1. Geographical Coordinate Systems
  • Axis Order varies, sometimes (Y,X), othertimes > (X,Y)
  • Signed values increase right and up limited to > -180, -90, 180, 90 (a spheroid)

所以要这样做

以上材料给我们的启示是:

  • 如果你是地信强相关 -> 那就采纳 GeoJSON 的 LngLat。
  • 如果你是数学强相关 -> 那就按 XY 坐标系的 LatLng 这样算顺手。
  • 如果你很不幸只是一个前端 -> 呵呵,给你啥用啥,你一个前端还有得选?

相关阅读

你是如何理解地理坐标系统与投影坐标系统的? - 知乎

聊聊 GIS 中的坐标系|再版 - 知乎

Footnotes

  1. 什么是地图投影?| ArcGIS Desktop
  2. GIS 专业人员需了解的投影基础知识 | ArcGIS Desktop
  3. 大地坐标系和地理坐标系的简单区别和联系—地信网论坛