ChoiYoun

게시판 답변이 생성됐습니다

15 글 보임 - 1 에서 15 까지 (총 39 중에서)
  • 글쓴이
  • 답변: for 반복문 내의 여러 변수 저장 #5660
    ChoiYoun
    회원

    질문자님 답변으로 미루어보았을 때 제작한 프로그램이 정상적으로 작동하고 “종료”되어 변수공간에 아무 변수도 남지 않는 것이 아닐까란 생각을 해보았습니다.

    프로그램에서 생산한 변수를 확인하기 위해서는 프로그램이 종료되기 전에 멈추는 과정이 필요합니다. 아래와 같이 코드를 변경하고 실행한 후 변수공간을 확인해보시면 변수가 생성되어있을 것 같습니다.

    PRO test
    FOR i=1,40 DO BEGIN
    rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
    result=execute(rtf)
    ENDFOR
    STOP
    END

    • 이 답변은 ChoiYoun에 의해 2 years, 8 months 전에 수정됐습니다.
    답변: for 반복문 내의 여러 변수 저장 #5655
    ChoiYoun
    회원

    프로그램에서 별다른 문제는 보이지 않습니다. 실행했을 때 출력되는 오류 메세지는 없을까요.

    ps. rtf 변수를 아래와 같이 수정하면 IF문이 필요없습니다.
    rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(“190910_’+STRING(i,format='(I0)’)+’+tif”)’

    답변: shape파일을 이용한 Mask 방법 문의 #5653
    ChoiYoun
    회원

    개인적으로 관심이 있어서 프로그램을 만들어보았습니다. 우리나라 군/구 단위(229개)를 Masking 하는 프로그램입니다. 격자 크기와 투영법은 임의로 가정하였습니다.

    시동에 필요한 자료는 아래 링크에서 다운로드 받을 수 있습다.
    다운로드(3.1M)

    답변: shape파일을 이용한 Mask 방법 문의 #5647
    ChoiYoun
    회원

    또다른 방식은 아래와 같은 방법을 생각해보았습니다.

    1) Shape파일의 경계 위경도를 격자 형태로 변환 (lon., lat.) -> (x, y)
    : Map 함수의 MapForward 매서드와 POLYLINE 키워드를 함께 사용하면 수월할 것 같습니다.

    2) 격자 형태의 경계 정보와 POLYFILLV 함수를 이용하여 시도 구분 Masking
    : POLYFILLV은 경계 내의 격자를 위치(index)를 출력해주는 함수입니다. 상세한 사용방법은 도움말을 참조하시면 될 것 같습니다.

    답변: shape파일을 이용한 Mask 방법 문의 #5645
    ChoiYoun
    회원

    저도 말씀하신 시/도를 구분하여 격자화된 자료에 Masking 하는 방법에 대해 고민하다가 다른 프로그램에서 해결하는 방식을 참조하여 시도해본 적이 있습니다. 그러나 저의 실력이 부족하여 개념만 있을 뿐 IDL로 해결하지는 못하였습니다. 개념은 아래와 같습니다.

    1) Polygon으로 시/도 경계 그림을 그린다. 이때, “그림 영역의 크기”는 “격자 자료의 크기”와 동일하다. (시/도에 따른 색상을 다르게, 색상을 채워서)
    2) 그림을 저장하여 IMAGE로 불러서 해당 격자의 색상코드를 이용해 Masking 한다.

    제가 위 개념에서 막혔던 부분은 Polygon으로 시/도 경계 그림을 그릴 때,

    “그림 영역의 크기”와 “격자 자료의 크기”를 동일하게 만드는 방법을 찾지 못하였습니다.

    이에 대해 좋은 혜안이 있으시다면 의견주시면 감사하겠습니다.

    답변: open file error시 skip하는 방법 #5624
    ChoiYoun
    회원

    읽기 전에 아래 구문을 추가해보시기 바랍니다.

    if not FILE_TEST(ifile) then continue

    답변: time array에서 데이터 nan 채우기 #5621
    ChoiYoun
    회원

    성능향상을 위해 이중반복문과 다중조건문을 제거하였습니다.

    1)이중반복문 제거: yy-mm-dd hh:minu 정보를 JULDAY를 이용해 배열형태로 변경(DataDates)
    2)다중조건문 제거: WHERE을 사용해 다중조건문 제거

    아래 코드를 참조하시면 되겠습니다.

    DataDates = JULDAY(dd,mm,yy,hh,minu)
    FOR i = 0l, n_elements(yy)-1 DO BEGIN
    wh = WHERE(MyDates EQ DataDates[i], /L64)
    IF SIZE(wh, /DIMENSIONS) EQ 1 THEN BEGIN
    data[wh,0] = var1[i]
    data[wh,1] = var2[i]
    ENDIF
    ENDFOR

    답변: grib 자료 읽기 #5603
    ChoiYoun
    회원

    다시 한번 답변 감사합니다. 우선 grib 자료를 다른 언어를 이용하여 읽을 수 있는 형태(바이너리 등)로 바꿔서 프로젝트를 진행 중입니다. 제 IDL 프로그램은 다음 버전에서 업데이트하도록 하겠습니다.

    답변: grib 자료 읽기 #5578
    ChoiYoun
    회원

    빠른 답변 감사합니다. 해당 파일은 다른 언어를 이용해 읽고 사용하는 것이 가능합니다(예: Fortran). 다만 제가 다른 언어에 능숙하지 않아서 어떠한 방식으로 읽는지는 명확하지 않습니다.

    • 이 답변은 ChoiYoun에 의해 3 years, 1 month 전에 수정됐습니다.
    답변: 벡터 범례 문의(2) #5494
    ChoiYoun
    회원

    답변 감사합니다.

    말씀해주신 것처럼 문제의 원인은 MAP에 벡터가 모두 나오지 않을 경우 발생하는 문제였습니다.
    (이는 본 프로그램에도 적용하여 확인)

    하여 아래와 같은 과정을 거쳐 벡터의 XY지점을 MAP 범위와 동일하게 만들어 해결하였습니다.

    ;Make anisotropic(x, y)
    sb = 32 &wb = 123 &nb = 41 &eb = 132
    xx_1d = FLTARR(10, 10)
    yy_1d = FLTARR(10, 10)
    fix_seed = 1
    for iy = 0, 9 do xx_1d[*, iy] = wb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    for ix = 0, 9 do yy_1d[ix, *] = sb + FINDGEN(10) + 0.1 * RANDOMN(fix_seed, 10)
    xx_1d = REFORM(xx_1d, 100)
    yy_1d = REFORM(yy_1d, 100)

    ;Select limited area
    wh_xx = WHERE(xx_1d gt wb and xx_1d lt eb)
    wh_yy = WHERE(yy_1d gt sb and yy_1d lt nb)
    match, wh_xx, wh_yy, sub_xx, sub_yy ;Need astron library
    wh_limit = wh_xx[sub_xx]
    xx_limit = xx_1d[wh_limit]
    yy_limit = yy_1d[wh_limit]

    ;Map set
    fix_seed2 = 2
    m = MAP(‘Geographic’, LIMIT = [sb,wb,nb,eb], $
    ASPECT_RATIO = 0, CENTER_LONGITUDE = 128, BUFFER = 1)
    mc_ = MAPCONTINENTS()

    FOR i = 0, 9 DO BEGIN
    uu = 10*RANDOMN(fix_seed2, 10, 10)
    vv = 10*RANDOMN(fix_seed2, 10, 10)
    uu_1d = REFORM(uu, 100)
    vv_1d = REFORM(vv, 100)

    uu_limit = uu_1d[wh_limit]
    vv_limit = vv_1d[wh_limit]

    spd = SQRT(uu_limit^2+vv_limit^2)
    scl = MAX(spd)/60.*3
    v = VECTOR(uu_limit, vv_limit, xx_limit, yy_limit, MIN_VALUE=0, MAX_VALUE=60, $
    LENGTH_SCALE=scl, HEAD_SIZE=scl/2, /OVERPLOT)

    v_legend = LEGEND(TARGET=v, SAMPLE_MAGNITUDE=10, UNITS=’$m s^{-1}$’)
    v_legend.POSITION = [0.95, 0.975]

    v.Save, ‘./OUTPUT/’ + STRING(STRING(i), FORMAT = ‘(I0)’) + ‘_21.png’
    IF i NE 9 THEN v.delete
    ENDFOR

    정말 많은 도움이 되었습니다. 다시 한번 감사드립니다.

    답변: 벡터 범례 문의 #5470
    ChoiYoun
    회원

    감사합니다. 덕분에 많은 문제가 해결되었습니다.

    LEGEND의 POSITION이 계속 움직이는 문제는 POSITION 키워드를 나중에 주는 것으로 해결하였습니다.

    v_legend = LEGEND(TARGET=v, SAMPLE_MAGNITUDE=10, UNITS=’$m s^{-1}$’)
    v_legend.POSITION = [0.95, 0.975]

    • 이 답변은 ChoiYoun에 의해 3 years, 4 months 전에 수정됐습니다.
    답변: 벡터 범례 문의 #5467
    ChoiYoun
    회원

    답변 감사합니다. 말씀하신대로 WINDOW 함수를 사용해 동일한 그래픽 창에 벡터와 범례를 겹쳐 그렸을 때, LEGEND가 동일하게 나오는 것처럼 보였습니다. 그런데 동일한 프로그램을 열번 정도 실행하면 두어번 이상 범례가 어긋나는 경우가 발생합니다.

    그래서 원인을 찾고자 아래와 같이 벡터의 최댓값, 최솟값, 평균값을 출력하였으나, 어긋나는 경우에 특별한 값을 보이진 않았습니다(spd 변수의 최댓값과 최솟값은 동일).

    w = WINDOW()
    for i = 0, 9 do begin
    uu = 10. * RANDOMN(seed, 10, 10)
    vv = 10. * RANDOMN(seed, 10, 10)
    uu[0] = 40 &uu[-1] = 0.01
    vv[0] = 40 &vv[-1] = 0.01
    spd = SQRT(uu ^ 2. + vv ^ 2.)
    v = VECTOR(uu, vv, MIN_VALUE = 0, MAX_VALUE = 60, /CURRENT)
    v_legend = LEGEND(TARGET = v, SAMPLE_MAGNITUDE = 10, UNITS=’$m s^{-1}$’, POSITION = [0.95, 0.975])
    print, MIN(spd), MAX(spd), MEAN(spd), v_legend.position
    wait, 3
    endfor

    • 이 답변은 ChoiYoun에 의해 3 years, 4 months 전에 수정됐습니다.
    답변: 지도 위에 벡터 표출하기 #5463
    ChoiYoun
    회원

    친절한 설명 감사합니다. 1차원으로 변경할 생각을 못했네요. 항상 배워갑니다.

    답변: map 위경도 추출 #5444
    ChoiYoun
    회원

    질문자님 말씀을 토대로 추측하였을 때 가지고 있는 정보는 “위경도 정보”가 아니라 투영법을 거친 “직교좌표계 정보”라는 말씀인 것 같습니다. 투영법을 거친 위경도 정보는 (x,y)형태의 “직교좌표계 정보”입니다.

    <예시>
    위경도 정보: (126.0, 37.0), (127.0, 38.0)
    직교좌표계 정보: (0, 0), (1, 0)

    물론 투영법을 거친 (x, y)가 위경도를 의미하긴 하지만 이는 투영법을 알고 있을 때 위경도가 됩니다. 이것이 무슨 차이를 가지고 있는지 아래 예시 코드가 도움이 되셨으면 합니다.

    다음과 같이 3가지 투영법이 있습니다(m1, m2, m3). 그리고 위경도 정보를 lon_arr, lat_arr와 같이 가지고 있을 때, 각 투영법을 적용하여 표출하는 방법은 c1, c2, c3와 같습니다.

    data_arr = ;SOMETHING
    lat_arr = ;SOMETHING[deg.] ex: lon_arr[0]=128.0
    lon_arr = ;SOMETHING[deg.] ex: lat_arr[0]=37.0

    m1 = MAP(‘Geographic’, CENTER_LONGITUDE = 127)
    m2 = MAP(‘Lambert Conformal Conic’, $
    STANDARD_PAR1 = 30, STANDARD_PAR2 = 60, $
    CENTER_LONGITUDE = 126, CENTER_LATITUDE = 38)
    m3 = MAP(‘Miller Cylindrical’, $
    CENTER_LONGITUDE = 127, FALSE_EASTING=2546731.496d, FALSE_NORTHING=-4354009.816d)

    c1 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m1)
    c2 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m2)
    c3 = CONTOUR(data_arr, lon_arr, lat_arr, GRID_UNITS=’Degrees’, OVERPLOT = m3)

    즉, 위경도 정보를 알고 있으면 투영법만 바꿔주면 알아서 표출해줍니다.
    반면에 직교좌표계 정보를 알고 있을 경우 투영법을 이용해 “위경도 정보”로 바꿔주는 과정이 필요합니다. 이와 관련된 상세한 내용은 아래 이상우 박사님 블로그의 “MapForward, MapInverse 메서드의 이해와 활용”을 참조하시면 좋을 것 같습니다.

    http://blog.daum.net/swrush

    질문자님이 사용하는 MODIS가 어떤 형식인지 알 수 없으나, 투영법을 거치지 않은 위경도 자료일 경우 투영법만 변경하여 표출하시면 됩니다.

    답변: map 위경도 추출 #5424
    ChoiYoun
    회원

    안녕하세요. 짧은 지식이지만 도움이 되실까하여 답변 답니다.

    Q1. 보통 MAP_SET 으로 어떤 지도를 쓸것인지 정하고 CONTOUR 하잖아요?
    A1. 맞습니다.

    Q2. 우리가 위도,경도,값이 있다면 MAP_SET에서 설정한 map projection의 위경도에 맞게 값을 대입해서 표출하게되는데 이때 map projection의 위경도를 추출할 수 있는 방법이 있나요?
    A2. 질문에 틀린 내용이 있습니다. 지도 투영법(map projection)은 위경도 값을 변경하는 방법이 아닙니다. 투영법은 지리 좌표계(Geographic coordinate system)를 직교 좌표계로 변경하는 방법입니다. 즉, (위도,경도)를 (x, y)로 바꾸는 방법입니다. 따라서 표출한 그림의 위경도는 투영법의 종류와 무관합니다.

    Q3. 어떤 자료를 /isotropic으로 표출할 때 그 isotropic의 위경도 값을 알고싶습니다
    Q3. /isotropic은 투영법이 아닌 표출하는 그림의 x축과 y축의 스케일을 동일하게 만들어줄 때 사용하는 키워드입니다. 또한, isotropic 키워드를 추가한다하여 표출한 그림의 위경도가 달라지지 않습니다.

    C1. 질문자께서 (위도, 경도)에서 투영법을 거친 (x, y)가 궁금한 상황이라면 MAP_PROJ_TOWARD, MAP_PROJ_BACKWARD 함수를 공부해보시기 바랍니다. 그러나 이러한 함수는 본인이 사용하는 투영법에 대한 이해가 우선입니다.

    • 이 답변은 ChoiYoun에 의해 3 years, 6 months 전에 수정됐습니다.
    • 이 답변은 ChoiYoun에 의해 3 years, 6 months 전에 수정됐습니다.
15 글 보임 - 1 에서 15 까지 (총 39 중에서)