C언어 고수님들 좀 도와주세요.~~

기타질문 왕초보탈출기~~ 2018.03.23 22:38

다름이 아니오라 제가 대학원을 다니고 있는데... 이번에 논문을 쓰게됐습니다.

 

근데 C언어를 이용하여 이진파일(bin)을 아스키 파일로 변환을 해야하는데

 

컴퓨터 프로그램을 아예 할줄을 모릅니다.

 

교수님께서 어디서 구해오셨는지 예제하나 툭 던져주고 가셨는데 전 해봐도 안되네요

 

고수님들 코딩 소스 보시고 어디가 잘못된것이 있는지 알려주세요.

 

이진파일 같이 올립니다.

 

4장 합성자료 

4.1 CAPPI(1.5km)합성자료 

4.1.1 파일명 : c1cm_년월일시분.bin.gz 

4.1.2 자료구조 

o 960 * 1200 * 1bytes(1km격자

o echo : 0 ~ 100(dBz) 

o 관측반경 밖 : -128 

o no echo : -127 4.1.3 지도 좌표 형식 

o 지도형식 : Lambert conformal conic projection 

o 격자간격 : 1km 

o 표준위도 : 30~60 

o 기준점위경도 : 126/38 

o 기준점X,Y좌표: 400/789 

4.1.4 자료변환 예시 

o 합성 이진자료를 텍스트로 변 

#include <string.h> 

#include <stdlib.h> 

#include <stdio.h>

#include <math.h> 

#include <zlib.h> 

#include <zconf.h> 

#include "../gis/map_ini.h" 

#define  XDIM  960 

#define  YDIM  1200 char DATA[YDIM][XDIM];

 

int main(int argc, char *argv[])

{

  FILE  *fp1;

  int i, j, k;

  float  x2, y2;

  float  alon, alat;

  struct lamc_parameter map;  float dbz, z, rain;

 

   map.Re   = 6370.19584; // 사용할 지구반경 [ km ]

   map.grid  = 1.0;         // 격자간격        [ km ]

   map.slat1 = 30.0;        // 표준위도        [degree]

   map.slat2 = 60.0;        // 표준위도        [degree]

   map.olat  = 38.0;   // 기준점의 경도   [degree]

   map.olon  = 126.0;      // 기준점의 위도   [degree]

   map.xo   = 400;   // 기준점의 X좌표  [격자거리]

   map.yo   = 789;   // 기준점의 Y좌표  [격자거리]

   map.first = 0;           // 시작여부 (0 = 시작 

 

  fp1 = gzopen(argv[1],"rb");

  gzread(fp1, &DATA, sizeof(DATA))

  for (j=1;j<YDIM;j+=25)

  {

     for (i=0;i<XDIM;i+=30)

     {

if(DATA[YDIM-j][i] == -127)

     {

printf(" . "); 

     }

else if(DATA[YDIM-j][i] == -128) 

     { 

printf(" - "); 

     } 

else 

     { 

printf(" %2d",DATA[YDIM-j][i]); 

     }     

}     

printf("\n");

 }  gzclose(fp1);

  //해당 위경도의 레이더 값 표출

  alon=atof(argv[2]); //aws_lon;

  alat=atof(argv[3]); //aws_lat;

  lamcproj(&alon, &alat, &x2, &y2, 0, map);

  printf("Lon = %7.4f Lat = %7.4f \n",alon, alat);

 

 if (DATA[(int)y2][(int)x2] >0 &&DATA[(int)y2][(int)x2] <100 )

  {

  printf("[%03d][%03d] = %d dBz \n",(int)y2,(int)x2, DATA[(int)y2][(int)x2]);

  dbz = (float)DATA[(int)y2][(int)x2];  z = pow(10.0, dbz/10.0);  

  rain = pow(z/200.0, 1.0/1.6);

 

  printf("[%03d][%03d] = %5.2f mm/hr \n",(int)y2, (int)x2, rain);

  }  

else  

 {

  printf("No echo or Vad vaild \n");

  } 

 

}

결과물은 이렇게 나와야 한다고 합니다.

결과.gif

 

첨부

답변등록

현재 답변들 1
장진혁 2018.03.26 18:47

구글에서 "기상청 대학생 캠프 강의자료" 로 검색하면 나오는 pdf 에 있는 코드네요

 

http://korus.kma.go.kr/comm/download_cnt/?no=81&path=bbs&filename=RadarUserGuide.pdf&ofilename=1445842667.pdf

 

필요한 RSL 라이브러리 가 설치되어야 하는데 pdf 내에서도 잘 설명되어 있진 않네요

 

주변분들한테 도움 받으시는게 낫겠습니다.