⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 retrievecommon_456.pro

📁 利用IDL读取MODIS影像L1B和MOD03数据(HDF格式),计算遥感植被指数NDVI
💻 PRO
字号:
;
;
;
;非自动生成功能部分,后添加功能
;
;
;
;
;----------------------------------
;和界面相关的控件设置函数及表格的相关操作
;-----------------------
;得到控件的Geometry
pro GetComponentGeometry_456, inTopBaseID, inTableName, otGeometry
	iComponent = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName);获取控件的ID号
	otGeometry = WIDGET_INFO(iComponent, /GEOMETRY);获取控件的Geometry
end
;-----------------------
;清除Table中内容
pro ClearTable_456, inTopBaseID, inTableName
	idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
    ;将表格两列的值都设为None
	WIDGET_CONTROL, idTable, Set_Value = [['-None-'],['-None-']], TABLE_YSIZE = 0
    ;将表格设置为只有一行,Set_UValue对应的是pUValueTable,pUValueTable将返回Set_UValue当中的值,即行数
	WIDGET_CONTROL, idTable, Set_UValue = {RowCount:0}
end
;-----------------------
;设置单选框状态
pro SetRatioStatus_456, inTopLevelBase, inRatioName, inStatus
	;获取RatioButton的ID
	idRatio = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inRatioName) & IF idRatio EQ 0 THEN RETURN
	;如果inStatus的状态值为1则设置RatioStatus为选中状态
	IF inStatus EQ 1 THEN WIDGET_CONTROL, idRatio, /SET_BUTTON
	;否则设置其为未选中状态
	IF inStatus EQ 0 THEN WIDGET_CONTROL, idRatio, SET_BUTTON = 0
end
;-----------------------
;得到单选框状态
pro GetRatioStatus_456, inTopLevelBase, inRatioName, otStatus
	idRatio = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inRatioName) & IF idRatio EQ 0 THEN RETURN
	otStatus = WIDGET_INFO(idRatio, /BUTTON_SET)
end
;-----------------------
;设置控件为可用还是不可用状态(0不可用状态,1可用状态)
;如果inTLB,则inComponent是在TLB中的ID,如果不是inTLB,则inComponent是控件名称
pro SetComponentSensitive_456, inTopLevelBase, inComponent, inStatus, inTLB = inTLB
	IF N_ELEMENTS(inTLB) NE 0 THEN BEGIN
		WIDGET_CONTROL, inComponent, SENSITIVE = inStatus
	ENDIF ELSE BEGIN
		idComponent = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inComponent) & IF idComponent EQ 0 THEN RETURN
		WIDGET_CONTROL, idComponent, SENSITIVE = inStatus
	ENDELSE
end
;-----------------------
;设置复选框状态
pro SetCheckBoxStatus_456, inTopLevelBase, inCheckBoxName, inStatus
	idCheck = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inCheckBoxName) & IF idCheck EQ 0 THEN RETURN
	IF inStatus EQ 1 THEN WIDGET_CONTROL, idCheck, /SET_BUTTON
	IF inStatus EQ 0 THEN WIDGET_CONTROL, idCheck, SET_BUTTON = 0
end
;-----------------------
;打开HDF文件,并返回文件的路径
pro SelectHdfPathFromDialog_456, otFiles, otPath
	COMPILE_OPT IDL2
	filters = [['*.hdf'], ['科学数据集格式(*.hdf)']]
	;返回文件名及文件路径,可以同时选中多个文件
	otFiles = DIALOG_PICKFILE(/READ, /MULTIPLE_FILES, /MUST_EXIST, FILTER = filters, GET_PATH = otPath)
