本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  在上一篇文章中我们对geopandas中的数据结构展开了较为全面的学习,其中涉及到面积长度等计算的过程中提到了具体的计算结果与所选择的投影坐标系关系密切,投影坐标系选择的不恰当会带来计算结果的偏差,直接关乎整个分析过程的有效与否。

  作为基于geopandas的空间数据分析系列文章的第二篇,通过本文你将会学习到geopandas中的坐标参考系管理

2 坐标参考系基础

2.1 CRS

  在一个二维的平面中,我们可以使用如图1所示的坐标系统,通过坐标\((x_{0},y_{0})\)唯一确定点的位置:

图1

  现实世界中的地球作为一个球体,当我们想要用同样的方式利用坐标\((\phi_{0},\lambda_{0})\)来唯一确定地球球面上的某个位置时,需要一套适应球体形状的坐标系统。而当我们想要在纸面或电脑屏幕上绘制平面地图时,就又需要有一套将地球球面展平的方法,上述的这些用于在不同情况下定义对象位置信息的坐标系统,就称为坐标参考系统Coordinate Reference System,下文统称CRS):

图2

  CRS可细分为地理坐标系投影坐标系

2.1.1 地理坐标系

  以弧度制下度数为单位的地理坐标系Geographic Coordinate Systems)帮助我们定位物体在地球球面上的具体位置以及绘制球体地图:

图3 WGS84地理坐标系示意图

  地理坐标系以地表上确定的某一个点为原点\((0,0)\),创建了包裹全球的网格,譬如WGS84,将本初子午线与赤道的交点作为原点(图4):

图4 WGS84地理坐标系及其经纬网格

2.1.2 投影坐标系

  地理坐标系虽然解决了我们在地球球面上定位的问题,但纬度和经度位置没有使用统一的测量单位,因为经度不变的情况下,纬度每变化1单位因为是对固定弧长的映射,所以真实距离是固定不变的,纬度变化1度的真实距离恒等于:

\[2\pi\cdot地球极半径/360\approx110.95(千米)
\]

可是经度每变化1单位对应的真实距离要随着纬度的变化而变化,经度变化1度的真实距离为:

\[(2\pi\cdot赤道半径/360)\cdot\cos(当地纬度)\approx111.314\cos(当地纬度)(千米)
\]

这就导致我们既不能直接在地理坐标系下精确度量几何对象的长度、面积,也无法直接用地理坐标系在平面上绘制出几何对象真实的形状。为了解决上述问题,各种各样的投影坐标系Projected Coordinate Systems)被开发出来(图5,其中右下角为地理坐标系,其余均为投影坐标系):

图5 各种CRS

  投影坐标系指的是从将3D球面展平为2D平面的一套数学计算方法,利用它可以优化形状比例/距离以及面积的失真情况,但实际情况中没有在整个地球表面都能“三全其美”的投影坐标系,有些投影坐标系优化形状上的失真,有些投影坐标系优化距离上的失真,有些投影坐标系专门针对面积失真进行优化,而有些投影坐标系可以对局部区域进行三个方面上的优化。

图6 投影坐标系变换过程示意

  常用的投影坐标系横轴墨卡托Universal Transverse Mercator,简称UTM),基于经度将全球等分为编号0-60的区域,且每个区域又进一步细分为南半球区域或北半球区域,譬如图7所示为美国本土跨过的区域:

图7

  划分出的每个区域,其原点\((0,0)\)位于左下角顶点,距离区域中轴线500千米(图8):

图8

  针对这样划分出的独立区域利用墨卡托投影法创建各自独立的坐标网格,这个过程可以通俗地理解为用圆筒包裹地球球体,从球心发散出的光穿过球体上每个位置点投射到外部圆筒内壁从而完成3D向2D的变换:

图9

  当然,这样做的后果是越靠近极点的几何对象被拉伸形变得越严重(图10),这也就是为什么俄罗斯疆域看起来如此庞大的原因:

图10 世界各国真实大小与墨卡托投影后差别

2.2 常用CRS格式

  通过前文我们了解到什么是CRS,而在计算机系统中要使用CRS,需要将其文档化,下面我们来了解CRS两种常见的文档存储格式。

