国外大气网站欣赏,北京网站建设与维护,搜狗权重查询,辽宁建设工程信息网官网新网站是哪个本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分#xff1a;读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据#xff0c;最后附加讲解了本人写的生成hdr文本文件代码。此外#xff0c;文中还具体介绍写代码的一些思路。
一、读取ENVI头文件…
本博客主要讲解如何读、生成ENVI标准格式的数据。主要分为四部分读取ENVI头文件、读取ENVI数据、写入ENVI头文件、生成ENVI标准数据最后附加讲解了本人写的生成hdr文本文件代码。此外文中还具体介绍写代码的一些思路。
一、读取ENVI头文件
可以用MathWorks官网公开的read_envihdr函数进行读取并将头文件的数据保存为一个结构体。点击下载read_envihdr函数。
下面给出一个实例
hdr文件“test_disp.hdr” ENVI description { ACQUISITION TIME 20221009101021.117934 MASTER ACQUISITION TIME 20221009101021.117934 SLAVE ACQUISITION TIME 20231016101026.222492 ANCILLARY INFO DISPLACEMENT M. File generated with SARscape 5.2.1 } samples 17634 lines 13082 bands 1 headeroffset 0 file type ENVI Standard data type 4 sensor type Unknown interleave bsq byte order 0 map info {Geographic Lat/Lon, 1, 1, 117.17881266000001, 27.439235720000003, 0.00016666000000000001, 0.00016666000000000001, WGS-84, unitsDegrees} x start 1 y start 1 利用read_envihdr函数读取
clear;close all;clc
% 路径
dispFilePath G:\DInSAR\DInSARNew\RESULT\test_disp.hdr;% 读取头文件数据test_disp
dispInfo read_envihdr(dispFilePath); % 读取头文件 读取经纬度信息
% 读取经纬度以及每个像素的大小
% [经度,纬度,经度方向像素的大小,纬度方向像素的大小]
dispGeoTemp strsplit(dispInfo.map_info.CONTENT,,); % 地理信息左上角
dispGeoLatLon str2double(string(dispGeoTemp(1,4:7))); % 经度纬度左上角 注:当对数据进行地理矫正、移动、裁剪等改变影像位置等操作需要对dispInfo结构体数据进行修改。
二、读取ENVI数据
根据第一章节读取头文件信息利用multibandread函数对头文件数据进行读取。 multibandread用法网上很多这里不做介绍。
dirTemp char(dispFilePath);
dispFile string(dirTemp(1:end-4)); % 无后缀的文件名即去掉“.hdr”
disp multibandread(dispFile,dispInfo.size,[dispInfo.format double],dispInfo.headeroffset,dispInfo.interleave,dispInfo.machine ); 读取完之后可以在这里对数据进行处理。本文不做演示。
注如果电脑没有multibandread函数说明matlab版本太旧了更换较为新的matlab版本。
三、写入ENVI头文件
这里是本博文的重点主要是讲述如何将结构体写入到文本文件中我以将其封装成函数等过段时间上传至博客中。
代码截图 代码介绍见第五章附件。
代码正在上传平台审核通过就能下载。
3.1 第一步创建并打开文件
利用fopen函数打开文件
fid fopen(fileName, w);
3.2 第二步提取结构体字段和数据
fields fieldnames(stru); value stru.(fieldName); % 获取结构体字段中得数据value
3.3 第三步将数据写入到文本文件中
将字段名写入到文本文件中
fprintf(fid, %-26s , fieldName);
将数据写入到文本文件中
% 根据类型如果输入的数数值数组则将之转化为字符串if isstruct(value) % 如果是结构体fprintf(fid, {\n);fprintf(fid, %-30s, );%disp({\n);StructPrintTxt(fid,value,true);fprintf(fid, %-30s, );fprintf(fid, }\n);elseif isnumeric(value) % 如果是数值型数组valueStr string(value); % 将数据转化为字符串if isempty(value) % 数据是否为空fprintf(fid, \n); % 空数据则直接打印换行符elseif length(value) 1 % 若数据为数组矩阵valueStr strjoin(valueStr,,); % 用逗号,连接字符串fprintf(fid, [%s]\n, valueStr); % 打印数组else % 单个数据时fprintf(fid, %s\n, valueStr); % 单个数据直接打印endelse % 其它情况valueStr value; % 为字符串if isempty(value) % 若为空fprintf(fid, \n); % 直接打印换行符elseif length(string(value)) 1 % 若为字符串数组时候valueStr strjoin(valueStr,,); % 用逗号,连接字符串fprintf(fid, [%s]\n, valueStr); % 打印字符串数组else % 单个字符串fprintf(fid, %s\n, valueStr); % 直接打印字符串endend
注StructPrintTxt函数是自己写的封装函数。
3.4 第四步迭代写入数据
3.2 第二步中获取的数据value可能是字符串、intdouble、float……还有可能是结构体因此需要对value进行判断如果是结构体则需要进一步判断然后更深层次的读取。很多人第一想到在弄一个循环然后吧前面代码在写一遍。倘若结构体中在套入n层结构体呢不可能重复写n层这样的代码。因此建议用跌打的原理进行处理。
StructPrintTxt是我封装的函数并在这个函数中调用此函数就形成迭代。
StructPrintTxt(fid,value,true);
完整迭代代码见3.3节。
3.5 关闭文件
每次用fopen函数打开文件都应该要关闭文件。
fclose(fid); % 关闭文件 四、生成ENVI标准数据 multibandwrite用法网上很多这里不做介绍。
% 写入数据
multibandwrite(disp,MyOutData,dispInfo.interleave,machfmt,dispInfo.machine,precision,dispInfo.format); 数据打开测试 五、附件WriteEnviHdr、StructPrintTxt讲解
将结构体写入到文本文件hdr中共写了两个函数。
StructPrintTxt该函数主要是结构体写入到文本文件中可以是文本后缀名不限文本文件即可是被WriteEnviHdr函数调用的
WriteEnviHdr该函数根据文件名判断文件是否为hdr文件然后创建并打开文件接着调用StructPrintTxt函数将结构体数据写入到文本文件中最后关闭文件。
小提示如果需要对数据进行一些说明可以在WriteEnviHdr函数中添加函数字段即可。
% 添加字段也可以修改一些字段
infoStruct.CONTENT ENVI;
infoStruct.author Hulizhen;
infoStruct.phone 15690911024;
infoStruct.organization Joint Receiving Station for Remote Sensing of Xiamen University;
下面是WriteEnviHdr函数具体测试
clear;close all;clc%%
dispFilePath G:\DInSAR\DInSARNew\RESULT\test_disp.hdr;% 读取头文件数据test_disp
dispInfo read_envihdr(dispFilePath); % 读取头文件WriteEnviHdr(Hulizhen.hdr, dispInfo)
运行结果 为了美观StructPrintTxt函数中部分代码是为了对齐。
完整的代码WriteEnviHdr、StructPrintTxt正在上传等一等平台审核通过就能下载。 路漫漫其修远兮吾将上下而求索