end
;-----------------------
;把数据添加到Table中
pro AddArrayToTable_456, inTopBaseID, inTableName, inArray, inAppend = inAppend
	IF (N_ELEMENTS(inArray))[0] EQ 0 THEN RETURN
	idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
	WIDGET_CONTROL, idTable, Get_UValue = pUValueTable;返回表格的行数,Set_UValue在ClearTable当中已设置

	IF (pUValueTable.RowCount NE 0) && (N_ELEMENTS(inAppend) NE 0) THEN BEGIN
		WIDGET_CONTROL, idTable, Get_Value = pValueTable ;对应Set_Value,Set_Value在ClearTable当中已设置,即返回表格当中的内容
		pValueTable = [pValueTable, inArray];如果不为空表,则将原先的文件和后面打开添加进去的文件合并,再用于重新填一次表
	ENDIF ELSE pValueTable = inArray;如果行数等于0即还未添加打开文件,即表格还为空表,直接打开HDF文件填入表格即可

	iTotalCount = (SIZE(pValueTable, /DIMENSIONS))[0];计算总共有几行
	WIDGET_CONTROL, idTable, Set_Value = pValueTable, TABLE_YSIZE = iTotalCount;填表
	WIDGET_CONTROL, idTable, Set_UValue = {RowCount:iTotalCount};根据iTotalCount来设置总共的行数
end
;-----------------------
;从Table中删除选中的内容
pro RemoveSelectedRowsFromTable_456, inTopBaseID, inTableName
	;获取表格的ID
	idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
	WIDGET_CONTROL, idTable, Get_UValue = pUVale & IF pUVale.RowCount EQ 0 THEN RETURN;获取表格当中的内容,如果表格为0行则返回 ,为0行即没有可删除的行
	arrEvnelope = WIDGET_INFO(idTable,  /TABLE_SELECT);将表格当中选中的暂时存放到变量arrEvnelope当中去,table_select通过选中的单元格其左、上、右、下来定义选中单元的位置
	iRowMin = arrEvnelope[1] & iRowMax = arrEvnelope[3] & IF iRowMin EQ -1 THEN RETURN
    ;用iRowMin,iRowMin来定义选中哪些行;不能同时选中不相邻的行,只能同时选中相邻的行
	;get remained index
	GetArrayFromTable_456, inTopBaseID, inTableName, otArray
	;返回表格的行数
	iRowCount = (SIZE(otArray, /DIMENSIONS))[0] & IF iRowCount EQ 0 THEN RETURN;size函数的返回值为:2,3,3,7,9/2表示数组为2维;3行3列;数据类型是7即字符串string类型,9个元素
	iIndex = LonArr(iRowCount);根据表格的行数创建一个跟表格的行数一样的数组
	iIndex[iRowMin : iRowMax] = 1 ;将选中的那行对应的数组元素其值置为1,为选中的默认为0
	iIndex = Where(iIndex EQ 0, count);计算未选中的行数,并返回其所在数组的下标

	IF count EQ 0 THEN BEGIN;如果表格当中的数据全部被选中删除的话
		ClearTable_456, inTopBaseID, inTableName;则将表格置为空
	ENDIF ELSE BEGIN
		otArray = otArray[iIndex, *];将剩下的文件对重新存放到数组当中
		AddArrayToTable_456, inTopBaseID, inTableName, otArray;将剩下的文件对重新填一次表格
	ENDELSE
end
;-----------------------
;从Table中得到数组,即将文件对以数组的形式返回
pro GetArrayFromTable_456, inTopBaseID, inTableName, otArray
	idTable = WIDGET_INFO(inTopBaseID, FIND_BY_UNAME = inTableName) & IF idTable EQ 0 THEN RETURN
	WIDGET_CONTROL, idTable, Get_Value = otArray
end
;-----------------------
;;从Table中删除配对结果为无效的数据
pro RemoveBadRowsFromTable_456, inTopBaseID, inTableName
	GetArrayFromTable_456, inTopBaseID, inTableName, otArray
	RemoveBadRowsFromArray_456, otArray, otGoodCount ;从表格当中移除配对为无效的行,返回配对为有效的行数
	IF otGoodCount EQ 0 THEN BEGIN
		ClearTable_456, inTopBaseID, inTableName ;如果无配对结果为有效的文件对,则直接将表格置为空
	ENDIF ELSE BEGIN
		AddArrayToTable_456, inTopBaseID, inTableName, otArray ; 重新加载一次表格,只填入配对结果为有效的文件对
	ENDELSE
