grid interpolation 관련 질문

게시판 IDL Q&A grid interpolation 관련 질문

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2757 Reply
      jsh4887
      회원

      안녕하세요

      제가 trigrid 함수를 써서 위 경도가 1도 간격이던 데이터를 0.25도 간격으로 만들었는데요

      제가 특정 위 경도에 대해서 값을 알고 싶습니다.

      예를 들어 경도 129.38 위도 38.44 딱 이 위치에 관한 데이터를 알고 싶은데요..

      trigrid를 쓰려면 0.01간격으로 줄여야하고.. 또 딱 0.01 간격이 아니라 129.845이런식으로 소숫점이 셋째자리까지
      가는 경우도 있거든요..

      혹시 특정 위 경도에 대해 interpolation 한 값만 알 수가 있을까요?

      • 이 게시글은 jsh4887에 의해 8 years, 1 month 전에 수정됐습니다.
    • #2759 Reply
      mukim
      회원

      아마도 다음과 같은 과정을 거치셨을 것으로 예상합니다.

      x = 경도
      y = 위도
      z = 데이터
      TRIANGULATE, x, y, tr, b
      내삽데이터 = TRIGRID(x, y, z, tr,[0.25,0.25])

      그리고 TRIGRID에서는 XOUT, YOUT 키워드를 통해서 특정 지점에 대해서 내삽값을 반환해줍니다.
      가령 [129.38, 38.44]의 위경도에서 값을 얻고 싶으시면 다음과 같이 하시면 됩니다.

      반환데이터 = TRIGRID(x, y, z, tr,XOUT=[129.38,130],YOUT=[38.44,39])
      반환데이터[0] ;; 구하고자 하는 위경도에 대한 내삽값

      다만 위에서 작성한 것과 같이 XOUT, YOUT에 들어가는 값은 적어도 값이 2개 이상이여야 해서,
      하나의 위경도에 대해서 구하실 때는 임의의 값을 넣어주셔야 할 것 같습니다.

    • #2787 Reply
      jsh4887
      회원

      답변 감사합니다~

      근데 또 한가지 문제가 생겨 글을 남기게 되었습니다.

      위와 같이 코드를 짰는데요..

      혹시 trigrid를 쓰면서 데이터 값이 변형될수도 있는건가요?

      그러니깐 원래 1도간격의 데이터가 0.1도로 바뀌면서 1도에 위치한 데이터의 값은 바뀌면 안되는거잖아요..

      근데 제가 짠 코드는 데이터값도 바뀌고.. 심지어 사라지고 nan값이 위치한 곳에 데이터값이 나오기도 합니다..

      lon_cit = float(961)을 가진 데이터구요 나머지 lat_cit와 dtec_cit_div 모두 같은 값을 가지고 있습니다.

      그래서 혹시 nan값을 가지고 있어서 그런가 싶어 계산을 해보았으나.. 갯수만 다르게 나올뿐 값은 모두 똑같이 나오더라구요..

      왜 그런것일까요..

      제가 짠 코드입니다.

      index = where( inside(lon_cit, lat_cit, lonx, laty) eq 0 ) ; 이 영역을 만들어서 영역 안의 포인트들을 제외하고 나머지는 nan을 만들어서 trigrid를 진행하였습니다.

      TRIANGULATE, lon_cit, lat_cit, tr
      grid = trigrid(lon_cit, lat_cit, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50])

      • 이 답변은 jsh4887에 의해 8 years, 1 month 전에 수정됐습니다.
      • 이 답변은 jsh4887에 의해 8 years, 1 month 전에 수정됐습니다.
      • #2792 Reply
        mwkim
        회원

        값의 차이가 어느 정도 인가요?

        일단 제가 확인했을 때는 값의 차이가 유의미하게 나지는 않았습니다.
        (값의 차이가 있기는 하지만 수치적인 계산 상에서 발생하는 정도였습니다. 10E-8 크기의)

        우선 제가 확인에 사용한 코드를 올려드립니다.(하단 참조)
        코드는 해닝함수 자료를 내삽하여 비교하는 코드입니다.
        원자료는 1도 간격으로 작성되었고, 내삽은 0.1도 간격으로 하였습니다.
        질문하신 내용에서 NaN 값의 이야기도 있어서 nanFlag 옵션으로 일정 구역에 NaN값이 나타나도록 하였습니다.

        전체 자료 표출(IMAGE)에서는 내삽 특성상 생기는 차이를 빼고는 괜찮았습니다.
        부분적으로 그래프(PLOT)를 그려보거나 지점값[15,15]을 비교했을 때도 동일하게 나왔습니다.

        그리고 지난번과 같이 일부지점에 대해서 TRIGRID 함수를 쓴 결과도 확인하였습니다.
        (별개의 문제로 TRIGRID 함수의 XOUT, YOUT 값에 따른 영향은 확인되었습니다. reverseCase 옵션)

        혹시 올려드린 코드를 참고하시고 문제가 발생한 코드와 어떤 차이가 있는지 설명해주실 수 있을까요?
        ——————–
        PRO TEST_TRIGRID

        nanFlag = 0 ;; 0: full data, 1: include NaN data
        reverseCase = 1 ;; 0: normal case, 1: reverse case

        lat = [20:50]
        lon = [120:150]
        lat = REBIN(lat,31,31)
        lat = TRANSPOSE(lat)
        lon = REBIN(lon,31,31)
        data = HANNING(31,31)

        IF nanFlag THEN data[4:6,14:16] = !VALUES.F_NAN

        TRIANGULATE, lon, lat, tr
        interpData = TRIGRID(lon,lat,data,tr,[0.1,0.1],[120,20,150,50],XGRID=interpLon,YGRID=interpLat)

        i1 = IMAGE(data,DIMENSIONS=[300,300],MARGIN=0,LAYOUT=[2,1,1])
        i2 = IMAGE(interpData,DIMENSIONS=[300,300],MARGIN=0,LAYOUT=[2,1,2],/CURRENT)

        p1 = PLOT(lon[*,11],data[*,11],’kD-‘,YRANGE=[0,1])
        p2 = PLOT(interpLon[*],interpData[*,110],’b+:’,YRANGE=[0,1],/CURRENT)

        PRINT, ‘origin data[15,15]: ‘, data[15,15]
        PRINT, ‘interpolation data[150,150]: ‘, interpData[150,150]
        PRINT

        PRINT, ‘longitude[15]: ‘, lon[15]
        PRINT, ‘latitude[15]: ‘, lat[15]
        PRINT

        interpPointData = TRIGRID(lon,lat,data,tr,XOUT=[135,125.5],YOUT=[35,25.5])
        IF reverseCase THEN interpPointData = TRIGRID(lon,lat,data,tr,XOUT=[125.5,135],YOUT=[25.5,35])

        PRINT, ‘interpolation point data: ‘, interpPointData[reverseCase,reverseCase]
        PRINT

        PRINT, ‘interpolation data[155,155]: ‘, interpData[55,55]
        PRINT, ‘interpolation point data: ‘, interpPointData[1-reverseCase,1-reverseCase]

        END
        ——————–

    • #2795 Reply
      jsh4887
      회원

      일단 제가 짠 코드을 올려드리겠습니다.

      i = 0
      path = ‘C:\Users\SSL\Desktop\Student\Nick’
      readcol, path+’\CIT data\’+year[i]+’_dTEC_CIT_’+doy[i]+’_’+ut[i]+’UT_before30min_after30min.txt’,$
      format='(f,f,f)’,lon_cit,lat_cit,dtec_cit, /silent, skipline=1

      위와 같이 readcol을 통해 data를 불러왔구요..
      data형식은
      lon_cit lat_cit dtec_cit
      120 20 0.1
      120 21 0.5
      120 22 0.3

      이런식으로 해서 961개의 값들로 이루어진 data입니다.
      lat = indgen(301)/float(10) + float(20)
      lon = indgen(301)/float(10) + float(120)

      lonx = [128,138,140,146,142,130,128]
      laty = [34,38,46,44,35,31,34]

      lat_interpol = fltarr(float(301)*float(301))
      lon_interpol = fltarr(float(301)*float(301))

      for ii = 0, 300 do begin
      for jj =0, 300 do begin
      lon_interpol[float(301)*ii+jj] = 120 + 0.1* ii
      lat_interpol[float(301)*ii+jj] = 20 + 0.1* jj
      endfor
      endfor

      index = where( inside(lon_cit, lat_cit, lonx, laty) eq 0 )

      dtec_cit_div = dtec_cit/10
      dtec_cit_div[index] = !Values.F_nan

      TRIANGULATE, lon_cit, lat_cit, tr
      grid = trigrid(lon_cit, lat_cit, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50])

      new_data = fltarr(3,float(301)*float(301))
      new_data[0,*] = lon_interpol
      new_data[1,*] = lat_interpol
      new_data[2,*] = grid

      end

      위와 같이 코드를 짯는데요.. 저는 data값이 많이 다르게 나옵니다.
      현재 다르게 보이는 점은 저는 1차원 배열을 썻을뿐이고.. 작성해주신분은 2차원배열을 썻다는 것밖에 다른점을 못느끼겠습니다.. 혹시 제가 코드를 잘못짠것인가요..?

    • #2800 Reply
      jsh4887
      회원

      제가 실험을 좀 해봤는데요..

      저기 index를 안쓰니깐 값이 똑같이 나오더라구요..

      즉.. 제가 임의로 정해놓은 지역 내에서만 interpolation을 하고 싶었는데..

      그래서 그 지역을 지정하기 위해 inside란 함수를 썼는데 저 함수를 안쓰고 trigrid를 쓰니 값이 똑같이 나오더라구요..

      저게 961개의 1차원 배열에서 inside를 쓸 경우 나머지는 nan이 되고 96개정도만 남아서 혹시 data가 너무 적어서 interpolation 되는 과정에서 값이 변한게 아닌가 싶은데요..

      제가 하는 방법이 틀린건가요.. 아님 코드가 틀린건가요..

      • #2801 Reply
        mwkim
        회원

        올려주신 내용을 확인했습니다.
        우선 INSIDE 함수는 Coyote 라이브러리를 사용하셨을 것으로 예상하여 해당 함수를 사용하였습니다.

        확인 결과 값의 차이는 잘 모르겠으나 일부 영역에서 NaN 값이 나오는 것은 확인하였습니다.
        이 부분은 아마도 내삽을 할 때 NaN 값의 영향을 많이 받는 부분은 전부 NaN 값으로 계산되는 것이 아닐까 추측합니다.
        그래서 일부 영역은 값이 있었으나 주위의 NaN 값의 영향을 받아서 NaN 값으로 나온 것 같습니다.

        해결 방법은 아니지만, 다른 방법을 제안하자면 아래와 같습니다.
        작성하신 것과는 반대로 영역 내의 자료만 추출하여 내삽을 진행하는 방법을 사용하였습니다.
        다만 이렇게 하면 외삽 부분이 발생하기 때문에, 다시 영역을 잘라 주어야 하며,
        값의 일부는 외삽값이 됩니다.

        지난 번과 마찬가지로 flag 옵션을 통해 살펴보시면 될 것 같습니다.
        장단점을 살펴보자면, flag = 0 일 때는 NaN 값의 영향을 받는 모든 영역이 NaN이 됩니다(실제로 값이 있던 격자도). 하지만 값의 왜곡은 없어 보입니다.
        flag = 1 일 때는 추출하고자 하는 영역에 대한 값을 구할 수 있습니다. 하지만 외삽된 값이 사용됩니다.

        다만 값이 차이나는 경우는 저도 확인은 못해봤습니다(자료의 영향이 있을 수도 있을 것 같습니다.)

        =============================================

        PRO TEST_TRIGRID2

        flag = 0

        lat = [20:50:1]
        lon = [120:150:1]

        lonx = [128,138,140,146,142,130,128]
        laty = [34,38,46,44,35,31,34]

        lat_interpol = TRANSPOSE(REBIN(lat,31,31))
        lon_interpol = REBIN(lon,31,31)

        lat_cit = REFORM(lat_interpol,31*31)
        lon_cit = REFORM(lon_interpol,31*31)

        dtec_cit = HANNING(31,31)

        IF flag EQ 0 THEN BEGIN
        index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 0 )
        dtec_cit_div = dtec_cit
        dtec_cit_div[index] = !VALUES.F_NAN
        ENDIF ELSE BEGIN
        index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 1 )
        dtec_cit_div = dtec_cit[index]
        lon_cit_div = lon_cit[index]
        lat_cit_div = lat_cit[index]
        ENDELSE

        IF flag EQ 0 THEN BEGIN
        TRIANGULATE, lon_cit, lat_cit, tr
        grid = TRIGRID(lon_cit, lat_cit, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50],XGRID=xgrid,YGRID=ygrid)
        ENDIF ELSE BEGIN
        TRIANGULATE, lon_cit_div, lat_cit_div, tr
        grid = TRIGRID(lon_cit_div, lat_cit_div, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50],XGRID=xgrid,YGRID=ygrid,MISSING = !VALUES.F_NAN)
        xgrid_interpol= REFORM(REBIN(xgrid,301,301),301L*301L)
        ygrid_interpol= REFORM(TRANSPOSE(REBIN(ygrid,301,301)),301L*301L)
        index = WHERE(INSIDE(xgrid_interpol, ygrid_interpol, lonx, laty) EQ 0)
        grid[index] = !VALUES.F_NAN
        ENDELSE

        index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 1)
        gridSample = grid[0:300:10,*]
        gridSample = gridSample[*,0:300:10]
        gridSample = gridSample[index]
        dataSample = dtec_cit[index]

        diff = ABS(gridSample – dataSample)
        PRINT, ‘Maximum different: ‘, MAX(diff[WHERE(FINITE(diff) EQ 1)])

        i1 = IMAGE(dtec_cit,lon,lat,LAYOUT=[2,1,1],MIN_VALUE = 0,MAX_VALUE = 1,TITLE = ‘Origin’)
        p1 = POLYLINE(lonx,laty,’r’,TARGET=i1,/DATA)
        i2 = IMAGE(grid,xgrid,ygrid,LAYOUT=[2,1,2],MIN_VALUE = 0,MAX_VALUE = 1,TITLE = ‘Interpolation’,/CURRENT)

        END

        • 이 답변은 mwkim에 의해 8 years, 1 month 전에 수정됐습니다.
        • 이 답변은 mwkim에 의해 8 years, 1 month 전에 수정됐습니다.
4 답변 글타래를 보이고 있습니다
'grid interpolation 관련 질문'에 답변달기
글쓴이 정보: