[IDL] 아이디엘 Terra/CERES 극궤도 기상 위성 자료를 이용하여 지표면 특성 (Landcover) 및 운량 (Cloud Fraction)에 따른 가시화

 정보

  • 업무명    : 아이디엘 Terra/CERES 극궤도 기상 위성 자료를 이용한 지표면 특성 (Landcover) 및 운량 (Cloud Fraction)에 따른 가시화

  • 작성자    : 이상호

  • 작성일    : 2019-08-29

  • 설   명    :

  • 수정이력 :

    • 2020-03-24 : 소스 코드 명세 추가

 

 내용

[개요]

  • 안녕하세요? 기상 연구 및 웹 개발을 담당하고 있는 해솔입니다.

  • 오늘 포스팅에서는 Terra/CERES 극궤도 기상 위성 자료를 이용한 지표면 특성 (Landcover) 및 운량 (Cloud Fraction)에 따른 가시화를 소개해 드리고자 합니다.

 

[특징]

  • 기상 위성 자료를 이용하여 가시화를 위한 소프트웨어가 필요하며 이 프로그램은 이러한 목적을 달성하기 위해 고안된 소프트웨어

 

[기능]

  • Terra/CERES 극궤도 기상 위성 자료에 대한 위/경도 및 이진 자료 읽기

  • 각 화소마다 분기문으로 컬러 부여

  • 각 카테고리 (지표면 특성 및 운량)별로 범례 추가

 

[사용법]

  • 입력 자료를 동일 디렉터리에 위치

  • 소스 코드를 실행 (idl -e Visualization_By_Landcover_And_Cloud_Fraction_Using_Terra_CERES_Data)

  • 가시화 결과를 확인

 

[사용 OS]

  • Windows 10

  • Linux

 

[사용 언어]

  • IDL v8.5

 

 소스 코드

  • 해당 작업을 하기 위한 컴파일 및 실행 코드는 IDL로 작성되었으며 가시화를 위한 라이브러리는 Coyote's Guide to IDL ProgrammingIDL Astronomy User's Library를 이용하였습니다.

  • 소스 코드는 단계별로 수행하며 상세 설명은 다음과 같습니다.

    • 1 단계는 주 프로그램은 작업 경로 설정, 아스키 파일 읽어 메모리상에 저장하고 가시화를 위한 초기 설정합니다.

    • 2 단계는 plots 매핑에 따라 영상 장면 표출하여 이미지 형식으로 저장합니다. 이 과정에서 포스트 스크립트 (PS) 형식에서 PNG로 변환합니다.

 

[명세]

  • 작업 환경 설정

cd, 'D:\할 일\Program\각종 자료\Aerosol mapping+RGB\modis hdf_ps_RGB x\Ozone'

 

  • 아스키 (ASCII) 파일 설정

file = 'Terra_20150818_0000-0134.dat'

 

  • 파일 읽기

    • readcol를 통해 각 변수에 따른 포맷별로 읽기

readcol, file, format='f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f', lon, lat, sza, ceres_rsr, ceres_albedo, rsr, rsr2, land_rsr, land_rsr2, albedo, albedo2, land_albedo, land_albedo2, sfc_albedo, ceres_landcover, ceres_sfc_albedo, clear_fraction

 

  • 가시화를 위한 초기 설정

    • set_plot를 통해 포스트 스크립트 (Post Script, PS) 형식으로 저장 및 세부 옵션

      • 그림 저장명 : filename

      • 폰트 : /SCHOOLBOOK

      • 폰트 굵게 : /BOLD

    • usersym를 통해 매핑을 위한 심볼 설정

    • 중심 위도 (clat), 중심 경도 (clon) 설정

    • loadct를 통해 컬러바 선택

    • cgmap_set를 통해 도법 (satellite) 설정

n_color = 7
clat = -0.031184  &  clon = 140.204602
zmin =  0
zmax = 8

ps_name = 'land'

set_plot,'ps'
device, filename=ps_name+'.ps', decomposed=0, bits=8, /color, xsize=12, ysize=13, /inches,  $
/schoolbook, /bold
!p.font=0  &  !p.charsize=2.0 & !p.charthick=1.6  & !p.multi=[0,1,1]
usersym,17.2*[0,1,1,0,0]/9,3.9*[0,0,1,1,0]/2,/fill

start_color=zmin  &  end_color=zmax  &  colorn=end_color-start_color

tvlct, r, g, b, /Get
loadct, 33, ncolor=colorn 