2.2.1 Proj4

  Proj4字符串是一种识别空间或坐标参考系统的简洁方法,通过其定义的语法规则,将想要定义的CRS全部参数信息保存到一条字符串中。

  • Proj4语法

  Proj4字符串包含了一种CRS全部元素信息,用+连接每个元素定义部分,如下面的例子记录了横轴墨卡托北11区CRS对应的Proj4字符串:

+proj=utm +zone=11 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0

  它记录了如下信息:

proj=utm:声明投影方法为墨卡托

zone=11:声明对应北11区(因为这里是横轴墨卡托所以拥有独立分区,但并不是所有CRS都有分区,且在Proj4中区号加S才为南半球分区如11S,否则默认为北半球分区)

datum=WGS84:声明基准面为WGS84(基准面是椭球体用来逼近某地区用的,因此各个国家都有各自的基准面。国内常用的基准面有:BEIJING1954XIAN1980WGS84等)

units=m:声明坐标系单位设置为米

ellps=WGS84:声明椭球面(如何计算地球的圆度)使用WGS84

  上述例子记录了投影坐标系Proj4,下面我们再来看看地理坐标系对应的Proj4,如下例:

+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0

  它记录了如下信息:

proj=longlat:声明这是一个地理坐标系

datum=WGS84:声明基准面为WGS84

ellps=WGS84:声明椭球面使用WGS84

  与投影坐标系相比,没有单位units的信息,因为地理坐标系通常单位为十进制度数;而上述两个示例中都带有towgs84=0,0,0,这是一个转换因子,在需要进行数据转换时使用。

2.2.2 EPSG编码

  EPSGEuropean Petroleum Survey Group)编码,使用4或5位数字编码来唯一确定已存在的一种CRS,可以在http://spatialreference.org/ref/epsg/中查看和搜索所有已知的EPSGCRS对应关系(图11):

图11

  或在QGIS中查看:

图12

  譬如对于重庆,因为地跨东经105°11~110°11,中轴线距离108E更近,常用如下投影:

图13

  对应的EPSG编码为2381。

3 geopandas中的坐标参考系管理

  至此,我们已经对CRS有了较为全面的了解,打好了基础,接下来我们来正式学习geopandas中的坐标参考系管理,geopandas调用pyproj作为CRS管理的后端,因此所有可以被pyproj.CRS.from_user_input()接受的合法输入同样可以被geopandas识别,譬如针对上文所说的应用于重庆区域绘图的Xian 1980 / 3-degree Gauss-Kruger CM 108E

  • Proj4
import pyproj

pyproj.CRS.from_user_input('+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=IAU76 +units=m +no_defs')

图14

  • EPSG
pyproj.CRS.from_user_input(2381)

图15

  直接传入字符串格式的EPSG亦可:

图16

  查看对应的Proj4信息,关键参数与前面Proj4一致,只是以Proj4形式传入时系统会视作创建未知CRS一样,因此相对于官方CRS缺少了一些无关紧要的其他信息:

图17

