02-坐标参考系统

源代码 请看此处

%matplotlib inlineimport pandas as pd
import geopandas
countries = geopandas.read_file("zip://data/ne_110m_admin_0_countries.zip")
cities = geopandas.read_file("zip://data/ne_110m_populated_places.zip")
rivers = geopandas.read_file("zip://data/ne_50m_rivers_lake_centerlines.zip")

2.1 坐标参考系统

到目前为止,我们已经使用了具有特定坐标的几何数据,而没有进一步想知道这些坐标是什么意思或者它们是如何表达的

**坐标参考系统(CRS)**将坐标与地球上的特定位置相关联

有关坐标参考系统的详细解释: https://docs.qgis.org/2.8/en/docs/gentle_gis_introduction/coordinate_reference_systems.html

2.1.1 地理坐标系

即经纬度

例如 48°51′N, 2°17′E

最常见的坐标类型是地理坐标,纬度和经度来定义地球上相对于赤道和本初子午线的位置

有了这个坐标系统,我们可以很容易地指定地球上的任何位置,例如在全球定位系统中,如果在谷歌地图上查看一个位置的坐标,会看到纬度和经度

注意 Python中的使用 (纬度,经度)(lon,lat) 表示地理坐标

  • Longitude: [-180, 180]
  • Latitude: [-90, 90]

2.1.2 投影坐标系

(x,y) 坐标通常以米或英尺为单位

虽然地球是一个球体,但实际上我们通常在一个平面上表示它,如生活中的地图,或者我们用Python在电脑屏幕上制作的地图

从立体地球到平面地图就是我们所说的 投影

<table><tr> <td> <img src="img/projection.png"/> </td> </tr></table>

我们把地球的表面投影到2D平面上,这样我们就可以在平面上用笛卡尔的x和y坐标表示位置。在这个平面上,我们通常使用长度单位,如米,而不是度,这使得分析更加方便和有效

然而,有一点很重要:三维地球永远不可能完美地呈现在二维地图上,所以投影不可避免地会引入失真。为了最大限度地减少这种错误,有不同的投影方法,每种方法都有特定的优点和缺点

一些投影系统将试图保持几何图形的面积大小,如艾伯斯等面积投影(Albers Equal Area)。其他投影系统试图保留角度,如墨卡托投影,但会看到该地区的大变形。每个投影系统总会有一些面积、角度或距离的失真

<table><tr> <td> <img src="img/projections-AlbersEqualArea.png"/>AlbersEqualArea </td> <td> <img src="img/projections-Mercator.png"/>Mercator </td> </tr> <tr> <td> <img src="img/projections-Robinson.png"/>Robinson </td> </tr></table>

投影尺寸与实际尺寸的比较 <table><tr> <td> <img src=" https://github.com/jorisvandenbossche/geopandas-tutorial/blob/master/img/mercator_projection_area.gif?raw=true "/> </td> </tr></table>

2.2 Python和GeoPandas中的坐标参考系统

GeoDataFrame或GeoSeries具有一个 .crs 属性,该属性保存(可选)几何坐标参考系统的描述:

countries.crs
<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich

可以看出,对于 countries 数据框,使用的是EPSG 4326 / WGS84 lon/lat参考系统,这是 地理坐标系 中最常用的系统之一

它使用坐标作为纬度和经度的度数,从图上的x/y标签可以看出:

countries.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f32e0b0c208>

.crs 属性的返回值是字典类型,在这种情况下,它只指示EPSG代码,但它也可以包含完整的 proj4 字符串(以字典的形式)

可能的CRS表达:

  • proj4 字符串 <br> 例如: +proj=longlat +datum=WGS84 +no_defs 或者 {'proj': 'longlat', 'datum': 'WGS84', 'no_defs': True}

  • EPSG 代码 <br> 例如: EPSG:4326 = WGS84地理坐标系(longitude, latitude)

  • 富文本(Well-Know-Text,WKT)表示 (在下一个GeoPandas版本中,PROJ6提供了更好的支持)<br> 例如: https://epsg.io/4326

在后端,GeoPandas使用 pyproj / PROJ 库来处理重投影

更多信息: http://geopandas.readthedocs.io/en/latest/projections.html

2.3 坐标系统的转换

在GeoDataFrame中,使用 to_crs 函数进行坐标系统的转换

