IDL学习笔记(三)OMI数据处理。hdf5文件读取,图像反转,GeoTiff区别,月季年均值计算提取输出,单位转换,运行时间计算
modis Level 2 grid 数据是全球格网化数据。一天的数据全在其中。
modis Level 1 和 2 数据是一景一景的影像。
IDL学习笔记(三)OMI数据处理
- hdf5文件读取
- 单位转换,输出hdf5数据集的图像,并检查图像经纬度是否正确,若错误,则进行翻转等操作
- GeoTiff 和 一般的 Tiff 区别
- 目标影像下GeoTiff信息如何获取?
- 计算不同年份数据,XX月均值计算。季度均值计算。年均值计算。(仅计算有效值,忽略无效值)
hdf5文件读取
hdf explor中,看起来像 “ 文件夹 ”一样,通俗可以叫做组。hdf5 与 hdf4不同,hdf5 不能只有数据集的名字,必须也有完整组名,才能被完整找到读出。
读取HDF5数据的一般步骤·
1、打开HDF5文件,获取文件id·
2、获取数据集名
3、将数据集名转换为数据集id
4、从数据集id处读取数据·
5、关闭数据集和文件
hdf5文件读取:
function hdf5_data_get,file_name,dataset_namefile_id = h5f_open(file_name)dataset_id = h5d_open(file_id,dataset_name) ;直接返回id 而不是indexdata = h5d_read(dataset_id)h5f_close,dataset_idh5d_close,file_idreturn,datadata = !null ;销毁data, 清空内存end
注意与hdf4文件读取,相区分:
function hdf4_data_get, file_name,sds_namesd_id = hdf_sd_start(file_name,/read)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id,sds_index)hdf_sd_getdata,sds_id,datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn,data
end
单位转换,输出hdf5数据集的图像,并检查图像经纬度是否正确,若错误,则进行翻转等操作
function hdf4_data_get, file_name,sds_namesd_id = hdf_sd_start(file_name,/read)sds_index = hdf_sd_nametoindex(sd_id,sds_name)sds_id = hdf_sd_select(sd_id,sds_index)hdf_sd_getdata,sds_id,datahdf_sd_endaccess,sds_idhdf_sd_end,sd_idreturn,data
endfunction hdf5_data_get,file_name,dataset_namefile_id = h5f_open(file_name)dataset_id = h5d_open(file_id,dataset_name) ;直接返回id 而不是indexdata = h5d_read(dataset_id)h5d_close,dataset_id ; h5d 关闭数据集h5f_close,file_id ; h5f 关闭文件return,datadata = !null ;销毁data, 清空内存endpro omi_no2_outputfile_name = 'E:/Data/IDL/chapter_2/NO2/2017/OMI-Aura_L3-OMNO2d_2017m0101_v003-2018m0627t042221.he5'dataset_name = '/HDFEOS/GRIDS/ColumnAmountNO2/Data Fields/ColumnAmountNO2TropCloudScreened'out_directory = 'E:/Data/IDL/chapter_2/result/';测试out_directory的目录(/directory)是否存在,若不存在,则创建dir_test = file_test(out_directory, /directory) if dir_test eq 0 then beginfile_mkdir,out_directoryendifout_name = out_directory + file_basename(file_name,'.h5')+'.tiff' ; 舍弃文件路径,只获取基础路径,但同时舍去".he5"data_temp = hdf5_data_get(file_name,dataset_name)data_temp = ((data_temp gt 0.0)*data_temp*10.0^10.0)/(!const.NA);(!const.NA)是阿伏伽德罗常数,该句是转换单位 最后单位是mol/km2;单位换完后,数据会变成“百”“千”量级,方便灰度拉伸;由于图像左右经度是正确的,但上下纬度是颠倒的,因此需要做一个上下反转(用到 rotate)函数data_temp = rotate(data_temp,7)write_tiff,out_name,data_temp,/float;,geotiff = geo_infoend
可以通过envi进行经纬度的查看。
GeoTiff 和 一般的 Tiff 区别
Geotiff和一般tiff的区别:
Geotiff有包含地理坐标、投影相关的描述信息
如何把上述 tiff 改为 GeoTiff 呢?
添加结构体、添加wirte_tiff后面的关键词。
结构体:
;投影参数geo_info = {$ ;结构体MODELPIXELSCALETAG:[0.25, 0.25, 0.0],$ ;X /Y /Z 方向的像元分辨率MODELTIEPOINTTAG:[0.0, 0.0, 0.0, -180.0, 90.0, 0.0],$ ;角点坐标。前三个指定位置,后三个指定数值。坐标转换信息,前三个0.0表示栅格图像第0,0,0个像素位置(z方向一般不存在),(若为0.5)就代表中心位置。后面-180.0代表x方向第 0 个位置对应的经度是 -180度,90.0代表y方向第0个位置对应的纬度是90.0度;MODELTIEPOINTTAG:[0.5, 0.0, 0.0, -179.875, 90.0, 0.0],$ ; 当起点中心偏移0.25,那么后面也要改GTMODELTYPEGEOKEY:2,$GTRASTERTYPEGEOKEY:1,$GEOGRAPHICTYPEGEOKEY:4326,$GEOGCITATIONGEOKEY:'GCS_WGS_1984',$GEOGANGULARUNITSGEOKEY:9102,$GEOGSEMIMAJORAXISGEOKEY:6378137.0,$GEOGINVFLATTENINGGEOKEY:298.25722}
一般只需要修改
1.MODELPIXELSCALETAG:[0.25, 0.25, 0.0],$ ;前两个0.25(分辨率,因为一般为2维)
2. MODELTIEPOINTTAG:[0.0, 0.0, 0.0, -180.0, 90.0, 0.0],$ ;一般需要修改-180.0,90.0这两个数字
3. 下面的数字不需要修改。涉及到GeoTiff的存储信息。如果只有上面两个信息,软件读取可能会乱赋值,所以需要写。
4. " $ "代表换行(另起一行)
目标影像下GeoTiff信息如何获取?
获取目标投影geotiff信息的最简方式
1.找一个已有目标投影格式的tiff文件
2.idl读取其中的geotiff结构体
tiff_file = 'D:/world_dem.tif'
data = read_tiff ( tiff_file , geotiff = geo_info )
print, geo_info
help, geo_info
3.修改该结构体中与起始坐标、分辨率的相关参数
4.将修改后的结构体写入目标文件

