使用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爬取网站数据保存使用的方法
Nov 20 Python
实例讲解python函数式编程
Jun 09 Python
python根据出生日期获得年龄的方法
Mar 31 Python
python爬虫框架talonspider简单介绍
Jun 09 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
python协程之动态添加任务的方法
Feb 19 Python
详解python pandas 分组统计的方法
Jul 30 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
python圣诞树编写实例详解
Feb 13 Python
通过实例解析python subprocess模块原理及用法
Oct 10 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
教你用python实现12306余票查询
Jun 30 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 magic_quotes_gpc的使用方法详解
2013/06/24 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
项目实践之javascript技巧
2007/12/06 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
使用javascript为网页增加夜间模式
2014/01/26 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
Django 前后台的数据传递的方法
2017/08/08 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python2.7实现多进程下开发多线程示例
2019/05/31 Python
python中metaclass原理与用法详解
2019/06/25 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
python3 logging日志封装实例
2020/04/08 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
索尼巴西商店:Sony巴西
2019/06/21 全球购物
2015年机关纠风工作总结
2015/05/15 职场文书
山楂树之恋观后感
2015/06/11 职场文书
入党后的感想
2015/08/10 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL