ENVI_IDL:批量对Modis Swath产品进行均值运算+解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: ENVI_IDL:批量对Modis Swath产品进行均值运算+解析

1. 实验内容:

如题所示,就是对Modis Swath产品进行均值运算

这里需要注意几点:

第一:

由于每一个Modis Swath数据的经纬度范围不一样(它不像之前的OMI数据一样是全球数据,之前求和在平均就好了),这里需要现在知道我们现在手上拿到的Modis Swath数据的经纬度范围有多大,那么就需要遍历所有的MOdis Swath数据找到所有的文件里面中的最大、最小经纬度

第二:

正常求均值就可以(讲的有些模糊,看代码或许会更清楚)

就像之前求借OMI数据差不多,其他的操作的也是常规操作。


2. 编程

pro week_five_test
  ; 本程序主要解决如何对Modis Swath数据进行均值运算
; 思路
; 1. 遍历所有的文件找到经纬度的最大值最小值
  ; 路径
  in_path = 'D:\IDL_program\experiment_data\chapter_3\modis_swath\geo_out'
  out_path = in_path
  ; 输出的分辨率
  out_resolution = 0.03
  ; 获取in_path下的所有tiff文件的路径以及文件数量
  file_path_array = file_search(in_path, '*.tiff', count=file_count)
  ; 循环每一幅tiff文件,找到最大最小的经纬度
  ; 预设值
  lon_min = 9999.0
  lon_max = -9999.0
  lat_min = 9999.0
  lat_max = -9999.0
  ; 进入循环
  for file_i = 0, file_count - 1 do begin
    ; 获取该循环下的tiff文件的数据以及geotiff
    data = read_tiff(file_path_array[file_i], geotiff=geo_info)  ; 传入tiff文件的路径,geotiff=返回该tiff文件的投影信息,这里用geo_info变量接收
    ; 从geo_info中获取空间分辨率
    geo_resolution = geo_info.(0)  ; 第0行是空间分辨率
    geo_resolution_x = geo_resolution[0]
    geo_resolution_y = geo_resolution[1]
    ; 从geo_info中获取左上角点的经纬度坐标
    geo_tag = geo_info.(1)  ; 获取第一行(索引为0开始)即是关于左上角点的x、y、z以及lon、lat、dem数值
    ; 获取数据的行列数
    data_size = size(data)
    data_column = data_size[1]
    data_row = data_size[2]
    ; 获取经纬度的最大最小值
    temp_lon_min = geo_tag[3]
    temp_lat_max = geo_tag[4]
    temp_lon_max = temp_lon_min + data_column * geo_resolution_x
    temp_lat_min = temp_lat_max - data_row * geo_resolution_y
    ; 判断是否是最大值,如果是,那么替换
    if temp_lon_min lt lon_min then lon_min = temp_lon_min
    if temp_lon_max gt lon_max then lon_max = temp_lon_max
    if temp_lat_min lt lat_min then lat_min = temp_lat_min
    if temp_lat_max gt lat_max then lat_max = temp_lat_max
  endfor
  ; 计算行列数
  data_box_column = ceil((lon_max - lon_min) / out_resolution)
  data_box_row = ceil((lat_max - lat_min) / out_resolution)
  ; 均值运算求和 和 频次的存储数组
  data_box_sum = fltarr(data_box_column, data_box_row)
  data_box_num = fltarr(data_box_column, data_box_row)
  ; 循环每一个文件进行均值运算
  for file_i = 0, file_count - 1 do begin
    ; 获取tiff文件数据
    data = read_tiff(file_path_array[file_i], geotiff=geo_info)
    ; 获取该文件的空间分辨率
    data_resolution = geo_info.(0)
    data_resolution_x = data_resolution[0]
    data_resolution_y = data_resolution[1]
    ; 获取文件的size
    data_size = size(data)
    ; 获取文件数据的行列数
    data_column = data_size[1]
    data_row = data_size[2]
    ; 获取geo_info的左上角点x、y、z数据以及对应的lon、lat、dem数据
    geo_tag = geo_info.(1)
    ; 获取文件数据的左上角点的经纬度坐标
    data_ul_lon = geo_tag[3]
    data_ul_lat = geo_tag[4]
    ; 获取tiff文件中每一个像元的经纬度
    data_lon_array = fltarr(data_column, data_row)  ; 用来存储经度信息的数组
    data_lat_array = fltarr(data_column, data_row)  ; 用来存储纬度信息的数组
    for data_column_i = 0, data_column - 1 do begin
      data_lon_array[data_column_i, *] = data_ul_lon + data_resolution_x * data_column_i
    endfor
    for data_row_i = 0, data_row - 1 do begin
      data_lat_array[*, data_row_i] = data_ul_lat - data_resolution_y * data_row_i
    endfor
    ; 获取tiff文件的每个像元在box中的行列数、
    data_box_column_array = floor((data_lon_array - lon_min) / out_resolution)
