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

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性