/* kcomp.c reads klein '.dat' files and makes the '.phd' files then '.bhd' files. */ #include #include "getfile.c" #include #define DP100M 0.0009009 #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define DEG_M 111120 /* converts degrees to meters -- 60 nmiles */ #define FILE_HEADER 5120 #define HEADER 32 #define DATA 404 #define TRAILER 4 #define NUMPTS 300 #define MAXHDR 300 #define PIXSIZE 0.5 int PrintAll=0; int NumAvg=100,NumHdg=90; /* + or - points */ union intflo { long lnum; float fnum; }; struct r_header { double lat,lon,time; unsigned char mo,da,yr,hr,min,sec,tsec; int pass_num,line_num,course,prp,corr_alt,uncorr_alt,rec_size; int status; }Hdr[MAXHDR]; double nlat[NUMPTS],nlon[NUMPTS]; struct r_header dat[NUMPTS]; unsigned char Buffer[1024],DBuff[1024]; struct br_header { double lat,lon; float heading,px,py; char mo,da,yr,hr,min,sec,tsec,status; }B; struct b_header { double maxlat,minlat,maxlon,minlon; double pixsize; long row,col,file_hdr,line_hdr,line_data,line_tlr; int mean,min,perc10,perc25,median,perc75,perc90,max; /* pixel values */ int numavg,numhdg; char space[96]; /* space for future expansion */ }C; double Hist[256]; FILE *FpHdr; double MaxLat,MinLat,MaxLon,MinLon,Row,Col; main(argc,argv) int argc; char *argv[]; { int i,i1,j,k; int numfiles; int firstfile=0,lastfile; char ans; if(argc>1) for(i=1;i1) sscanf(argv[1],"%d",&firstfile); do { printf("\n\n 1 -- make lat lon ASCI file\n"); printf(" 2 -- make header files\n"); printf(" 3 -- list '.dat' files\n"); ans=getch(); if(ans=='1') { numfiles=load_names("kln*.dat"); lastfile=numfiles-1; sort_name(numfiles); if(argc>2) for(i=1;i2) for(i=1;i0) { if(getch()==27) { fclose(fpout); fpout=fopen(string,"wt"); exit(0); } } fread((char *)dbuff,sizeof(char),HEADER,fp); fread((char *)DBuff,sizeof(char),DATA+TRAILER,fp); decode_hdr(dbuff,&Hdr[0]); if(i==0) { for(j=0;j1.0) { for(k=1;k=row) { printf("Bad data at end of file. File truncated.\n"); fclose(fpout); return(-2); } fread((char *)dbuff,sizeof(char),HEADER,fp); fread((char *)DBuff,sizeof(char),DATA+TRAILER,fp); decode_hdr(dbuff,&Hdr[k]); dist=(Hdr[k].lat-lat1)*(Hdr[k].lat-lat1)+ (Hdr[k].lon-lon1)*(Hdr[k].lon-lon1); if(dist<1.0) break; } if(k>=MAXHDR-1) { printf("Too many bad points. File truncated.\n\n"); return(-1); } printf("Fixing %d bad points\n",k); printf("from %10.6f %11.6f to %10.6lf %11.6lf\n", lat1,lon1,Hdr[k].lat,Hdr[k].lon); fk=k+1; dlat=(Hdr[k].lat-lat1)/fk; dlon=(Hdr[k].lon-lon1)/fk; for(j=0;j0.0) { printf("mean = %5.1lf\n",hsum/hnum); fprintf(fpout,"mean = %5.1lf\n",hsum/hnum); hsumo=hsum=0.0; for(i=0;i<256;i++) { hsum+=Hist[i]; if(hsumo==0.0&&hsum>0.0) { printf("min = %3d\n",i); fprintf(fpout,"min = %3d\n",i); } if(hsumo/hnum<0.10&&hsum/hnum>=0.10) { printf("perc10 = %3d\n",i); fprintf(fpout,"perc10 = %3d\n",i); } if(hsumo/hnum<0.25&&hsum/hnum>=0.25) { printf("perc25 = %3d\n",i); fprintf(fpout,"perc25 = %3d\n",i); } if(hsumo/hnum<0.50&&hsum/hnum>=0.50) { printf("perc50 = %3d\n",i); fprintf(fpout,"perc50 = %3d\n",i); } if(hsumo/hnum<0.75&&hsum/hnum>=0.75) { printf("perc75 = %3d\n",i); fprintf(fpout,"perc75 = %3d\n",i); } if(hsumo/hnum<0.90&&hsum/hnum>=0.90) { printf("perc90 = %3d\n",i); fprintf(fpout,"perc90 = %3d\n",i); } if(hsum==hnum) { printf("max = %3d\n",i); fprintf(fpout,"max = %3d\n",i); break; } hsumo=hsum; } } fclose(fpout); } fclose(fp); } /*********************************************************************** ** ** ** ** ************************************************************************/ int make_header_file(name) char *name; { int i,j,k; FILE *fp,*fpthd; int row,col; int file,inum; unsigned char dbuff[32]; union intflo dval; double lat,lon,time,num; long offset,hdr=FILE_HEADER; double dlat=0.0,dlon=0.0,dnum=0.0,dellat=0.0,dellon=0.0; double dx,dy,heading,dist,px,py; double distsum=0.0,distnum=0.0,distmax=-1.0,distmin=10000.0; char string[100],mo,da,yr,hr,min; float sec,mean; sscanf(name+3,"%d",&file); strcpy(string,name); for(k=0;k0) { if(getch()==27) exit(0); } fscanf(fp,"%d%lf%lf%d%d%d%d%d%d%d", &dat[(i+j)%NUMPTS].status, &dat[(i+j)%NUMPTS].lat,&dat[(i+j)%NUMPTS].lon, &dat[(i+j)%NUMPTS].mo,&dat[(i+j)%NUMPTS].da, &dat[(i+j)%NUMPTS].yr,&dat[(i+j)%NUMPTS].hr, &dat[(i+j)%NUMPTS].min,&dat[(i+j)%NUMPTS].sec); dlat+=dat[(i+j)%NUMPTS].lat; dlon+=dat[(i+j)%NUMPTS].lon; dlat-=dat[(i-j-1)%NUMPTS].lat; dlon-=dat[(i-j-1)%NUMPTS].lon; nlat[i%NUMPTS]=dlat/dnum; nlon[i%NUMPTS]=dlon/dnum; dy=(nlat[i%NUMPTS]-nlat[(i-1)%NUMPTS])*DEG_M; dx=(nlon[i%NUMPTS]-nlon[(i-1)%NUMPTS])* cos(nlat[i%NUMPTS]*DEG_RAD)*DEG_M; dist=dx*dx+dy*dy; if(dist>0.0) dist=sqrt(dist); distsum+=dist; distnum+=1.0; if(dist>0.0) { if(dist>distmax) distmax=dist; if(dist0.0) { dist=sqrt(dist); px=-dy/dist; py= dx/dist; heading=atan2(dx,dy); if(heading<0.0) heading+=360.0*DEG_RAD; } B.lat=dlat/dnum; B.lon=dlon/dnum; B.mo=dat[(i)%NUMPTS].mo; B.da=dat[(i)%NUMPTS].da; B.yr=dat[(i)%NUMPTS].yr; B.hr=dat[(i)%NUMPTS].hr; B.min=dat[(i)%NUMPTS].min; B.sec=dat[(i)%NUMPTS].sec; B.tsec=dat[(i)%NUMPTS].tsec; B.heading=heading/DEG_RAD; B.px=px; B.py=py; if(dat[i%NUMPTS].status>0) B.status=1; else B.status=0; if(PrintAll==1) printf( "%d %9.6lf %10.6lf %9.6lf %10.6lf%5.2lf%5.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", B.status, dat[i%NUMPTS].lat,dat[i%NUMPTS].lon, dlat/dnum,dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); fwrite((char *)&B,sizeof(struct br_header),1,FpHdr); if(B.lat>MaxLat)MaxLat=B.lat; if(B.lon>MaxLon)MaxLon=B.lon; if(B.lat0) B.status=1; else B.status=0; if(PrintAll==1) printf( "*%d %9.6f %10.6f %9.6lf %10.6lf %4.2lf %4.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", B.status, dat[j%NUMPTS].lat,dat[j%NUMPTS].lon, *dlat/dnum,*dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); fwrite((char *)&B,sizeof(struct br_header),1,FpHdr); if(B.lat>MaxLat)MaxLat=B.lat; if(B.lon>MaxLon)MaxLon=B.lon; if(B.lat0.0) dist=sqrt(dist); px=-dy/dist; py= dx/dist; heading=atan2(dx,dy); if(heading<0.0) heading+=360*DEG_RAD; if(PrintAll==1) printf( "%9.6f %10.6f %9.6lf %10.6lf %4.2lf %4.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", dat[i%NUMPTS].lat,dat[i%NUMPTS].lon, *dlat/dnum,*dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); B.lat=*dlat/dnum; B.lon=*dlon/dnum; B.mo=dat[(i)%NUMPTS].mo; B.da=dat[(i)%NUMPTS].da; B.yr=dat[(i)%NUMPTS].yr; B.hr=dat[(i)%NUMPTS].hr; B.min=dat[(i)%NUMPTS].min; B.sec=dat[(i)%NUMPTS].sec; B.tsec=dat[(i)%NUMPTS].tsec; fwrite((char *)&B,sizeof(struct br_header),1,FpHdr); if(B.lat>MaxLat)MaxLat=B.lat; if(B.lon>MaxLon)MaxLon=B.lon; if(B.lat0.0) dist=sqrt(dist); px=-dy/dist; py= dx/dist; heading=atan2(dx,dy); if(heading<0.0) heading+=360.0*DEG_RAD; if(PrintAll==1) printf( "%9.6lf %10.6lf %9.6lf %10.6lf %4.2lf %4.2lf %4.2lf %5.1lf %5.2lf %5.2lf\n", dat[i%NUMPTS].lat,dat[i%NUMPTS].lon, *dlat/dnum,*dlon/dnum,dy,dx,dist,heading/DEG_RAD,px,py); B.lat=*dlat/dnum; B.lon=*dlon/dnum; B.mo=dat[(i)%NUMPTS].mo; B.da=dat[(i)%NUMPTS].da; B.yr=dat[(i)%NUMPTS].yr; B.hr=dat[(i)%NUMPTS].hr; B.min=dat[(i)%NUMPTS].min; B.sec=dat[(i)%NUMPTS].sec; B.tsec=dat[(i)%NUMPTS].tsec; fwrite((char *)&B,sizeof(struct br_header),1,FpHdr); if(B.lat>MaxLat)MaxLat=B.lat; if(B.lon>MaxLon)MaxLon=B.lon; if(B.lat1.0e15) { printf("Bad time\n"); status-=1; time=0.0; } else time=dval.fnum; min=time; sec=time*60; sec%=60; tsec=time*600; tsec%=10; mo=dbuff[9]*256+dbuff[8]; da=dbuff[11]*256+dbuff[10]; yr=dbuff[13]*256+dbuff[12]; hr=dbuff[15]*256+dbuff[14]; dat->pass_num=dbuff[1]*256+dbuff[0]; dat->line_num=dbuff[3]*256+dbuff[2]; dat->course=dbuff[5]*256+dbuff[4]; dat->prp=dbuff[7]*256+dbuff[6]; dat->lat=lat; dat->lon=lon; dat->time=time; dat->yr=yr; dat->mo=mo; dat->da=da; dat->hr=hr; dat->min=min; dat->sec=sec; dat->tsec=tsec; return(status); } /************************************************************************** ** ** ** ************************************************************************* */ int dec2nec(a,n) long *a; int n; { long *w2; short i,j,z[2],y; w2=(long *)z; for(i=0;i