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分即可进入下…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
