ENVI_IDL: 读取文本文件并输出为Geotiff格式+简单均值插值

1.  内容

——————————————————————————————————————————

——————————————————————————————————————————

这里主要没有用到什么新的知识点,就是先获取数据,然后找到经纬度的最大值最小值,以此得到行列数去构建装数据的数组,然后数据按顺序放入到数组中。另外,如果你的数据源明确说明数据的分辨率是准确的而不是近似,那么你可以不进行均值插值,当然为了确保你可以先出图看看缺失值是否存在再来判断是否需要均值插值。做好均值插值后最后输出即可。

——————————————————————————————————————————————————————————————————————————————————————

2. 编程

pro geo_out_tiff, lon, lat, geo_data, resolution, geo_data_out, geo_info
  ; 本程序用于将经纬度、xx数据集转化为可输出为tiff的数据
  
  ; 确定最大最小的经纬度
  lon_min = min(lon)
  lon_max = max(lon)
  lat_min = min(lat)
  lat_max = max(lat)
  
  ; 获取转化为tiff数据所需要的行列数
  column = ceil((lon_max - lon_min) / resolution)  ; ceil()函数表示向上取整
  row = ceil((lat_max - lat_min) / resolution)
  
  ; 得到每一个点的行列位置
  column_array = floor((lon - lon_min) / resolution)  ; 向下取整
  row_array = floor((lat_max - lat) / resolution)
  
  ; 创建装数据的box
  data_box = fltarr(column, row)
  
  ; 将数据转入到box里面
  data_box[column_array, row_array] = geo_data
  
  ; 用来装填充之后的值的box
  geo_data_out = fltarr(column, row)
  ; 但是这个样子还是不行,由于我们这个txt文件的数据源表明了这个分辨率只是大致的分辨率,所以有一些像元位置的data是没有的,所以需要插值
  
; 下面这种方法没有处理最外边的行列
;  for column_i = 1, column - 2 do begin
;    for row_i = 1, row - 2 do begin
;      if data_box[column_i, row_i] eq 0.0 then begin
;        ; 创建九宫格移动窗口
;        temp_windows = data_box[column_i - 1:column_i + 1, row_i - 1:row_i + 1]
;        temp_windows = (temp_windows gt 0.0) * temp_windows
;        if total(temp_windows gt 0.0) gt 3 then begin  ; 阈值设定
;          geo_data_out[column_i, row_i] = total(temp_windows) / total(temp_windows gt 0.0)
;        endif
;      endif else begin
;        geo_data_out[column_i, row_i] = data_box[column_i, row_i]
;      endelse
;    endfor
;  endfor
  
  ; 现在写的方法会处理最外边的行列
  geo_data_out_copy = fltarr(column + 2, row + 2)
  geo_data_out_copy[1:column, 1:row] = data_box
  for column_i = 1, column do begin
    for row_i = 1, row do begin
      if geo_data_out_copy[column_i, row_i] eq 0.0 then begin
        ; 创建九宫格移动窗口
        temp_windows = geo_data_out_copy[column_i - 1: column_i + 1, row_i - 1:row_i + 1]
        temp_windows = (temp_windows gt 0.0) * temp_windows
        if total(temp_windows gt 0.0) gt 3 then begin
          geo_data_out[column_i - 1, row_i - 1] = total(temp_windows) / total(temp_windows gt 0.0)
        endif
      endif else begin
        geo_data_out[column_i - 1, row_i - 1] = geo_data_out_copy[column_i, row_i]
      endelse
    endfor
  endfor
  
  ; 编写地理信息geotiff
  geo_info={$
    MODELPIXELSCALETAG:[resolution,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}
end





pro week_six_study2
  ; 本程序(主程序)是将txt文本数据转化为geotiff图像输出,并且由于有一些缺失值所以需要插值
  
  ; 路径
  in_path = 'D:/IDL_program/experiment_data/chapter_4/2013_year_aop.txt'
  out_path = 'D:/IDL_program/experiment_data/chapter_4/'
  
  ; 打开txt文本文件
  openr, 1, in_path
  
  ; 创建存储数组
  geo_data = fltarr(5, 56304)  ; 行列数通过记事本查看得到
  ; 初始化值
  geo_data[*, *] = -9999.0
  
  ; 获取第一行的索引数据
  index = ''
  readf, 1, index
  index = strsplit(index, /extract)
  index_num = n_elements(index)
  
  ; 获取txt文件的数据
  readf, 1, geo_data
  ; 已经将txt文件的数据全部放在了变量geo_data里面,所以txt文件可以关闭了
  free_lun, 1
  ; 获取经度数据
  lon = geo_data[0, *]
  ; 获取纬度数据
  lat = geo_data[1, *]
  ; 已知该txt文本数据的分辨率是0.18
  resolution = 0.18
  ; 获取后面的数据
  for data_i = 2, index_num - 1 do begin
    ; 输出
    geo_out_tiff, lon, lat, geo_data[data_i, *], resolution, geo_data_out, geo_info
    write_tiff, out_path + index[data_i] + '.tiff', geo_data_out, geotiff=geo_info, /float
  endfor
end  

运行结果:

部分输出结果展示:
这是未经过均值插值的结果:

ENVI_IDL: 读取文本文件并输出为Geotiff格式+简单均值插值_第1张图片 

———————————————————————————————————————————

这是经过了均值插值的结果:

ENVI_IDL: 读取文本文件并输出为Geotiff格式+简单均值插值_第2张图片 

——————————————————————————————————————————————————————————————————————————————————————

我是炒茄子,谢谢大家! 

——————————————————————————————————————————————————————————————————————————————————————

你可能感兴趣的:(IDL,均值算法,开发语言,算法,经验分享)