使用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遍历目录的4种方法实例介绍
Apr 13 Python
在Python的Flask框架中使用模版的入门教程
Apr 20 Python
对Tensorflow中的矩阵运算函数详解
Jul 27 Python
python将秒数转化为时间格式的实例
Sep 16 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
学习python的前途 python挣钱
Feb 27 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
Pandas读取csv时如何设置列名
Jun 02 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 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变量引用的面试题
2010/08/08 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php常用字符函数实例小结
2016/12/29 PHP
js字符编码函数区别分析
2008/06/05 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
jQuery中的一些小技巧
2017/01/18 Javascript
jquery实现input框获取焦点的简单实例
2017/01/26 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
课外小组活动总结
2014/08/27 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
小学班主任研修日志
2015/11/13 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL
Pandas-DataFrame知识点汇总
2022/03/16 Python