IDL学习笔记(四)
正弦投影 是以 米 为单位的
经纬度网格 是以 度 为单位的
但是转换之后,不会一一对应,所以需要对中间空缺位置需要进行一个填补。
核心问题:
把一个点从一个空间参考系放到另一个空间参考系
对应的编程关键:
1.数组A的元素应该放到数组B的哪个位置?
2.数组B的行列数量?
3.数组B的空值如何填补?
MODIS Grid数据的重投影
1.对应的专业问题:
数组A的元素应该放到数组B的哪个位置投影
2.坐标与经纬度坐标的转换:
数组B的行列数量:经纬度格网的范围
3.数组B的空值如何填补:
移动窗口均值计算
首先,确定,经纬度最值。(数组行列数:原图像包含的经纬度范围最值 ; 重投影结果分辨率设置)
重投影结果分辨率设置,不能比原来更细,因为这样的话,空缺会更多,将带来更大误差。
每个像元坐标从哪里来?
知道第一列坐标,那么第二列坐标 就是 第一列坐标 + 像元分辨率。所以其余坐标就可以利用像元分辨率进行 加减乘除 运算 得知。
像元分辨率没有提到,需要自己计算。利用左上角、右下角坐标,以及行数、列数,进行计算得到。
再找到,我们需要的“一行”信息,再定位到()取出里面的坐标信息。为什么不用strmid?因为()内的信息可能是不固定的,长度不唯一。
根据前面的关键字,通过strpos定位到起始位置和结束位置,获取总共子串长度,然后就可以用strsplit分割函数获取所需数值。
strsplit(ul_info, '=(,)', /extract)
1.'=(,)'只要遇到引号里的任何一个内容就把他分开
2./extract 如果需要提取内容,则输出的是分割的下标。所以需要提取信息的话,需要添加关键字。这时候,提取结果是一个 字符型 数组,里面包含坐标信息。
sd_id = hdf_sd_start(file_list[file_i],/read)
gindex = hdf_sd_attrfind(sd_id,'StructMetadata.0')
hdf_sd_attrinfo, sd_id, gindex, data=metadata
;左上角坐标获取
ul_start_pos = strpos(metadata,'UpperLeftPointMtrs')
ul_end_pos = strpos(metadata,'LowerRightMtrs')
ul_info = strmid(metadata,ul_start_pos, ul_end_pos-ul_start_pos)
ul_info_spl = strsplit(ul_info,'=(,)',/extract) ; 加 /extract 才返回的是内容,而不是切割点的索引
ul_prj_x = double(ul_info_spl[1])
ul_prj_y = double(ul_info_spl[2])
;右下角坐标获取
lr_start_pos = strpos(metadata,'LowerRightMtrs')
lr_end_pos = strpos(metadata,'Projection')
lr_info = strmid(metadata,lr_start_pos,le_end_pos - le_start_pos)
lr_split = strsplit(lr_info,'=(,)',/extract) ;这里一开始忘添加关键字了,导致后面查报错查了很久
lr_prj_x = double(lr_split[1])
lr_prj_y = double(lr_split[2])
;map_proj_inverse 用于将 投影坐标 转为 经纬度坐标
sin_prj = map_proj_init('sinusoidal', /gctp, sphere_radius = 6371007.181,center_longitude=0.0,false_easting=0.0,false_northing=0.0)
;投影坐标参数,从数据里得知,
geo_loc = map_proj_inverse(proj_x, proj_y, map_strcture = sin_prj); 进行坐标转换,需要知道原来的投影的坐标
lon_min = min