X-Git-Url: https://git.gag.com/?p=debian%2Fsplat;a=blobdiff_plain;f=utils%2Fusgs2sdf-broken.c;fp=utils%2Fusgs2sdf-broken.c;h=acfb7f887e87e421750ccc54ebba2d89e87484b7;hp=0000000000000000000000000000000000000000;hb=18b0073296be2b71aa95c3c2441f717279d09eab;hpb=dcc481697c227c3b265d1e68a8a82910c818332c diff --git a/utils/usgs2sdf-broken.c b/utils/usgs2sdf-broken.c new file mode 100644 index 0000000..acfb7f8 --- /dev/null +++ b/utils/usgs2sdf-broken.c @@ -0,0 +1,355 @@ +/***************************************************************************\ +* USGS2SDF: USGS to SPLAT Data File Converter Utility * +* Copyright John A. Magliacane, KD2BD 1997-2001 * +* Last update: 05-Sep-2005 * +***************************************************************************** +* Updated July 2005 by John Gabrysch (jgabby@gmail.com) to properly handle * +* the updated USGS DEM file format and to properly scale Alaska tiles. * +***************************************************************************** +* * +* This program reads files containing delimited US Geological Survey * +* Digital Elevation Model Data files, and creates Splat Data Files * +* containing ONLY the raw information needed by SPLAT!, thereby saving * +* disk space, as well as read/write time. * +* * +* The format of .sdf files created by this utility is as follows: * +* * +* maximum west longitude (degrees West) * +* minimum north latitude (degrees North) * +* minimum west longitude (degrees West) * +* maximum north latitude (degrees North) * +* ...1440000 elevation points... (1200x1200) * +* * +* All data is represented as integers. A single '\n' follows each value. * +* * +* SPLAT Data Files are named according to the geographical locations * +* they represent (ie: min_north:max_north:min_west:max_west.sdf). * +* * +***************************************************************************** +* To compile: gcc -Wall -O3 -s usgs2sdf.c -o usgs2sdf * +***************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 2 of the License or any later * +* version. * +* * +* This program is distributed in the hope that it will useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * +* for more details. * +* * +\***************************************************************************/ + +#include +#include + +char *d2e(string) +char *string; +{ + /* This function is used to replace 'D's with 'E's for proper + exponential notation of numeric strings read from delimited + USGS data files. It returns a pointer to a string. */ + + unsigned char x; + + for (x=0; string[x]!=0; x++) + if (string[x]=='D') + string[x]='E'; + return (string); +} + +int main(argc,argv) +int argc; +char *argv[]; +{ + unsigned char minimum[30], maximum[30], swlong[30], swlat[30], + nwlong[30], nwlat[30], nelong[30], nelat[30], + selong[30], selat[30]; + char string[40]; + double max_el, min_el, max_west, min_west, max_north, min_north; + int x, y, z, c, array[1202][1202]; + int arc_mod=0; + char splatfile[25]; + FILE *fd; + + if (argc!=2) + { + fprintf(stderr,"Usage: usgs2sdf uncompressed_delimited_usgs_datafile (ie: wilmington-e)\n"); + exit(0); + } + + fd=fopen(argv[1],"rb"); + + if (fd!=NULL) + { + fprintf(stdout,"Reading \"%s\"...",argv[1]); + fflush(stdout); + + /* Skip first 548 bytes */ + + for (x=0; x<548; x++) + getc(fd); + + /* Read quadrangle corners */ + + /* Read southwest longitude */ + + for (x=0; x<22; x++) + swlong[x]=getc(fd); + + swlong[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read southwest latitude */ + + for (x=0; x<22; x++) + swlat[x]=getc(fd); + + swlat[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read northwest longitude */ + + for (x=0; x<22; x++) + nwlong[x]=getc(fd); + + nwlong[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read northwest latitude */ + + for (x=0; x<22; x++) + nwlat[x]=getc(fd); + + nwlat[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read northeast longitude */ + + for (x=0; x<22; x++) + nelong[x]=getc(fd); + + nelong[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read northeast latitude */ + + for (x=0; x<22; x++) + nelat[x]=getc(fd); + + nelat[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read southeast longitude */ + + for (x=0; x<22; x++) + selong[x]=getc(fd); + + selong[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read southeast latitude */ + + for (x=0; x<22; x++) + selat[x]=getc(fd); + + selat[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read minimum elevation */ + + for (x=0; x<22; x++) + minimum[x]=getc(fd); + + minimum[x]=0; + + /* Skip 2 bytes */ + + for (x=0; x<2; x++) + getc(fd); + + /* Read maximum elevation */ + + for (x=0; x<22; x++) + maximum[x]=getc(fd); + + maximum[x]=0; + + sscanf(d2e((char*)minimum),"%lG",&min_el); + sscanf(d2e((char*)maximum),"%lf",&max_el); + + sscanf(d2e((char*)swlong),"%lf",&max_west); + sscanf(d2e((char*)swlat),"%lf",&min_north); + + sscanf(d2e((char*)nelong),"%lf",&min_west); + sscanf(d2e((char*)nelat),"%lf",&max_north); + + max_west/=-3600.0; + min_north/=3600.0; + max_north/=3600.0; + min_west/=-3600.0; + + /* If the latitude is between 50 and 70, there are only 600 vertical lines of data. + If the latitude is greater than 70, there are only 400. arc_mod is the flag for + use later */ + + if (min_north >= 50.0) + arc_mod++; + + if (min_north >= 70.0) + arc_mod++; + + + /* Skip 84 Bytes - Modified to 238 by jgabby 07/05 */ + + for (x=0; x<238; x++) + getc(fd); + + /* Read elevation data... */ + + for (x=1200; x>=0; x--) + { + if (x==900) + { + printf(" 25%c...",37); + fflush(stdout); + } + + if (x==600) + { + printf(" 50%c...",37); + fflush(stdout); + } + + if (x==300) + { + printf(" 75%c... ",37); + fflush(stdout); + } + + /* Skip over 9 strings of data */ + + for (y=0; y<9; y++) + { + string[0]=0; + + do + { + c=getc(fd); + + } while (c==' ' || c=='\n'); + + for (z=0; c!=' ' && c!='\n' && z<28; z++) + { + string[z]=c; + c=getc(fd); + } + + string[z]=0; + } + + /* Store elevation data in array */ + + for (y=0; y<1201; y++) + { + string[0]=0; + + do + { + c=getc(fd); + + } while (c==' ' || c=='\n'); + + for (z=0; c!=' ' && c!='\n' && z<28; z++) + { + string[z]=c; + c=getc(fd); + } + + string[z]=0; + + sscanf(string,"%d",&array[y][x]); + + /* The next few lines either duplicate or triplicate the lines to + ensure a 1200x1200 result, depending on how arc_mod was set earlier */ + + if (arc_mod > 0) + sscanf(string,"%d",&array[y][x-1]); + + if (arc_mod > 1) + sscanf(string,"%d",&array[y][x-2]); + } + + if (arc_mod > 0) + x--; + + + if (arc_mod > 1) + x--; + } + + fclose(fd); + + /* Write splat data file to disk */ + + sprintf(splatfile,"%.0f:%.0f:%.0f:%.0f.sdf",min_north,max_north,min_west,max_west); + + fprintf(stdout," Done!\nWriting \"%s\"... ",splatfile); + fflush(stdout); + + fd=fopen(splatfile,"w"); + + fprintf(fd,"%.0f\n%.0f\n%.0f\n%.0f\n", max_west, min_north, min_west, max_north); + + for (x=0; x<1200; x++) + for (y=0; y<1200; y++) + fprintf(fd,"%d\n",array[x][y]); + + fclose(fd); + fprintf(stdout,"Done!\n"); + fflush(stdout); + } + + if (fd==NULL) + { + fprintf(stderr,"*** %c%s%c: File Not Found!\n",34,argv[1],34); + exit(-1); + } + + else + exit(0); +} +