/* makeraw.c reads a '*.bin' file and makes a '*.raw' file. makeraw infile(bin) outfile(raw) MaxLat MinLat MaxLon MinLon example: makeraw l:\demo\road1a d:\mydir\m_road1a 45.0 35.0 -100.0 -124.0 */ #include #include #include "nomouse.h" int Attrib=0; long Lattrib; float MaxLat=100.0,MinLat=-100.0,MaxLon=360.1,MinLon=-360.1; int PointCut=0; int LineLen=0; int cut_interp(float llat,float llon,float llato,float llono, float *newlat,float *newlon); main(argc,argv) int argc; char *argv[]; { int i,j,k,n=0; int numseg,numpts,doit; float latlon[2],mll[4],mnln,mxln,mnlt,mxlt,llat,llon,llato,llono; float lat,lon,latn,lonn,latt,lont; FILE *fpbin,*fpout,*fpatr,*fpout2,*fphdr; char name[100],string[100],cr=0xd,file[100]; long lattrib; int attrib,atr=0,out,hit,num=0,latout,lonout; int numsec,ok=0; long offset; for(i=0;i=MaxLat||MinLon>MaxLon) { printf("The order is:\n\n"); printf("MaxLat MinLat MaxLon MinLon\n\n"); printf("\nYou entered %10.6f %10.6f %11.6f %11.6f\n", MaxLat,MinLat,MaxLon,MinLon); exit(0); } printf("PointCut option is ON\n\n"); if(strcmp(argv[i],"/p")==0) { PointCut=1; printf("All points will lie inside limits.\n"); } else { PointCut=2; printf("All points will lie inside or on limits.\n"); } printf("\nMaxlat = %f MinLat = %f MaxLon = %f MinLon = %f\n", MaxLat,MinLat,MaxLon,MinLon); } } if(argc<2) { printf("PROCESS\n"); printf(" ALL LINES AND ALL POINTS:\n"); printf(" makeraw [source name] [dest. name]\n"); printf("\n"); printf(" ONLY LINES IN OR NEAR A LAT/LON BOX:\n"); printf(" makeraw [source name] [dest. name] \n"); printf("\n"); printf(" ONLY POINTS IN A LAT/LON BOX (RAGGED EDGE):\n"); printf(" makeraw [source name] [dest. name] /p \n"); printf("\n"); printf(" ONLY POINTS IN A LAT/LON BOX AND INTERPOLATE EDGE POINTS (SMOOTH EDGE):\n"); printf(" makeraw [source name] [dest. name] /P \n"); printf("\n"); printf("\n"); printf(" EXAMPLE:\n"); printf(" makeraw l:\\demo\\road1a d:\\mydir\\m_road1a /P 45.0 35.0 -80.0 -90.0\n"); exit(0); } if(MaxLat!=100.0) { strcpy(name,argv[1]); sprintf(string,"%s.hdr",name); fphdr=fopen(string,"rb"); if(!fphdr) printf("Could not open '%s' to check latlon. CONTINUING\n\n"); else { fread((char *)&numsec,sizeof(int),1,fphdr); printf("file = '%s' %d segments\n",string,numsec); for(k=0;kMinLon&&mnlnMinLat&&mnlt0) { strcpy(name,argv[2]); strcat(name,".srt"); fpout2=fopen(name,"wt"); printf("\nShort Line Output name is '%s'\n",name); } strcpy(name,argv[2]); strcat(name,".raw"); fpout=fopen(name,"wt"); printf("\nOutput name is '%s'\n",name); if(argc==7) { sscanf(argv[3],"%f",&MaxLat); sscanf(argv[4],"%f",&MinLat); sscanf(argv[5],"%f",&MaxLon); sscanf(argv[6],"%f",&MinLon); printf("\nMaxlat = %f MinLat = %f MaxLon = %f MinLon = %f\n", MaxLat,MinLat,MaxLon,MinLon); } printf("file = '%s'\n",file); sprintf(name,"%s.atr",file); fpatr=fopen(name,"rb"); if(fpatr) { printf("Attribute file present.\n"); if(Attrib==1) printf("Working only segments with attibute = %ld\n\n",Lattrib); atr=1; } else { printf("No attribute file found.\n"); Attrib=0; } fread((char *)&numseg,sizeof(int),1,fpbin); printf("numseg = %d\n",numseg); for(i=0;iMaxLon||mnlt>MaxLat||mxlnLineLen) fprintf(fpout,"%5d",i+1); else fprintf(fpout2,"%5d",i+1); } else { if(numpts>LineLen) fprintf(fpout,"%5ld",lattrib); else fprintf(fpout2,"%5ld",lattrib); } } hit=0; for(j=0;j0) { llat=latlon[0]; llon=latlon[1]; out=0; if(latlon[1]>MaxLon||latlon[0]>MaxLat|| latlon[1]0) /* first point in after cut */ { cut_interp(llato,llono,llat,llon,&lat,&lon); fprintf(fpout,"\n%8.5f %11.5f",lat,lon); hit=1; } } if(hit%3==0) fprintf(fpout,"\n"); else fprintf(fpout," "); fprintf(fpout,"%8.5f %11.5f",latlon[0],latlon[1]); hit+=1; } else /* not a valid point and point cut on */ { if(PointCut==1) /* all points inside of limits */ { if(hit>0) /* cut line */ { if(hit<2) fprintf(fpout," %8.5f %11.5f//\n",llat,llon); else fprintf(fpout,"//\n"); hit=0; } } else if(PointCut==2) /* put point on limit */ { if(hit>0) /* cut line */ { llat=latlon[0]; llon=latlon[1]; cut_interp(llat,llon,llato,llono,&lat,&lon); if(hit%3==0) fprintf(fpout,"\n"); else fprintf(fpout," "); fprintf(fpout,"%8.5f %11.5f//\n",lat,lon); hit=0; } } } llono=llon; llato=llat; } else /* point cut is set to OFF */ { if(j%3==0) { if(numpts>LineLen) fprintf(fpout,"\n"); else fprintf(fpout2,"\n"); } else { if(numpts>LineLen) fprintf(fpout," "); else fprintf(fpout2," "); } if(numpts>LineLen) fprintf(fpout,"%8.5f %11.5f",latlon[0],latlon[1]); else fprintf(fpout2,"%8.5f %11.5f",latlon[0],latlon[1]); } } } if(doit==1&&PointCut==1) { if(hit==1) fprintf(fpout," %8.5f %11.5f//\n",llat,llon); else if(hit>1) fprintf(fpout,"//\n"); n+=1; } else if(doit==1&&PointCut==2) { if(hit>1) fprintf(fpout,"//\n"); n+=1; } else if(doit==1) { if(numpts>LineLen) fprintf(fpout,"//\n"); else fprintf(fpout2,"//\n"); n+=1; } printf("%6d %6d of %6d%c",i+1,n,numseg,cr); } printf("\n"); fclose(fpout); fclose(fpbin); if(LineLen>0) fclose(fpout2); } /*********************************************************************** ** ** ** ** ************************************************************************/ int cut_interp(float llat,float llon,float llato,float llono, float *newlat,float *newlon) { int latout,lonout; float lat,lon,latt,lont,latn,lonn; int hit=0; do { latout=lonout=0; if(llatMaxLat) latout=2; if(llonMaxLon) lonout=2; if(lonout>0) { if(lonout==1) lon=MinLon; if(lonout==2) lon=MaxLon; lat=(lon-llono)/(llon-llono)*(llat-llato)+llato; } else if(latout>0) { if(latout==1) lat=MinLat; if(latout==2) lat=MaxLat; lon=(lat-llato)/(llat-llato)*(llon-llono)+llono; } llat=lat; llon=lon; hit+=1; if(hit>2) printf("hit = %3d llat = %11.6f llon = %11.6f\n",hit,llat,llon); }while(latout>0||lonout>0); *newlat=lat; *newlon=lon; }