使用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进阶教程之词典、字典、dict
Aug 29 Python
使用httplib模块来制作Python下HTTP客户端的方法
Jun 19 Python
Python实现文件按照日期命名的方法
Jul 09 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
Python类的继承用法示例
Jan 31 Python
Python大数据之使用lxml库解析html网页文件示例
Nov 16 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 Python
python 如何实现遗传算法
Sep 22 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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作的文本留言本的例子(一)
2006/10/09 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php从csv文件读取数据并输出到网页的方法
2015/03/14 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
javascript ajax 仿百度分页函数
2013/10/29 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
Jquery性能优化详解
2014/05/15 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
Python版名片管理系统
2018/11/30 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
一行python实现树形结构的方法
2019/08/09 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
通过实例学习Python Excel操作
2020/01/06 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书