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 = p
    if ~keyword_set(p) then p = 2.0

    distances = 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=p
    out_res_half = out_res / 2.0d
    x_min = min(xs_exist) - out_res_half
    x_max = max(xs_exist) + out_res_half
    y_min = min(ys_exist) - out_res_half
    y_max = max(ys_exist) + out_res_half
    cols = 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_exist

    for col_ix=0, cols - 1 do begin
        for row_ix=0, rows - 1 do begin
            if ~finite(target_interp[col_ix, row_ix], /nan) then continue
            x0 = x_min + col_ix * out_res + out_res_half
            y0 = y_max - row_ix * out_res - out_res_half
            target_interp[col_ix, row_ix] = _idw(x0, y0, targets_exist, xs_exist, ys_exist, p=p)
        endfor
    endfor
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_dir
    out_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 begin
        target = 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, $  ; 地理坐标系为WGS84
            GEOGCITATIONGEOKEY: 'GCS_WGS_1984', $
            GEOGANGULARUNITSGEOKEY: 9102}  ; 单位为度
        
        ; 输出
        out_path = out_dir + 'IDW_' + target_name + '.tiff'
        write_tiff, out_path, target_interp, geotiff=geo_info, /double
        print, target_name, ' IDW插值完成: ', timer_keep(), ' s', format='%s%s%0.2f%s'
    endforeach
end


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国企业务变革-管理变革-IT支撑

&#xff08;1&#xff09;业务变革 国家-国资委-央国企这条链&#xff0c;有一主一副两个战略嘱托&#xff1a; 一个是&#xff1a;做大&#xff0c;并且做强-自主可控产业链供应链。 一个是&#xff1a;支撑国家一带一路战略落地 一、做大&#xff0c;做强-自主可控产业链供应…

常见面试题-分布式锁

Redisson 分布式锁&#xff1f;在项目中哪里使用&#xff1f;多久会进行释放&#xff1f;如何加强一个分布式锁&#xff1f; 答&#xff1a; 什么时候需要使用分布式锁呢&#xff1f; 在分布式的场景下&#xff0c;使用 Java 的单机锁并不可以保证多个应用的同时操作共享资源…

影响金融软件开发价格的因素有哪些?

随着科技的发展&#xff0c;金融行业逐渐向数字化和信息化转型&#xff0c;在这个过程中&#xff0c;金融软件开发成为了重要的支撑&#xff0c;然而&#xff0c;金融软件开发的价格是一个复杂的问题&#xff0c;受到多种因素的影响&#xff0c;本文将详细解析影响金融软件开发…

【Nginx40】Nginx学习:动静分离与日志分割

Nginx学习&#xff1a;动静分离与日志分割 放轻松放轻松&#xff0c;最后两篇文章学习的内容是比较轻松的。首先&#xff0c;我们来看看 Nginx 动静分离的概念&#xff0c;然后再看看怎么为 Nginx 做日志分割。内容都很简单&#xff0c;完全不需要有任何的压力。 动静分离 动静…

win下安卓打包指南

win下安卓打包指南 0、缘起 换了台电脑竟然忘了怎么打包&#xff0c;还好有笔记&#xff0c;用软件打包也挺好&#xff0c;但是我感觉用 命令行 更有操作感&#xff0c;分享下。 1、下载并配置apktool&#xff08;放在C://Windows无需配置环境变量&#xff0c;需要java环境&…

JVM虚拟机:垃圾回收器之Parallel Old(老年代)

本文重点 本文将学习老年代的另外一种垃圾回收器Parallel Old(PO)&#xff0c;这是一种用于老年代的并行化垃圾回收器&#xff0c;它使用标记整理算法进行垃圾回收。 历史 在1.6之前&#xff0c;新生代使用Parallel Scavenge只能搭配老年代的Serial Old收集器&#xff0c;而…

入选《人工智能领域内容榜》

入选《人工智能领域内容榜》第 23名 C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割-CSDN博客

比亚迪推动启动电池无铅化 车主有福了

时间过得很快&#xff0c;又到了立冬&#xff0c;意味着冬季已经开始。此时的北方已经下起了大雪&#xff0c;即便是艳阳高照的粤北山区&#xff0c;早晚也出现了较大的温差。笔者不禁想起此前做二手车时期的尴尬场面——三年以上的老车&#xff0c;尤其是没有更换过启动电池的…

【解决方案】pytion 运行时提示 import psutil ModuleNotFoundError: No module named ‘psutil‘

报错原因分析 import psutil ModuleNotFoundError: No module named psutil报错原因分析 当前环境pytion中缺少了psutil包&#xff0c;使用pip命令进行安装 解决方案 pip install psutil

