source: subversion/applications/rendering/fmapgen/fmapgen.cpp @ 34655

Last change on this file since 34655 was 2519, checked in by jochen, 13 years ago

moved to rendering dir

File size: 5.2 KB
Line 
1/* fmapgen.cpp
2
3   Freemap map generator
4
5   Designed for generating Mapnik maps of the UK in OSGB projection.
6   However it's easily adjusted, I suspect, to fit the national projection of
7   any country.
8
9
10   Parameters :
11
12   -u username
13   -p password
14   -b bbox
15   -s scale (pixels/KM)
16   -w tile width
17   -h tile height
18   -x XML file
19
20*/
21
22#include <mapnik/map.hpp>
23#include <mapnik/layer.hpp>
24#include <mapnik/envelope.hpp>
25#include <mapnik/agg_renderer.hpp>
26#include <mapnik/image_util.hpp>
27#include <mapnik/load_map.hpp>
28#include <mapnik/datasource_cache.hpp>
29#include <mapnik/font_engine_freetype.hpp>
30
31#include "Client.h"
32#include "Parser.h"
33#include "Components.h"
34#include "llgr.h"
35
36using namespace mapnik;
37using std::cout;
38using std::cerr;
39using std::endl;
40using OSM::EarthPoint;
41
42struct Info
43{
44        std::string username, password, xmlfile;
45        double w, s, e, n; 
46        double scale;
47        int width, height;
48};
49
50bool genSHP(OSM::Client &client,EarthPoint& ep, EarthPoint& ep2,
51                                const std::string&, const std::string&);
52void makeMapnikMap(EarthPoint& ep, EarthPoint& ep2, int w, int h,double);
53std::string processCmdLineArgs(int argc, char* argv[],  Info& theInfo);
54
55
56
57int main (int argc, char *argv[])
58{
59        Info  info;
60        info.username = "";
61        info.password = "";
62        info.xmlfile = "freemap2.xml";
63        info.w = 480000;
64        info.s = 120000;
65        info.e = 490000;
66        info.n = 130000;
67        info.scale = 100;
68        info.width = info.height = 500;
69
70        std::string error=processCmdLineArgs(argc,argv,info);
71        if(error!="")
72        {
73                cerr << error << endl;
74                exit(1);
75        }
76
77        datasource_cache::instance()->register_datasources
78                ("/usr/local/lib/mapnik/input");
79        freetype_engine::instance()->register_font("/var/www/nick/data/Vera.ttf");
80        OSM::Client client("http://www.openstreetmap.org/api/0.3");
81        client.setLoginDetails(info.username, info.password);
82
83        EarthPoint ep(info.w,info.s), ep2(0,0);
84       
85        while(ep.y < info.n)
86        {
87                ep.x = info.w;
88                while (ep.x < info.e)
89                {
90                        //EarthPoint gr = OSM::wgs84_ll_to_gr(ep);
91                        EarthPoint gr = ep;
92                        EarthPoint gr2 = EarthPoint(gr.x + (1000.0*info.width)/info.scale , 
93                                gr.y + (1000.0*info.height)/info.scale);
94                        ep2 = gr2;
95
96                        EarthPoint j=OSM::gr_to_wgs84_ll(ep), j2=OSM::gr_to_wgs84_ll(ep2);
97                        EarthPoint k= OSM::wgs84_ll_to_gr(j);
98
99                        if (genSHP(client,j,j2,"nodes","ways")) 
100                                makeMapnikMap(ep,ep2,info.width,info.height,info.scale);
101                        ep.x = ep2.x;
102                }
103                ep.y = ep2.y;
104        }
105
106        return 0;
107}
108
109std::string processCmdLineArgs(int argc, char* argv[], Info& theInfo)
110{
111        int i=1;
112        while (i<argc)
113        {
114                if(!strcmp(argv[i],"-u"))
115                {
116                        if(argc<=i+1)
117                                return("-u needs a username specified!");
118
119                        theInfo.username=argv[i+1];
120                        i++;
121                }
122                if(!strcmp(argv[i],"-p"))
123                {
124                        if(argc<=i+1)
125                                return("-p needs a password specified!");
126
127                        theInfo.password=argv[i+1];
128                        i++;
129                }
130                else if (!strcmp(argv[i],"-b"))
131                {
132                        if(argc<=i+4)
133                                return("-b needs a bounding box specified!");
134                        theInfo.w=atof(argv[i+1]);
135                        theInfo.s=atof(argv[i+2]);
136                        theInfo.e=atof(argv[i+3]);
137                        theInfo.n=atof(argv[i+4]);
138
139                        // For easy OSGB generation....
140                        if ( 
141                                ( ((int)theInfo.w)%1000) ||
142                                ( ((int)theInfo.s)%1000) ||
143                                ( ((int)theInfo.e)%1000) ||
144                                ( ((int)theInfo.n)%1000)
145                                )
146                        {
147                                return "bounding box parameters not divisible by 1000!";
148                        }
149                        i+=4;
150                }
151                if(!strcmp(argv[i],"-s"))
152                {
153                        if(argc<=i+1)
154                                return("-s needs a scale specified!");
155
156                        theInfo.scale=atof(argv[i+1]);
157                        i++;
158                }
159                if(!strcmp(argv[i],"-w"))
160                {
161                        if(argc<=i+1)
162                                return("-w needs a width specified!");
163
164                        theInfo.width=atoi(argv[i+1]);
165                        i++;
166                }
167                if(!strcmp(argv[i],"-h"))
168                {
169                        if(argc<=i+1)
170                                return("-h needs a height specified!");
171
172                        theInfo.height=atoi(argv[i+1]);
173                        i++;
174                }
175                if(!strcmp(argv[i],"-x"))
176                {
177                        if(argc<=i+1)
178                                return("-x needs an XML file specified!");
179                        theInfo.xmlfile=argv[i+1];
180                        i++;
181                }
182                i++;
183        }
184
185        if(theInfo.username=="" || theInfo.password=="")
186                return("Username and/or password unspecified");
187
188        return "";
189}
190
191bool genSHP(OSM::Client &client,EarthPoint& ep, EarthPoint& ep2,
192                                const std::string& nodesSHP, const std::string& waysSHP)
193{
194        bool success = false;
195
196        cerr << "Doing shape for bbox " << ep.x << " "<<ep.y << " " 
197                << ep2.x << " " << ep2.y << endl;
198
199        std::string osmData = client.grabOSM("map",ep.x,ep.y,ep2.x,ep2.y);
200
201        std::istringstream sstream;
202        sstream.str(osmData);
203
204        OSM::Components *comp = OSM::Parser::parse(sstream);
205        if(comp)
206        {
207                cerr<<"doing cleanWays"<<endl;
208                OSM::Components *comp2 = comp->cleanWays();
209                cerr<<"done."<<endl;
210                if(comp2)
211                {       
212                        comp2->toOSGB();
213                        success = comp2->makeShp(nodesSHP,waysSHP);
214                        delete comp2;
215                }
216                delete comp;
217        }
218        return success;
219}
220
221void makeMapnikMap(EarthPoint& ep, EarthPoint& ep2, int w, int h,
222                                                double scale)
223{
224        char pngfile[1024], shpfile[1024];
225        sprintf(pngfile,"%03d%03d%03d.png",(int)scale,(int)(ep.x/1000),
226                                                (int)(ep.y/1000));
227        sprintf(shpfile,"%03d%03d%03d",(int)scale,(int)(ep.x/1000),
228                                                (int)(ep.y/1000));
229        static int i=1;
230        Map m(w,h);
231        load_map(m,"freemap2.xml");
232        Layer osmlayer = m.getLayer(0); // srtm
233        parameters p;
234        p["type"] = "shape";
235        p["file"] = shpfile; 
236        m.getLayer(0).set_datasource(datasource_cache::instance()->create(p));
237        Envelope<double> bbox (ep.x,ep.y,ep2.x,ep2.y); 
238        m.zoomToBox(bbox);
239        Image32 buf(m.getWidth(),m.getHeight());
240        agg_renderer<Image32> r(m,buf);
241        r.apply();
242        ImageUtils::save_to_file(pngfile,"png",buf);
243}
Note: See TracBrowser for help on using the repository browser.