例如,将 countries 转换城墨卡托投影( http://epsg.io/3395 ):

# 因为墨卡托投影无法处理两极,因此移除南极
countries=countries[(countries['name']!="Antarctica")]
countries_mercator=countries.to_crs(epsg=3395)# 或者使用 .to_crs({'init': 'epsg:3395'})
countries_mercator.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f32de80f208>

注意比较此处的x和y轴刻度与地理坐标系中投影的区别

2.4 使用不同CRS的原因

  • 具有不同CRS的不同源数据->需要转换到相同的CRS下

    df1 = geopandas.read_file(...)
    df2 = geopandas.read_file(...)df2 = df2.to_crs(df1.crs)
    
  • 地图映射(由于形状和距离的扭曲)

  • 基于距离/面积的计算->确保使用适当的投影坐标系,以有意义的单位表示,如米或英尺(而不是度)

<div class="alert alert-info" style="font-size:120%">

注意:

所有发生在地表上的计算都假设数据是在2D笛卡尔平面上,因此这些计算的结果只有在数据被正确投影的情况下才是正确的

</div>

2.5 练习

再次使用巴黎数据集,到目前为止,我们为练习提供了一个合适的投影CRS中的数据集

但是原始数据实际上是地理坐标

在下面的练习中,我们将从原始数据开始

原始数据集,现在以 地理坐标系 的GeoJSON( "data/paris_districts.geojson" )文件提供

为了转换为投影坐标,我们将使用法国的标准投影坐标系统,即RGF93 / Lambert-93参考系,参考号为 EPSG:2154 (比利时为 Lambert 72,EPSG为31370)。

2.5.1 练习一:对GeoDataFrame进行投影

  • 将地区数据集( "data/paris_districts.geojson" )读入名为 districts 的GeoDataFrame中
  • 查看 districts 的CRS属性
  • districts 数据集进行简单绘图
  • 计算所有地区的面积
  • districts 进行投影(法国使用 EPSG:2154 ),将新数据集称为 districts_RGF93
  • 绘制一个类似的 districts_RGF93
  • districts_RGF93 再次计算所有区的面积(结果现在用m²表示)
districts=geopandas.read_file("data/paris_districts.geojson")
districts.crs
<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich
districts.plot(figsize=(12,6))
<matplotlib.axes._subplots.AxesSubplot at 0x7f32de177cc0>

districts.geometry.area
0     0.000107
1     0.000051
2     0.000034
3     0.000033
4     0.000023...
75    0.000159
76    0.000099
77    0.000182
78    0.000196
79    0.000256
Length: 80, dtype: float64
districts_RGF93=districts.to_crs(epsg=2154)
districts_RGF93.plot(figsize=(12,6))
<matplotlib.axes._subplots.AxesSubplot at 0x7f32ddeebb70>

districts_RGF93.geometry.area
0     8.690007e+05
1     4.124585e+05
2     2.736968e+05
3     2.694568e+05
4     1.880122e+05...
75    1.294988e+06
76    8.065686e+05
77    1.486971e+06
78    1.599002e+06
79    2.090904e+06
Length: 80, dtype: float64

可以看到在不同坐标系统下同一地区的面积值不同

在 01-地理数据介绍 中,我们做了一个练习,绘制了巴黎自行车站的位置,并使用 contextily 包为其添加了背景地图

contextily ”假设数据坐标系统为 网络墨卡托投影 (Web Mercator projection)中,这是大多数网络地图服务使用的系统。在第一个练习中,我们在适当的CRS中提供了数据,所以不需要关心这个方面

但是,通常情况下,数据的参考坐标系不会是 网络墨卡托投影 (Web Mercator projection),因此我们必须自己将它们与网络背景图进行对齐

2.5.2 练习二:对GeoDataFrame进行投影

  • 将自行车站数据集( data/paris_bike_stations.geojson )读入名为 stations 的GeoDataFrame
  • stations 数据集转换为网络墨卡托投影( EPSG:3857 )命名为 stations_webmercator
  • 绘制该投影数据集地图图(指定标记大小为5),并使用 contextily 添加背景地图
stations=geopandas.read_file('data/paris_bike_stations.geojson')
stations_webmercator=stations.to_crs(epsg=3857)
stations_webmercator.head()

<div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }

.dataframe tbody tr th {vertical-align: top;
}.dataframe thead th {text-align: right;
}

</style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>name</th> <th>bike_stands</th> <th>available_bikes</th> <th>geometry</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>14002 - RASPAIL QUINET</td> <td>44</td> <td>4</td> <td>POINT (259324.887 6247620.771)</td> </tr> <tr> <th>1</th> <td>20503 - COURS DE VINCENNES PYRÉNÉES</td> <td>21</td> <td>3</td> <td>POINT (267824.377 6249062.894)</td> </tr> <tr> <th>2</th> <td>20011 - PYRÉNÉES-DAGORNO</td> <td>21</td> <td>0</td> <td>POINT (267742.135 6250378.469)</td> </tr> <tr> <th>3</th> <td>31008 - VINCENNES (MONTREUIL)</td> <td>56</td> <td>0</td> <td>POINT (271326.638 6250750.824)</td> </tr> <tr> <th>4</th> <td>43006 - MINIMES (VINCENNES)</td> <td>28</td> <td>27</td> <td>POINT (270594.689 6248007.705)</td> </tr> </tbody> </table> </div>

