使用Rasterio读取栅格数据的实例讲解


Posted in Python onNovember 26, 2019

Rasterio简介

有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。

Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库。

Rasterio中栅格数据模型基本和GDAL类似,需要注意的是:

在Rasterio 1.0以后,对于GeoTransform的表示弃用了GDAL风格的放射变换,而使用了Python放射变换的第三方库affine库的风格。

对于放射变换

affine.Affine(a, b, c,
    d, e, f)

GDAL中对应的参数顺序是:(c, a, b, f, d, e)

采用新的放射变换模型的好处是,如果你需要计算某个行列号的地理坐标,直接使用行列号跟给放射变换对象相乘即可,完全符合数学上矩阵乘法的操作,更加直观和方便。

栅格数据读取代码示例

下面的示例程序中演示了如何读取一个GeoTIFF文件并获取相关信息,需要注意的是:

1、rasterio使用rasterio.open()函数打开一个栅格文件

2、rasterio使用read()函数可以将数据集转为numpy.ndarray,该函数如果不带参数,将把数据的所有波段做转换(第一维是波段数),如果指定波段,则只取得指定波段对应的数据(波段索引从1开始)

3、数据的很多元信息都是以数据集的属性进行表示的

import rasterio

with rasterio.open('example.tif') as ds:
 print('该栅格数据的基本数据集信息(这些信息都是以数据集属性的形式表示的):')
 print(f'数据格式:{ds.driver}')
 print(f'波段数目:{ds.count}')
 print(f'影像宽度:{ds.width}')
 print(f'影像高度:{ds.height}')
 print(f'地理范围:{ds.bounds}')
 print(f'反射变换参数(六参数模型):\n {ds.transform}')
 print(f'投影定义:{ds.crs}')
 # 获取第一个波段数据,跟GDAL一样索引从1开始
 # 直接获得numpy.ndarray类型的二维数组表示,如果read()函数不加参数,则得到所有波段(第一个维度是波段)
 band1 = ds.read(1)
 print(f'第一波段的最大值:{band1.max()}')
 print(f'第一波段的最小值:{band1.min()}')
 print(f'第一波段的平均值:{band1.mean()}')
 # 根据地理坐标得到行列号
 x, y = (ds.bounds.left + 300, ds.bounds.top - 300) # 距离左上角东300米,南300米的投影坐标
 row, col = ds.index(x, y) # 对应的行列号
 print(f'(投影坐标{x}, {y})对应的行列号是({row}, {col})')
 # 根据行列号得到地理坐标
 x, y = ds.xy(row, col) # 中心点的坐标
 print(f'行列号({row}, {col})对应的中心投影坐标是({x}, {y})')
 # 那么如何得到对应点左上角的信息
 x, y = (row, col) * ds.transform
 print(f'行列号({row}, {col})对应的左上角投影坐标是({x}, {y})')

输出如下:

该栅格数据的基本数据集信息(这些信息都是以数据集属性的形式表示的):
数据格式:GTiff
波段数目:3
影像宽度:4800
影像高度:4800
地理范围:BoundingBox(left=725385.0, bottom=2648415.0, right=869385.0, top=2792415.0)
反射变换参数(六参数模型):
 | 30.00, 0.00, 725385.00|
| 0.00,-30.00, 2792415.00|
| 0.00, 0.00, 1.00|
投影定义:CRS({'init': 'epsg:32649'})
第一波段的最大值:5459
第一波段的最小值:-313
第一波段的平均值:489.80300625
(投影坐标725685.0, 2792115.0)对应的行列号是(10, 10)
行列号(10, 10)对应的中心投影坐标是(725700.0, 2792100.0)
行列号(10, 10)对应的左上角投影坐标是(725685.0, 2792115.0)

以上这篇使用Rasterio读取栅格数据的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python文件比较示例分享
Jan 10 Python
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
Python迭代器定义与简单用法分析
Apr 30 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
Python参数类型以及常见的坑详解
Jul 08 Python
Python如何计算语句执行时间
Nov 22 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
Python小程序之在图片上加入数字的代码
Nov 26 #Python
基于Python获取城市近7天天气预报
Nov 26 #Python
NumPy中的维度Axis详解
Nov 26 #Python
python列表推导式操作解析
Nov 26 #Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 #Python
简单了解python数组的基本操作
Nov 26 #Python
python实现图片插入文字
Nov 26 #Python
You might like
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python中私有函数调用方法解密
2016/04/29 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
python中列表和元组的区别
2017/12/18 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
python绘制多个子图的实例
2019/07/07 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
CSS3实现多样的边框效果
2018/05/04 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
家长会主持词开场白
2014/03/18 职场文书
关于建议书的格式范文
2014/05/20 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
MySQL分区表实现按月份归类
2021/11/01 MySQL
redis数据一致性的实现示例
2022/03/18 Redis
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android