一个高效的通用光学卫星数据正射校正程序

news2024/11/26 12:46:00

李国春

随着高分辨率对地观测卫星发射的日益增多,对数据处理软件的要求也越来越高。通常每个系列卫星都有自己的数据特点并需要专门的处理软件,但卫星数量的增加为每种卫星单独设计软件的压力越来越大。本文介绍的一种处理方案旨在能够正射校正处理大多数的光学遥感卫星的观测数据。

将卫星运营部门发布的卫星数据处理成用户数据最重要的处理成本是正射校正部分。这里提供的处理方案可以快速无人工干预处理由有理式(RPC)参数描述的一级数据。

本文演示处理了几种卫星数据,更多类别的卫星(尤其是近年大量发射的新卫星)数据用户可以用本文程序试验处理,遇有问题可以及时反馈以便修正处理。

一、99脚本语言处理代码

1. 准备正射校正用DEM数据

	Print("开始生成中国区 SRTM 90m DEM 数据...");
	DWORD tc = GetTickCount();
	//创建 DEM 数据,正射校正用///
	double		demGeoBox[4];				//排列依次为:最小纬度、最小经度、最大纬度和最大经度
	longlong	demHeight = 36000;
	longlong	demWidth = 42000;
	short		demBuffer[demHeight][demWidth];
	double		dbOrgLat = 46.0;			//设置左上角位置的经纬度
	double		dbOrgLon = 95.0;
	short		defaltElv = 0.0;	
	double		demPixSize = 5.0/6000.0;	//SRTM90m = 0.0008333。ASTGTM2、3 DEM 为 0.00027778度/像元.pixsize = 1.0/3600.0;
	DemSrtm90Buffer(demBuffer,dbOrgLat,dbOrgLon,demHeight,demWidth,defaltElv,demGeoBox);
	double dmtm = (GetTickCount() - tc) / 1000.0;
	Print("生成中国区 SRTM 90m DEM 数据用时 %f 秒。",dmtm);

这段代码从SRTM90读来高程数据,存放在DemSrtm90Buffer指向的缓存。数据左上角纬度46.0°N,经度95°E。东西向42000个像元,南北向36000个像元。每个像元5/6000°。这样根据经纬度位置能够定位到对应的高程。

正射校正用DEM数据可以使用SRTM90、ASTGDEM2、3等通用DEM,也可以使用用户自行定义的DEM数据,只需指定开始经纬度位置、像元大小和数据范围,并将数据预存到一个数据缓存中即可。

2.  选择待校正的数据集

	//选择待进行正射校正的卫星数据文件,自动查找对应的RPC数据文件 ///
	longlong	width,height;
	int			bands,datatype;
	STRING tifName = OpenFileDialog(TRUE,"*.tif;*.tiff");//打开一个tif文件
	STRING	rpcName = tifName - '.';
	rpcName = rpcName + ".rpb";
	if(!PathFileExists(rpcName))
	{
		rpcName = tifName - '.';
		rpcName = rpcName + "_rpc.txt";
		if(!PathFileExists(rpcName))
		{
			Print("没有找到多光谱数据 %s 对应的 RPC 文件。",tifName);
			return FALSE;
		}
	}

这段代码用OpenFileDialog函数通过对话框选择一个待处理的文件tifName,并通过文件名查找对应的有理式系数(RPC)文件rpcName。先查找.rpb文件,如果该文件不存在再查找.txt文件。

3. 选择结果输出目录并生成一个输出文件名

	//选择一个结果文件的输出路径,并指定导出文件的类型(.img或者.tif)/
	STRING outPath;
	BrowseFolder(outPath);
	STRING mainName = FileNameMain(tifName);
	STRING outName = outPath + mainName + ".tif";//正射校正后数据的导出文件名

输出文件名指定.tif扩展名自动保存为TIFF文件,指定为.img时自动保存为带.hdr的IMG格式。

4. 开始计时

	Print("开始对%s进行正射校正...",tifName);//开始进行正射校正/
	DWORD tc = GetTickCount();

5. 获取数据行数、列数、波段数、数据类型和四角经纬度信息

	//检测数据集基本信息///
	longlong	width,height;
	int			bands,datatype;
	double quad[8]; //数据四角经纬度,每角一对,书写顺序
	int b = TifInqDataInfo(tifName,height,width,bands,datatype);	//读取 TIFF 文件的数据范围、数据类型和波段数
	int bo2 = SwRpcGeoQuad(rpcName,quad,height,width,demBuffer,demHeight,demWidth,SINT16BL,demGeoBox,demPixSize);//四角坐标

