exit(1);
}
-int main(int argc, char **argv)
+struct maptool_params {
+ int zip64;
+ int keep_tmpfiles;
+ int process_nodes;
+ int process_ways;
+ int process_relations;
+ char *protobufdb;
+ char *protobufdb_operation;
+ char *md5file;
+ int start;
+ int end;
+ int output;
+ int o5m;
+ int compression_level;
+ int protobuf;
+ int dump_coordinates;
+ int input;
+ GList *map_handles;
+ FILE* input_file;
+ FILE* rule_file;
+ char *url;
+};
+
+static int
+parse_option(struct maptool_params *p, char **argv, int argc, int *option_index)
{
- FILE *ways=NULL, *way2poi=NULL, *ways_split=NULL,*ways_split_index=NULL,*nodes=NULL,*turn_restrictions=NULL,*graph=NULL,*coastline=NULL,*tilesdir,*coords,*relations=NULL,*boundaries=NULL;
- FILE *files[10];
- FILE *references[10];
+ char *optarg_cp,*attr_name,*attr_value;
+ struct map *handle;
+ struct attr *attrs[10];
+ int pos,c,i;
-#if 0
- char *map=g_strdup(attrmap);
+ static struct option long_options[] = {
+ {"md5", 1, 0, '5'},
+ {"64bit", 0, 0, '6'},
+ {"attr-debug-level", 1, 0, 'a'},
+ {"binfile", 0, 0, 'b'},
+ {"compression-level", 1, 0, 'z'},
+#ifdef HAVE_POSTGRESQL
+ {"db", 1, 0, 'd'},
#endif
- int zipnum,c,start=1,end=99,dump_coordinates=0;
- int keep_tmpfiles=0;
- int process_nodes=1, process_ways=1, process_relations=1;
+ {"dedupe-ways", 0, 0, 'w'},
+ {"dump", 0, 0, 'D'},
+ {"dump-coordinates", 0, 0, 'c'},
+ {"end", 1, 0, 'e'},
+ {"help", 0, 0, 'h'},
+ {"keep-tmpfiles", 0, 0, 'k'},
+ {"nodes-only", 0, 0, 'N'},
+ {"map", 1, 0, 'm'},
+ {"o5m", 0, 0, 'M'},
+ {"plugin", 1, 0, 'p'},
+ {"protobuf", 0, 0, 'P'},
+ {"start", 1, 0, 's'},
+ {"input-file", 1, 0, 'i'},
+ {"rule-file", 1, 0, 'r'},
+ {"ignore-unknown", 0, 0, 'n'},
+ {"url", 1, 0, 'u'},
+ {"ways-only", 0, 0, 'W'},
+ {"slice-size", 1, 0, 'S'},
+ {"unknown-country", 0, 0, 'U'},
+ {0, 0, 0, 0}
+ };
+ c = getopt_long (argc, argv, "5:6B:DMNO:PS:Wa:bc"
+#ifdef HAVE_POSTGRESQL
+ "d:"
+#endif
+ "e:hi:knm:p:r:s:wu:z:U", long_options, option_index);
+ if (c == -1)
+ return 1;
+ switch (c) {
+ case '5':
+ p->md5file=optarg;
+ break;
+ case '6':
+ p->zip64=1;
+ break;
+ case 'B':
+ p->protobufdb=optarg;
+ break;
+ case 'D':
+ p->output=1;
+ break;
+ case 'M':
+ p->o5m=1;
+ break;
+ case 'N':
+ p->process_ways=0;
+ break;
+ case 'R':
+ p->process_relations=0;
+ break;
+ case 'O':
+ p->protobufdb_operation=optarg;
+ p->output=1;
+ break;
+ case 'P':
+ p->protobuf=1;
+ break;
+ case 'S':
+ slice_size=atoll(optarg);
+ break;
+ case 'W':
+ p->process_nodes=0;
+ break;
+ case 'U':
+ unknown_country=1;
+ break;
+ case 'a':
+ attr_debug_level=atoi(optarg);
+ break;
+ case 'b':
+ p->input=1;
+ break;
+ case 'c':
+ p->dump_coordinates=1;
+ break;
+#ifdef HAVE_POSTGRESQL
+ case 'd':
+ p->dbstr=optarg;
+ break;
+#endif
+ case 'e':
+ p->end=atoi(optarg);
+ break;
+ case 'h':
+ return 2;
+ case 'm':
+ optarg_cp=g_strdup(optarg);
+ pos=0;
+ i=0;
+ attr_name=g_strdup(optarg);
+ attr_value=g_strdup(optarg);
+ while (i < 9 && attr_from_line(optarg_cp, NULL, &pos, attr_value, attr_name)) {
+ attrs[i]=attr_new_from_text(attr_name,attr_value);
+ if (attrs[i]) {
+ i++;
+ } else {
+ fprintf(stderr,"Failed to convert %s=%s to attribute\n",attr_name,attr_value);
+ }
+ attr_value=g_strdup(optarg);
+ }
+ attrs[i++]=NULL;
+ g_free(attr_value);
+ g_free(optarg_cp);
+ handle=map_new(NULL, attrs);
+ if (! handle) {
+ fprintf(stderr,"Failed to create map from attributes\n");
+ exit(1);
+ }
+ p->map_handles=g_list_append(p->map_handles,handle);
+ break;
+ case 'n':
+ fprintf(stderr,"I will IGNORE unknown types\n");
+ ignore_unkown=1;
+ break;
+ case 'k':
+ fprintf(stderr,"I will KEEP tmp files\n");
+ p->keep_tmpfiles=1;
+ break;
+ case 'p':
+ add_plugin(optarg);
+ break;
+ case 's':
+ p->start=atoi(optarg);
+ break;
+ case 'w':
+ dedupe_ways_hash=g_hash_table_new(NULL, NULL);
+ break;
+ case 'i':
+ p->input_file = fopen( optarg, "r" );
+ if (p->input_file == NULL )
+ {
+ fprintf( stderr, "\nInput file (%s) not found\n", optarg );
+ exit( -1 );
+ }
+ break;
+ case 'r':
+ p->rule_file = fopen( optarg, "r" );
+ if (p->rule_file == NULL )
+ {
+ fprintf( stderr, "\nRule file (%s) not found\n", optarg );
+ exit( -1 );
+ }
+ break;
+ case 'u':
+ p->url=optarg;
+ break;
#ifdef HAVE_ZLIB
- int compression_level=9;
-#else
- int compression_level=0;
+ case 'z':
+ p->compression_level=atoi(optarg);
+ break;
#endif
- int zip64=0;
- int output=0;
- int input=0;
- int protobuf=0;
- int o5m=0;
- int f,pos;
- char *result,*optarg_cp,*attr_name,*attr_value;
- char *protobufdb=NULL,*protobufdb_operation=NULL,*md5file=NULL;
+ case '?':
+ default:
+ return 0;
+ }
+ return 3;
+}
+
+int main(int argc, char **argv)
+{
+ FILE *ways=NULL, *way2poi=NULL, *ways_split=NULL,*ways_split_index=NULL,*nodes=NULL,*turn_restrictions=NULL,*graph=NULL,*coastline=NULL,*tilesdir,*coords,*relations=NULL,*boundaries=NULL;
+ FILE *files[10];
+ FILE *references[10];
+ struct maptool_params p;
+ int zipnum;
+ int f;
+ char *result;
#ifdef HAVE_POSTGRESQL
char *dbstr=NULL;
#endif
FILE* rule_file = NULL; // external rule file
- struct attr *attrs[10];
- GList *map_handles=NULL;
- struct map *handle;
struct maptool_osm osm;
#if 0
char *suffixes[]={"m0l0", "m0l1","m0l2","m0l3","m0l4","m0l5","m0l6"};
main_init(argv[0]);
struct zip_info *zip_info=NULL;
int suffix_start=0;
+ int option_index = 0;
char *timestamp=current_to_iso8601();
- char *url=NULL;
+
#ifndef HAVE_GLIB
_g_slice_thread_init_nomessage();
#endif
+ memset(&p, 0, sizeof(p));
+#ifdef HAVE_ZLIB
+ p.compression_level=9;
+#endif
+ p.start=1;
+ p.end=99;
+ p.input_file=stdin;
+ p.process_nodes=1;
+ p.process_ways=1;
+ p.process_relations=1;
while (1) {
-#if 0
- int this_option_optind = optind ? optind : 1;
-#endif
- int option_index = 0;
- static struct option long_options[] = {
- {"md5", 1, 0, '5'},
- {"64bit", 0, 0, '6'},
- {"attr-debug-level", 1, 0, 'a'},
- {"binfile", 0, 0, 'b'},
- {"compression-level", 1, 0, 'z'},
-#ifdef HAVE_POSTGRESQL
- {"db", 1, 0, 'd'},
-#endif
- {"dedupe-ways", 0, 0, 'w'},
- {"dump", 0, 0, 'D'},
- {"dump-coordinates", 0, 0, 'c'},
- {"end", 1, 0, 'e'},
- {"help", 0, 0, 'h'},
- {"keep-tmpfiles", 0, 0, 'k'},
- {"nodes-only", 0, 0, 'N'},
- {"map", 1, 0, 'm'},
- {"o5m", 0, 0, 'M'},
- {"plugin", 1, 0, 'p'},
- {"protobuf", 0, 0, 'P'},
- {"start", 1, 0, 's'},
- {"input-file", 1, 0, 'i'},
- {"rule-file", 1, 0, 'r'},
- {"ignore-unknown", 0, 0, 'n'},
- {"url", 1, 0, 'u'},
- {"ways-only", 0, 0, 'W'},
- {"slice-size", 1, 0, 'S'},
- {"unknown-country", 0, 0, 'U'},
- {0, 0, 0, 0}
- };
- c = getopt_long (argc, argv, "5:6B:DMNO:PS:Wa:bc"
-#ifdef HAVE_POSTGRESQL
- "d:"
-#endif
- "e:hi:knm:p:r:s:wu:z:U", long_options, &option_index);
- if (c == -1)
- break;
- switch (c) {
- case '5':
- md5file=optarg;
- break;
- case '6':
- zip64=1;
- break;
- case 'B':
- protobufdb=optarg;
- break;
- case 'D':
- output=1;
- break;
- case 'M':
- o5m=1;
- break;
- case 'N':
- process_ways=0;
- break;
- case 'R':
- process_relations=0;
- break;
- case 'O':
- protobufdb_operation=optarg;
- output=1;
- break;
- case 'P':
- protobuf=1;
- break;
- case 'S':
- slice_size=atoll(optarg);
- break;
- case 'W':
- process_nodes=0;
- break;
- case 'U':
- unknown_country=1;
- break;
- case 'a':
- attr_debug_level=atoi(optarg);
- break;
- case 'b':
- input=1;
- break;
- case 'c':
- dump_coordinates=1;
- break;
-#ifdef HAVE_POSTGRESQL
- case 'd':
- dbstr=optarg;
- break;
-#endif
- case 'e':
- end=atoi(optarg);
+ int parse_result=parse_option(&p, argv, argc, &option_index);
+ if (!parse_result) {
+ usage(stderr);
+ exit(1);
+ }
+ if (parse_result == 1)
break;
- case 'h':
+ if (parse_result == 2) {
usage(stdout);
- break;
- case 'm':
- optarg_cp=g_strdup(optarg);
- pos=0;
- i=0;
- attr_name=g_strdup(optarg);
- attr_value=g_strdup(optarg);
- while (i < 9 && attr_from_line(optarg_cp, NULL, &pos, attr_value, attr_name)) {
- attrs[i]=attr_new_from_text(attr_name,attr_value);
- if (attrs[i]) {
- i++;
- } else {
- fprintf(stderr,"Failed to convert %s=%s to attribute\n",attr_name,attr_value);
- }
- attr_value=g_strdup(optarg);
- }
- attrs[i++]=NULL;
- g_free(attr_value);
- g_free(optarg_cp);
- handle=map_new(NULL, attrs);
- if (! handle) {
- fprintf(stderr,"Failed to create map from attributes\n");
- exit(1);
- }
- map_handles=g_list_append(map_handles,handle);
- break;
- case 'n':
- fprintf(stderr,"I will IGNORE unknown types\n");
- ignore_unkown=1;
- break;
- case 'k':
- fprintf(stderr,"I will KEEP tmp files\n");
- keep_tmpfiles=1;
- break;
- case 'p':
- add_plugin(optarg);
- break;
- case 's':
- start=atoi(optarg);
- break;
- case 'w':
- dedupe_ways_hash=g_hash_table_new(NULL, NULL);
- break;
- case 'i':
- input_file = fopen( optarg, "r" );
- if ( input_file == NULL )
- {
- fprintf( stderr, "\nInput file (%s) not found\n", optarg );
- exit( -1 );
- }
- break;
- case 'r':
- rule_file = fopen( optarg, "r" );
- if ( rule_file == NULL )
- {
- fprintf( stderr, "\nRule file (%s) not found\n", optarg );
- exit( -1 );
- }
- break;
- case 'u':
- url=optarg;
- break;
-#ifdef HAVE_ZLIB
- case 'z':
- compression_level=atoi(optarg);
- break;
-#endif
- case '?':
- default:
- fprintf(stderr,"c=%d\n", c);
- usage(stderr);
+ exit(0);
}
-
}
- if (optind != argc-(output == 1 ? 0:1))
+ if (optind != argc-(p.output == 1 ? 0:1))
usage(stderr);
result=argv[optind];
// initialize plugins and OSM mappings
maptool_init(rule_file);
- if (protobufdb_operation) {
- osm_protobufdb_load(input_file, protobufdb);
+ if (p.protobufdb_operation) {
+ osm_protobufdb_load(input_file, p.protobufdb);
return 0;
}
// input from an OSM file
- if (input == 0) {
- if (start == 1) {
+ if (p.input == 0) {
+ if (p.start == 1) {
unlink("coords.tmp");
- if (process_ways)
+ if (p.process_ways)
ways=tempfile(suffix,"ways",1);
- if (process_nodes)
+ if (p.process_nodes)
nodes=tempfile(suffix,"nodes",1);
- if (process_ways && process_nodes) {
+ if (p.process_ways && p.process_nodes) {
turn_restrictions=tempfile(suffix,"turn_restrictions",1);
if(doway2poi)
way2poi=tempfile(suffix,"way2poi",1);
}
- if (process_relations)
+ if (p.process_relations)
boundaries=tempfile(suffix,"boundaries",1);
phase=1;
fprintf(stderr,"PROGRESS: Phase 1: collecting data\n");
map_collect_data_osm_db(dbstr,&osm);
else
#endif
- if (map_handles) {
+ if (p.map_handles) {
GList *l;
- phase1_map(map_handles,ways,nodes);
- l=map_handles;
+ phase1_map(p.map_handles,ways,nodes);
+ l=p.map_handles;
while (l) {
map_destroy(l->data);
l=g_list_next(l);
}
}
- else if (protobuf)
+ else if (p.protobuf)
map_collect_data_osm_protobuf(input_file,&osm);
- else if (o5m)
+ else if (p.o5m)
map_collect_data_osm_o5m(input_file,&osm);
else
map_collect_data_osm(input_file,&osm);
fclose(way2poinew);
tempfile_rename(suffix,"way2poi_resolved_new","way2poi_resolved");
way2poi=tempfile(suffix,"way2poi_resolved",0);
- if (first && !keep_tmpfiles)
+ if (first && !p.keep_tmpfiles)
tempfile_unlink(suffix,"way2poi");
}
first=0;
if (boundaries)
fclose(boundaries);
}
- if (end == 1)
+ if (p.end == 1)
exit(0);
- if (start == 2) {
+ if (p.start == 2) {
load_buffer("coords.tmp",&node_buffer,0, slice_size);
}
- if (start <= 2) {
- if (process_ways) {
+ if (p.start <= 2) {
+ if (p.process_ways) {
ways=tempfile(suffix,"ways",0);
phase=2;
fprintf(stderr,"PROGRESS: Phase 2: finding intersections\n");
ways=tempfile(suffix,"ways_to_resolve",0);
}
}
- if(!keep_tmpfiles)
+ if(!p.keep_tmpfiles)
tempfile_unlink(suffix,"ways");
tempfile_unlink(suffix,"ways_to_resolve");
} else
node_buffer.base=NULL;
node_buffer.malloced=0;
node_buffer.size=0;
- if (end == 2)
+ if (p.end == 2)
exit(0);
} else {
ways_split=tempfile(suffix,"ways_split",0);
fclose(coastline);
}
#endif
- if (start <= 3) {
+ if (p.start <= 3) {
fprintf(stderr,"PROGRESS: Phase 3: sorting countries, generating turn restrictions\n");
- sort_countries(keep_tmpfiles);
- if (process_relations) {
+ sort_countries(p.keep_tmpfiles);
+ if (p.process_relations) {
#if 0
boundaries=tempfile(suffix,"boundaries",0);
ways_split=tempfile(suffix,"ways_split",0);
fclose(coords);
fclose(relations);
fclose(turn_restrictions);
- if(!keep_tmpfiles)
+ if(!p.keep_tmpfiles)
tempfile_unlink(suffix,"turn_restrictions");
}
}
- if(!keep_tmpfiles)
+ if(!p.keep_tmpfiles)
tempfile_unlink(suffix,"ways_split_index");
}
- if (end == 3)
+ if (p.end == 3)
exit(0);
- if (output == 1) {
+ if (p.output == 1) {
fprintf(stderr,"PROGRESS: Phase 4: dumping\n");
- if (process_nodes) {
+ if (p.process_nodes) {
nodes=tempfile(suffix,"nodes",0);
if (nodes) {
dump(nodes);
fclose(nodes);
}
}
- if (process_ways) {
+ if (p.process_ways) {
ways_split=tempfile(suffix,"ways_split",0);
if (ways_split) {
dump(ways_split);
fclose(ways_split);
}
}
- if (process_relations) {
+ if (p.process_relations) {
relations=tempfile(suffix,"relations",0);
fprintf(stderr,"Relations=%p\n",relations);
if (relations) {
}
for (i = suffix_start ; i < suffix_count ; i++) {
suffix=suffixes[i];
- if (start <= 4) {
+ if (p.start <= 4) {
phase=3;
if (i == suffix_start) {
zip_info=zip_new();
- zip_set_zip64(zip_info, zip64);
+ zip_set_zip64(zip_info, p.zip64);
zip_set_timestamp(zip_info, timestamp);
}
zipnum=zip_get_zipnum(zip_info);
} else {
for (f = 0 ; f < 3 ; f++)
files[f]=NULL;
- if (process_relations)
+ if (p.process_relations)
files[0]=tempfile(suffix,"relations",0);
- if (process_ways)
+ if (p.process_ways)
files[1]=tempfile(suffix,"ways_split",0);
- if (process_nodes)
+ if (p.process_nodes)
files[2]=tempfile(suffix,"nodes",0);
phase4(files,3,0,suffix,tilesdir,zip_info);
fclose(tilesdir);
zip_set_zipnum(zip_info,zipnum);
}
- if (end == 4)
+ if (p.end == 4)
exit(0);
if (zip_info) {
zip_destroy(zip_info);
zip_info=NULL;
}
- if (start <= 5) {
+ if (p.start <= 5) {
phase=4;
fprintf(stderr,"PROGRESS: Phase 5: assembling map %s\n",suffix);
if (i == suffix_start) {
char *zipdir=tempfile_name("zipdir","");
char *zipindex=tempfile_name("index","");
zip_info=zip_new();
- zip_set_zip64(zip_info, zip64);
+ zip_set_zip64(zip_info, p.zip64);
zip_set_timestamp(zip_info, timestamp);
zip_set_maxnamelen(zip_info, 14+strlen(suffixes[0]));
- zip_set_compression_level(zip_info, compression_level);
- if (md5file)
+ zip_set_compression_level(zip_info, p.compression_level);
+ if (p.md5file)
zip_set_md5(zip_info, 1);
zip_open(zip_info, result, zipdir, zipindex);
- if (url) {
+ if (p.url) {
map_information_attrs[1].type=attr_url;
- map_information_attrs[1].u.str=url;
+ map_information_attrs[1].u.str=p.url;
}
index_init(zip_info, 1);
}
files[f]=NULL;
references[f]=NULL;
}
- if (process_relations)
+ if (p.process_relations)
files[0]=tempfile(suffix,"relations",0);
- if (process_ways) {
+ if (p.process_ways) {
files[1]=tempfile(suffix,"ways_split",0);
references[1]=tempfile(suffix,"ways_split_ref",1);
}
- if (process_nodes)
+ if (p.process_nodes)
files[2]=tempfile(suffix,"nodes",0);
fprintf(stderr,"Slice %d\n",i);
fclose(references[f]);
}
}
- if(!keep_tmpfiles) {
+ if(!p.keep_tmpfiles) {
tempfile_unlink(suffix,"relations");
tempfile_unlink(suffix,"nodes");
tempfile_unlink(suffix,"ways_split");
zip_write_index(zip_info);
zip_write_directory(zip_info);
zip_close(zip_info);
- if (md5file && zip_get_md5(zip_info, md5_data)) {
- FILE *md5=fopen(md5file,"w");
+ if (p.md5file && zip_get_md5(zip_info, md5_data)) {
+ FILE *md5=fopen(p.md5file,"w");
int i;
for (i = 0 ; i < 16 ; i++)
fprintf(md5,"%02x",md5_data[i]);
fprintf(md5,"\n");
fclose(md5);
}
- if (!keep_tmpfiles) {
+ if (!p.keep_tmpfiles) {
remove_countryfiles();
tempfile_unlink("index","");
tempfile_unlink("zipdir","");