如何利用Python进行地理坐标系统的转换?

Python大数据分析

共 2615字,需浏览 6分钟

 ·

2020-09-12 22:19

点击上方"蓝字"关注我们





Python大数据分析


记录   分享   成长

作者:师大Giser

专栏地址:

https://zhuanlan.zhihu.com/p/100993681

本文主要讲述地理坐标系统的原理以及怎么利用Python进行地理坐标系统转换,内容包含以下几块:

  1. 什么是地理坐标系统?
  2. 常用的地理坐标系统有哪些?
  3. 常用地图产品分别是什么地理坐标系?
  4. 怎么样利用Python实现地理坐标系的转换?
  5. 如何对转换后的精确度进行验证?

一、什么是地理坐标系统

用一张图来解释什么是地理坐标系统。

上图中红色实线圈为「地球自然表面」,由于地球自然表面坑坑洼洼、凹凸不平,所以在进行精准测量和定位的时候是不能直接用数据公式来拟合地球表面的。

这时,用一个可以近似表示地球表面的规则的椭圆(如上图中的蓝色虚线框所示)来进行地球表面的定位和测量,这个规则的三维球面就是地球椭球体。

但是,地球表面高低起伏不平,造成「地球椭球体」与地球自然表面在有的地方能够十分贴合,在有的地方则不是很贴合,这会造成测量及定位地误差。

所以,需要在地球椭球体以及地球自然表面之间加一层中间层,使其能够尽量贴合真实的地球表面,那这中间层就是「大地基准面」(如图中绿色实线圈所示),其可以理解为在特定区域内与地球自然表面极为吻合的椭球体。

地球上各个地方的地理位置及环境都是独一无二的,为了满足当地测量及定位的精度要求,全世界的地理学家们建立了无数个适合当地的大地基准面。

地理坐标系统就是由大地基准面衍生而来的,其是使用三维球面来定义地球表面位置,以实现通过经纬度对地球表面点位引用的坐标系。

一个地理坐标系包括角度测量单位、本初子午线和基准面三部分。一个大地基准面可以对应多个地理坐标系统,而一个「地理坐标系统」只能对应一个大地基准面。(这边为了方便理解,没有加入大地水准面的概念)

「同一个坐标点在不同地理坐标系的地图上,会落在不同的区域;同一个地点获取不同地理坐标系下的坐标数据,值不相同。」

因此,在地图制图以及空间分析之前,先要了解坐标点以及地图的地理坐标系统。

二、常用的地理坐标系统有哪些?

常用地图产品的地理坐标系统有:

  1. 地球坐标系(WGS-84)WGS-84是国际通用坐标系,也叫地球坐标系,GPS系统就是采用的WGS-84。WGS-84对于具体地方的位置描述可能不如当地坐标系来的准确,但是它对全球范围内的位置估计更准确。

在中国范围内,一般不直接使用WGS-84,而是使用由国家测绘局在WGS-84基础上加密的火星坐标系(GCJ-02),或者使用企业在GCJ-02上二次加密的坐标系,例如百度坐标系(BD-09)、搜狗坐标系等。

2.北京54坐标系(BJ-54)BJ-54是建国初期提出的地理坐标系,因此在早期有比较广泛的运用,有一定比例的数据使用的是BJ-54。

从现代的眼光看,它并不能十分准确地表达我国国境内的空间位置。

3.西安80坐标系(XIAN-80)XIAN-80由于后期意识到BJ-54的不足,我国1978年4月在西安召开全国天文大地网平差会议,确定重新定位,建立的我国新地理坐标系。它在中国经济建设、国防建设和科学研究中发挥了巨大作用。

4.2000国家大地坐标系(CGCS-2000)CGCS-2000我国当前最新的国家大地坐标系。2018年,我国国土资源系统全面采用CGCS-2000,并要求各类国土资源数据向CGCS-2000进行转换。

5.地方独立坐标系许多城市、矿区基于实用、方便与科学的目的,建立了地方坐标系。

国内地图产品的地理坐标系集中于CGCS-2000、GCJ-02以及一些对GCJ-02加密的商业坐标系,国外地图产品的地理坐标系则基本是WGS-84。

下表罗列了常用地图产品的地理坐标系,供大家参考。

三、利用Python实现地理坐标系统的转换

本节主要介绍怎么利用Python实现常用地理坐标系统之间的转换,并对转换结果进行精度检验。

话不多说,先上Python代码。

设置常量:

经纬度计算功能类:

简单判断坐标点是否在中国范围内:

WGS-84转换为GCJ-02:

GCJ-02转换为WGS-84:

GCJ-02转换为BD-09

GCJ-02转换为BD-09:

WGS-84转换为BD-09:

BD-09转换为WGS-84:

坐标转换功能包使用方法:

输出结果:

5. 如何对转换后的精确度进行验证?

接下来,对上述地理坐标系转换代码的精确度进行验证,具体的验证步骤为:

  1. 在A坐标系的地图产品下拾取5个坐标点;
  2. 利用代码对5个坐标点进行A坐标系到B坐标系的转换;
  3. 在B坐标系地图产品下同样拾取这5个位置的坐标点;
  4. 计算转换后坐标点与真值坐标点的偏移距离,并计算平均偏移距离。

其中,WGS-84坐标系的地图产品是OpenStreetMap,GCJ-02坐标系的地图产品是高德地图,BD-09坐标系的地图产品是百度地图。

以下为选择的5个坐标点。

坐标点1. 北京西路与石门一路交叉口:

坐标点2. 嘉定梅园路与塔城路交叉口:

坐标点3. 白石公路与外青松公路交叉口:

坐标点4. 贤浦路与金大公路交叉口:

坐标点5. 临港达到与环湖西三路交叉口

以下为精确度计算过程表:

通过上表可以得到:

  • WGS-84 => GCJ-02的误差均值是8.9米
  • WGS-84 => BD-09的误差均值是7.6米
  • GCJ-02 => WGS-84的误差均值是8.2米
  • GCJ-02 => BD-09的误差均值是3.9米
  • BD-09 =>WGS-84的误差均值是7.2米
  • BD-09 => GCJ-02的误差均值是3.9米

三个坐标系之间转换公式的误差均值都在10米以下,在能够使用的合理范围之内。由于不同地图产品之间存在一定的差异以及在拾取坐标的时候存在一定的误差,真实的误差均值可能比看到的误差还要再小。


· 往期精选 ·
1

详解seaborn可视化中的kdeplot、rugplot、distplot与jointplot

2

快速提升效率的6个pandas使用小技巧

3

在模仿中精进数据可视化01:国内38城居住自由指数




Python大数据分析

data creates value

扫码关注我们


浏览 56
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报