6. 指定投影参数、四角经纬度转换成Northing、Easting坐标

	STRING projstr = "";
	double box[4];
	ProjGeoCoordTransForEx(projstr,2,2,quad,box);//四角经纬度转换成投影坐标 N、E

投影参数 是RSD投影串,格式为:

投影串定义

/ ID = <投影ID>,                      //投影ID,例如UTM、ALBERS_CONIC_EQAREA等

/ a = <椭球体半长轴>,      //椭球体半长轴,如WGS84 为6378137

/ f = <椭球体扁率>,               //椭球体扁率(实为扁率的倒数1/f),如WGS84 为298.2572,

/ SP1 = <第1标准纬线>,   //圆锥投影的第1标准纬线,麦卡托的割线,UTM、高斯投影的带号。

/ SP2 = <第2标准纬线>,   //圆锥投影的第2标准纬线。

/ org_lat = <原点纬度>,    //投影的纬度原点。

/ org_lon = <中央经线>,    //投影的中央经线。

/ FN = <伪北>,             //False Northing,伪北坐标。

/ FE = <伪东>,             //False Easting,伪东坐标。

/ K = <系数>,               //变换系数。

/ DATUM = <大地基准>,    //缺省为WGS84。

这里STRING projstr = "";定义了一个空串,为缺省的UTM投影,投影参数由数据范围自动探测得到。

7.  估算像元尺度和正射后图像大小

	//估算像元大小,南北方向和东西方向都估算,取平均值,然后取整。(或者根据卫星已知信息直接指定像元尺度)
	double nsize,esize;
	double pixsize = SwEvalPixelSize(quad,height,width,nsize,esize);	//估算像元尺度的函数

	//正射校正后的图像大小/
	height = (box[2]-box[0]) / pixsize;
	width = (box[3]-box[1]) / pixsize;

8. 正射校正

	//正射校正,///
	int precis = TRUE;	//精度选项,TRUE时全程使用 8 字节浮点精度。	
	int resamp = CC;//重采样像元重定位方式 FW=前向重采样,NN=最近邻点法,BL=二次线性插值法,CC=三次褶积法。
	WORD retBuffer[height][width][bands]; //哑数组,接收处理结果
	int boo = Sw7WristbandsBuffer3(tifName,rpcName,retBuffer,box,projstr,pixsize,demBuffer,demGeoBox,demPixSize,precis,resamp);

正射校正结果保存在retBuffer缓存中。

9. 统计处理时间

	double tm = (GetTickCount() - tc) / 1000.0;
	Print("正射校正结束,并保存在数组retBuffer中。总计用时 %f 秒。",tm);

10. 输出结果、结束程序

	//正射校正结果导出为TIFF数据格式文件。
	Print("开始导出正射校正结果...");
	tc = GetTickCount();
	int rank,dims,datatype;
	int dims[16];
	InqVariable(retBuffer,rank,dims,datatype);//读正射校正后PAN数据的数据范围、维数和数据类型信息
	height = dims[0];
	width = dims[1];
	bands = dims[2];
	GdSaveTiffFile(outName,retBuffer,height,width,bands,datatype,BIP,projstr,box,pixsize);
	double outpuTime = (GetTickCount() - tc) / 1000.0;
	Print("数据保存为 %s 用时 %f 秒。",outName,outpuTime);

	Print("主程序结束");
	return 1;

二、运行代码

1. 准备代码

将上述代码放入一个main{}内,保存为一个扩展名为.c的文本文件。启动RSD,在 脚本编辑 窗口打开这个文件,如图1。

 图1 运行脚本代码

2. 调试运行

在脚本的第20行的行号后面点击,出现一个小方块,这个小方块是程序断点。点击工具栏里面的小三角,程序开始运行,DEM数据生成以后,程序执行到第20行发生中断,该行代码变为粉色。程序此时停在这里等待。

3. 观察变量(可视化计算)

打开 监视 窗口,双击点亮20行之前的任意一个变量,然后右击该变量,在弹出菜单添加监视,则该变量及其对应的值出现在监视窗口。用户在这里可以监视变量值的正确与否。

对于二维以上数组的观察可以使用预览图的方式。例如上述代码第19行读来全国DEM数据在demBuffer中,观察一下读来的数据是否正确,可以双击点亮该变量,右击,在弹出菜单选 SeeSee。出现图2的DEM图像,说明数据正确。

 图2 观察变量合成的图像

4. 继续运行程序并输出结果

点击工具条上的小三角,程序继续运行。先输入一个待正射校正的高分数据集。再指定一个输出路径。运行结束后在指定的输出目录里面就会找到这个正射校正后的 .tif数据文件。

在RSD中打开这个TIFF文件,图3为GF2正射校正结果。

图3  GF2多光谱数据正射校正结果

从图3中红框可见,GF2多光谱数据正射校正用时6.187秒。

三、测试多种数据正射校正

1.  GF1 多光谱数据

 图4  GF1多光谱数据正射校正结果

GF1多光谱数据正射校正用时4.891秒。

2.  GF多模多光谱数据

 图4  GF多模多光谱数据正射校正结果

GF多模多光谱数据正射校正用时17.453秒。

3.  吉林1号多光谱数据

 图5  吉林1号多光谱数据正射校正结果

吉林1号多光谱数据正射校正用时1.453秒。

4.  资源3多光谱数据

图6  资源3号多光谱数据正射校正结果

资源3号多光谱数据正射校正用时15.719秒。

其它还试验了多种卫星数据,这里就不一一列举了。希望同学们用该脚本测试更多的卫星数据,如遇到问题,将结果及时反馈给我,以便及时解决。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵形状的读取和改变ndarray.shape()方法

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】矩阵形状的读取和改变ndarray.shape()方法[太阳]选择题以下说法正确的是&#xff1a;import numpy as np a np.array([[1,2,3],[4,5,6]])print("【显示】a\n",a)print("【显示】…

【第十六篇】Camunda系列-动态表单

动态表单 接下来我们看看动态表单的应用,在Camunda中表单分为内置表单和动态表单。 1.内置表单 内置表单就是在绘制流程图的时候同时绘制表单。这种方式其实就是绑定了对应的流程变量,不是太灵活。但还是来讲解下。 1.1 启动流程绑定 我们先来看下在启动流程的时候就设置相…

点击化学Alkynyl Myristic COOH,82909-47-5,13-十四炔酸

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;82909-47-5中文名&#xff1a;炔基-肉豆蔻酸&#xff0c;13-十四炔酸英文名&#xff1a;Alkynyl Myristic Acid&#xff0c;Alkynyl Myristic COOH试剂基团反应特点&#xff08;Reagent g…

c++模板,选择排序,字符数组,字符串

目录 1.模板 1.1模板概念 1.2.函数模板 1.2.1函数模板语法&#xff0c;函数模板的调用--1.自动类型推导&#xff0c;2.显示指定类型 1.2.2函数模板注意事项 ​编辑 1.2.3函数模板的案例&#xff0c;选择排序&#xff0c;字符数组&#xff0c;字符串 1.2.4普通函数与函数…

C语言中的回调函数 和 函数指针

以冒泡排序为例&#xff1a; void sort(int *a, int size) {int i, j;for (i 0; i < size-1; i){for (j 0; j < size - i - 1; j){if (a[j] > a[j1]){int num a[j];a[j] a[j1];a[j1] num;}}}}int main(){int arr[9] {1,2,3,4,5,6,7,8,9};sort(arr, 9); // sort…

列表元素的最大值,最小值,出现的次数和列表长度

1 获取列表中的最大元素和最小元素&#xff1a; 使用max和min可以分别获取一个列表中最大元素和最小元素的值&#xff0c;其语法格式为&#xff1a; max(list) 和min(list) 例&#xff1a;ls[12,34,56,87]#创建列表并赋给ls print(ls中最大元素值为&#xff1a;max(ls))#输出…

JDY-10M BLE组网模块介绍

JDY-10M BLE组网模块简介JDY-10透传模块是基于蓝牙4.0协议标准&#xff0c;工作频段为2.4GHZ范围&#xff0c;调制方式为GFSK&#xff0c;最大发射功率为8db&#xff0c;最大发射距离50米&#xff0c;具有功耗低、尺寸小、信号强、数据传输稳定等特性。JDY-10M BLE组网模块特征…

DM8:达梦数据库DEM部署说明(详细步骤)

DM8:达梦数据库DEM部署说明&#xff08;详细步骤&#xff09;1 创建一个数据库作为DEM后台数据库, 数据库dm.ini参数配置进行优化, 推荐配置:1.1 在该数据库中执行DEM的SQL脚本2 配置tomcat2.1 配置/tomcat/conf/server.xml2.2 修改jvm启动参数3 配置JAVA 1.8及以上版本的运行时…

潜力出众应该具有的特质

前言 先说一下背景&#xff0c;最近在以面试官的角色面试候选人的过程中&#xff0c;一直在思考一个问题&#xff1a;“如何判断一个候选人是否有潜力&#xff0c;是否适合这个岗位&#xff0c;入职后是否能能快速成长&#xff0c;成为独挡一面的人&#xff0c;一个有潜力的人…

手撕Pytorch源码#1.Dataset类 part1

写在前面手撕Pytorch源码系列目的&#xff1a;通过手撕源码复习了解高级python语法熟悉对pytorch框架的掌握在每一类完成源码分析后&#xff0c;会与常规深度学习训练脚本进行对照本系列预计先手撕python层源码&#xff0c;再进一步手撕c源码版本信息python&#xff1a;3.6.13p…

PHP MySQL 插入多条数据

使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句。 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php $servername "localhost"; $username "username"; $pas…

MWORKS 2023a 已上线!

同元软控不断打磨MWORKS产品&#xff0c;持续精进&#xff0c;于1月8日正式发布科学计算与系统建模仿真平台MWORKS 2023a。 欢迎大家前往同元软控官网下载MWORKS 2023a软件进行试用。我们在官网新增反馈问题入口&#xff0c;也欢迎大家提交工单以反馈产品建议。 1.MWORKS官方软…

FPGA:Vivado基于IP集成的计数器设计(3)

本节利用上一节创建和封装的ls61和ls00两个IP核。采用原理图设计的方式实现一个模9计数器&#xff0c;讲解IP核集成的Vivado设计流程。 &#xff08;1&#xff09;创建工程 创建一个名为count_bd的新工程&#xff0c;存于F:\FPGA\FPGAproject\exam文件夹下&#xff1b; &…

用 Goby 通过反序列化漏洞一键打入内存马【利用篇】

Goby 社区第 22 篇技术分享文章全文共&#xff1a;3734 字 预计阅读时间&#xff1a;10 分钟001 前言 在上一篇《Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】》中&#xff0c;我从概念上介绍了很多内存马的东西&#xff0c;并给出了我的观点&#xff1a;“大势所趋下&#…

dvwa中的xss(跨站脚本)攻击

环境&#xff1a;dvwa: 192.168.11.135 dvwa版本&#xff1a; Version 1.9 (Release date: 2015-09-19)kail机器&#xff1a;192.168.11.156 一、XSS是什么XSS&#xff08;Cross Site Scripting&#xff0c;跨站脚本攻击&#xff09;&#xff0c;是指恶意攻击者往web页面里插入…

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 1、时间&#xff1a;2003-2019年 2、来源整理自统计NJ、各省NJ 3、指标包括&#xff1a;GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 4、包括&#xff1a;31省 5、指标解释&#xff1a; …

2023届计算机专业弄潮儿如何快速找毕业论文文献?

人生苦短&#xff0c;我用Python 一、准备工作 软件选择 Python3.8pycharm 模块 requests #模拟请求 Selenium # 浏览器自动化操作winr打开搜索框&#xff0c;输入cmd按确定打开命令提示符窗口&#xff0c;输入pip install 加上你要安装的模块名&#xff0c; 回车即可安…

uml图 各连接线的含义

目录UML类图六种关系的总结1.泛化&#xff08;Generalization&#xff09;2.实现&#xff08;Realization&#xff09;3.关联&#xff08;Association&#xff09;4.聚合&#xff08;Aggregation&#xff09;5.组合&#xff08;Composition&#xff09;6.依赖&#xff08;Depen…

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)

文章目录前言一、JS前端的修改前言 最近学习了一些有关于JS脚本搭建网站方面的安全知识。通常来说JS是前端的页面代码&#xff0c;因此我们可以直接修改前端的JS代码来实现绕过&#xff0c;故我试着做了一下利用浏览器的开发者工具进行尝试修改页面&#xff0c;以此来直接进行…

<Python>使用python来控制windows系统音量

使用python可以对windows系统的音量进行读取或者设置。 平台&#xff1a;visual studio code 语言&#xff1a;python 需要的python模块&#xff1a; 1、pyqt5 2、ctypes&#xff1a; ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型&#xff0c;并允许调用 DLL …