本文介绍基于Python语言gdal模块,实现多波段HDF栅格图像文件的读取处理像元值可视化(直方图绘制)等操作。

  另外,基于gdal等模块读取.tif格式栅格图层文件的方法可以查看Python批量绘制遥感影像数据的直方图,读取单波段.hdf格式栅格图层文件的方法可以查看Python GDAL读取栅格数据并基于质量评估波段QA对指定数据加以筛选掩膜

  本文期望实现的需求为:现有一存放.tif格式的全球LAI产品栅格数据的路径,需将这一路径下的全部LAI产品栅格数据依据另一路径下存放的全球MODIS植被覆盖类型产品栅格数据进行像元分类,并绘制全球每一种植被类型对应的LAI数值直方图。在这里,由于有前述两篇博客作为铺垫,本文对代码的讲解就着重于多波段HDF栅格图像文件的读取部分;其它内容由于在本文开头提及的前期两篇博客中已经详细介绍,这里就不再赘述~

  首先将本文所需代码展示如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 20 11:05:31 2021 @author: fkxxgis
""" import os
import numpy as np
from osgeo import gdal
import matplotlib.pyplot as plt lai_file_path="G:/Postgraduate/LAI_Glass_RTlab/Test_DRT/h20v09.tif"
mcd_file_path="G:/Postgraduate/LAI_Glass_RTlab/Test_DRT/MCD12Q1.A2018001.h20v09.006.2019199233851.hdf"
pic_save_path="G:/Postgraduate/LAI_Glass_RTlab/Test_DRT/" for veg_type in range(9): mcd_raster=gdal.Open(mcd_file_path)
mcd_sub_dataset=mcd_raster.GetSubDatasets()
hdf_band_num=len(mcd_sub_dataset)
# for sub_dataset in mcd_sub_dataset:
# print(sub_dataset[1])
# print(mcd_sub_dataset[2][1])
mcd_sub_type=gdal.Open(mcd_sub_dataset[2][0])
mcd_raster_array=mcd_sub_type.ReadAsArray() lai_raster=gdal.Open(lai_file_path)
lai_raster_array=lai_raster.ReadAsArray()
non_veg_type_lai_array=np.where(mcd_raster_array==veg_type+1,lai_raster_array,np.nan)
plt.hist(non_veg_type_lai_array)
plt.savefig(pic_save_path+"DRT_"+str(veg_type+1)+".png", dpi=300)
plt.clf()
plt.cla()

  我们直接讲解多波段HDF栅格图像文件读取部分的代码:首先,多波段.hdf格式文件的读取在一开始与单波段.hdf格式文件或.tif格式文件的读取一致,即通过gdal.Open()函数实现;但随后,需要额外借助len()函数获取HDF文件对应的波段数量。

  因为我们读取的HDF文件是多波段,因此hdf_band_num肯定是大于1的,那么刚刚读取进来的mcd_sub_dataset其实就是一个列表(List);其中,这个列表的元素个数就是对应的多波段HDF文件波段数,列表的每一个元素则都是一个元组(tuple);同时,每一个元组都有两个元素,其每一个元素都是一个字符串;其中第一个元素为当前HDF文件的当前波段对应的文件路径与部分提示信息,第二个元素作为当前HDF文件的当前波段对应的文件像素行列数、名称与数据类型。

  这么说可能不太明白,我们用一个实例来讲解。例如,通过上述代码读取一景具有六个波段的MODIS LAI产品——MCD15A3H产品,其第一个波段为FPAR数据,第二个波段为LAI数据。那么读取其后,得到的mcd_sub_dataset长这个样子:

  可以看到,是一个具有6个元素的列表。

  点开列表,可以看到6个元素每一个都是一个具有2个元素的元组:

  再点开第一个元组,可以看到其具有2个字符串格式的元素:

  其第二个元素包含了该波段对应的数据行数与列数(即[2400×2400])、数据名称(即Fpar)、数据空间分辨率(即500m)、数据产品简称(即MOD_Grid_MCD15A3H),以及数据格式(即8-bit unsigned integer);而第一个字符串没有显示完毕,我们可以点击打开看看:

  可以看到第一个元素则包含了该波段对应的数据路径、文件全称,以及部分与第二个元素重复的几个数据信息参数。

  有了上面的分析就比较清楚了,接下来再一次利用gdal.Open()函数读取我们需要的波段,mcd_sub_dataset[2][0]表示第三个波段;其中,第三个波段却用[2]来表示,是因为波段数量(也就是mcd_sub_datasetIndex)是从0开始计算的;而后面的[0]则表示元组中的第一个参数,也就是上面一幅图中显示的该波段对应的数据路径。

  随后,再利用.ReadAsArray()函数将其读取为Array即可。接下来的操作与本文开头提及的那两篇博客就一致,这里不再赘述~

Python批量读取HDF多波段栅格数据并绘制像元直方图的更多相关文章

  1. python批量读取txt文件为DataFrame

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...

  2. Python批量读取人脸图片与数据互相转换

    读取部分结果 程序 # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from PIL import ...

  3. Python之批量读取文件【面试必学】

    python的os模块可以实现普遍的操作系统功能,并且和平台无关.以下为实现根目录下文件的批量读取. os.listdir(dirname)可以列出dirname下的目录和文件,依次读取相应的文件即可 ...

  4. python接口自动化测试--批量读取数据

    为了便于维护,python接口自动化测试用例可以利用xlrd模块读取excal表格进行数据分离.我们可以利用xlrd模块的row_values()和cell_value()两种方法读取Excal表格. ...

  5. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

  6. python 批量删除mysql前缀相同的表

    1,一般游戏log数据库会存储大量的玩家行为日志,一种行为一张表,每天生成一张新表,一天会有30+张不同行为的表,通常会保留玩家日志1年左右,对于超过1年的日志需要删除 2,log数据库一年会保存1W ...

  7. python批量修改linux主机密码

    +++++++++++++++++++++++++++++++++++++++++++标题:python批量修改Linux服务器密码时间:2019年2月24日内容:基于python实现批量修改linu ...

  8. 用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同 Current database: pyt ...

  9. R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

    一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...

  10. python批量处理压缩文件

    python批量处理压缩文件 博客小序:在数据的处理中,下载的数据很有可能是许多个压缩文件,自己一个一个解压较为麻烦,最近几日自己在处理一次下载的数据时,遇到大量的压缩数据需要处理,于是利用pytho ...

随机推荐

  1. hashlib加密模块 subprocess模块 logging日志模块

    目录 hashlib加密模块 简介 hashlib使用流程 hashilb加密模块使用说明 明文绑定密文 密文长度不变 多次传入 密文不可解密原因 加盐处理(salt) 普通加盐 动态加盐 加密实际运 ...

  2. python虚拟环境和venv的使用

    目录 1.环境与虚拟环境 2.查看帮助 3.--system-site-package 命令 4.创建虚拟环境 5.激活/关闭虚拟环境 6.保存和复制虚拟环境 7.改变虚拟环境所指向的真实python ...

  3. 一文带你入木三分地理解字符串KMP算法(next指针解法)

    1. KMP算法简介 温馨提示:在通篇阅读完并理解后再看简介效果更佳 以下简介由百度百科提供https://baike.baidu.com/item/KMP%E7%AE%97%E6%B3%95/109 ...

  4. 使用WPF或AspNetCore创建简易版ChatGPT客户端,让ChatGPT成为你的私人助理

    前言:前一天写的一个ChatGPT服务端,貌似大家用起来还不是那么方便,所以我顺便用WPF和AspNetCore的webapi程序做个客户端吧,通过客户端来快速访问chatgpt模型生成对话.   1 ...

  5. 动力节点——day08

    什么是集合,有什么用? 数组其实就是一个集合,集合实际上就是一个容器,可以用来容纳其他数据类型 集合为什么说在开发中使用最多? 集合是一个容器,是一个载体,可以一次容纳多个对象,在实际开发中,假设连接 ...

  6. Unity_UIWidgets - 组件Scaffold

    UIWidgets - 组件Scaffold 各位兄弟姐妹,想通过Unity来开发UIWidgets的么,想通过UIWi的gets..来开发手机APP么??想么想么,哈哈哈哈哈哈哈哈. 好了,小黑不唠 ...

  7. 【随笔记】全志平台 gpio-leds 驱动应用

    硬件信息 内核版本:Linux 4.9 硬件原理: GPIO 通过一颗 MOS 管(2N7002ET1G),接到 LED 负极,LED 正极接电源. GPIO 通过拉高导通 MOS ,将 LED 接地 ...

  8. windows环境下部署一个Jenkins工程

    首先要安装配置好Jenkins环境变量,具体操作可参考其他文章 确保Jenkins可以正常运行之后开始进行项目的部署 首页点击新建,进行新建一个工程 进入项目添加界面,填入项目名称并选择构建一个自由风 ...

  9. RestTemplate的超全讲解(全)转

    RestTemplate的超全讲解(全)转 https://blog.csdn.net/weixin_47872288/article/details/121842374 (81条消息) RestTe ...

  10. python70 前端框架之vue js的集中循环方式、key值的解释、input事件、v-model双向数据绑定、过滤案例、事件修饰符、按键修饰符、表单控制

    js的几种循环方式 v-for可以循环的变量 可以循环的: 数组.数组带索引 对象.对象带key.value 字符串 字符串带索引 数字.数字带索引 <!DOCTYPE html> < ...