/* thinpts.c tp1.bat = cl /AL thinpts.c proj1 Takes a file of column data and makes a '.v' file for input into 'trimake.c' INPUT FORMAT: latitude longitude variable_1 variable_2 . . . variable_N missing_value -1 [ optional ] * 40.123456 -123.456789 12.5 8.0 ... 0.00005 etc. */ #include #include #include #include "proj1.h" #define NUM_TYPE 5 #define DEG_RAD 0.01745329251 /* converts degrees to radians */ #define MAX_DIST 10000.00 #define MAX_VAR 30 #define MAX_VAL 15000 long Max_Val=MAX_VAL; int Max_Var=MAX_VAR; FILE *Fpin,*FpV,*FpTxt; int Type=0; int CutLong=0; int Count=0; float Thin=1.0,Msng=0; int MsngVal=0; long Tnum=0,Limit=14000,Tcount=0; /* proj1 */ struct control Constant; char String[10][80],PString[80]; extern struct projection *Proj; /* end proj1 */ char VarName[MAX_VAR][100]; int VarNum; double Var[MAX_VAR],Num[MAX_VAR],Sum[MAX_VAR],Max[MAX_VAR],Min[MAX_VAR],Npts; double LatSum,LonSum,LatMax=-360.0,LonMax=-360,LatMin=360.0,LonMin=360; double MxLat=360.0,MnLat=-360.0,MxLon=360.0,MnLon=-360.0; main(argc,argv) int argc; char *argv[]; { int i,j,k,n,il,m; char filename[100],file[100],string0[100]; int num,segs=0,len,numread,print=0,end_of_file=0; double dist,mindist,coslat,sum=0.0,used=0.0; int pnum,var; char string[100],cr=0xd,outfile[50],infile[50]; double zscale,lat,lon,x,y,dval; long count=0,lthin=0,offset; float thin=0.0; if(argc<2) { printf("Command Line to Count Points Only:\n"); printf("\n"); printf(" thinpts [in_file]\n"); printf("\n"); printf("Command Line Process Points:\n"); printf("\n"); printf( " thinpts [in_file] [thin_number] \n"); printf(" \n"); printf(" where:\n"); printf(" \n"); printf( " in_file -- input file name with file type\n"); printf( " thin_number -- floating point number of ratio of points to save\n"); printf(" ( must be 1.0 or greater)\n"); printf( " max_pts -- optional resetting of maximum number of points\n"); printf(" ( default is %ld )\n",Max_Val); printf("\n"); exit(0); } else strcpy(file,argv[1]); strcpy(filename,file); Fpin=fopen(filename,"rt"); if(!Fpin) { printf("Could not open file '%s'.\n",filename); exit(0); } strcpy(infile,filename); VarNum=0; do { fscanf(Fpin,"%s",VarName[VarNum]); if(strcmpi(VarName[VarNum],"missing_value")==0) { if(fscanf(Fpin,"%f",&Msng)>0) MsngVal=1; } else if(VarName[VarNum][0]!='*') VarNum+=1; if(VarNum>Max_Var) { printf("Too many variables or no '*' to end set.\n\n"); printf("Maximum number of variables = %d\n\n",Max_Var); exit(0); } }while(VarName[VarNum][0]!='*'); offset=ftell(Fpin); if(strcmpi(VarName[0],"latitude")!=0||strcmpi(VarName[1],"longitude")!=0) { printf("Variable 1 must be latitude and variable 2 must be longitude.\n\n"); exit(0); } if(VarNum<3) { printf("You must have at least on variable besides lat/lon.\n\n"); exit(0); } printf("There are %d variables:\n",VarNum-2); for(i=2;i3) sscanf(argv[3],"%ld",&Limit); if(Thin<1.0) Thin=1.0; printf("Thinning rate = 1%/%0.2f\n",Thin); } if(Count==0) printf("Thinning rate = 1%/%0.2f or %0.3f%%\n",Thin,1.0/Thin*100.0); if(Count==0) { pnum=choose_projection(&Constant,PString); get_constants(&Constant,String,&n); } printf("Counting points and setting statistics ...\n"); for(i=0;iMnLat&&lon>MnLon&&latLatMax) LatMax=lat; if(latLonMax) LonMax=lon; if(lonMax[0]) Max[0]=x; if(y>Max[1]) Max[1]=y; if(xMax[i+2]) Max[i+2]=Var[i]; if(Var[i]1.0) printf("%c%8ld of %8ld (%0.2f%%) ", cr,Tnum,count+1,(float)Tnum/(float)(count+1)*100.0); else printf("%c%8ld ",cr,Tnum); } Tnum+=1; thin+=Thin; lthin=thin; } count+=1; } } if(Count==1) printf("\nThere are %ld points.\n\n",Tcount); if(Thin>1.0) printf("%cThere are %ld points out of a total of %ld.\n",cr,Tnum,count); else printf("%cThere are %ld points.\n",cr,Tnum); Npts=Tnum; printf( " --------------------------------------------------------\n"); printf( " Minimum Mid_Point Maximum Range Mean\n"); printf( " ---------- ---------- ---------- ---------- ----------\n"); printf("latitude %10.6lf %10.6lf %10.6lf %10.6lf %10.6lf\n", LatMin,(LatMax+LatMin)/2.0,LatMax,LatMax-LatMin,LatSum/Num[0]); printf("longitude %10.6lf %10.6lf %10.6lf %10.6lf %10.6lf\n", LonMin,(LonMax+LonMin)/2.0,LonMax,LonMax-LonMin,LonSum/Num[1]); printf("\n\n HIT ANY KEY TO CONTINUE\n\n"); getch(); do { Tnum=count=lthin=0; thin=0.0; strcpy(VarName[0],"X"); strcpy(VarName[1],"Y"); printf( " -----------------------------------------------------------------------------\n"); printf( " Number Points Min Max Range Number Name\n"); printf( " ------------ ------------- ------------- -------------- ----- --------------\n"); for(i=0;iVarNum-2) { printf("Invalid variable number.\n\n"); exit(0); } var+=1; strcpy(filename,VarName[var]); var-=2; filename[7]='\0'; printf("Give vertical exaggeration (negative for bathimetry)\n"); printf( "X and Y will be in kilometers -- Z should be in kilometers or something\n"); printf( "that scale is compatable with X and Y kilometers.\n\n"); scanf("%lf",&zscale); printf("Output files will be named '%s'.\n",filename); printf("Do you wish to change this? (y or n)\n\n"); if(getch()=='y') { printf("Give new name.\n\n"); scanf("%s",filename); } for(k=0;k0) fprintf(FpTxt,"# Missing Value = %f\n",Msng); if(FpTxt) fclose(FpTxt); fseek(Fpin,offset,SEEK_SET); while(fscanf(Fpin,"%lf%lf",&lat,&lon)==2) { for(i=0;iMnLat&&lon>MnLon&&lat