게시판 답변이 생성됐습니다
-
글쓴이글
-
코드 내에서 잘못된 점은 fix나 float등이 배열들의 개별값을 변환하는 함수라는 점입니다.
nbyte= fix(data[offset+4L:offset+7L]) & print, ‘nbyte:’, nbyte
에서 출력이
nbyte: 44 0 0 0
라고 되는데요.
보시면 data라는 byte array의 data[offset+4L:offset+7L]의 결과가 배열이 됩니다.따라서 nbyte를 포함한 fix,float로 변환하는 변수들을 help로 확인하면
<Expression> INT = Array[4]
등으로 출력이 됩니다. (fix를 이용했으면 int, float를 이용하면 float)단 string은 byte를 char로 판단하기 때문에 byte array를 넣으면 정상적으로 출력됩니다. 따라서 id는 제대로 출력이 된 것이지요.
참고로 byte array로 출력된 데이터를 다른형으로 맞춰서 변환하는 것이 힘들기 때문에 처음 파일을 읽을 때 데이터형에 따라서
char형은 bytarr(4) [예)id = bytarr(4)]
integer4형은 IDL의 long [예) nbyte=0L]
integer2형은 IDL의 int
float4형은 IDL의 float와 같이 변수를 우선 생성하고,
openr,1,fp+file
로 파일을 열어서
readu,id,nbyte,sweep_num …
식으로 파일을 읽으면 될 것 같습니다.
1행과 2행을 문자로 만들어서 비교하는 것은 문제가 없어 보입니다.
strmatch를 이용하셔서 어떤 문제가 발생하는지 모르겠지만, 1행과 2행을 비교하실 때 각 행을 tmp = strtrim(str,2) 를 통해서 양쪽의 공백을 지워주시고 if 1행 eq 2행 then begin을 통해서 비교 진행을 하는 것이 더 좋을 것 같습니다. if문이 string도 비교해주기 때문에 양쪽의 공백만 제거해 주시면 제대로 작동할 것입니다.해당 에러코드는 netcdf에서 주어지는 에러가 아니기 때문에 해결하는 데 더 자세한 정보가 필요합니다.
우선 경로를 문자열에서 추출하고( tmp = str[i] ) 이것을 통해서 ncdf_open을 시도해보세요.( ncdf_id = ncdf_open(tmp[0]) )
지금까지 확인한 내용으로는 해결되었다고 하는 유일한 방법이었습니다. 그래도 안되시면, 해당 코드를 올려주시면 코드를 확인하고 해결방안을 찾아드리도록 하겠습니다.
실제로 데이터가 잘려서 나온게 아니라 포맷의 문제인 것 같습니다.
아래쪽에 Julan day관련된 질문과 연관되어 보여서 링크 추가했습니다.
http://idl.selab.re.kr/?topic=julian-day-%EA%B4%80%EB%A0%A8-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4- 이 답변은 JongHyeon에 의해 10 years, 7 months 전에 수정됐습니다.
if 조건 then return
하시면 됩니다.
프로시저일때는 return이 값을 반환하지 않고 종료합니다.
링크를 보시면 자세하게 보실 수 있습니다.
우선 HDF5포맷에 대해서는 IDL에서 F1을 하신다음 도움말에서 HDF5를 검색하시면 설명이 나옵니다.
여러개의 파일을 읽는다는 것은 파일을 열고 읽고 닫는 일련의 작업을 파일의 갯수만큼 반복한다는 것인데, 여러 파일을 동시에 찾는 작업은 http://idl.selab.re.kr/?p=668 를 보시면 아실 수 있을 겁니다.
levels는 직접 contour의 등고선을 지정하는 것입니다. nlevel은 동일한 크기로만 등고선을 자르는데 비해 levels는 등고선의 선을 자신이 원하는 형식으로 설정할 수 있다는 차이가 있습니다. 컬러테이블의 색은 자동으로 레벨에 맞추어 나누어주는 것 같습니다.
컬러바에서 ncolors를 100으로 지정해주실 때 전체 컬러테이블의 크기만큼 되기를 원하신다면, loadct,39,ncolor=100으로 하셔서 작업을 하시면 contour와 동일한 모양의 컬러바가 지정이 될 것입니다.
컬러바에 들어가는 숫자의 포맷은 FORMAT 키워드로 조정이 가능합니다. 10의 지수승 즉 1.000e+003같은 형태로 받는 방법은 FORMAT='(e7.3)’으로 해주시면 됩니다.
파일의 정보를 읽는 것은 result=FILE_INFO(파일명) 으로 가능합니다.
result는 구조체로 들어오며, result.atime은 마지막으로 접근한(파일을 이용한) 날짜이며, result.ctime은 파일의 상태가 변화된 날짜(생성일), result.mtime은 마지막으로 수정된 날짜를 UTC기준에 맞춰서 초단위로 저장하게 됩니다.
추가적으로 이것을 날짜의 문자열로 바꾸는 것은
day=systime(0,result.ctime,/utc)
으로 변경이 가능합니다.
chi square root값을 찾고 싶으시면,
result = LINFIT(X, Y,chisqr=k)
로 하시면 됩니다. k에 값이 들어가게됩니다.
자세한 설명은 IDL 도움말을 이용하시는 것이 좋을 듯 싶습니다.
우선 첫번째의 해결은 원본 지도를 그린 후 알래스카 지도를 표현할 때
map_set,/CYLINDRICAL,limit=[50,190,75,230], color=0,POSITION=[0.1, 0.7, 0.2, 0.8],/noerase를 이용하시면 됩니다. 단 지도에 표시할 것이 있다고 하셨으니, 원본지도에 우선 데이터 표출을 완료한 다음에 덧씌우는 것이 좋을 것 같습니다.position같은 경우 임의로 해놨는데 원하시는 위치에 넣으시면 될 것입니다.
또한 경도의 문제 같은 경우 주어진 경도의 배열의 이름을 바꾸는 방식이 가능합니다.
MAP_GRID, COLOR=100, BOX_AXES=0.1,lons=[-150,-130,-110,-90,-70,-50],lonname=[210,230,250,270,290,310]
위와 같이 바꿀 경도의 배열과 변환된 배열을 입력하시면 결과가 나올 것입니다.
IDLgrWindow::SetCurrentCursor 라는 프로시저가 질문하신 내용에 맞는 함수인 것 같습니다.
Obj->[IDLgrWindow::]SetCurrentCursor [, CursorName] [, IMAGE=16 x 16 bitmap] [, MASK=16 x 16 bitmap] [, HOTSPOT=[x, y]]
식으로 이용이 가능하고 cursorname을 넣으면 제공하는 커서모양이 가능한 것 같고 image 키워드를 통해서 커서 이미지도 직접 넣는 것이 가능한 듯 싶습니다.
cursorname에 쓰이는 것들은 ARROW CROSSHAIR ICON IBEAM MOVE ORIGINAL SIZE_NE SIZE_NW SIZE_SE SIZE_SW SIZE_NS SIZE_EW UP_ARROW 가 있으며 REGISTER_CURSOR 를 통해서 커서 모양을 추가할 수 있습니다.
적당한 함수는 찾지 못했습니다만, 데이터의 양이 절망스럽게 많지 않고 적당한 오차범위에서 contour가 그려진다면 다음과 같은 방법은 가능할 것 같습니다.
a에서 b를 지나는 직선의 x값과 y값을 x1,y1로 하여 배열을 만들고(이때 시작은 a점으로 하면 좋습니다) contour의 x값과 y값을 x2,y2의 배열로 존재한다면 다음과 같은 방법도 가능합니다.
(만약 4개의 배열이 다 1000개의 값을 가진다면)
z1=fltarr(1000,1000)
z2=fltarr(1000,1000)
for i=0,999 do for j=0,999 z1[i,j]=abs(x1[i]-x2[j])
for i=0,999 do for j=0,999 z2[i,j]=abs(y1[i]-y2[j])
sumz=sqrt(z1^2+z2^2)
result=min(sumz,tmp)
where=tmp MOD 1000print,x1[where],y1[where]
이렇게 하시면, c의 근사값은 구할 수 있을 것이라 생각합니다.
-
글쓴이글