cgmap_set, /satellite, sat_p=[42159.934825,0,0], clat, clon, charsize=1.0, limit=[-90,-180,90,180], $
position=[0.10,0.15,0.9,0.95], /isotropic, color='white'

 

  • 매핑을 위한 설정 및 가시화 : points

    • 지표면 특성 (ceres_landcover) 및 운량 (clear_fraction)에 따라 컬러 (color) 매핑

for i=0L, lines-1 do begin

	if ((ceres_landcover[i] ge 1 and ceres_landcover[i] le 6) or (ceres_landcover[i] ge 8 and ceres_landcover[i] le 14) $
		or (ceres_landcover[i] eq 18) or (ceres_landcover[i] eq 7) or (ceres_landcover[i] eq 16) )  then begin  
        if (clear_fraction[i] gt 95  and  clear_fraction[i] le 100) then begin
            plots, lon[i], lat[i], psym=8, symsize=0.4, color=0
        endif else if (clear_fraction[i] gt 50  and  clear_fraction[i] le 95) then begin
            plots, lon[i], lat[i], psym=8, symsize=0.4, color=1
        endif else if (clear_fraction[i] gt 5  and  clear_fraction[i] le 50) then begin
            plots, lon[i], lat[i], psym=8, symsize=0.4, color=2
        endif else if(clear_fraction[i] ge 0  and  clear_fraction[i] le 5) then begin
            plots, lon[i], lat[i], psym=8, symsize=0.4, color=3            
        endif else begin
        endelse
	endif else begin
	endelse

    if(ceres_landcover[i] eq 17) then begin               
        if (clear_fraction[i] gt 95  and  clear_fraction[i] le 100) then begin
        	plots, lon[i], lat[i], psym=8, symsize=0.4, color=4
        endif else if (clear_fraction[i] gt 50  and  clear_fraction[i] le 95) then begin
          	plots, lon[i], lat[i], psym=8, symsize=0.4, color=5
        endif else if (clear_fraction[i] gt 5  and  clear_fraction[i] le 50) then begin
        	plots, lon[i], lat[i], psym=8, symsize=0.4, color=6
        endif else if(clear_fraction[i] ge 0  and  clear_fraction[i] le 5) then begin
        	plots, lon[i], lat[i], psym=8, symsize=0.4, color=7
        endif else begin
        endelse   
    endif else begin
    endelse

endfor

 

  • cgtext 및 cgLegend를 통해 범례 설정 및 세부 옵션

    • 그림에서와 같이 글자 색 (운형)와 심볼 모양 (통계값 종류)에 따라 LAND, SEA, SD 및 R, Bias, RMSE에 따라 별도 범례 설정

    • charsize : 글자 크기

    • charthick : 글자 굵기

    • alignment : 글자 정렬

    • color : 글자 색

    • font : cgPS_Open에서 설정한 폰트 반영

    • Psyms : 심볼 모양

    • SymSize : 심볼 크기

    • Color : 심볼 색

    • TCOLORS : 심볼 색

cgtext, 0.61, 0.74, 'LAND :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal

cgLegend, Title=['  Clear', '  Partly cloudy', '  Mostly cloudy', '  Overcast'], PSyms=[-15], $
	SymSize=3.0, Color=[0, 1, 2, 3], Location=[0.62, 0.71], $
	Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[0, 1, 2, 3] 

cgtext, 0.61, 0.54, 'OCEAN :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal

cgLegend, Title=['  Clear', '  Partly cloudy', '  Mostly cloudy', '  Overcast'], PSyms=[-15], $
	SymSize=3.0, Color=[4, 5, 6, 7], Location=[0.62, 0.51], $
	Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[4,5,6,7]

 

  • 컬러바 설정

cgcolorbar,range=[zmin,zmax],  ncolor=colorn, position=[0.15,0.09,0.85,0.13],  $
	yminor=0, ytickinterval=0, xminor=5, xstyle=1+8, ystyle=4, $
	xthick=5, ythick=5, ticklen=0.29999, charsize=1.9

 

  • 지도 맵 설정

cgmap_gshhs, 'gshhg'+path_sep()+'gshhs_i.b', color='black', /outline, level=4, thick=1.0
cgmap_continents, /continents,  /hires, color='black', mlinethick=0.001, thick=1.0, limit=[-90,-180,90,180]

 

  • 도법에 대한 격자 보조선 설정

    • cgmap_grid를 기준 위/경도 (lats, lons)에 따라 텍스트 (lats_names, lons_names) 및 격자 보조선 삽입

    • cgtext를 통해 그림 제목 삽입

lats = [-90, -60, -30, 0, 30, 60, 90]
lats_names = ['','', '', ' ', '','', '']