end
;-----------------------
;移除无效匹配数据
pro RemoveBadRowsFromArray_456, inOtArray, otGoodCount
	goodIndex = Where(StrMatch(inOtArray[*, 1], '*有效*', /FOLD_CASE) EQ 1, otGoodCount);返回打开文件表格中其匹配状态为有效的行的ID
	IF otGoodCount NE 0 THEN BEGIN
		inOtArray = inOtArray(goodIndex, *);重新创建一个数组,用于保存文件匹配状态为有效的文件对,goodIndex行和所有列
	ENDIF ELSE BEGIN
		FreeVariable_457, inOtArray;如果无配对结果为有效的文件对,则直接释放表格当中的全部数据
	ENDELSE
end
;-----------------------
;打开保存文件对话框
pro SelectDirectoryFromDialog_456, otDirectory, inTitle = inTitle
	otDirectory = DIALOG_PICKFILE(/READ, /MUST_EXIST, /DIRECTORY, TITLE = inTitle);选择保存目录
end
;-----------------------
;返回选择的保存路径
pro SetTextCaption_456, inTopLevelBase, inTextName, inTextCaption
	idText = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inTextName) & IF idText EQ 0 THEN RETURN
	WIDGET_CONTROL, idText, SET_VALUE = inTextCaption ;设置保存路径Text里的内容,即选中的保存路径
end
;-----------------------
;得到Text的caption
pro GetTextCaption_456, inTopLevelBase, inTextName, otTextCaption
	;返回Text控件的ID
	idText = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inTextName) & IF idText EQ 0 THEN RETURN
	WIDGET_CONTROL, idText, GET_VALUE = otTextCaption;返回Text当中的内容
end
;-----------------------
;得到复选框状态
pro GetCheckBoxStatus_456, inTopLevelBase, inCheckBoxName, otStatus
	idCheck = WIDGET_INFO(inTopLevelBase, FIND_BY_UNAME = inCheckBoxName) & IF idCheck EQ 0 THEN RETURN
	otStatus = WIDGET_INFO(idCheck, /BUTTON_SET)
end
;----------------------------------
;设置窗口的位置
PRO SetTLBPosition_400, inSetedBaseId, inCenterOwner = inCenterOwner, inCenterWindow = inCenterWindow

	IF N_ELEMENTS(inCenterOwner) NE 0 THEN BEGIN;如果前一级窗体存在的话
		ownerGeometry = WIDGET_INFO(inCenterOwner, /GEOMETRY);则获取前一级窗体的Geometry信息
		xSize = ownerGeometry.SCR_XSIZE & ySize = ownerGeometry.SCR_YSIZE;获取前一级窗体的大小
		xOff = ownerGeometry.XOFFSET & yOff = ownerGeometry.YOFFSET;获取前一级窗体的位置
	ENDIF ELSE IF N_ELEMENTS(inCenterWindow) NE 0 THEN BEGIN;如果前一级窗体不存在的话,则获取系统桌面的大小和原点位置
		dimensions = GET_SCREEN_SIZE()
		xSize = dimensions[0] & ySize = dimensions[1] & xOff = 0 & yOff = 0
	ENDIF

	;获取正要显示的窗体的Geometry信息
	setedGeometry = WIDGET_INFO(inSetedBaseId, /GEOMETRY);获取正要显示的窗体的Geometry信息,其中参数inSetedBaseId为正要显示的窗体
	xMeSize = setedGeometry.SCR_XSIZE & yMeSize = setedGeometry.SCR_YSIZE;获取窗体的大小

	;set seted size
    ;设置正要显示的窗体的显示位置,在前一级窗体或者系统界面的中间
	xMeOff = Long(xOff + (xSize - xMesize) / 2)
	yMeOff = Long(yOff + (ySize - yMesize) / 2)
	IF (xMeOff LE 0) OR (yMeOff LE 0) THEN BEGIN
		SetTLBPosition_400, inSetedBaseId, /inCenterWindow & RETURN
	ENDIF
	WIDGET_CONTROL, inSetedBaseId, XOFFSET = xMeOff, YOFFSET = yMeOff ;在设置好的位置显示窗体
