diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-07-10 12:22:48 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-07-10 12:22:48 +0000 |
commit | a531a612ae132bab955db40b88ecbd323e70dd6d (patch) | |
tree | 1ceb60687a4224c4f7eb5d67d49882274a45fcfd | |
parent | 792166c40052894e1fb289d3a23d7fe8f0717312 (diff) | |
download | navit-svn-a531a612ae132bab955db40b88ecbd323e70dd6d.tar.gz |
Add:maptool:Moved town to country resolution to a separate phase
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4616 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r-- | navit/attr_def.h | 1 | ||||
-rw-r--r-- | navit/maptool/itembin.c | 17 | ||||
-rw-r--r-- | navit/maptool/maptool.c | 15 | ||||
-rw-r--r-- | navit/maptool/maptool.h | 3 | ||||
-rw-r--r-- | navit/maptool/osm.c | 83 |
5 files changed, 83 insertions, 36 deletions
diff --git a/navit/attr_def.h b/navit/attr_def.h index 9e7bbdd2..600bdd98 100644 --- a/navit/attr_def.h +++ b/navit/attr_def.h @@ -346,6 +346,7 @@ ATTR(dbus_destination) ATTR(dbus_path) ATTR(dbus_interface) ATTR(dbus_method) +ATTR(osm_is_in) ATTR2(0x0003ffff,type_string_end) ATTR2(0x00040000,type_special_begin) ATTR(order) diff --git a/navit/maptool/itembin.c b/navit/maptool/itembin.c index b7e0c079..35f90707 100644 --- a/navit/maptool/itembin.c +++ b/navit/maptool/itembin.c @@ -154,6 +154,23 @@ item_bin_add_attr(struct item_bin *ib, struct attr *attr) } void +item_bin_remove_attr(struct item_bin *ib, void *ptr) +{ + unsigned char *s=(unsigned char *)ib; + unsigned char *e=s+(ib->len+1)*4; + s+=sizeof(struct item_bin)+ib->clen*4; + while (s < e) { + struct attr_bin *ab=(struct attr_bin *)s; + s+=(ab->len+1)*4; + if ((void *)(ab+1) == ptr) { + ib->len-=ab->len+1; + memmove(ab,s,e-s); + return; + } + } +} + +void item_bin_add_attr_int(struct item_bin *ib, enum attr_type type, int val) { struct attr attr; diff --git a/navit/maptool/maptool.c b/navit/maptool/maptool.c index a8ff840a..859334b2 100644 --- a/navit/maptool/maptool.c +++ b/navit/maptool/maptool.c @@ -364,8 +364,10 @@ osm_collect_data(struct maptool_params *p, char *suffix) unlink("coords.tmp"); if (p->process_ways) p->osm.ways=tempfile(suffix,"ways",1); - if (p->process_nodes) + if (p->process_nodes) { p->osm.nodes=tempfile(suffix,"nodes",1); + p->osm.towns=tempfile(suffix,"towns",1); + } if (p->process_ways && p->process_nodes) { p->osm.turn_restrictions=tempfile(suffix,"turn_restrictions",1); if(doway2poi) { @@ -408,6 +410,8 @@ osm_collect_data(struct maptool_params *p, char *suffix) fclose(p->osm.poly2poi); if (p->osm.line2poi) fclose(p->osm.line2poi); + if (p->osm.towns) + fclose(p->osm.towns); } int debug_ref=0; @@ -806,6 +810,15 @@ int main(int argc, char **argv) } phase++; if (p.start <= phase && p.end >= phase) { + FILE *towns=tempfile(suffix,"towns",0); + fprintf(stderr,"PROGRESS: Phase %d: assinging towns to countries\n",phase); + osm_process_towns(towns); + fclose(towns); + if(!p.keep_tmpfiles) + tempfile_unlink(suffix,"towns"); + } + phase++; + if (p.start <= phase && p.end >= phase) { fprintf(stderr,"PROGRESS: Phase %d: sorting countries\n",phase); sort_countries(p.keep_tmpfiles); p.countries_loaded=1; diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h index 7c498e95..0886dde0 100644 --- a/navit/maptool/maptool.h +++ b/navit/maptool/maptool.h @@ -181,6 +181,7 @@ struct attr_bin * item_bin_get_attr_bin_last(struct item_bin *ib); void item_bin_add_attr_longlong(struct item_bin *ib, enum attr_type type, long long val); void item_bin_add_attr_string(struct item_bin *ib, enum attr_type type, char *str); void item_bin_add_attr_range(struct item_bin *ib, enum attr_type type, short min, short max); +void item_bin_remove_attr(struct item_bin *ib, void *ptr); void item_bin_write(struct item_bin *ib, FILE *out); struct item_bin *item_bin_dup(struct item_bin *ib); void item_bin_write_range(struct item_bin *ib, FILE *out, int min, int max); @@ -241,6 +242,7 @@ struct maptool_osm { FILE *ways; FILE *line2poi; FILE *poly2poi; + FILE *towns; }; void osm_add_tag(char *k, char *v); @@ -263,6 +265,7 @@ FILE *resolve_ways_file(FILE *in, char *suffix, char *filename); void process_way2poi(FILE *in, FILE *out, int type); int map_find_intersections(FILE *in, FILE *out, FILE *out_index, FILE *out_graph, FILE *out_coastline, int final); void write_countrydir(struct zip_info *zip_info); +void osm_process_towns(FILE *in); void load_countries(void); void remove_countryfiles(void); void osm_init(FILE*); diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c index 1b4a628d..31ac7a61 100644 --- a/navit/maptool/osm.c +++ b/navit/maptool/osm.c @@ -1630,10 +1630,9 @@ osm_end_way(struct maptool_osm *osm) void osm_end_node(struct maptool_osm *osm) { - int conflict,count,i; + int count,i; char *postal; enum item_type types[10]; - struct country_table *result=NULL, *lookup; struct item_bin *item_bin; in_node=0; @@ -1646,7 +1645,6 @@ osm_end_node(struct maptool_osm *osm) } dbg_assert(count < 10); for (i = 0 ; i < count ; i++) { - conflict=0; if (types[i] == type_none) continue; if (ignore_unkown && (types[i] == type_street_unkn || types[i] == type_point_unkn)) @@ -1673,43 +1671,58 @@ osm_end_node(struct maptool_osm *osm) item_bin_add_attr_string(item_bin, item_is_town(*item_bin) ? attr_town_postal : attr_postal, postal); } item_bin_write(item_bin,osm->nodes); - if (item_is_town(*item_bin) && attr_strings[attr_string_label]) { - char *tok,*buf=is_in_buffer; - if (!buf[0] && unknown_country) - strcpy(is_in_buffer, "Unknown"); - while ((tok=strtok(buf, ",;"))) { - while (*tok==' ') - tok++; - lookup=g_hash_table_lookup(country_table_hash,tok); - if (lookup) { - if (result && result->countryid != lookup->countryid) { - osm_warning("node",nodeid,0,"conflict for %s %s country %d vs %d\n", attr_strings[attr_string_label], debug_attr_buffer, lookup->countryid, result->countryid); - conflict=1; - } - result=lookup; + if (item_is_town(*item_bin) && attr_strings[attr_string_label] && osm->towns) { + item_bin=init_item(item_bin->type); + item_bin_add_coord(item_bin, &ni->c, 1); + item_bin_add_attr_string(item_bin, attr_osm_is_in, is_in_buffer); + item_bin_add_attr_string(item_bin, attr_town_postal, postal); + item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); + item_bin_add_attr_string(item_bin, attr_town_name, attr_strings[attr_string_label]); + item_bin_write(item_bin, osm->towns); + } + } + processed_nodes_out++; + attr_longest_match_clear(); +} + +void +osm_process_towns(FILE *in) +{ + struct item_bin *ib; + + while ((ib=read_item(in))) { + struct country_table *result=NULL, *lookup; + char *tok,*is_in=item_bin_get_attr(ib, attr_osm_is_in, NULL), *buf=g_strdup(is_in); + int conflict; + if (!buf && unknown_country) + buf=g_strdup("Unknown"); + while ((tok=strtok(buf, ",;"))) { + while (*tok==' ') + tok++; + lookup=g_hash_table_lookup(country_table_hash,tok); + if (lookup) { + if (result && result->countryid != lookup->countryid) { + osm_warning("node",nodeid,0,"conflict for %s %s country %d vs %d\n", attr_strings[attr_string_label], debug_attr_buffer, lookup->countryid, result->countryid); + conflict=1; } - buf=NULL; + result=lookup; } - if (result) { - if (!result->file) { - char *name=g_strdup_printf("country_%d.bin.unsorted", result->countryid); - result->file=fopen(name,"wb"); - g_free(name); - } - if (result->file) { - item_bin=init_item(item_bin->type); - item_bin_add_coord(item_bin, &ni->c, 1); - item_bin_add_attr_string(item_bin, attr_town_postal, postal); - item_bin_add_attr_string(item_bin, attr_county_name, attr_strings[attr_string_county_name]); - item_bin_add_attr_string(item_bin, attr_town_name, attr_strings[attr_string_label]); - item_bin_write_match(item_bin, attr_town_name, attr_town_name_match, result->file); - } - + buf=NULL; + } + if (result) { + if (!result->file) { + char *name=g_strdup_printf("country_%d.bin.unsorted", result->countryid); + result->file=fopen(name,"wb"); + g_free(name); + } + if (result->file) { + if (is_in) + item_bin_remove_attr(ib, is_in); + item_bin_write_match(ib, attr_town_name, attr_town_name_match, result->file); } } + g_free(buf); } - processed_nodes_out++; - attr_longest_match_clear(); } void |