3.1 CRS的设置与再投影

  在上一篇文章(数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇中我们介绍了创建GeoSeriesGeoDataFrame的方法,实际上,现实的空间分析计算任务中,必须要为数据设置合适的CRS,在geopandas.GeoSeries()geopandas.GeoDataFrame()中就包含参数crs,下面我们举例说明,还是先用到geopandas自带的世界国家地区数据,我们从中选择中国(坚持一个中国,我们将台湾地区组合进国土中):

import geopandas as gpd

world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# 利用name字段选择中国区域
china = world.loc[world['name'].isin(['China', 'Taiwan'])]
china

图18

  查看其crs属性即为其对应CRS,为WGS84对应的EPSG:4326,在当前的CRS下将其绘制出来:

图19

  利用to_crs()将其再投影到EPSG:2381并进行绘制:

图20

  通过比较可以发现,再投影之后的中国形变失真情况得到缓解,且坐标系单位范围也发生了变化(EPSG:2381单位:米),接下来我们参考谷歌地图上点击出的重庆渝中区某地坐标:

图21

  基于此创建只包含一个点的GeoSeries,尝试将其与EPSG:2381下的中国地图一同绘制:

from shapely import geometry
import matplotlib.pyplot as plt cq = gpd.GeoSeries([geometry.Point([106.561203, 29.558078])],
crs='EPSG:4326') fig, ax = plt.subplots()
china.to_crs(crs='EPSG:2381').plot(ax=ax, color='red', alpha=0.8)
cq.plot(ax=ax, color='orange', markersize=100, marker='x')
plt.xticks(rotation=20)

图22

  可以看出我们创建在重庆境内的点并没有绘制在正确的位置,接下来我们对cq进行再投影,再尝试将其与EPSG:2381下的中国绘制在一起:

fig, ax = plt.subplots()
china.to_crs(crs='EPSG:2381').plot(ax=ax, color='red', alpha=0.8)
# 先再投影到EPSG:2381
cq.to_crs(crs='EPSG:2381').plot(ax=ax, color='orange', markersize=100, marker='x')
plt.xticks(rotation=20)

图23

  这时我们定义的点被绘制到正确的位置。

  同样地,可以在投影后计算更为准确的面积,这里举一个粗糙的例子(实际计算国土面积不会这样粗糙),以中国中轴线东经104.19度最靠近的105度经线对应的EPSG:2380CRS计算面积:

图24

  如果直接用原来的ESPG:4326计算面积结果如下:

图25

  可以看出使用ESPG:2380计算出的面积比较接近大家记忆中的960万平方公里。

  以上就是本文的全部内容,如有笔误之处望斧正!

  下一篇文章将会介绍geopandas中的文件IO基础地图制作,敬请期待。

(数据科学学习手札75)基于geopandas的空间数据分析——坐标参考系篇的更多相关文章

  1. (数据科学学习手札89)geopandas&geoplot近期重要更新

    本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 最近一段时间(本文写作于2020-07-1 ...

  2. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...

  3. (数据科学学习手札111)geopandas 0.9.0重要新特性一览

    本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,geopandas释放了其最新正式版 ...

  4. (数据科学学习手札146)geopandas中拓扑非法问题的发现、诊断与修复

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为在Pyt ...

  5. (数据科学学习手札139)geopandas 0.11版本重要新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...

  6. (数据科学学习手札78)基于geopandas的空间数据分析——基础可视化

    本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...

  7. (数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)

    本文示例代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在前面的基于geopandas的空间数据分 ...

  8. (数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)

    本文示例代码.数据及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在本系列之前的文章中我们主要讨论了g ...

  9. (数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇

    本文对应代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 geopandas是建立在GEOS.GDAL.P ...

随机推荐

  1. 「BZOJ4590」「SHOI2015」 自动刷题机 解题报告

    自动刷题机 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法, ...

  2. 1034 有理数四则运算 (20 分)C语言

    题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...

  3. 高德API对接

    <?php class GaoDeAPI { private $key = '123456789'; # 你应用key /** * 地址转经纬度 */ public function getTr ...

  4. mui选择器和软键盘冲突解决

    只需要让此节点失焦即可: onfocus="this.blur();"

  5. 移动端保存当前屏幕内容为图片,canvas图片拼接

    需求:1.移动端点击分享时,截屏当前屏幕,并保存为图片  2.将截屏的图片与一张二维码图片进行拼接后,生成一张新的图片 技术栈:html2canvas.js.canvas2image.js 代码:(j ...

  6. TensorFlow——卷积神经网络的相关函数

    在TensorFlow中,使用tr.nn.conv2d来实现卷积操作,使用tf.nn.max_pool进行最大池化操作.通过闯传入不同的参数,来实现各种不同类型的卷积与池化操作. 卷积函数tf.nn. ...

  7. cogs 1176. [郑州101中学] 月考 字典树

    1176. [郑州101中学] 月考 ★★☆   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中B ...

  8. C++ 中的 unique 函数

    unique 函数是用来去除一个集合中重复元素的函数 若是在数组中,则调用此函数后,返回的除去重复元素的下一个指针的地方 若是在 vector中,则会返回重复元素下一个位置的迭代器,在调用erase函 ...

  9. 关于将vs项目推到GitHub上遇到的问题

    想整理下项目,然后通过vs推到github下. 1.在vs上创建好了一个程序.点中解决方案-->右键-->将项目加入代码库. 2.在github上创建好一个仓库,然后复制下https 3. ...

  10. gitbub 基本使用

    一.环境 git:https://git-scm.com/ 申请github账号:https://github.com/ 二.安装git 一直next即可 三.创储存建库 1.选择New reposi ...