END
;----------------------------------
;判断是否是MODIS02的文件
PRO MatchMOD02Files_803, inTopBaseID, inFiles ,inFilepath, inOldFiles

	iFileCount = N_ELEMENTS(inFiles) & IF iFileCount EQ 0 THEN RETURN ;如果还未打开文件则返回

	clmMODIS02Files=STRARR(iFileCount)
	clmStatus=STRARR(iFileCount)

	jj=0
	for ii = 0 , iFileCount - 1 do begin

	    ;方法1、判断每个数据是不是modis数据,这个判断是从文件里面的sd来判断的速度比较慢

;	    FileIsMOD021KM_322, inFiles[ii], ot1KMFlag
;	    FileIsMOD02HKM_322, inFiles[ii], otHKMFlag
;	    FileIsMOD02QKM_322, inFiles[ii], otQKMFlag
;	    if ot1KMFlag eq 1 then begin


       ;方法2、从文件名来判断,速度快,但文件命名规则要以MOD开头,有一定局限性
        ;HDFName = StrMid( inFiles[ii], strlen(inFilepath[0]), 8) ;因为inFiles包括文件的存储路径,所以要取MODIS021KM的文件名要先从inFiles当中取出文件存储路径的头几位,然后取8位,即为MODIS021KM的文件名称
	    HDFName = StrMid( inFiles[ii], strlen(inFilepath[0]), 5) ;因为inFiles包括文件的存储路径,所以要取MODIS02的文件名要先从inFiles当中取出文件存储路径的头几位,然后取5位,即可知道该文件是否为MODIS02的文件
	    ;if strcmp(HDFName,'MOD021KM') eq 1 then begin ;保留,用于只需输入文件为MODIS021KM的文件时使用
		if strcmp(HDFName,'MOD02') eq 1 then begin
			clmMODIS02Files[jj]=inFiles[ii]
			clmStatus[jj]='有效'
			jj=jj+1 ;jj为有效的行数
		endif else begin
	    	clmMODIS02Files[jj]=inFiles[ii]
			clmStatus[jj]='无效'
			jj=jj+1 ;jj为行数
	    endelse

	endfor

    ;把原来表格中有的数据保留,并把新的数据添加进去
	iFileIndex = Where(clmMODIS02Files NE '-None-', fileCount);判断选中的MODIS02文件的个数
	IF fileCount NE 0 THEN BEGIN ;如果文件个数不为0
		IF inOldFiles[0, 0] NE '-None-' THEN BEGIN ;判断原来表格当中文件是否为空,如果不为空则继续在表格当中添加文件
			strMODISFiles = [inOldFiles[*, 0], clmMODIS02Files[iFileIndex]];将新选中的文件跟原来表格中的文件合并,并重新输出
			strStatus = [inOldFiles[*, 1], clmStatus[iFileIndex]]     ;将状态合并并重新输出
		ENDIF ELSE Begin ;如果原来表格为空,则直接输出选中的文件
		      strMODISFiles = clmMODIS02Files[iFileIndex]
		      strStatus = clmStatus[iFileIndex]
		ENDELSE
	ENDIF ELSE Begin ;如果没有新选中的文件,则输出原来表格中的内容
	      strMODISFiles = inOldFiles[*, 0]
	      strStatus = inOldFiles[*, 1]
	ENDELSE

	;把文件加载到Table中
	AddArrayToTable_456, inTopBaseID, 'WID_TABLE_InputFiles', [[strMODISFiles], [strStatus]]
END
;--------------------
;释放变量
pro FreeVariable_457, inVar
	IF N_ELEMENTS(inVar) EQ 0 THEN RETURN
	tempVar = Temporary(inVar);保存变量inVar到tempVar当中,并释放变量inVar
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -