ENVI IDL:如何基于气象站点数据进行反距离权重插值?

2023-11-12 00:36

本文主要是介绍ENVI IDL:如何基于气象站点数据进行反距离权重插值?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

01 前言

仅仅练习,大可使用ArcGIS或者已经封装好的python模块进行插值,此处仅仅从底层理解如何从公式和代码理解反距离权重插值的过程,从而更深刻的理解IDL的使用和插值的理解。

02 函数说明

2.1 Read_CSV()函数

官方语法如下:

Result = READ_CSV( Filename [, COUNT=variable] [, HEADER=variable] [, MISSING_VALUE=value] [, N_TABLE_HEADER=value] [, NUM_RECORDS=value] [, RECORD_START=value] [, TABLE_HEADER=variable] [, TYPES=value] )

Filename表示读取的CSV文件的路径;
COUNT表示读取的CSV文件内表格的行数(不包含标签头即第一行)
HEADER表示读取的CSV文件内表头(以字符串数组存储表头信息,默认第一行记录为表头<如果有>)
MISSING_VALUE表示对于CSV文件内表格中的空值应该赋予何值呢?默认是赋予0。
N_TABLE_HEADER表示表头的行数,或许我们的表头不止一行,那么使用header就很难获取得到所有的表头信息,因此我们需要指定表头到底有多少行。一般与TABLE_HEADER连用,获取的多行表头返回给该参数,且其优先级高于header
NUM_RECORDS表示读取的总行数,默认是所有行都读取。
RECORD_START表示开始读取的行的索引,默认从0开始(0为表头行)
TYPES传入各个列的数据类型(字符串数组形式,每一列的记录的数据类型)以下是各个数据类型的参数:
在这里插入图片描述
""表示该列的数据类型自动确定数据类型。

03 代码

3.1 封装的反距离权重插值函数

;+
;   函数用途:
;       IDW插值相关(私有函数), 用于单个像元值的插值计算
;   函数参数:
;       ···
;-
function _idw, x0, y0, targets_exist, xs_exist, ys_exist,  p = pif ~keyword_set(p) then p = 2.0distances = sqrt((x0 - xs_exist) ^ 2.0 + (y0 - ys_exist) ^ 2.0)distances_coef = total(1.0 / (distances ^ p))interp_target = total(targets_exist / ((distances ^ p) * distances_coef))return, interp_target
end;+
;   函数用途:
;       该函数基于少数点位进行反距离权重插值(IDW)生成指定范围的插值栅格矩阵
;   函数参数:
;       targets_exist: 插值的目标向量(数组形式)
;       xs_exist: 与目标向量对应的X坐标向量集(数组形式)
;       ys_exist: 与目标向量对应的Y坐标向量集(数组形式)
;       out_res: 插值后输出的分辨率大小
;       target_interp: 输出插值后的目标矩阵
;-
pro idw, targets_exist, xs_exist, ys_exist, out_res, target_interp, p=pout_res_half = out_res / 2.0dx_min = min(xs_exist) - out_res_halfx_max = max(xs_exist) + out_res_halfy_min = min(ys_exist) - out_res_halfy_max = max(ys_exist) + out_res_halfcols = ceil((x_max - x_min) / out_res)rows = ceil((y_max - y_min) / out_res)target_interp = make_array(cols, rows, /double, value=!values.F_NAN)existing_cols = floor((xs_exist - x_min) / out_res)existing_rows = floor((y_max - ys_exist) / out_res)target_interp[existing_cols, existing_rows] = targets_existfor col_ix=0, cols - 1 do beginfor row_ix=0, rows - 1 do beginif ~finite(target_interp[col_ix, row_ix], /nan) then continuex0 = x_min + col_ix * out_res + out_res_halfy0 = y_max - row_ix * out_res - out_res_halftarget_interp[col_ix, row_ix] = _idw(x0, y0, targets_exist, xs_exist, ys_exist, p=p)endforendfor
end

3.2 主程序

; @Author	: ChaoQiezi
; @Time		: 2023117-下午2:17:56
; @Email	: chaoqiezi.one@qq.com; 该程序用于 对站点(CSV)文件中的空气质量参数(多种污染物浓度)进行指定范围的插值; 主程序
pro idw_interp; 准备in_path = 'D:\Objects\JuniorFallTerm\IDLProgram\Experiments\ExperimentalData\Week7\air_quality_data.csv\'out_dir = 'D:\Objects\JuniorFallTerm\IDLProgram\Experiments\ExperimentalData\Week7\out_me\'if ~file_test(out_dir, /directory) then file_mkdir, out_dirout_res = 0.001d  ; 输出分辨率,(°)out_res_half = out_res / 2.0d; 读取ds = read_csv(in_path, count=count, header=header, missing_value=!values.F_NAN)lon = ds.(0)lat = ds.(1)targets_name = header[2:*]foreach target_name, targets_name, ix do begintarget = ds.(ix + 2)idw, target, lon, lat, out_res, target_interp; 地理结构体geo_info={$MODELPIXELSCALETAG: [out_res, out_res, 0.0], $  ; 分辨率MODELTIEPOINTTAG: [0.0, 0.0, 0.0, min(lon) - out_res_half, max(lat) + out_res_half, 0.0], $  ; 角点信息GTMODELTYPEGEOKEY: 2, $  ; 设置为地理坐标系GTRASTERTYPEGEOKEY: 1, $  ; 像素的表示类型, 北上图像(North-Up)GEOGRAPHICTYPEGEOKEY: 4326, $  ; 地理坐标系为WGS84GEOGCITATIONGEOKEY: 'GCS_WGS_1984', $GEOGANGULARUNITSGEOKEY: 9102}  ; 单位为度; 输出out_path = out_dir + 'IDW_' + target_name + '.tiff'write_tiff, out_path, target_interp, geotiff=geo_info, /doubleprint, target_name, ' IDW插值完成: ', timer_keep(), ' s', format='%s%s%0.2f%s'endforeach
end

这篇关于ENVI IDL:如何基于气象站点数据进行反距离权重插值?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/393887

相关文章

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS