使用Rasterio读取栅格数据

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库。

使用Rasterio读取栅格数据

作者:阿振 邮箱:tanzhenyugis@163.com

博客:https://blog.csdn.net/theonegis/article/details/80089375

修改时间:2018-06-06

声明:本文为博主原创文章,转载请注明原文出处


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)
目录
相关文章
|
传感器 算法 数据处理
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
|
6月前
|
弹性计算 运维 安全
阿里云服务器通用算力型u1实例简单测评:性能、优势与最新价格参考
在阿里云2025年的活动中,独享型通用算力u1云服务器是用户比较关注的云服务器,因为它的性能要比活动内的经济型e实例好,但是价格又比计算型c8i、通用型g8i等其他企业级实例的价格要便宜。那么,独享型通用算力u1云服务器到底怎么样呢?它又有哪些优势呢?接下来,本文将为您详细解析。
|
10月前
|
运维 物联网 网络虚拟化
网络功能虚拟化(NFV):定义、原理及应用前景
网络功能虚拟化(NFV):定义、原理及应用前景
980 3
|
设计模式 JSON 前端开发
Struts2框架知识分享
【6月更文挑战第7天】Struts2框架知识分享
207 0
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
518 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
JavaScript 前端开发
|
域名解析 负载均衡 网络协议
《打造不宕机的电商网站:揭秘Bind和Nginx的负载均衡策略》
【8月更文挑战第13天】在互联网技术快速演进的当下,确保web服务的高可用性和高性能至关重要。本文通过案例分析,探讨如何利用Bind和Nginx实现高效的负载均衡。以一家大型电商网站为例,面对每日上百万次的用户访问请求,通过配置Bind DNS服务器根据策略将域名解析至不同IP地址,并借助Nginx作为反向代理和负载均衡器,将请求按需分发至多个应用服务器,实现了服务的稳定性和高效性。此方案不仅提升了网站的扩展性和可靠性,还增强了对网络流量的控制能力,适用于处理巨大用户量和数据量的服务。
210 0
|
JSON 安全 Java
Java一分钟之-Spring Security:身份验证与授权
【6月更文挑战第7天】本文介绍了Spring Security的常见问题及解决方案,包括配置启动、身份验证、授权、无状态JWT和异常处理。通过`@EnableWebSecurity`启动安全框架,自定义登录页面和登录逻辑,使用`http.authorizeRequests()`设置访问规则。对于JWT,需添加解析器并注册过滤器。此外,处理Spring Security异常,创建自定义的`AccessDeniedHandler`和`AuthenticationEntryPoint`。理解核心概念并按业务需求定制,是确保应用安全的关键。
263 1
|
数据采集 物联网 数据挖掘
API接口的应用
API接口在现代技术中至关重要,它使不同软件、设备间能相互通信和数据共享。在社交网络中,如Facebook及Twitter的API让开发者能够构建交互式应用;移动应用则依赖API与服务器通信,实现天气查询、地图定位等功能;云计算平台如AWS通过API提供了资源管理和配置服务;物联网设备使用API实现数据交换;视频游戏开发商利用各类平台API发布游戏。此外,API爬虫数据接口技术通过爬虫抽取并输出数据,被广泛应用于获取商业、金融、医疗等领域的大数据,以支持数据分析、策略制定及业务流程优化,极大地提高了数据收集与处理的效率和准确性。
|
编解码 人工智能 定位技术
MERRA (Modern-Era Retrospective analysis for Research and Applications) 是由 NASA 气候数据集
MERRA (Modern-Era Retrospective analysis for Research and Applications) 是由 NASA 气候数据集
216 0