source: subversion/applications/utils/export/osmgarminmap/osm2garmin.cpp @ 28719

Last change on this file since 28719 was 1814, checked in by nick, 13 years ago

Updated osm2garmin so that each map has unique ID; command line options revise

File size: 6.1 KB
Line 
1#include <stdio.h>
2#include <string.h>
3#include <stdlib.h>
4#include <libxml/xmlmemory.h>
5#include <libxml/debugXML.h>
6#include <libxml/HTMLtree.h>
7#include <libxml/xmlIO.h>
8#include <libxml/DOCBparser.h>
9#include <libxml/xinclude.h>
10#include <libxml/catalog.h>
11#include <libxslt/xslt.h>
12#include <libxslt/xsltInternals.h>
13#include <libxslt/transform.h>
14#include <libxslt/xsltutils.h>
15#include "curlstuff.h"
16
17int applyXSLT(const char* infile,const char *xsltfile,const char *outfile,
18                                        const char**);
19int createGPSmap(const char*,const char* file);
20int sendmap(const char*,const char*, const char files[1024][16], int nfiles);
21int makeMap(double w,double s,double e,double n, const char* username,
22                                        const char* password, const char*,int*);
23void error(const char* msg);
24void usage();
25
26int main(int argc, char *argv[])
27{
28        char username[1024], password[1024], serialport[1024], 
29                 cgpsmapper_loc[1024], sendmap_loc[1024];
30        strcpy(serialport,"/dev/ttyS0");
31        strcpy(cgpsmapper_loc,"cgpsmapper");
32        strcpy(sendmap_loc,"sendmap");
33        strcpy(username,"");
34        strcpy(password,"");
35        int send=1, tiled=0, specified_bbox=0;
36        double tilesize=0.1, w, s, e, n;
37
38
39        int i=1;
40        while (i<argc)
41        {
42                if(!strcmp(argv[i],"-N"))
43                {
44                        send=0;
45                }
46                else if(!strcmp(argv[i],"-T"))
47                {
48                        tiled=1;
49                }
50
51                else if(!strcmp(argv[i],"-t"))
52                {
53                        if(argc<=i+1)
54                                error("-t needs a tile size specified!");
55
56                        tilesize=atof(argv[i+1]);
57                        i++;
58                }
59
60
61                else if(!strcmp(argv[i],"-o"))
62                {
63                        if(argc<=i+1)
64                                error("-o needs a serial port specified!");
65                        strcpy(serialport,argv[i+1]);
66                        i++;
67                }
68
69                else if (!strcmp(argv[i],"-c"))
70                {
71                        if(argc<=i+1)
72                                error("-c needs a cGPSmapper location specified!");
73                        strcpy(cgpsmapper_loc,argv[i+1]);
74                        i++;
75                }
76
77                else if (!strcmp(argv[i],"-s"))
78                {
79                        if(argc<=i+1)
80                                error("-s needs a sendmap location specified!");
81                        strcpy(sendmap_loc,argv[i+1]);
82                        i++;
83                }
84
85                else if (!strcmp(argv[i],"-u"))
86                {
87                        if(argc<=i+1)
88                                error("-u needs a username specified!");
89                        strcpy(username,argv[i+1]);
90                        i++;
91                }
92                else if (!strcmp(argv[i],"-p"))
93                {
94                        if(argc<=i+1)
95                                error("-p needs a password specified!");
96                        strcpy(password,argv[i+1]);
97                        i++;
98                }
99                else if (!strcmp(argv[i],"-b"))
100                {
101                        if(argc<=i+4)
102                                error("-b needs a bounding box specified!");
103                        w=atof(argv[i+1]);
104                        s=atof(argv[i+2]);
105                        e=atof(argv[i+3]);
106                        n=atof(argv[i+4]);
107                        specified_bbox=1;
108                        i+=4;
109                }
110                else if (!strcmp(argv[i],"-h"))
111                {
112                        usage();
113                        exit(0);
114                }
115                i++;
116        }
117       
118        if(!specified_bbox || !strcmp(username,"") || !strcmp(password,""))
119        {
120                error("You need to specify a bounding box, username and password!");
121                exit(1);
122        }       
123
124        int nmaps=0;
125
126        if(tiled && (e-w>tilesize || n-s>tilesize))
127        {
128                printf("Large area so doing tiled retrieval\n");
129                double lon=w, lat, lon2, lat2;
130
131
132                while(lon < e)
133                {
134                        lat=s;
135                        lon2 = lon+tilesize < e ? lon+tilesize : e;
136
137                        while(lat < n)
138                        {
139                                lat2 = lat+tilesize < n ? lat+tilesize : n;
140
141                                printf("Doing tile %lf,%lf,%lf,%lf\n",lon,lat,lon2,lat2);
142                                makeMap(lon,lat,lon2,lat2,username,password,cgpsmapper_loc,
143                                                                &nmaps);
144                                lat += tilesize;
145                        }
146                        lon += tilesize;
147                }
148        }
149        else
150        {
151                makeMap(w,s,e,n,username,password,cgpsmapper_loc,&nmaps);
152        }
153       
154        //int send=1, nmaps=1;
155
156        if(send && nmaps>0 && nmaps<=1024)
157        {
158                char mapfiles[1024][16]; 
159                for(int count=0; count<nmaps; count++)
160                {
161                        sprintf(mapfiles[count],"osm%04d.img", count+1);
162                }
163                sendmap(sendmap_loc,serialport,mapfiles,nmaps);
164        }
165
166        return 0;
167}
168
169               
170
171int makeMap(double w,double s,double e,double n, const char* username,
172                                        const char* password, const char* cgpsmapper_loc,
173                                        int *nmaps)
174{
175        int retval=1;
176        char MPfile[1024];
177       
178        fprintf(stderr,"Grabbing data from OSM...");
179        CURL_LOAD_DATA *osm = grab_osm
180                        ("http://www.openstreetmap.org/api/0.3/map", w, s, e, n,
181                                        username, password );
182        fprintf(stderr,"done.\n");
183
184        const char *params[17];
185        char mapid[6];
186        strcpy(mapid,"mapid");
187        char id[10];
188
189        FILE *blah = fopen("data.osm", "w");
190        fwrite( osm->data, osm->nbytes, 1, blah );
191        fclose(blah);
192
193        free(osm->data);
194        free(osm);
195
196        fprintf(stderr,"Converting OSM to MPX...");
197
198        params[0] = mapid; 
199        sprintf(id,"%d", 65536+ (*nmaps) );
200        params[1] = id;
201        params[2] = NULL;
202
203        if (applyXSLT("osm2mpx.xml", "osm2mpx.xsl", "map.mpx", params) == 0)
204        {
205                fprintf(stderr,"done.\nConverting MPX to MP...");
206                sprintf(MPfile,"osm%04d.mp", (*nmaps)+1);
207                params[0] = NULL;
208
209                if(applyXSLT("feature-list.xml", "mpx2mp.xsl", MPfile, params)==0)
210                {
211                        fprintf(stderr,"done.\n");
212                        //remove("map.mpx");
213                        //remove("data.osm");
214                        if(createGPSmap(cgpsmapper_loc,MPfile)==0)
215                        {
216                                (*nmaps)++;
217                                retval=0;
218                        }
219                }
220        }
221
222        return retval;
223}
224
225
226int applyXSLT(const char* infile,const char *xsltfile,const char *outfile,
227                                const char **params)
228{
229        int retval=1;
230
231        xsltStylesheetPtr xslt; 
232        xmlDocPtr doc; 
233        xmlDocPtr res; 
234
235
236        FILE *out = fopen(outfile,"w");
237        if(out!=NULL)
238        {
239                xslt = xsltParseStylesheetFile((const xmlChar*)xsltfile);
240                doc = xmlParseFile (infile);
241                res = xsltApplyStylesheet(xslt,doc,params);
242
243                xsltSaveResultToFile(out,res,xslt);
244                fclose(out);
245
246                xsltFreeStylesheet(xslt);
247                xmlFreeDoc(res);
248                xmlFreeDoc(doc);
249
250                xsltCleanupGlobals();
251                xmlCleanupParser();
252
253                retval = 0;
254        }
255
256        return retval;
257}
258
259// TODO: on windows we can use the cgpsmapper DLL directly here
260int createGPSmap(const char* gpsmap_cmd, const char* file)
261{
262        char cmd[1024];
263        sprintf(cmd,"%s %s", gpsmap_cmd, file);
264        return system(cmd);
265}
266
267int sendmap(const char* sendmap_cmd,const char* serialport,
268                                const char files[1024][16], int nfiles)
269{
270        char cmd[1024];
271        char blah[1024];
272        sprintf(cmd,"%s %s", sendmap_cmd, serialport);
273
274        for(int count=0; count<nfiles; count++)
275        {
276                sprintf(blah," %s", files[count]);
277                strcat(cmd,blah);
278        }
279       
280        return system(cmd);
281}
282
283void error(const char* msg)
284{
285        fprintf(stderr,"ERROR: %s\n\n",msg);
286        usage();
287        exit(1);
288}
289
290void usage()
291{
292        fprintf(stderr,"Usage: osm2garmin [-N] [-T] [-t tilesize] [-o serialport]");
293        fprintf(stderr," [-c cgpsmapper_location] [-s sendmap_location] [-h] ");
294        fprintf(stderr,"-u username -p password -b west south east north\n");
295        fprintf(stderr,"\n-h: Display this message\n-N: do not send .img to GPS\n");
296        fprintf(stderr,"-T: tiled retrieval if area larger than tilesize\n");
297}
298
299// xmlParseMemory(buffer,size)
Note: See TracBrowser for help on using the repository browser.