source: subversion/applications/utils/srtm2shp/srtm2shp.cpp @ 34385

Last change on this file since 34385 was 6182, checked in by nick, 12 years ago

new and internationally-capable srtm2shp added

File size: 3.6 KB
Line 
1// This is a UK-centric hack which works off OSGB Grid References, using
2// ancient code from before the dawn of OSM (well, almost)
3// Feel free to modify
4
5#include "SRTMConGen.h"
6#include <cstring>
7
8void ReadCmdLineArgs(int argc, char *argv[],
9                                                double bbox[4],
10                                                int& interval, std::string& inCoord,
11                                                std::string& outCoord, double& step,
12                                                double& extend, bool& feet, 
13                                                std::string& srtmlocation,std::string& shpfile);
14
15
16////////////////////////////////////////////////////////////////////////////////
17
18int main (int argc, char *argv[])
19{
20
21        if(argc<8)
22        {
23                cerr<<"Usage: srtm2shp -b comma_separated_bbox " 
24                        <<"[-I InCoordFormat] [-O OutCoordFormat]"<<endl
25                        <<"[-i height_interval]" <<" [-S step] [-f] [-l srtmlocation]" 
26                        <<" shpfile" <<endl;
27                cerr<<endl<<"Allowed coord formats: latlon,Mercator" << endl
28                        <<"Mercator units are as in OpenStreetMap"<<endl;
29                cerr<<endl<<"-f outputs heights in feet, otherwise metres"<<endl;
30                cerr<<endl<<"Default SRTM location: ./data"<<endl;
31                exit(1);
32        }
33
34        double bbox[4], step=-1, extend=0;
35        int interval=50;
36        std::string inCoord="latlon", outCoord="latlon",shpfile,srtmlocation="data";
37        bool feet=false;
38
39        ReadCmdLineArgs(argc,argv,bbox,interval,inCoord,outCoord,step,
40                                        extend,feet,srtmlocation,shpfile);
41
42        EarthPoint bottomleft,topright;
43        SRTMConGen congen;
44
45        if(inCoord=="Mercator")
46        {
47                step = (step<0 ? 10000: step);
48                congen.setInCoord("Mercator");
49        }
50        else 
51        {
52                step = (step<0 ? 0.1: step);
53        }
54
55        if(outCoord=="Mercator")
56                congen.setOutCoord("Mercator");
57
58        SHPHandle shp = SHPCreate(shpfile.c_str(),SHPT_ARC);
59        DBFHandle dbf = DBFCreate(shpfile.c_str());
60        int htidx = DBFAddField(dbf,"height",FTInteger,255,0);
61    int mjridx = DBFAddField(dbf,"major",FTInteger,255,0);
62
63        for(double ecount=bbox[0]; ecount<bbox[2]; ecount+=step)
64        {
65                for(double ncount=bbox[1]; ncount<bbox[3]; ncount+=step)
66                {
67                        cerr<<"Trying: " << ecount<<","<<ncount<<endl;
68                        bottomleft.x=ecount-(step*extend);
69                        bottomleft.y=ncount-(step*extend);
70                        topright.x=(ecount+step)+(step*extend);
71                        topright.y=(ncount+step)+(step*extend);
72                        congen.makeGrid(srtmlocation,bottomleft,topright,feet);
73                        congen.appendShp(shp,dbf,interval,htidx,mjridx);
74                        congen.deleteGrid();
75                }
76        }       
77    DBFClose(dbf);
78    SHPClose(shp);
79        return 0;
80}
81
82void ReadCmdLineArgs(int argc, char *argv[],
83                                                double bbox[4],
84                                                int& interval, std::string& inCoord,
85                                                std::string& outCoord, double& step,
86                                                double& extend, bool& feet, 
87                                                std::string& srtmlocation,std::string& shpfile)
88{
89        int required=0;
90        while (argc>2 && strlen(argv[1])>1 && argv[1][0]=='-')
91        {
92                char *s;
93                cerr<<argv[1]<<endl;
94
95                switch(argv[1][1])
96                {
97                        case 'b':
98                                        s=strtok(argv[2],",");
99                                        while (s!=NULL)
100                                        {
101                                                bbox[required++] = atof(s);
102                                                s=strtok(NULL,",");
103                                        }
104                                        argc-=2;
105                                        argv+=2;
106                                        break;
107
108                        case 'i':
109                                        interval=atoi(argv[2]);
110                                        argc-=2;
111                                        argv+=2;
112                                        break;
113                        case 'I':
114                                        inCoord=argv[2];
115                                        argc-=2;
116                                        argv+=2;
117                                        break;
118                        case 'O':
119                                        outCoord=argv[2];
120                                        argc-=2;
121                                        argv+=2;
122                                        break;
123                        case 'S':
124                                        step = atof(argv[2]);
125                                        argc-=2;
126                                        argv+=2;
127                                        break;
128                        case 'x':
129                                        extend = atof(argv[2]);
130                                        argc-=2;
131                                        argv+=2;
132                                        break;
133                        case 'f':
134                                        feet=true;
135                                        argc-=2;
136                                        argv+=2;
137                                        break;
138                        case 'l':
139                                        srtmlocation=argv[2];
140                                        argc-=2;
141                                        argv+=2;
142                                        break;
143                        default:
144                                        cerr<<"Unknown command line option " << argv[1][1]<<endl;
145                                        exit(1);
146                }
147        }
148
149        if(required<4)
150        {
151                cerr<<"Invalid bounding box!"<<endl;
152                exit(1);
153        }
154
155        if(argc>1)
156        {
157                shpfile=argv[1];
158        }
159        else
160        {
161                cerr<<"No shapefile name specified"<<endl;
162                exit(1);
163        }
164}
165
166
167
Note: See TracBrowser for help on using the repository browser.