source: subversion/applications/utils/srtm2shp/SRTMConGen.h @ 6182

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

new and internationally-capable srtm2shp added

File size: 5.1 KB
Line 
1/*
2    Copyright (C) 2005 Nick Whitelegg, Hogweed Software, nick@hogweed.org
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU Lesser General Public License as published by
6    the Free Software Foundation; either version 2 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
17
18 */
19#ifndef SRTMCONGEN_H
20#define SRTMCONGEN_H
21
22#include "SRTMDataGrid.h"
23#include "Map.h"
24#include <cmath>
25#include <libshp/shapefil.h>
26#include <deque>
27#include <map>
28#include <set>
29
30
31// Added by Artem
32
33typedef std::multimap<int,LINE> SegmentCache;
34typedef std::deque<LINE*> Contour;
35typedef std::set<int> Range;
36
37struct LineString
38 {
39      typedef std::vector<double> List;
40     
41   public:
42      LineString(int height)
43         : height_(height),
44           length_(0)
45      {}
46     
47      ~LineString() {}
48     
49      void add_first(double x, double y)
50      {
51         if (xs_.size() > 0)
52         {
53            double dx = xs_[0]-x;
54            double dy = ys_[0]-y;
55            length_ += sqrt(dx*dx + dy*dy); 
56         }
57         xs_.insert(xs_.begin(),x);
58         ys_.insert(ys_.begin(),y);
59         
60      }
61      void add_last(double x, double y)
62      {
63         unsigned size = xs_.size();
64         if ( size > 0)
65         {
66            double dx = xs_[size-1]-x;
67            double dy = ys_[size-1]-y;
68            length_ += sqrt(dx*dx + dy*dy); 
69         }
70         xs_.push_back(x);
71         ys_.push_back(y);
72      }
73     
74      unsigned size() const
75      {
76         return xs_.size();
77      }
78 
79      int height() const
80      {
81         return height_;
82      }
83 
84      unsigned length () const 
85      {
86         return length_;
87      }
88 
89      double * xs ()
90      {
91         return &xs_[0];
92      }
93      double * ys ()
94      {
95         return &ys_[0];
96      }
97      int height_;
98      unsigned length_;
99      List xs_;
100      List ys_;
101};
102 
103struct shape_writer
104{
105      shape_writer(SHPHandle & shp, DBFHandle & dbf, int htidx, int mjridx, 
106                        int interval)
107         : shp_(shp),
108           dbf_(dbf),
109           htidx_(htidx),
110           mjridx_(mjridx),
111           interval_(interval)
112      {}
113     
114      template <typename T>
115      void operator() (T) const;
116     
117      void operator() (LINE const& line)
118      {
119         //xs[0] = line.p[0].x;
120         //xs[1] = line.p[1].x;
121         //ys[0] = line.p[0].y;
122         //ys[1] = line.p[1].y;
123         
124         //SHPObject *object = SHPCreateSimpleObject(SHPT_ARC,2,xs,ys,0);
125         //int objid = SHPWriteObject(shp_,-1,object);
126         //SHPDestroyObject(object);
127         //DBFWriteIntegerAttribute (dbf_,objid,htidx_,segment.ht);
128         //DBFWriteIntegerAttribute (dbf_,objid,mjridx_,
129                 // ( segment.ht %(interval_*5) == 0 ? 1:0));
130      }
131     
132      void operator() (LineString & line)
133      {
134         //std::cout << "writing LINE num points=" << line.size() <<
135                 //     " lenghth=" << line.length() << "\n";
136         double * xs = line.xs();
137         double * ys = line.ys();
138         unsigned size = line.size();
139         SHPObject *object = SHPCreateSimpleObject(SHPT_ARC,size,xs,ys,0);
140         int objid = SHPWriteObject(shp_,-1,object);
141         SHPDestroyObject(object);
142         DBFWriteIntegerAttribute (dbf_,objid,htidx_,line.height());
143         DBFWriteIntegerAttribute (dbf_,objid,mjridx_,
144                                ( line.height()  % ( interval_*5) == 0 ? 1:0));
145      }
146     
147      double xs[2];
148      double ys[2];
149      int htidx_;
150      int mjridx_;
151      int interval_;
152      SHPHandle & shp_;
153      DBFHandle & dbf_;
154     
155};
156
157// end of code added by Artem
158
159class SRTMConGen
160{
161private:
162        SRTMDataGrid *sampledata;
163        int f;
164        std::string inCoord, outCoord;
165
166        LATLON_TILE ** get_latlon_tiles(EarthPoint&,EarthPoint&,int *w,int *h);
167        LATLON_TILE** getrects
168                (const EarthPoint& bottomleft,const EarthPoint& topright,int *w,int *h);
169        void do_contours (DrawSurface *ds,int row,int col, 
170                                int interval, std::map<int,vector<int> >&last_pt );
171
172public:
173        SRTMConGen() { sampledata = NULL; }
174        SRTMConGen(const std::string&,
175                                EarthPoint&,EarthPoint&, bool feet=false,int f=1);
176        ~SRTMConGen() { if(sampledata) delete sampledata; }
177        void makeGrid(const std::string&,
178                                        EarthPoint&,EarthPoint&,bool feet=false,int f=1);
179        void deleteGrid() { delete sampledata; sampledata=NULL; }
180        void generate(DrawSurface *ds,Map&);
181        void generateShading(DrawSurface *ds,double shadingres,Map&);
182        void generateShp (const char*,int interval);
183        void appendShp(SHPHandle shp,DBFHandle dbf,int interval,
184                                                                int htidx, int mjridx);
185        void merge_segments 
186                (Contour & contour, LineString & line, unsigned maxlength);
187
188        void setInCoord(const std::string& inCoord)
189        {
190                this->inCoord=inCoord;
191        }
192
193        void setOutCoord(const std::string& outCoord)
194        {
195                this->outCoord=outCoord;
196        }
197
198};
199
200#endif
Note: See TracBrowser for help on using the repository browser.