前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python地信专题 | 基于geopandas的空间数据分析-坐标参考系篇

Python地信专题 | 基于geopandas的空间数据分析-坐标参考系篇

作者头像
朱卫军 AI Python
发布于 2022-04-02 13:08:26
发布于 2022-04-02 13:08:26
2K00
代码可运行
举报
运行总次数:0
代码可运行

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

1 简介

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

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

2 坐标参考系基础

2.1 CRS

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

图1

现实世界中的地球作为一个球体,当我们想要用同样的方式利用坐标来唯一确定地球球面上的某个位置时,需要一套适应球体形状的坐标系统。

而当我们想要在纸面或电脑屏幕上绘制平面地图时,就又需要有一套将地球球面展平的方法。

上述的这些用于在不同情况下定义对象位置信息的坐标系统,就称为坐标参考系统Coordinate Reference System,下文统称CRS):

图2

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

2.1.1 地理坐标系

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

图3 WGS84地理坐标系示意图

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

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

2.1.2 投影坐标系

地理坐标系虽然解决了我们在地球球面上定位的问题,但纬度和经度位置没有使用统一的测量单位。

因为经度不变的情况下,纬度每变化1单位因为是对固定弧长的映射,所以真实距离是固定不变的,纬度变化1度的真实距离恒等于:

地球极半径千米

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

这就导致我们既不能直接在地理坐标系下精确度量几何对象的长度、面积,也无法直接用地理坐标系在平面上绘制出几何对象真实的形状。

为了解决上述问题,各种各样的投影坐标系Projected Coordinate Systems)被开发出来(图5,其中右下角为地理坐标系,其余均为投影坐标系):

图5 各种CRS

投影坐标系指的是从将3D球面展平为2D平面的一套数学计算方法,利用它可以优化形状比例/距离以及面积的失真情况。

但实际情况中没有在整个地球表面都能“三全其美”的投影坐标系,有些投影坐标系优化形状上的失真,有些投影坐标系优化距离上的失真,有些投影坐标系专门针对面积失真进行优化,而有些投影坐标系可以对局部区域进行三个方面上的优化。

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

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

图7

划分出的每个区域,其原点位于左下角顶点,距离区域中轴线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字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+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,如下例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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自带的世界国家地区数据,我们从中选择中国(坚持一个中国,我们将地区组合进国土中):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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下的中国地图一同绘制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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下的中国绘制在一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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基础地图制作,敬请期待。

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020/02/14 20:27:09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
  在本系列之前的文章中我们主要讨论了geopandas及其相关库在数据可视化方面的应用,各个案例涉及的数据预处理过程也仅仅涉及到基础的矢量数据处理。在实际的空间数据分析过程中,数据可视化只是对最终分析结果的发布与展示,在此之前,根据实际任务的不同,需要衔接很多较为进阶的空间操作,本文就将对geopandas中的部分空间计算进行介绍。
Feffery
2020/05/25
4K0
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
  通过前面的文章,我们已经对geopandas中的数据结构、坐标参考系以及文件IO有了较为深入的学习,在拿到一份矢量数据开始分析时,对其进行可视化无疑是探索了解数据阶段重要的步骤。
Feffery
2020/03/04
3.6K0
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
geopandas:Python绘制数据地图
GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口。 GeoPandas扩展了Pandas的数据类型,并使用matplotlib进行绘图。GeoPandas官方仓库地址为:GeoPandas。 GeoPandas的官方文档地址为:GeoPandas-doc。 本文主要参考GeoPandas Examples Gallery。 GeoPandas的基础使用见Python绘制数据地图1-GeoPandas入门指北。 GeoPandas的可视化入门见Python绘制数据地图2-GeoPandas地图可视化。
luckpunk
2023/09/14
3.7K0
geopandas:Python绘制数据地图
动手学geopandas地理数据分析
如何用Python分析诸如各国人口和GDP数据,各省市房价等地理相关数据,并在地图上优雅地展示你的结果?你需要geopandas!?? 一,GeoPandas总体介绍 geopandas 是pand
lyhue1991
2021/04/07
1.5K0
动手学geopandas地理数据分析
(数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)
在上一篇文章中我们详细学习了geoplot中较为基础的三种绘图API:pointplot()、polyplot()以及webmap(),而本文将会承接上文的内容,对geoplot中较为实用的几种高级绘图API进行介绍。
Feffery
2020/05/21
1.8K0
(数据科学学习手札83)基于geopandas的空间数据分析——geoplot篇(下)
【Python】应用:pyproj地理计算库应用
pyproj 是 Python 中一个非常有用的库,用于执行地理坐标系统的转换和地图投影。它是基于 proj 库的 Python 接口,因此继承了 proj 库的强大功能,但以 Python 的形式提供了更友好的接口。
DevFrank
2024/09/07
2210
【Python】应用:pyproj地理计算库应用
大地测量学:EPSG:4326、EPSG:3857
最近接手一个GIS项目,需要用到 PostGIS,GeoServer,OpenLayers 等工具组件,遇到一堆地理信息相关的术语名词,在这里做一个总结。
Jean
2021/11/22
3.6K0
大地测量学:EPSG:4326、EPSG:3857
GIS世界里坐标系“黑话”
世界大地测量系统(World geodetic system,简称WGS)是指1960年以来, 由美国国防制图局(DMA)建立的四个世界大地测量系统(WGS60、WGS66、WGS72和WGS84)的统称
追风骚年
2021/11/19
2.3K0
基于geopandas的空间数据分析——空间计算篇(下)
在基于geopandas的空间数据分析系列文章第8篇中,我们对geopandas开展空间计算的部分内容进行了介绍,涉及到缓冲区分析、矢量数据简化、仿射变换、叠加分析与空间融合等常见空间计算操作,而本文就将针对geopandas中剩余的其他常用空间计算操作进行介绍。
朱卫军 AI Python
2022/04/03
1.3K0
基于geopandas的空间数据分析——空间计算篇(下)
Python pyproj 实现地理坐标转换
pyproj是一个Python库,用于执行坐标转换和投影变换。它基于Proj库,后者是一个C库,用于处理地图投影和坐标变换。pyproj提供了Python语言的接口,使得用户可以方便地使用这些功能。
为为为什么
2024/07/02
9240
GIS坐标系测绘原理:大地水准面/基准面/参考椭球体/EPSG/SRI/WKT
预热文章系列:《GIS历史概述与WebGis应用开发技术浅解》、《GIS坐标系:WGS84,GCJ02,BD09,火星坐标,大地坐标等解析说与转换》、《OGC标准WMTS服务概念与地图商的瓦片编号流派》、《GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857 》我们过一遍如下概念:
周陆军
2021/07/13
5K0
(数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)
  在前面的基于geopandas的空间数据分析系列文章中,我们已经对geopandas的基础知识、基础可视化,以及如何科学绘制分层设色地图展开了深入的学习,而利用geopandas+matplotlib进行地理可视化固然能实现常见的地图可视化,且提供了操纵图像的极高自由度,但对使用者matplotlib的熟悉程度要求较高,制作一幅地图可视化作品往往需要编写较多的代码,而geoplot基于geopandas,提供了众多高度封装的绘图API,很大程度上简化了绘图难度,就像seaborn之于matplotlib。
Feffery
2020/05/07
2.4K0
(数据科学学习手札82)基于geopandas的空间数据分析——geoplot篇(上)
R可视乎|空间地理数据可视化(1)
研究生讨论班第一次用 slides 作报告,主要讲了《Geospatial Health Data》[1]一书中关于空间地理数据可视化的内容。文末给出对应的 pdf 网页版本。
庄闪闪
2021/08/20
3.5K0
R可视乎|空间地理数据可视化(1)
用 GeoPandas 绘制超高颜值数据地图
通常情况下,在执行 EDA 时,我们会面临显示有关地理位置的信息的情况。例如,对于 COVID 19 数据集,人们可能希望显示各个区域的病例数。这是 Python 库 GeoPandas 的用武之地。
数据STUDIO
2021/12/15
5.2K0
用 GeoPandas 绘制超高颜值数据地图
让GIS三维可视化变得简单-地理坐标系统
地理位置也就是坐标说是 GIS 的灵魂不为过吧,像天气预报、火箭发射包括地震、火山等事故发生时,新闻媒体就会说东经 XX 度、北纬 YY 度发生了什么什么,还有高德百度的地图导航、定位等等都需要用到坐标系统,因为没有准确的位置信息就无法表达地物的位置关系,地图查询分析等等也就无从谈起了
isboyjc
2022/03/28
1.1K0
让GIS三维可视化变得简单-地理坐标系统
让GIS三维可视化变得简单-投影坐标系统
投影坐标系统 PCS(Projection Coordinate System),它也叫非地球投影坐标系统 (notearth),或者再简单点叫平面坐标系统,也就是使用基于 X,Y 值的坐标系统来描述地球上某个点所处的位置
isboyjc
2022/03/28
1.3K0
让GIS三维可视化变得简单-投影坐标系统
空间参考系统
假想将静止的平均海水面,延伸到大陆内部,形成一个连续不断的,与地球比较接近的形状,其表面称之为大地水准面,由它包围的球体叫“大地体”。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.4K0
空间参考系统
(数据科学学习手札74)基于geopandas的空间数据分析——数据结构篇
geopandas是建立在GEOS、GDAL、PROJ等开源地理空间计算相关框架之上的,类似pandas语法风格的空间数据分析Python库,其目标是尽可能地简化Python中的地理空间数据处理,减少对Arcgis、PostGIS等工具的依赖,使得处理地理空间数据变得更加高效简洁,打造纯Python式的空间数据处理工作流。本系列文章就将围绕geopandas及其使用过程中涉及到的其他包进行系统性的介绍说明,每一篇将尽可能全面具体地介绍geopandas对应方面的知识,计划涵盖geopandas的数据结构、投影坐标系管理、文件IO、基础地图制作、集合操作、空间连接与聚合。   作为基于geopandas的空间数据分析系列文章的第一篇,通过本文你将会学习到geopandas中的数据结构。 geopandas的安装和使用需要若干依赖包,如果不事先妥善安装好这些依赖包而直接使用pip install geopandas或conda install geopandas可能会引发依赖包相关错误导致安装失败,官方文档中的推荐安装方式为:
Feffery
2020/02/15
2.8K0
【C++】开源:地图投影和坐标转换proj库配置使用
proj 库是一个开源的库,主要用于地理坐标系之间的转换和地图投影。它被广泛应用于地理信息系统(GIS)和其他需要坐标转换和地图投影的应用中。
DevFrank
2024/07/24
8700
Web墨卡托公开的小秘密
所谓地图投影,是利用一定数学法则把地球表面的经、纬线转换到平面上的理论和方法。由于地球是一个赤道略宽两极略扁的不规则的梨形球体,故其表面是一个不可展平的曲面,所以运用任何数学方法进行这种转换都会产生误差和变形,为按照不同的需求缩小误差,就产生了各种投影方法,eg:墨卡托投影,高斯克吕格投影, Lambert__投影,UTM__投影…
用户9580384
2022/10/05
2.8K0
Web墨卡托公开的小秘密
推荐阅读
相关推荐
(数据科学学习手札84)基于geopandas的空间数据分析——空间计算篇(上)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验