lons = [10, 80, 110, 140, 170, -160, -10]
lons_names = ['','', '', '', '', '','']

cgmap_grid, color='black', /label, lats=lats,  latlabel=170, lonlabel=-5, latnames=lats_names, lons=lons, lonnames=lons_names, clip_text=0, linestyle=1, noclip=0, /horizon, charsize=1.7
cgtext, 0.5, 0.965, ps_name, charsize=2, charthick=1.6, alignment=0.5, color='black', font=0, /normal

 

  • 포스트 스크립트 형식 (PS)을 PNG로 변환

    • device를 통해 포스크 스크립트 정상 종료

    • convert를 통해 PNG 이미지 형태로 변환

    • file_delete를 통해 포스트 스크립트 삭제

device, /close_file

com  = 'convert -flatten -background white '+ps_name+'.ps'+' '+file_basename(ps_name, '.ps')+'.png'
spawn, com

file_delete, ps_name+'.ps'

 

  • Terra/CERES 자료를 이용한 지표면 특성과 운량에 따른 매핑

etc-image-0

 

[전체]

pro Visualization_By_Landcover_And_Cloud_Fraction_Using_Terra_CERES_Data
cd, 'D:\할 일\Program\각종 자료\Aerosol mapping+RGB\modis hdf_ps_RGB x\Ozone'
file = 'Terra_20150818_0000-0134.dat'
lines = file_lines(file)-1
print, lines
readcol, file, format='f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f,f', lon, lat, sza, ceres_rsr, ceres_albedo, rsr, rsr2, land_rsr, land_rsr2, albedo, albedo2, land_albedo, land_albedo2, sfc_albedo, ceres_landcover, ceres_sfc_albedo, clear_fraction
n_color = 7
clat = -0.031184 & clon = 140.204602
zmin = 0
zmax = 8
ps_name = 'land'
set_plot,'ps'
device, filename=ps_name+'.ps', decomposed=0, bits=8, /color, xsize=12, ysize=13, /inches, $
/schoolbook, /bold
!p.font=0 & !p.charsize=2.0 & !p.charthick=1.6 & !p.multi=[0,1,1]
usersym,17.2*[0,1,1,0,0]/9,3.9*[0,0,1,1,0]/2,/fill
start_color=zmin & end_color=zmax & colorn=end_color-start_color
tvlct, r, g, b, /Get
loadct, 33, ncolor=colorn
; cgloadct, 13, /Reverse, /Brewer, ncolor=colorn ; Good (diff)
; cgloadct, 24, /Reverse, /Brewer, bottom=0, ncolor=colorn ; Good (diff)
; cgloadct, 25, /Reverse, /Brewer, bottom=0, ncolor=colorn ; Good
; cgloadct, 13, /Reverse, /Brewer, bottom=0, ncolor=colorn ; Good (Cloud Fraction)
cgmap_set, /satellite, sat_p=[42159.934825,0,0], clat, clon, charsize=1.0, limit=[-90,-180,90,180], $
position=[0.10,0.15,0.9,0.95], /isotropic, color='white'
for i=0L, lines-1 do begin
if ((ceres_landcover[i] ge 1 and ceres_landcover[i] le 6) or (ceres_landcover[i] ge 8 and ceres_landcover[i] le 14) $
or (ceres_landcover[i] eq 18) or (ceres_landcover[i] eq 7) or (ceres_landcover[i] eq 16) ) then begin
if (clear_fraction[i] gt 95 and clear_fraction[i] le 100) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=0
endif else if (clear_fraction[i] gt 50 and clear_fraction[i] le 95) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=1
endif else if (clear_fraction[i] gt 5 and clear_fraction[i] le 50) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=2
endif else if(clear_fraction[i] ge 0 and clear_fraction[i] le 5) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=3
endif else begin
endelse
endif else begin
endelse
if(ceres_landcover[i] eq 17) then begin
if (clear_fraction[i] gt 95 and clear_fraction[i] le 100) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=4
endif else if (clear_fraction[i] gt 50 and clear_fraction[i] le 95) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=5
endif else if (clear_fraction[i] gt 5 and clear_fraction[i] le 50) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=6
endif else if(clear_fraction[i] ge 0 and clear_fraction[i] le 5) then begin
plots, lon[i], lat[i], psym=8, symsize=0.4, color=7
endif else begin
endelse
endif else begin
endelse
endfor
cgtext, 0.61, 0.74, 'LAND :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal
cgLegend, Title=[' Clear', ' Partly cloudy', ' Mostly cloudy', ' Overcast'], PSyms=[-15], $
SymSize=3.0, Color=[0, 1, 2, 3], Location=[0.62, 0.71], $
Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[0, 1, 2, 3]
cgtext, 0.61, 0.54, 'OCEAN :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal
cgLegend, Title=[' Clear', ' Partly cloudy', ' Mostly cloudy', ' Overcast'], PSyms=[-15], $
SymSize=3.0, Color=[4, 5, 6, 7], Location=[0.62, 0.51], $
Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[4,5,6,7]
; for i=0L, lines-1 do begin
; if ((ceres_landcover[i] ge 1 and ceres_landcover[i] le 6) or (ceres_landcover[i] ge 8 and ceres_landcover[i] le 14) $
; or (ceres_landcover[i] eq 18) or (ceres_landcover[i] eq 7) or (ceres_landcover[i] eq 16) ) then begin
; if (clear_fraction[i] gt 95 and clear_fraction[i] le 100) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=5
; endif else if (clear_fraction[i] gt 50 and clear_fraction[i] le 95) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=7
; endif else if (clear_fraction[i] gt 5 and clear_fraction[i] le 50) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=7
; endif else if(clear_fraction[i] ge 0 and clear_fraction[i] le 5) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=7
; endif else begin
; endelse
; endif else begin
; endelse
;
; if(ceres_landcover[i] eq 17) then begin
; if (clear_fraction[i] gt 95 and clear_fraction[i] le 100) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=0
; endif else if (clear_fraction[i] gt 50 and clear_fraction[i] le 95) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=3
; endif else if (clear_fraction[i] gt 5 and clear_fraction[i] le 50) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=3
; endif else if(clear_fraction[i] ge 0 and clear_fraction[i] le 5) then begin
; plots, lon[i], lat[i], psym=8, symsize=0.4, color=3
; endif else begin
; endelse
; endif else begin
; endelse
;
; endfor
; cgtext, 0.61, 0.74, 'LAND :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal
; cgLegend, Title=[' Clear', ' Cloudy'], PSyms=[-15], $
; SymSize=3.0, Color=[5, 7], Location=[0.62, 0.71], $
; Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[5,7]
; cgtext, 0.61, 0.54, 'SEA :', charsize=2.5, charthick=3.0, alignment=0, color='black', font=0, /normal
; cgLegend, Title=[' Clear', ' Cloudy'], PSyms=[-15], $
; SymSize=3.0, Color=[0, 3], Location=[0.62, 0.51], $
; Length=0, VSpace=3.5, charsize=2.2, TCOLORS=[0,3]
cgcolorbar,range=[zmin,zmax], ncolor=colorn, position=[0.15,0.09,0.85,0.13], $
yminor=0, ytickinterval=0, xminor=5, xstyle=1+8, ystyle=4, $
xthick=5, ythick=5, ticklen=0.29999, charsize=1.9
cgmap_gshhs, 'gshhg'+path_sep()+'gshhs_i.b', color='black', /outline, level=4, thick=1.0
cgmap_continents, /continents, /hires, color='black', mlinethick=0.001, thick=1.0, limit=[-90,-180,90,180]
lats = [-90, -60, -30, 0, 30, 60, 90]
; lats_names = ['',textoidl('60\circS', font=0), textoidl('30\circS', font=0), ' ', textoidl('30\circN', font=0),textoidl('60\circN', font=0), '']
lats_names = ['','', '', ' ', '','', '']
lons = [10, 80, 110, 140, 170, -160, -10]
; lons_names = ['',textoidl('80\circE'), textoidl('110\circE'), textoidl('140\circE'), textoidl('170\circE'), textoidl('200\circW'),'']
lons_names = ['','', '', '', '', '','']
cgmap_grid, color='black', /label, lats=lats, latlabel=170, lonlabel=-5, latnames=lats_names, lons=lons, lonnames=lons_names, clip_text=0, linestyle=1, noclip=0, /horizon, charsize=1.7
cgtext, 0.5, 0.965, ps_name, charsize=2, charthick=1.6, alignment=0.5, color='black', font=0, /normal
device, /close_file
com = 'convert -flatten -background white '+ps_name+'.ps'+' '+file_basename(ps_name, '.ps')+'.png'
spawn, com
file_delete, ps_name+'.ps'
end

 

 참고 문헌

[논문]

  • 없음

[보고서]

  • 없음

[URL]

  • 없음

 

 문의사항

[기상학/프로그래밍 언어]

  • sangho.lee.1990@gmail.com

[해양학/천문학/빅데이터]

  • saimang0804@gmail.com