Routino SVN Repository Browser

Check out the latest version of Routino: svn co http://routino.org/svn/trunk routino

ViewVC logotype

Annotation of /trunk/src/planetsplitter.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1614 - (hide annotations) (download) (as text)
Sat Oct 25 13:22:29 2014 UTC (10 years, 5 months ago) by amb
File MIME type: text/x-csrc
File size: 22273 byte(s)
Sort the data geographically before pruning so that the data points physically
close together are close together in memory which reduces swapping/paging and
therefore runs much faster when memory is limited.

1 amb 2 /***************************************
2     OSM planet file splitter.
3 amb 151
4     Part of the Routino routing software.
5 amb 2 ******************/ /******************
6 amb 1514 This file Copyright 2008-2014 Andrew M. Bishop
7 amb 2
8 amb 151 This program is free software: you can redistribute it and/or modify
9     it under the terms of the GNU Affero General Public License as published by
10     the Free Software Foundation, either version 3 of the License, or
11     (at your option) any later version.
12    
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     GNU Affero General Public License for more details.
17    
18     You should have received a copy of the GNU Affero General Public License
19     along with this program. If not, see <http://www.gnu.org/licenses/>.
20 amb 2 ***************************************/
21    
22    
23     #include <stdio.h>
24     #include <stdlib.h>
25 amb 1192 #include <unistd.h>
26 amb 60 #include <string.h>
27 amb 330 #include <errno.h>
28 amb 2
29 amb 449 #include "types.h"
30     #include "ways.h"
31    
32 amb 199 #include "typesx.h"
33 amb 109 #include "nodesx.h"
34     #include "segmentsx.h"
35     #include "waysx.h"
36 amb 498 #include "relationsx.h"
37 amb 109 #include "superx.h"
38 amb 949 #include "prunex.h"
39 amb 449
40     #include "files.h"
41 amb 519 #include "logging.h"
42 amb 1319 #include "errorlogx.h"
43 amb 449 #include "functions.h"
44 amb 940 #include "osmparser.h"
45 amb 395 #include "tagging.h"
46 amb 1194 #include "uncompress.h"
47 amb 2
48    
49 amb 395 /* Global variables */
50 amb 284
51 amb 256 /*+ The name of the temporary directory. +*/
52 amb 284 char *option_tmpdirname=NULL;
53 amb 249
54 amb 358 /*+ The amount of RAM to use for filesorting. +*/
55     size_t option_filesort_ramsize=0;
56 amb 284
57 amb 991 /*+ The number of threads to use for filesorting. +*/
58     int option_filesort_threads=1;
59 amb 358
60 amb 991
61 amb 342 /* Local functions */
62    
63 amb 490 static void print_usage(int detail,const char *argerr,const char *err);
64 amb 342
65    
66     /*++++++++++++++++++++++++++++++++++++++
67 amb 395 The main program for the planetsplitter.
68 amb 342 ++++++++++++++++++++++++++++++++++++++*/
69    
70 amb 2 int main(int argc,char** argv)
71     {
72 amb 1314 NodesX *OSMNodes;
73     SegmentsX *OSMSegments,*SuperSegments=NULL,*MergedSegments=NULL;
74     WaysX *OSMWays;
75     RelationsX *OSMRelations;
76 amb 498 int iteration=0,quit=0;
77 amb 861 int max_iterations=5;
78 amb 804 char *dirname=NULL,*prefix=NULL,*tagging=NULL,*errorlog=NULL;
79 amb 1140 int option_parse_only=0,option_process_only=0;
80 amb 1171 int option_append=0,option_keep=0,option_changes=0;
81 amb 498 int option_filenames=0;
82 amb 975 int option_prune_isolated=500,option_prune_short=5,option_prune_straight=3;
83 amb 498 int arg;
84 amb 26
85 amb 1398 printf_program_start();
86 amb 982
87 amb 82 /* Parse the command line arguments */
88    
89 amb 327 for(arg=1;arg<argc;arg++)
90 amb 60 {
91 amb 327 if(!strcmp(argv[arg],"--help"))
92 amb 490 print_usage(1,NULL,NULL);
93 amb 1202 else if(!strncmp(argv[arg],"--dir=",6))
94     dirname=&argv[arg][6];
95     else if(!strncmp(argv[arg],"--prefix=",9))
96     prefix=&argv[arg][9];
97 amb 358 else if(!strncmp(argv[arg],"--sort-ram-size=",16))
98     option_filesort_ramsize=atoi(&argv[arg][16]);
99 amb 991 #if defined(USE_PTHREADS) && USE_PTHREADS
100     else if(!strncmp(argv[arg],"--sort-threads=",15))
101     option_filesort_threads=atoi(&argv[arg][15]);
102     #endif
103 amb 327 else if(!strncmp(argv[arg],"--tmpdir=",9))
104     option_tmpdirname=&argv[arg][9];
105 amb 1202 else if(!strncmp(argv[arg],"--tagging=",10))
106     tagging=&argv[arg][10];
107     else if(!strcmp(argv[arg],"--loggable"))
108     option_loggable=1;
109     else if(!strcmp(argv[arg],"--logtime"))
110     option_logtime=1;
111 amb 1598 else if(!strcmp(argv[arg],"--logmemory"))
112     option_logmemory=1;
113 amb 1202 else if(!strcmp(argv[arg],"--errorlog"))
114     errorlog="error.log";
115     else if(!strncmp(argv[arg],"--errorlog=",11))
116     errorlog=&argv[arg][11];
117 amb 327 else if(!strcmp(argv[arg],"--parse-only"))
118 amb 326 option_parse_only=1;
119 amb 327 else if(!strcmp(argv[arg],"--process-only"))
120 amb 326 option_process_only=1;
121 amb 1120 else if(!strcmp(argv[arg],"--append"))
122     option_append=1;
123 amb 1167 else if(!strcmp(argv[arg],"--keep"))
124     option_keep=1;
125 amb 1140 else if(!strcmp(argv[arg],"--changes"))
126     option_changes=1;
127 amb 327 else if(!strncmp(argv[arg],"--max-iterations=",17))
128     max_iterations=atoi(&argv[arg][17]);
129 amb 953 else if(!strncmp(argv[arg],"--prune",7))
130     {
131 amb 975 if(!strcmp(&argv[arg][7],"-none"))
132     option_prune_isolated=option_prune_short=option_prune_straight=0;
133 amb 953 else if(!strncmp(&argv[arg][7],"-isolated=",10))
134 amb 975 option_prune_isolated=atoi(&argv[arg][17]);
135 amb 964 else if(!strncmp(&argv[arg][7],"-short=",7))
136 amb 975 option_prune_short=atoi(&argv[arg][14]);
137 amb 966 else if(!strncmp(&argv[arg][7],"-straight=",10))
138 amb 975 option_prune_straight=atoi(&argv[arg][17]);
139 amb 953 else
140     print_usage(0,argv[arg],NULL);
141     }
142 amb 327 else if(argv[arg][0]=='-' && argv[arg][1]=='-')
143 amb 490 print_usage(0,argv[arg],NULL);
144 amb 327 else
145     option_filenames++;
146 amb 60 }
147 amb 26
148 amb 395 /* Check the specified command line options */
149    
150 amb 326 if(option_parse_only && option_process_only)
151 amb 490 print_usage(0,NULL,"Cannot use '--parse-only' and '--process-only' at the same time.");
152 amb 326
153 amb 1120 if(option_append && option_process_only)
154     print_usage(0,NULL,"Cannot use '--append' and '--process-only' at the same time.");
155    
156 amb 327 if(option_filenames && option_process_only)
157 amb 490 print_usage(0,NULL,"Cannot use '--process-only' and filenames at the same time.");
158 amb 327
159 amb 1224 if(!option_filenames && !option_process_only)
160     print_usage(0,NULL,"File names must be specified unless using '--process-only'");
161    
162 amb 358 if(!option_filesort_ramsize)
163     {
164 amb 452 #if SLIM
165 amb 940 option_filesort_ramsize=64*1024*1024;
166 amb 452 #else
167 amb 940 option_filesort_ramsize=256*1024*1024;
168 amb 452 #endif
169 amb 358 }
170     else
171     option_filesort_ramsize*=1024*1024;
172    
173 amb 284 if(!option_tmpdirname)
174 amb 252 {
175     if(!dirname)
176 amb 284 option_tmpdirname=".";
177 amb 252 else
178 amb 284 option_tmpdirname=dirname;
179 amb 252 }
180    
181 amb 989 if(!option_process_only)
182 amb 395 {
183 amb 989 if(tagging)
184 amb 481 {
185 amb 989 if(!ExistsFile(tagging))
186     {
187     fprintf(stderr,"Error: The '--tagging' option specifies a file that does not exist.\n");
188 amb 1359 exit(EXIT_FAILURE);
189 amb 989 }
190 amb 481 }
191     else
192     {
193 amb 989 if(ExistsFile(FileName(dirname,prefix,"tagging.xml")))
194     tagging=FileName(dirname,prefix,"tagging.xml");
195     else if(ExistsFile(FileName(DATADIR,NULL,"tagging.xml")))
196     tagging=FileName(DATADIR,NULL,"tagging.xml");
197     else
198     {
199     fprintf(stderr,"Error: The '--tagging' option was not used and the default 'tagging.xml' does not exist.\n");
200 amb 1359 exit(EXIT_FAILURE);
201 amb 989 }
202     }
203    
204     if(ParseXMLTaggingRules(tagging))
205     {
206     fprintf(stderr,"Error: Cannot read the tagging rules in the file '%s'.\n",tagging);
207 amb 1359 exit(EXIT_FAILURE);
208 amb 481 }
209     }
210 amb 395
211 amb 498 /* Create new node, segment, way and relation variables */
212 amb 82
213 amb 1314 OSMNodes=NewNodeList(option_append||option_changes,option_process_only);
214 amb 275
215 amb 1314 OSMWays=NewWayList(option_append||option_changes,option_process_only);
216 amb 26
217 amb 1314 OSMRelations=NewRelationList(option_append||option_changes,option_process_only);
218 amb 498
219 amb 804 /* Create the error log file */
220    
221 amb 809 if(errorlog)
222 amb 1313 open_errorlog(FileName(dirname,prefix,errorlog),option_append||option_changes||option_process_only,option_keep);
223 amb 804
224 amb 89 /* Parse the file */
225 amb 2
226 amb 989 if(!option_process_only)
227     {
228 amb 1224 for(arg=1;arg<argc;arg++)
229 amb 989 {
230 amb 1224 int fd;
231 amb 1227 char *filename,*p;
232 amb 327
233 amb 1224 if(argv[arg][0]=='-' && argv[arg][1]=='-')
234     continue;
235 amb 327
236 amb 1227 filename=strcpy(malloc(strlen(argv[arg])+1),argv[arg]);
237 amb 327
238 amb 1412 fd=OpenFile(filename);
239 amb 1227
240     if((p=strstr(filename,".bz2")) && !strcmp(p,".bz2"))
241     {
242 amb 1224 fd=Uncompress_Bzip2(fd);
243 amb 1227 *p=0;
244     }
245 amb 1194
246 amb 1227 if((p=strstr(filename,".gz")) && !strcmp(p,".gz"))
247     {
248 amb 1224 fd=Uncompress_Gzip(fd);
249 amb 1227 *p=0;
250     }
251 amb 1196
252 amb 1514 if((p=strstr(filename,".xz")) && !strcmp(p,".xz"))
253     {
254     fd=Uncompress_Xz(fd);
255     *p=0;
256     }
257    
258 amb 1224 if(option_changes)
259     {
260 amb 1227 printf("\nParse OSC Data [%s]\n==============\n\n",filename);
261 amb 1224 fflush(stdout);
262    
263 amb 1227 if((p=strstr(filename,".pbf")) && !strcmp(p,".pbf"))
264 amb 1140 {
265 amb 1226 logassert(0,"Unable to read a PBF file to apply changes (format does not permit this)");
266 amb 1140 }
267 amb 1227 else if((p=strstr(filename,".o5c")) && !strcmp(p,".o5c"))
268     {
269 amb 1339 if(ParseO5CFile(fd,OSMNodes,OSMWays,OSMRelations))
270 amb 1227 exit(EXIT_FAILURE);
271     }
272 amb 1140 else
273     {
274 amb 1339 if(ParseOSCFile(fd,OSMNodes,OSMWays,OSMRelations))
275 amb 1224 exit(EXIT_FAILURE);
276 amb 1140 }
277 amb 989 }
278 amb 1224 else
279 amb 1140 {
280 amb 1227 printf("\nParse OSM Data [%s]\n==============\n\n",filename);
281 amb 1140 fflush(stdout);
282 amb 2
283 amb 1227 if((p=strstr(filename,".pbf")) && !strcmp(p,".pbf"))
284 amb 1224 {
285 amb 1339 if(ParsePBFFile(fd,OSMNodes,OSMWays,OSMRelations))
286 amb 1224 exit(EXIT_FAILURE);
287     }
288 amb 1227 else if((p=strstr(filename,".o5m")) && !strcmp(p,".o5m"))
289     {
290 amb 1339 if(ParseO5MFile(fd,OSMNodes,OSMWays,OSMRelations))
291 amb 1227 exit(EXIT_FAILURE);
292     }
293 amb 1224 else
294     {
295 amb 1339 if(ParseOSMFile(fd,OSMNodes,OSMWays,OSMRelations))
296 amb 1224 exit(EXIT_FAILURE);
297     }
298 amb 1140 }
299    
300 amb 1412 CloseFile(fd);
301 amb 1227
302     free(filename);
303 amb 989 }
304 amb 80
305 amb 989 DeleteXMLTaggingRules();
306     }
307    
308 amb 1314 FinishNodeList(OSMNodes);
309     FinishWayList(OSMWays);
310     FinishRelationList(OSMRelations);
311 amb 1139
312 amb 1157 if(option_parse_only)
313 amb 326 {
314 amb 1314 FreeNodeList(OSMNodes,1);
315     FreeWayList(OSMWays,1);
316     FreeRelationList(OSMRelations,1);
317 amb 326
318 amb 1599 exit(EXIT_SUCCESS);
319 amb 326 }
320    
321 amb 1120
322 amb 1151 /* Sort the data */
323 amb 229
324 amb 1151 printf("\nSort OSM Data\n=============\n\n");
325 amb 227 fflush(stdout);
326 amb 8
327 amb 1355 /* Sort the nodes, ways and relations */
328 amb 263
329 amb 1314 SortNodeList(OSMNodes);
330 amb 263
331 amb 1314 SortWayList(OSMWays);
332 amb 87
333 amb 1314 SortRelationList(OSMRelations);
334 amb 559
335 amb 1151 /* Process the data */
336    
337     printf("\nProcess OSM Data\n================\n\n");
338     fflush(stdout);
339    
340 amb 1609 /* Remove non-highway nodes by looking through the ways (must be before splitting the ways) */
341 amb 1350
342     RemoveNonHighwayNodes(OSMNodes,OSMWays,option_keep||option_changes);
343    
344 amb 1609 /* Separate the segments and way names and sort them (must be before processing the segments) */
345 amb 1339
346 amb 1349 OSMSegments=SplitWays(OSMWays,OSMNodes,option_keep||option_changes);
347 amb 1339
348 amb 1348 SortWayNames(OSMWays);
349    
350 amb 1339 SortSegmentList(OSMSegments);
351    
352 amb 1609 /* Process the segments and index them (must be before processing relations) */
353 amb 549
354 amb 1351 ProcessSegments(OSMSegments,OSMNodes,OSMWays);
355 amb 549
356 amb 1352 IndexSegments(OSMSegments,OSMNodes,OSMWays);
357    
358 amb 1353 /* Process the route relations and turn relations (must be before compacting the ways) */
359 amb 498
360 amb 1314 ProcessRouteRelations(OSMRelations,OSMWays,option_keep||option_changes);
361 amb 498
362 amb 1353 ProcessTurnRelations(OSMRelations,OSMNodes,OSMSegments,OSMWays,option_keep||option_changes);
363 amb 498
364 amb 1609 /* Compact the ways */
365 amb 643
366 amb 1314 CompactWayList(OSMWays,OSMSegments);
367 amb 1100
368 amb 1614 /* Sort the nodes and segments geographically */
369 amb 1100
370 amb 1614 SortNodeListGeographically(OSMNodes);
371    
372     SortSegmentListGeographically(OSMSegments,OSMNodes);
373    
374     /* Re-index the segments */
375    
376 amb 1314 IndexSegments(OSMSegments,OSMNodes,OSMWays);
377 amb 1100
378 amb 1614 /* Sort the turn relations geographically */
379    
380     SortTurnRelationListGeographically(OSMRelations,OSMNodes,OSMSegments);
381    
382 amb 1609 /* Prune unwanted nodes/segments */
383 amb 645
384 amb 975 if(option_prune_straight || option_prune_isolated || option_prune_short)
385 amb 949 {
386 amb 1098 printf("\nPrune Unneeded Data\n===================\n\n");
387     fflush(stdout);
388    
389 amb 1604 if(option_prune_straight)
390     {
391     StartPruning(OSMNodes,OSMSegments,OSMWays);
392 amb 1431
393 amb 1451 PruneStraightHighwayNodes(OSMNodes,OSMSegments,OSMWays,option_prune_straight);
394    
395 amb 1604 FinishPruning(OSMNodes,OSMSegments,OSMWays);
396    
397     RemovePrunedNodes(OSMNodes,OSMSegments);
398     RemovePrunedSegments(OSMSegments,OSMWays);
399     CompactWayList(OSMWays,OSMSegments);
400     RemovePrunedTurnRelations(OSMRelations,OSMNodes);
401    
402     IndexSegments(OSMSegments,OSMNodes,OSMWays);
403     }
404    
405 amb 975 if(option_prune_isolated)
406 amb 1604 {
407     StartPruning(OSMNodes,OSMSegments,OSMWays);
408    
409 amb 1314 PruneIsolatedRegions(OSMNodes,OSMSegments,OSMWays,option_prune_isolated);
410 amb 953
411 amb 1604 FinishPruning(OSMNodes,OSMSegments,OSMWays);
412    
413     RemovePrunedNodes(OSMNodes,OSMSegments);
414     RemovePrunedSegments(OSMSegments,OSMWays);
415     CompactWayList(OSMWays,OSMSegments);
416     RemovePrunedTurnRelations(OSMRelations,OSMNodes);
417    
418     IndexSegments(OSMSegments,OSMNodes,OSMWays);
419     }
420    
421 amb 975 if(option_prune_short)
422 amb 1604 {
423     StartPruning(OSMNodes,OSMSegments,OSMWays);
424    
425 amb 1314 PruneShortSegments(OSMNodes,OSMSegments,OSMWays,option_prune_short);
426 amb 964
427 amb 1604 FinishPruning(OSMNodes,OSMSegments,OSMWays);
428 amb 1431
429 amb 1604 RemovePrunedNodes(OSMNodes,OSMSegments);
430     RemovePrunedSegments(OSMSegments,OSMWays);
431     CompactWayList(OSMWays,OSMSegments);
432     RemovePrunedTurnRelations(OSMRelations,OSMNodes);
433 amb 1098
434 amb 1604 IndexSegments(OSMSegments,OSMNodes,OSMWays);
435     }
436 amb 949 }
437    
438 amb 258 /* Repeated iteration on Super-Nodes and Super-Segments */
439 amb 58
440     do
441     {
442 amb 1302 index_t nsuper;
443 amb 650
444 amb 229 printf("\nProcess Super-Data (iteration %d)\n================================%s\n\n",iteration,iteration>9?"=":"");
445 amb 227 fflush(stdout);
446 amb 80
447 amb 90 if(iteration==0)
448     {
449     /* Select the super-nodes */
450 amb 58
451 amb 1314 ChooseSuperNodes(OSMNodes,OSMSegments,OSMWays);
452 amb 58
453 amb 90 /* Select the super-segments */
454 amb 58
455 amb 1314 SuperSegments=CreateSuperSegments(OSMNodes,OSMSegments,OSMWays);
456 amb 650
457 amb 1314 nsuper=OSMSegments->number;
458 amb 90 }
459     else
460     {
461 amb 97 SegmentsX *SuperSegments2;
462 amb 58
463 amb 1605 /* Index the super-segments */
464    
465     IndexSegments(SuperSegments,OSMNodes,OSMWays);
466    
467 amb 90 /* Select the super-nodes */
468    
469 amb 1314 ChooseSuperNodes(OSMNodes,SuperSegments,OSMWays);
470 amb 90
471     /* Select the super-segments */
472    
473 amb 1314 SuperSegments2=CreateSuperSegments(OSMNodes,SuperSegments,OSMWays);
474 amb 90
475 amb 650 nsuper=SuperSegments->number;
476 amb 104
477 amb 1339 FreeSegmentList(SuperSegments);
478 amb 90
479 amb 97 SuperSegments=SuperSegments2;
480 amb 90 }
481    
482 amb 1132 /* Sort the super-segments and remove duplicates */
483 amb 58
484 amb 1314 DeduplicateSuperSegments(SuperSegments,OSMWays);
485 amb 58
486 amb 643 /* Check for end condition */
487    
488 amb 650 if(SuperSegments->number==nsuper)
489     quit=1;
490    
491 amb 89 iteration++;
492 amb 58
493 amb 89 if(iteration>max_iterations)
494     quit=1;
495     }
496     while(!quit);
497 amb 58
498 amb 229 /* Combine the super-segments */
499    
500 amb 1427 printf("\nCombine Segments and Super-Segments\n===================================\n\n");
501 amb 227 fflush(stdout);
502 amb 58
503 amb 104 /* Merge the super-segments */
504    
505 amb 1314 MergedSegments=MergeSuperSegments(OSMSegments,SuperSegments);
506 amb 104
507 amb 1339 FreeSegmentList(OSMSegments);
508 amb 256
509 amb 1339 FreeSegmentList(SuperSegments);
510 amb 58
511 amb 1314 OSMSegments=MergedSegments;
512 amb 90
513 amb 1427 /* Cross reference the nodes and segments */
514 amb 90
515 amb 1427 printf("\nCross-Reference Nodes and Segments\n==================================\n\n");
516     fflush(stdout);
517    
518     /* Sort the nodes and segments geographically */
519    
520     SortNodeListGeographically(OSMNodes);
521    
522     SortSegmentListGeographically(OSMSegments,OSMNodes);
523    
524     /* Re-index the segments */
525    
526 amb 1314 IndexSegments(OSMSegments,OSMNodes,OSMWays);
527 amb 665
528 amb 1108 /* Sort the turn relations geographically */
529 amb 212
530 amb 1427 SortTurnRelationListGeographically(OSMRelations,OSMNodes,OSMSegments);
531 amb 551
532 amb 229 /* Output the results */
533    
534     printf("\nWrite Out Database Files\n========================\n\n");
535     fflush(stdout);
536    
537 amb 89 /* Write out the nodes */
538 amb 58
539 amb 1314 SaveNodeList(OSMNodes,FileName(dirname,prefix,"nodes.mem"),OSMSegments);
540 amb 95
541 amb 89 /* Write out the segments */
542 amb 58
543 amb 1314 SaveSegmentList(OSMSegments,FileName(dirname,prefix,"segments.mem"));
544 amb 58
545 amb 89 /* Write out the ways */
546 amb 58
547 amb 1314 SaveWayList(OSMWays,FileName(dirname,prefix,"ways.mem"));
548 amb 58
549 amb 549 /* Write out the relations */
550    
551 amb 1314 SaveRelationList(OSMRelations,FileName(dirname,prefix,"relations.mem"));
552 amb 549
553 amb 1595 /* Free the memory (delete the temporary files) */
554    
555     FreeSegmentList(OSMSegments);
556    
557 amb 1317 /* Close the error log file and process the data */
558 amb 804
559 amb 809 if(errorlog)
560 amb 1317 {
561 amb 809 close_errorlog();
562 amb 804
563 amb 1317 if(option_keep)
564     {
565 amb 1362 ErrorLogsX *OSMErrorLogs;
566    
567 amb 1317 printf("\nCreate Error Log\n================\n\n");
568     fflush(stdout);
569    
570 amb 1362 OSMErrorLogs=NewErrorLogList();
571 amb 1317
572 amb 1362 ProcessErrorLogs(OSMErrorLogs,OSMNodes,OSMWays,OSMRelations);
573 amb 1317
574 amb 1362 SortErrorLogsGeographically(OSMErrorLogs);
575    
576     SaveErrorLogs(OSMErrorLogs,FileName(dirname,prefix,"errorlogs.mem"));
577    
578     FreeErrorLogList(OSMErrorLogs);
579 amb 1317 }
580     }
581    
582 amb 1314 /* Free the memory (delete the temporary files) */
583    
584     FreeNodeList(OSMNodes,0);
585     FreeWayList(OSMWays,0);
586     FreeRelationList(OSMRelations,0);
587    
588 amb 1601 printf("\n");
589     fflush(stdout);
590    
591 amb 1398 printf_program_end();
592 amb 982
593 amb 1599 exit(EXIT_SUCCESS);
594 amb 2 }
595 amb 342
596    
597     /*++++++++++++++++++++++++++++++++++++++
598     Print out the usage information.
599    
600     int detail The level of detail to use - 0 = low, 1 = high.
601 amb 490
602     const char *argerr The argument that gave the error (if there is one).
603    
604     const char *err Other error message (if there is one).
605 amb 342 ++++++++++++++++++++++++++++++++++++++*/
606    
607 amb 490 static void print_usage(int detail,const char *argerr,const char *err)
608 amb 342 {
609     fprintf(stderr,
610     "Usage: planetsplitter [--help]\n"
611     " [--dir=<dirname>] [--prefix=<name>]\n"
612 amb 991 #if defined(USE_PTHREADS) && USE_PTHREADS
613     " [--sort-ram-size=<size>] [--sort-threads=<number>]\n"
614     #else
615 amb 452 " [--sort-ram-size=<size>]\n"
616 amb 991 #endif
617 amb 358 " [--tmpdir=<dirname>]\n"
618 amb 953 " [--tagging=<filename>]\n"
619 amb 1598 " [--loggable] [--logtime] [--logmemory]\n"
620 amb 982 " [--errorlog[=<name>]]\n"
621 amb 342 " [--parse-only | --process-only]\n"
622 amb 1167 " [--append] [--keep] [--changes]\n"
623 amb 342 " [--max-iterations=<number>]\n"
624 amb 975 " [--prune-none]\n"
625     " [--prune-isolated=<len>]\n"
626     " [--prune-short=<len>]\n"
627     " [--prune-straight=<len>]\n"
628 amb 1221 " [<filename.osm> ... | <filename.osc> ...\n"
629 amb 1227 " | <filename.pbf> ...\n"
630 amb 1366 " | <filename.o5m> ... | <filename.o5c> ..."
631 amb 1197 #if defined(USE_BZIP2) && USE_BZIP2
632 amb 1227 "\n | <filename.(osm|osc|o5m|o5c).bz2> ..."
633 amb 1197 #endif
634     #if defined(USE_GZIP) && USE_GZIP
635 amb 1227 "\n | <filename.(osm|osc|o5m|o5c).gz> ..."
636 amb 1197 #endif
637 amb 1514 #if defined(USE_XZ) && USE_XZ
638     "\n | <filename.(osm|osc|o5m|o5c).xz> ..."
639     #endif
640 amb 1197 "]\n");
641 amb 342
642 amb 490 if(argerr)
643     fprintf(stderr,
644     "\n"
645     "Error with command line parameter: %s\n",argerr);
646    
647 amb 491 if(err)
648 amb 490 fprintf(stderr,
649     "\n"
650     "Error: %s\n",err);
651    
652 amb 342 if(detail)
653     fprintf(stderr,
654     "\n"
655     "--help Prints this information.\n"
656     "\n"
657     "--dir=<dirname> The directory containing the routing database.\n"
658     "--prefix=<name> The filename prefix for the routing database.\n"
659     "\n"
660 amb 358 "--sort-ram-size=<size> The amount of RAM (in MB) to use for data sorting\n"
661 amb 452 #if SLIM
662     " (defaults to 64MB otherwise.)\n"
663     #else
664     " (defaults to 256MB otherwise.)\n"
665     #endif
666 amb 991 #if defined(USE_PTHREADS) && USE_PTHREADS
667     "--sort-threads=<number> The number of threads to use for data sorting.\n"
668     #endif
669     "\n"
670 amb 342 "--tmpdir=<dirname> The directory name for temporary files.\n"
671 amb 358 " (defaults to the '--dir' option directory.)\n"
672 amb 342 "\n"
673 amb 953 "--tagging=<filename> The name of the XML file containing the tagging rules\n"
674     " (defaults to 'tagging.xml' with '--dir' and\n"
675     " '--prefix' options or the file installed in\n"
676     " '" DATADIR "').\n"
677 amb 342 "\n"
678 amb 519 "--loggable Print progress messages suitable for logging to file.\n"
679 amb 982 "--logtime Print the elapsed time for each processing step.\n"
680 amb 1598 "--logmemory Print the max allocated/mapped memory for each step.\n"
681 amb 810 "--errorlog[=<name>] Log parsing errors to 'error.log' or the given name\n"
682 amb 804 " (the '--dir' and '--prefix' options are applied).\n"
683 amb 519 "\n"
684 amb 1140 "--parse-only Parse the OSM/OSC file(s) and store the results.\n"
685 amb 953 "--process-only Process the stored results from previous option.\n"
686 amb 1120 "--append Parse the OSM file(s) and append to existing results.\n"
687 amb 1167 "--keep Keep the intermediate files after parsing & sorting.\n"
688 amb 1140 "--changes Parse the data as an OSC file and apply the changes.\n"
689 amb 953 "\n"
690 amb 861 "--max-iterations=<number> The number of iterations for finding super-nodes\n"
691     " (defaults to 5).\n"
692 amb 342 "\n"
693 amb 975 "--prune-none Disable the prune options below, they are re-enabled\n"
694     " by adding them to the command line after this option.\n"
695 amb 1117 "--prune-isolated=<len> Remove access from small disconnected segment groups\n"
696 amb 975 " (defaults to removing groups under 500m).\n"
697     "--prune-short=<len> Remove short segments (defaults to removing segments\n"
698     " up to a maximum length of 5m).\n"
699     "--prune-straight=<len> Remove nodes in almost straight highways (defaults to\n"
700     " removing nodes up to 3m offset from a straight line).\n"
701 amb 395 "\n"
702 amb 1227 "<filename.osm>, <filename.osc>, <filename.pbf>, <filename.o5m>, <filename.o5c>\n"
703 amb 1224 " The name(s) of the file(s) to read and parse.\n"
704 amb 1227 " Filenames ending '.pbf' read as PBF, filenames ending\n"
705     " '.o5m' or '.o5c' read as O5M/O5C, others as XML.\n"
706 amb 1197 #if defined(USE_BZIP2) && USE_BZIP2
707     " Filenames ending '.bz2' will be bzip2 uncompressed.\n"
708     #endif
709     #if defined(USE_GZIP) && USE_GZIP
710     " Filenames ending '.gz' will be gzip uncompressed.\n"
711     #endif
712 amb 1514 #if defined(USE_XZ) && USE_XZ
713     " Filenames ending '.xz' will be xz uncompressed.\n"
714     #endif
715 amb 342 "\n"
716     "<transport> defaults to all but can be set to:\n"
717     "%s"
718     "\n"
719     "<highway> can be selected from:\n"
720     "%s"
721     "\n"
722     "<property> can be selected from:\n"
723     "%s",
724     TransportList(),HighwayList(),PropertyList());
725    
726     exit(!detail);
727     }

Properties

Name Value
cvs:description Planet file splitter.