Rasterio:rasterio.open函数参数和用法解析(以GPM Imerg Early nc转tif为例)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Rasterio:rasterio.open函数参数和用法解析(以GPM Imerg Early nc转tif为例)

01 前言

最近用ENVI IDL,觉得身心俱疲,一方面是学的不深,另一方面是关于IDL的资料太少了,基本上仅有少量的陈年博客(虽然写的不错),其余基本上来源于官方文档.所以还是做好两手准备,python处理遥感影像也要抓起来,毕竟python对于人工智能的专长之于遥感影像的冲击也比较大,现在漂亮国要是再不发几颗卫星国内遥感我们这批专业生就活不下去了,论文个个都在卷计算机算法人工智能,神卷。


废话不多说,我将以先讲述其参数,至于用法我打算以GPM Imerg early数据集为例将nc文件转为tif文件来说明rasterio的用法。


(至于为什么使用rasterio而不是gdal,有一定的考虑,我认为rasterio的语法更符合python的理念,而gdal的语法等等更偏向于C语言之类的)


02 参数说明

基本形式:


rasterio.open(fp, mode='r', driver=None, width=None, height=None, count=None, crs=None, transform=None, dtype=None, nodata=None, sharing=False, **kwargs)


rasterio.open函数用于创建一个DatasetReader或DatasetWriter对象,这两个对象分别用于读取和写入栅格数据。


fp: 需要打开的文件的路径(字符串);


mode: 字符串(可选参数,默认是r,只读模式), 打开文件的模式,包括四种,分别是'r', 'w', 'r+', 'w+',分别表示只读模式, 只写, 可读可写,可读可写模式。对于后面r+和w+,区别在于如果文件路径不存在,那么w+会新建一个,而r+则会报错,共同部分即可读又可写,但是需要注意的是如果文件路径存在即文件存在那么w+会将其中内容全部清空而r+会在其后内容继续追加内容。w和w+的区别就是w只可以写入不可以读,而w+既可以读也可以写入;


driver:文件的格式,一般在r和r+模式会省略,因为函数会自动获取其文件后缀判别。若是创建文件则需要指定该参数。若是创建GeoTIFF文件,则需要指定driver=GTiff。此处的driver与gdal类似,可以参照:Raster drivers — GDAL documentation获取不同文件格式的driver参数;


width:图像的宽度,也即图像栅格矩阵的列数;


height:图像的高度,也即图像栅格矩阵的行数;


count:图像的波段数;


crs:可以是字符串/字典/crs对象。


transform: 文件的仿射变换,可以是一个Affine对象或一个包含6个元素的列表或元组。这6个元素表示(x_size, skew_y, x_upper_left, skew_x, -y_size, y_upper_left), x为lon,y为lat.


你可以自行计算出来,对于旋转系数skew_x和skew_x填写0.0即可,一般你不会使用到它的。(我后面是通过其他函数计算因为我比较懒)


由于在我们遥感影像上,坐标系的原点在左上角点,所以输入的角点信息也在左上角的经纬度坐标,由于是左上角点所以它计算是从左往右,从上往下,因此x上的分辨率正常,但是y上的分辨率需要添上负号因为从上往下纬度在减小。


dtype:文件的数据类型,字符串或者np type都是可行的。


nodata:在矩阵中无效值的像素值,可以传入int,float,nan。


sharing:bool型。是否共享句柄,多线程应当避免。当处理大量数据时,操作系统可能会耗尽可用的文件描述符,这可能导致程序崩溃或无法打开更多文件。为了避免这个问题,Rasterio维护了一个共享句柄池,可以在多个地方重用这些句柄,从而减少了打开新文件的开销。


03 用法

好了基本上说清楚了 ,至于用法我就不详细赘述,时间有限,大家自行查看即可。

以下是关于如何处理将GPM Imerg Early的NC4文件处理为GeoTIFF文件。

import netCDF4 as nc
import rasterio
from rasterio.transform import from_origin
# preparation
in_path = r'F:\ExtremePrecipitation\data\GPM IMERG Early\3B-HHR-E.MS.MRG.3IMERG.20180312-S000000-E002959.0000.V06B.HDF5.SUB.nc4'
out_path = r'F:\ExtremePrecipitation\TEMP\output.tif'
# get the precip_dataset, lon_dataset, lat_dataset of the nc4 file
dataset = nc.Dataset(in_path)  # get the dataset_writer object
precipitation = dataset.variables['precipitationCal'][0, :, :]  # shape=(1, 630, 510), (channels, cols, rows))
lon = dataset.variables['lon'][:]  # shape=(630,), this means the cols == 630
lat = dataset.variables['lat'][:]  # shape=(510,), this means the rows == 510
# get the basic info of the precipitation
rows = len(lat)
cols = len(lon)
lon_upper_left = min(lon)
lat_upper_left = max(lat)
lon_res = lon[1] - lon[0]  # assume the lon and lat are equally spaced
lat_res = lat[1] - lat[0]
# write the precipitation data into a tif file
with rasterio.open(out_path, 'w', driver='GTiff',
                   height=rows, width=cols,
                   count=1, dtype=precipitation.dtype,
                   crs='+proj=latlong',
                   transform=from_origin(lon_upper_left, lat_upper_left, lon_res, lat_res)) as dst:
    dst.write(precipitation, 1)  # write the precipitation dataset into the first band of the tif file
目录
相关文章
|
21天前
|
Dart 安全 编译器
Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析
在 Flutter 开发中,`dynamic` 类型提供了灵活性,但也带来了类型安全性问题。本文深入探讨 `dynamic` 类型及其与其他类型的转换,介绍如何使用 `as` 关键字、`is` 操作符和 `whereType<T>()` 方法进行类型转换,并提供最佳实践,包括避免过度使用 `dynamic`、使用 Null Safety 和异常处理,帮助开发者提高代码的可读性和可维护性。
69 1
|
1月前
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
38 0
|
1月前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
27 3
|
1月前
|
机器学习/深度学习 算法 C语言
【Python】Math--数学函数(详细附解析~)
【Python】Math--数学函数(详细附解析~)
|
2月前
|
安全 网络安全 开发工具
深入探索Git:全面解析Git的用法与最佳实践
深入探索Git:全面解析Git的用法与最佳实践
57 2
|
1月前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
94 0
|
1月前
|
存储 缓存 并行计算
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
32 0
|
1月前
|
JSON API 开发者
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
深入解析Python网络编程与Web开发:urllib、requests和http模块的功能、用法及在构建现代网络应用中的关键作用
16 0
|
2月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
23 2

推荐镜像

更多