정보

    • 업무명    : 포트란 지상 관측소를 기준으로 근접한 1/4/9 위성 픽셀에 대해 평균 수행

    • 작성자    : 이상호

    • 작성일    : 2019-08-25

    • 설   명    :

    • 수정이력 :

     

     내용

    [특징]

    • 위성 자료와 지상 관측소를 공간 일치를 위한 소프트웨어가 필요하며 이 프로그램은 이러한 목적을 이러한 목적을 달성하기 위해 고안된 소프트웨어

     

     

    [기능]

    • Terra/MODIS 자료에 대한 위경도 및 이진 자료 읽기

    • 해당 이진 자료를 이용하여 식생지수 (NDVI)로 변환

    • 지상 관측소의 위·경도를 기준으로 거리 계산 및 1/4/9 격자 평균 수행

     

    [사용법]

    • 입력 자료 (Terra/MODIS 위·경도 및 이진 자료)를 동일 디렉터리에 저장

    • 소스 코드를 컴파일 (gfortran Average_Over_Satellite_Pixels_Relative_To_Ground_ Station.f90)

    • 소스 코드를 실행 (./a.out)

    • 각 관측소의 평균값을 확인

     

    [사용 OS]

    • Linux

     

    [사용 언어]

    • Fortran

     

     소스 코드

    [전체]

          implicit none
          integer, parameter :: X_MAX = 2030 , Y_MAX = 1354 , XY_DATA = 2752681
          integer, parameter :: NaN = 0
    !      real, parameter :: add_offset = 0.49 , scale_factor = 0.002 ! Emis
          real, parameter :: add_offset = 0.00 , scale_factor = 0.02    ! LST
          
          integer :: i, j, m, n, l, mm, ll, ii
          integer :: cc, cc1, cc2, cc3, cc4
          real :: read_lat, read_lon
          real :: MIN_dd, MIN_dd2
          real,allocatable,dimension( : , : ) :: NDVI,lat,lon,dd, dd2
          real,allocatable,dimension( : ) :: Point_lat, Point_lon
          allocate(lat(100000,100000), lon(100000,100000), NDVI(100000,100000), &
                   dd(10000,10000), dd2(10000,10000), &
                   Point_lat(10000), Point_lon(10000) )
          
          open(10,file='read_lat.dat',status='old',action='read')
          open(11,file='read_lon.dat',status='old',action='read')
          open(12,file='lat.dat')
          open(13,file='lon.dat')
          
          do i=1,XY_DATA
             read(10,'(f10.4)') read_lat
             read(11,'(f10.3)') read_lon
    
                if(read_lat /= 0.d0) then  ! 빈칸 = 0.0
                if(read_lat < 1.d0) read_lat=read_lat*(10.d0**4.d0) ! 정수는 1 이하로
                write(12,*) read_lat
                endif
    
                if(read_lon /= 0.d0) then
                if(read_lon < 1.d0) read_lon=read_lon*(10.d0**3.d0) 
                write(13,*) read_lon
                end if
          end do
          
          close (10) ; close (11) ; close (12) ; close (13)
          
          open(14,file='NDVI.dat',status='old',action='read')
          open(15,file='lat.dat')
          open(16,file='lon.dat')
          open(17,file='data.dat')
          open(18,file='Mean.dat')
           
    
          do i = 1, X_MAX
             read(14,*) NDVI(i,1:Y_MAX)
          enddo
    
          do i = 1, X_MAX
          do j = 1, Y_MAX
             read(15,*) lat(i,j)
             read(16,*) lon(i,j)
                if(NDVI(i,j) /= NaN) NDVI(i,j) = (NDVI(i,j)*scale_factor) + add_offset
             write(17,*) lat(i,j), lon(i,j), NDVI(i,j)
          end do
          end do
                
          Point_lat = reshape ( (/37.7515, 37.5714, 37.3376, 37.2723, 36.9704, 36.6392, &
                                  36.3720, 36.0326, 36.0053, 35.8782, 35.8408, 35.5601, &
                                  35.1729, 35.1047, 34.8169, 33.2938, 33.3868, 36.7796/), (/18/) )
    
          Point_lon = reshape ( (/128.8910, 126.9658, 127.9466, 126.9853, 127.9527, 127.4407, &
                                  127.3721, 129.3796, 126.7614, 128.6522, 127.1172, 129.3203, &
                                  126.8916, 129.0320, 126.3812, 126.1628, 126.8802, 127.1213/), (/18/) )
    
          ! 강릉(105), 서울(108), 원주(114), 수원(119), 충주(127), 청주(131)
          ! 대전(133), 포항(138), 군산(140), 대구(143), 전주(146), 울산(152)
          ! 광주(156), 부산(159), 목포(165), 고산(185), 성산(188), 천안(232)
    	  do ii = 1, 18
                cc=0 ; cc1=0 ; cc2=0 ; cc3=0 ; cc4=0
           
                do i=1,X_MAX
                do j=1,Y_MAX
                   dd(i,j)=sqrt(((Point_lon(ii)-lon(i,j))**2.d0)+((Point_lat(ii)-lat(i,j))**2.d0))
                end do 
                end do
          
                MIN_dd = minval( dd(1:X_MAX, 1:Y_MAX) )
                                                                         !  EX)   (305,244)   (305,245)   (305,246)
                                                                         !        (306,244)   (306,245)   (306,246)
                                                                         !        (307,244)   (307,245) 
                do i=1,X_MAX
                do j=1,Y_MAX
                   if( MIN_dd == dd(i,j) ) then                          !  EX)   
                         cc = count( NDVI(i-1:i+1, j-1:j+1) /= NaN )     !                    (306,245)   
                         cc1 = count( NDVI(i-1:i, j-1:j) /= NaN )        !        
                         cc2 = count( NDVI(i-1:i, j:j+1) /= NaN )
                         cc3 = count( NDVI(i:i+1, j-1:j) /= NaN )
                         cc4 = count( NDVI(i:i+1, j:j+1) /= NaN )
          
                         do m=i-1,i+1
                         do l=j-1,j+1
                            if(mod(m+l,2)==mod(i+j,2) .and. l/=j) dd2(m,l)=sqrt(((Point_lon(ii)-lon(m,l))**2.d0)+((Point_lat(ii)-lat(m,l))**2.d0))
                         end do
                         end do
          
                         MIN_dd2 = minval( dd2(i-1:i+1, j-1:j+1), mask=dd2(i-1:i+1, j-1:j+1) /= 0.d0)
          
                                                                         !  EX)   (305,244)               (305,246)
                                                                         !                  cc1        cc2        
                                                                         ! 
                                                                         !                  cc3        cc4        
                                                                         !        (307,244)               (307,246)
                         do mm=i-1,i+1                               
                         do ll=j-1,j+1                               
                            if( MIN_dd2 == dd(mm,ll) ) then
    
    !***************************************  TotalSUM(NDVI(i:i+1, j-1:j), mask=NDVI(i:i+1, j-1:j) /= NaN)/real(cc3), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
          
          ! cc4
                if(mm>i-1 .and. ll>j-1) &
                      write(18,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                      i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                      mm, ll, cc4, SUM(NDVI(i:i+1, j:j+1), mask=NDVI(i:i+1, j:j+1) /= NaN)/real(cc4), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
    
    
    !***************  Each ( fort.21, fort.22, fort.23, fort24 )  *************************************
          write(20+ii,*) 'ASOS Obs', Point_lat(ii), Point_lon(ii)
          write(20+ii,*) 'MODIS Obs', lat(i,j), lon(i,j)
    
          ! cc1
                if(mm<i+1 .and. ll<j+1) &
                      write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                      i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                      mm, ll, cc1, SUM(NDVI(i-1:i, j-1:j), mask=NDVI(i-1:i, j-1:j) /= NaN)/real(cc1), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
          
          ! cc2
                if(mm<i+1 .and. ll>j-1) &
                      write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                      i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                      mm, ll, cc2, SUM(NDVI(i-1:i, j:j+1), mask=NDVI(i-1:i, j:j+1) /= NaN)/real(cc2), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
          
          ! cc3
                if(mm>i-1 .and. ll<j+1) &
                      write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                      i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                      mm, ll, cc3, SUM(NDVI(i:i+1, j-1:j), mask=NDVI(i:i+1, j-1:j) /= NaN)/real(cc3), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
          
          ! cc4
                if(mm>i-1 .and. ll>j-1) &
                      write(20+ii,'(2i5,f10.4,3i5,f10.4,i5,f10.4)')  &
                      i, j, SUM(NDVI(i:i, j:j), mask=NDVI(i:i, j:j) /= NaN), &
                      mm, ll, cc4, SUM(NDVI(i:i+1, j:j+1), mask=NDVI(i:i+1, j:j+1) /= NaN)/real(cc4), &
                      cc, SUM(NDVI(i-1:i+1, j-1:j+1), mask=NDVI(i-1:i+1, j-1:j+1) /= NaN )/real(cc)
    !******************************************************************************************************      
    
                           end if
                                                                         
                         end do ! mm
                         end do ! jj
                   end if
                end do  ! i
                end do  ! i
          enddo ! ii
     
          end

     

    [GitHub GIST]

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

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

    • sangho.lee.1990@gmail.com

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

    • saimang0804@gmail.com
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기