注意:可以对目标影像进行,重采样,裁剪等操作,看看哪些参数没有改变,无变化参数就是结构体需要的数字。
关于Geotiff的更多说明:
https://gis.stackexchange.com/questions/62837/understanding-geotifftagshttp://duff.ess.washington.edu/data/raster/drg/docs/geotiff.txt
计算不同年份数据,XX月均值计算。季度均值计算。年均值计算。(仅计算有效值,忽略无效值)

function h5_data_get,file_name,dataset_namefile_id=h5f_open(file_name)dataset_id=h5d_open(file_id,dataset_name)data=h5d_read(dataset_id)h5d_close,dataset_idh5f_close,file_idreturn,datadata=!null
endpro omi_no2_average_calculating;输入输出路径设置start_time = systime(1) ; 程序按秒计时,开始计时,与最后的end_time相呼应in_path = 'E:\Data\IDL\chapter_2\NO2\'out_path = 'E:\Data\IDL\chapter_2\NO2\average\'dir_test = file_test(out_path,/directory) ;检测目标文件夹是否存在if dir_test eq 0 then beginfile_mkdir, out_pathendiffilelist = file_search(in_path,'*NO2*.he5') ; 搜索NO2文件下面的,所以hdf5文件file_n = n_elements(filelist)group_name = '/HDFEOS/GRIDS/ColumnAmountNO2/Data Fields/' ; hdf5 需要组的路径,才能读取数据集target_dataset = 'ColumnAmountNO2CloudScreened'dataset_name = group_name + target_dataset; 月份存储数组初始化data_total_month = fltarr(1440,720,12) ; 1440列和720行可以在hdf explor里看到,12分别代表12个月份data_valid_month = fltarr(1440,720,12)data_avr_month = fltarr(1440,720,12); 季节存储数组初始化data_total_season = fltarr(1440,720,4) data_valid_season = fltarr(1440,720,4)data_avr_season = fltarr(1440,720,4); 处理年份设置、年份储存数组初始化year_start = 2017year_n = 2data_total_year = fltarr(1440,720,year_n) data_valid_year = fltarr(1440,720,year_n)data_avr_year = fltarr(1440,720,year_n)for file_i = 0, file_n - 1 do beginprint, filelist[file_i]data_temp = hdf5_data_get(filelist[file_i],dataset_name);help,data_temp ;Array[1440, 720]data_temp = ((data_temp gt 0.0)*data_temp/!const.NA)*(10.0^10.0);转换单位为 mol/km2data_temp = rotate(data_temp,7); 图像反转layer_i = fix(strmid(file_basename(filelist[file_i]),24,2)) - 1 ;从名字中去除月份的信息,从名字中,第24个字母开始取,取两个,但是由于1月要放在0层,2月要放在1层,因此需要-1;月均值data_total_month[*, *, layer_i] = data_temp + data_total_month[*, *, layer_i]data_valid_month[*, *, layer_i] = (data_temp gt 0) + data_valid_month[*, *, layer_i] ;有效是1,无效是0。所有大于0的,记录为1,加入进去,这样,就可以算出每一个位置上出现过几次有效值了;季月均值if(layer_i ge 2) and (layer_i le 4) then begindata_total_season[*, *, 0] = data_tempdata_valid_season[*, *, 0] = (data_temp gt 0.0)endifif(layer_i ge 5) and (layer_i le 7) then begindata_total_season[*, *, 1] = data_tempdata_valid_season[*, *, 1] = (data_temp gt 0.0)endifif(layer_i ge 8) and (layer_i le 10) then begindata_total_season[*, *, 2] = data_tempdata_valid_season[*, *, 2] = (data_temp gt 0.0)endifif(layer_i ge 11) or (layer_i le 1) then begindata_total_season[*, *, 3] = data_tempdata_valid_season[*, *, 3] = (data_temp gt 0.0)endif;年均值year_i = fix(strmid(file_basename(filelist[layer_i]),19,4)) - year_start; 从文件名当中读取年份,减去2017,就只有0或者1(仅两年:2016、2017),且不能是string格式,需要强制类型转换data_total_year[*, *, year_i] = data_tempdata_valid_year[*, *, year_i] = (data_temp gt 0.0)endfordata_valid_month = (data_valid_month gt 0.0)*data_valid_month + (data_valid_month eq 0.0)*(1.0)data_valid_season = (data_valid_season gt 0.0)*data_valid_season + (data_valid_season eq 0.0)*(1.0) data_valid_year = (data_valid_year gt 0.0)*data_valid_year + (data_valid_year eq 0.0)*(1.0) data_avr_month = data_total_month / data_valid_monthdata_avr_season = data_total_season / data_valid_season data_avr_year = data_total_year / data_valid_year geo_info = {$MODELPIXELSCALETAG:[0.25,0.25,0.0],$;x、y、z方向的像元分辨率MODELTIEPOINTTAG:[0.0,0.0,0.0,-180.0,90.0,0.0],$;坐标转换信息,前三个0.0代表栅格图像上的第0,0,0个像元位置(z方向一般不存在),后面-180.0代表x方向第0个位置对应的经度是-180.0度,90.0代表y方向第0个位置对应的纬度是90.0度GTMODELTYPEGEOKEY:2,$GTRASTERTYPEGEOKEY:1,$GEOGRAPHICTYPEGEOKEY:4326,$GEOGCITATIONGEOKEY:'GCS_WGS_1984',$GEOGANGULARUNITSGEOKEY:9102,$GEOGSEMIMAJORAXISGEOKEY:6378137.0,$GEOGINVFLATTENINGGEOKEY:298.25722}for mon_i = 0, 11 do beginout_name = out_path + 'month_avr_' + strcompress(string(mon_i),/remove_all) + '.tiff'write_tiff,out_name, data_avr_month[*, *,mon_i],/float, geotiff = geo_info endforfor season_i = 0, 3 do beginout_name = out_path + 'season_avr_' + strcompress(string(season_i),/remove_all) + '.tiff'write_tiff,out_name, data_avr_month[*, *,season_i],/float, geotiff = geo_infoendforfor year_i = 0, 1 do beginout_name = out_path + 'year_avr_' + strcompress(string(year_i),/remove_all) + '.tiff'write_tiff,out_name, data_avr_month[*, *,year_i],/float, geotiff = geo_infoendforend_time = systime(1)print,'Processing is end, the total time consuming is : ' + strcompress(string(end_time - start_time)) + 's.'; /removeallend
1月份数据在第0层,同理,第N月数据,在第N-1层。
1.strcomptress 函数可以 仅保留一个空格 把多余空格剔除掉。
2.加关键字,/remove_all ,可以把前面所有空格剔除,一个也不保留
3.输出路径不要把最后的/漏掉
程序完成后的提示一定要注意,若出现:
% Program caused arithmetic error: Floating illegal operand
可能是出现了0/0这样的非法操作,这样的原因可能是没有有效数据,导致存出去的结果有NAN的数值存在。所以当分母为0时候,可以进行一些操作,把分母换成其他的数字就可以了
systime这个函数,是系统内置的时间函数,默认输出的是当前时间,systime(1)代表相对于过去了多少秒,可以计算一个程序运行了多少秒。前后均添加该函数,就可以计算时间了。
相关文章:
IDL学习笔记(三)OMI数据处理。hdf5文件读取,图像反转,GeoTiff区别,月季年均值计算提取输出,单位转换,运行时间计算
modis Level 2 grid 数据是全球格网化数据。一天的数据全在其中。 modis Level 1 和 2 数据是一景一景的影像。 IDL学习笔记(三)OMI数据处理 hdf5文件读取单位转换,输出hdf5数据集的图像,并检查图像经纬度是否正确,若错…...
深入浅出:PHP中的数据类型全解析
文章目录 引言理解数据类型标量类型整数 (integer)浮点数 (float)布尔值 (boolean)字符串 (string) 复合类型数组 (array)对象 (object)资源 (resource)NULL 特殊类型Callable强制类型转换 实战案例总结与展望参考资料 引言 在编程的世界里,数据类型是构建任何应用…...
要使用 OpenResty 创建一个接口,返回客户端的 IP 地址,并以 JSON 格式输出
要使用 OpenResty 创建一个接口,返回客户端的 IP 地址,并以 JSON 格式输出 要使用 OpenResty 创建一个接口,返回客户端的 IP 地址,并以 JSON 格式输出方案一解决方案(openresty使用cjson)说明:使…...
智慧油客:从初识、再识OceanBase,到全栈上线
今天,我们邀请了智慧油客的研发总监黄普友,为我们讲述智慧油客与 OceanBase 初识、熟悉和结缘的故事。 智慧油客自2016年诞生以来,秉持新零售的思维,成功从过去二十年间以“以销售产品为中心”的传统思维模式,转向“以…...
ClickHouse守护进程
背景描述 维护CK过程中,有时候会有CK OOM,并且CK自己没有自动拉起的情况出现;那么这个时候就需要守护进程,最初我不说了Supervisor来做守护进程,但是当我手动kill的时候发现并没有自动拉起。 解决方案 于是乎自己写…...
智能合约
06-智能合约 0 啥是智能合约? 定义 智能合约,又称加密合约,在一定条件下可直接控制数字货币或资产在各方之间转移的一种计算机程序。 角色 区块链网络可视为一个分布式存储服务,因为它存储了所有交易和智能合约的状态 智能合约还…...
SQL面试题——拼多多SQL面试题 求连续段的起始位置和结束位置
拼多多SQL面试题 求连续段的起始位置和结束位置 今天的题目来自拼多多,我们先看一下题目描述 有一张表ids记录了id,id不重复,但是会存在间断,求出连续段的开始位置和结束位置 +---+ | id| +---+ | 1| | 2| | 3| | 5| | 6| | 8| | 10| | 12| | 13| | 14| | 15| +--…...
玩《三角洲行动》遇到游戏运行故障是什么原因?游戏运行故障要怎么解决?预防游戏运行故障问题出现
《三角洲行动》游戏运行故障解析与解决方案:原因、解决与预防 在畅游《三角洲行动》这款充满挑战与激情的游戏时,玩家可能会遭遇各种游戏运行故障,如卡顿、闪退、无法启动等问题。我将结合自己丰富的经验和知识,为大家深入剖析《…...
基于灰色神经网络的订单需求预测
灰色神经网络(Grey Neural Network, GNN) 是将灰色系统理论与人工神经网络相结合的一种模型,旨在处理不完全信息和小样本问题。灰色神经网络利用灰色系统的预测优势和神经网络的学习能力,能够在信息不完整或数据不充分的情况下实现…...
记录学习《手动学习深度学习》这本书的笔记(三)
这两天看完了第六章:卷积神经网络,巧的是最近上的专业选修课刚讲完卷积神经网络,什么卷积层池化层听得云里雾里的,这一章正好帮我讲解了基础的知识。 第六章:卷积神经网络 6.1 从全连接层到卷积 在之前的学习中&…...
JS中递归函数的理解及展开运算符在递归种的运用理解
<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>递归函数</title> </head> <body> <script>const list ["你好", "吃饭了吗",["好",[[&qu…...
人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换
接触人工智能的学习三个月了,每天与各种安装包作斗争,缺少依赖包、版本高了、版本低了、不兼容了、系统做一半从头再来了。。。这些都是常态。三个月把单位几台电脑折腾了不下几十次安装,是时候总结一下踩过的坑和积累的经验了。 以一个典型的…...
提高身份证 OCR 识别 API 接口的准确性的方法
身份证OCR识别API接口能够快速、准确地识别并提取身份证上的文字信息,包括姓名、性别、民族、出生日期、住址、身份证号、签发机关、有效期限等关键内容,将其转化为计算机可处理的结构化数据,从而实现身份证信息的自动化录入和处理࿰…...
PHP面向对象
在 PHP 中,面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它使用“对象”来组织和设计代码。对象是类的实例,类是定义对象特征和行为的蓝图。面向对象编程的主要目标是提高代码的可重…...
Tomcat新手成长之路:安装部署优化全解析(下)
接上篇《Tomcat新手成长之路:安装部署优化全解析(上)》: link 文章目录 7.应用部署7.1.上下文7.2.启动时进行部署7.3.动态应用部署 8.Tomcat 类加载机制8.1.简介8.2.类加载器定义8.3.XML解析器和 Java 9.JMS监控9.1.简介9.2.启用 JMX 远程监…...
GPT 1到4代的演进笔记
1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…...
vitepress组件库文档项目 markdown语法大全(修正版)
#上次总结的 有些语法是用在markdown文档中的 使用到vitepress项目中有些语法可能有出入 于是我再总结一版 vitepress项目中的markdown语法大全 在阅读本章节之前,请确保你已经对 Markdown 有所了解。如果你还不了解 Markdown ,请先学习一些Markdown 教…...
Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件
主要讲述封装一个3D轮播相册的组件,效果图如下,仅仅传入一个图片的数组即可,效果如下: 使用Vue3技术开发,支持传入任意张数的图片。 使用方法 <template><Swiper :list"list" /> </templat…...
LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示: class Solution { public:int searchIns…...
【035】基于51单片机俄罗斯方块游戏机【Proteus仿真+Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统LCD12864液晶显示按键控制。 1、设计采用STC89C52、AT89C52、AT89S52作为主控芯片,采用LCD12864液晶作为显示,大屏显示就是刺激; 2、游戏设置十个关卡,每个关卡累计99分即可进入下…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