土壤含水量的计算

土壤含水量的计算 土壤水分的表示方法 一般所说的土壤水分&#xff0c;实际上是指用烘干法在105-110摄氏度温度下能从土壤中被驱逐出来的水。土壤水分含量即土壤含水量&#xff0c;它是指土壤中所含有的水分的数量。土壤含水量可以用不同的方法表示&#xff0c;最常用的表示方…

34 Feign最佳实践

2.4.2.抽取方式 将Feign的Client抽取为独立模块&#xff0c;并且把接口有关的POJO、默认的Feign配置都放到这个模块中&#xff0c;提供给所有消费者使用。 例如&#xff0c;将UserClient、User、Feign的默认配置都抽取到一个feign-api包中&#xff0c;所有微服务引用该依赖包…

【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

8.继承与多态 8.2 多态8.2.1 多态的概念8.2.2 多态实现条件8.2.3 重写8.2.4 向上转型和向下转型8.2.5 向下转型8.2.6 多态的优缺点8.2.7 避免在构造方法中调用重写的方法 8.2 多态 8.2.1 多态的概念 通俗来说就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当…

华为ensp:为vlan配置ip

配置对应vlan的ip vlan1 interface Vlanif 1 进入vlan1 ip address 192.168.1.254 24配置IP为192.168.1.254 子网掩码为24位 这样就配置上ip了 vlan2 interface Vlanif 2 ip address 192.168.2.254 24 vlan3 interface Vlanif 3 ip address 192.168.3.254 24 查看结果 …

[蓝桥杯复盘] 第 3 场双周赛20231111

[蓝桥杯复盘] 第 3 场双周赛20231111 总结深秋的苹果1. 题目描述2. 思路分析3. 代码实现 鲜花之海1. 题目描述2. 思路分析3. 代码实现 斐波拉契跳跃2. 思路分析3. 代码实现 星石传送阵2. 思路分析3. 代码实现 六、参考链接 总结 做了后4题。https://www.lanqiao.cn/oj-contes…

为什么要学习去使用云服务器,外网 IP能干什么,MAC使用Termius连接阿里云服务器。保姆级教学

目录 引言 可能有人想问为什么要学习云服务器&#xff1f; &#xff08;获取Linux环境&#xff0c;获得外网IP) 二、安装教程 引言 可能有人想问为什么要学习云服务器&#xff1f; &#xff08;获取Linux环境&#xff0c;获得外网IP) 1.虚拟机&#xff08;下策&#xff09; …

【教3妹学编程-算法题】765. 情侣牵手

3妹&#xff1a;2哥2哥&#xff0c;你看到新闻了吗&#xff1f;襄阳健桥医院院长 公然“贩卖出生证明”&#xff0c; 真是太胆大包天了吧。 2哥 : 我也看到新闻了&#xff0c;7人被采取刑事强制措施。 就应该好好查查他们&#xff0c; 一查到底&#xff01; 3妹&#xff1a;真的…

《红蓝攻防对抗实战》十一.内网穿透之利用SSH协议进行隧道穿透

利用DNS协议进行隧道穿透 一.前言二.前文推荐三. 利用SSH协议进行隧道穿透1.SSH隧道-本地端口转发2.SSH隧道-远程端口转发3.SSH隧道-动态端口转发 四.本篇总结 一.前言 SSH&#xff08;Secure Shell&#xff09;协议是一种加密的网络传输协议&#xff0c;它可以在不安全的网络…

阿里云-maven私服idea访问私服与组件上传

1.进入aliyun制品仓库 2. 点击 生产库-release进入 根据以上步骤修改本地 m2/setting.xml文件 3.pom.xml文件 点击设置获取url 4. idea发布组件

DNS(Domain Name System) in detail

什么是 DNS&#xff1f; DNS&#xff08;域名系统&#xff09;为我们提供了一种与互联网上的设备进行通信的简单方法&#xff0c;而无需记住复数。就像每个房子都有一个唯一的地址来直接向它发送邮件一样&#xff0c;互联网上的每台计算机都有自己唯一的地址来与之通信&#xf…

酷柚易汛ERP-自定义打印整体介绍

1、产品介绍 每种单据系统预设常用模板&#xff0c;提供A4纸张、三等分、二等分&#xff0c;销货单额外提供80mm、58mm供用户选择&#xff1b;每张单据可设置一个默认模板和多个常用模&#xff1b;除默认模板外&#xff0c;其他模板都允许删除&#xff0c;用户可以根据公司业务…