; 错误示范  ; 这里犯了重大错误,我想当然的类似的照写(对于纬度而言),仔细想想这显然是有问题的!!!!!!
;    data_box_row_array = floor((data_lat_array - lat_min) / out_resolution)
; 正确示范
    data_box_row_array = floor((lat_max - data_lat_array) / out_resolution)
    ; 均值运算的前提准备
    data_box_sum[data_box_column_array, data_box_row_array] += data
    data_box_num[data_box_column_array, data_box_row_array] += (data gt 0.0)
  endfor
  ; 将data_box_num中频次为0的更改为1,避免等会儿出现0/0的情况,当然如果出现那么也会得出结果为NaN(看你是要出现0,还是NaN)
  data_box_num = (data_box_num gt 0.0) * data_box_num + (data_box_num eq 0.0)
  ; 均值运算
  data_box_aver = data_box_sum / data_box_num
  ; 地理信息结构体
  geo_info={$
    MODELPIXELSCALETAG:[out_resolution,out_resolution,0.0],$
    MODELTIEPOINTTAG:[0.0,0.0,0.0,lon_min,lat_max,0.0],$
    GTMODELTYPEGEOKEY:2,$
    GTRASTERTYPEGEOKEY:1,$
    GEOGRAPHICTYPEGEOKEY:4326,$
    GEOGCITATIONGEOKEY:'GCS_WGS_1984',$
    GEOGANGULARUNITSGEOKEY:9102,$
    GEOGSEMIMAJORAXISGEOKEY:6378137.0,$
    GEOGINVFLATTENINGGEOKEY:298.25722}
;  data_box_aver = rotate(data_box_aver, 7)
  ; 输出
  write_tiff, out_path + '_aver.tiff', data_box_aver, geotiff=geo_info, /float
end


运行结果如此下:



使用ENVI打开处理好的aver.tiff文件



目录
相关文章
|
9天前
|
缓存 网络协议 安全
融合DNS技术产品和生态
本文介绍了阿里云在互联网基础资源领域的最新进展和解决方案,重点围绕共筑韧性寻址、赋能新质生产展开。随着应用规模的增长,基础服务的韧性变得尤为重要。阿里云作为互联网资源的践行者,致力于推动互联网基础资源技术研究和自主创新,打造更韧性的寻址基础服务。文章还详细介绍了浙江省IPv6创新实验室的成立背景与工作进展,以及阿里云在IPv6规模化部署、DNS产品能力升级等方面的成果。此外,阿里云通过端云融合场景下的企业级DNS服务,帮助企业构建稳定安全的DNS系统,确保企业在数字世界中的稳定运行。最后,文章强调了全链路极致高可用的企业DNS解决方案,为全球互联网基础资源的创新提供了中国标准和数字化解决方案。
|
9天前
|
存储 搜索推荐 数据挖掘
投资回报与预算考量:CRM产品报价全解析
在当今竞争激烈的商业环境中,CRM系统已成为企业不可或缺的工具。它能有效管理客户信息、提升销售效率、优化服务并增强忠诚度。选择合适的CRM需考虑功能、用户数量、定制需求、技术支持及数据安全等因素,确保在预算内实现最大价值。企业在挑选时应明确需求、比较产品、评估长期回报,并考虑扩展性。最适合自己业务需求的CRM才是最佳选择。
|
5月前
|
自然语言处理 数据可视化 API
淘宝商品评论 API 接口:深度解析用户评论,优化产品与服务
淘宝是领先的中国电商平台,其API为开发者提供商品信息、交易记录及用户评价等数据访问服务。对于获授权的开发者和商家,可通过申请API权限、获取并解析评论数据来进行情感分析和统计,进而优化产品设计、提升服务质量、增强用户互动及调整营销策略。未授权用户可能受限于数据访问。
|
3月前
|
存储 Java 开发者
【编程基础知识】 计算机中的数学魔法:二进制加减运算全解析
本文深入解析了计算机中二进制加减运算的原理,涵盖原码、反码和补码的概念及应用,结合具体示例,帮助读者理解计算机底层数学运算机制,适合Java开发者学习。
71 0
|
4月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
93 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
89 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
69 0
|
15天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

推荐镜像

更多
下一篇
开通oss服务