使用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改变日志(logging)存放位置的示例
Mar 27 Python
在Python下进行UDP网络编程的教程
Apr 29 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
Python中类的创建和实例化操作示例
Feb 27 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
Nov 26 Python
Python实现京东抢秒杀功能
Jan 25 Python
python实现简易自习室座位预约系统
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动态生成VRML网页
2006/10/09 PHP
文件上传程序的全部源码
2006/10/09 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
BootStrap网页中代码显示用法详解
2016/10/21 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
浅析使用Python操作文件
2017/07/31 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
PyQt5实现五子棋游戏(人机对弈)
2020/03/24 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
计算机操作自荐信
2013/12/07 职场文书
大学运动会通讯稿
2014/01/28 职场文书
超市活动计划书
2014/04/24 职场文书
管理标语大全
2014/06/24 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
学校体育节班级口号
2015/12/25 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