import contextily as ctxax = stations_webmercator.plot(figsize=(10, 10), markersize=5, alpha=0.5, edgecolor='k')
ctx.add_basemap(ax, source=ctx.providers.Stamen.TonerLite)

GeoPandas入门 | 02-坐标参考系统相关推荐

  1. 地图数据设计(三):坐标参考系统的选择

    前言 上一篇文章介绍了如何对矢量数据进行预处理,接下来正式进入地图的制作.地图制作的第一步,是选择一个恰当的地图坐标系.为什么呢?因为地图坐标系作为地图数学基础的租成部分,描述了制图要素的空间位置,是 ...

  2. IOS基础之UIDynamicAnimator动力学入门-02

    IOS基础之UIDynamicAnimator动力学入门-02 10-弹性附着 // // ViewController.m // 10-弹性附着 // // Created by 鲁军 on 202 ...

  3. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 2017-10-15  1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源 ...

  4. java编程菜鸟入门02

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: java编程菜鸟入门01 java编程菜鸟入门02 ...

  5. 图像篡改入门02 利用空间结构篡改定位

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @图像篡改入门02 利用空间结构篡改定位 图像篡改被动取证 利用图像空间结构进行篡改定位 使用一个CNN-LSTM的网络模型捕获篡改边 ...

  6. drools入门-02

    drools入门-02 一. 另一种方式 上一篇我们讲了一下基本理论和入门demo,这一篇我们接着讲 我们用springboot另一种方式整合(这个比较常用) 1. 引入依赖 <!-- 规则引擎 ...

  7. Linux 基础入门 02

    Linux 基础入门 02 一.用户&组管理 1.1 usermod 用来修改用户账号的各项设定 -c<备注> #修改用户帐号的备注文字. -d登入目录> #修改用户登入时的 ...

  8. 迈德威视工业相机入门( 基于 Windows 系统 + VS2019 + OpenCV 4.x.x )

    迈德威视工业相机入门( 基于 Windows 系统 + VS2019 + OpenCV 4.x.x ) 前言: 一.登录迈德威视官网,下载官方SDK: 二.环境配置,相机显示和参数调整( 基于 VS2 ...

  9. 树莓派4b入门之开发RFID系统—简介、搭建MFRC522-SPI环境

    树莓派4b入门之开发RFID系统-简介.搭建MFRC522-SPI环境 一.系统简介 二.模块连接 1.引脚定义 2.接口对应关系 三.搭建接口环境 1.开启SPI 2.模块功能设计 3.安装SPI ...

最新文章

  1. ngrok配置信息_ngrok内网穿透服务器搭建及配置(附 frp 配置)
  2. html每个段落空前空两格,科普:为什么段落开始要空两格(两个汉字)?
  3. hibernate教程--抓取策略
  4. centos7自带python版本_CentOS7保留默认Python版本并安装更新Python2和Python3共存
  5. q7goodies事例_Java 8 Friday Goodies:轻松派本地缓存
  6. Android中style和theme的区别
  7. php微信公众平台开发获取access_token,用CURL出现certificate verify failed错误的解决方法...
  8. 2018年10微型计算机接口技术,微机原理及接口技术
  9. 741. 斐波那契数列
  10. 透明网桥自学习转发帧解题记录
  11. 唯心主义-柏拉图的哲学世界
  12. 工作过程中积累的书签(链接)
  13. 上海富爸爸_放弃高薪选择财务自由之路(转)
  14. 将西瓜书中的表格数字化与可视化
  15. LeetCode 12 数字转化为罗马符号(难度: Medium)
  16. 木板切割问题(二)——动态规划
  17. Typora工具免费版下载
  18. 高等数学学习笔记——第三十二讲——泰勒公式
  19. Game with Chips(思维)
  20. iOS - 蓝牙开门智能门锁

热门文章

  1. 【Windows XP系统本身功能隐藏文件】
  2. php生鲜超市系统,毕业论文:基于PHP平台下的Ajax开发实践—网上生鲜超市系统的开发...
  3. libra协议实现(学习笔记)
  4. python画龙猫_【Python】python常用模块
  5. 5 面试官问你问题,该怎么回答,这里有总结的攻略--绝密,程序员大厂面试求职大揭秘!
  6. 11-软件研制总结报告
  7. Qt项目实战2:图片查看器QImageViewer
  8. RBM受限波兹曼机在特征学习上的使用
  9. 19年深圳杯D题之爬取微博粉丝基本信息
  10. 【MATLAB教程案例88】通过matlab模拟光的干涉现象