diff options
Diffstat (limited to 'navit/maptool/osm.c')
| -rw-r--r-- | navit/maptool/osm.c | 63 |
1 files changed, 35 insertions, 28 deletions
diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c index 131d7f0eb..f30b06365 100644 --- a/navit/maptool/osm.c +++ b/navit/maptool/osm.c @@ -120,10 +120,16 @@ char *attr_strings[attr_string_last]; char *osm_types[]={"unknown","node","way","relation"}; -#define REF_MARKER (1 << 30) -#define IS_REF(c) ((c).x == REF_MARKER) -#define GET_REF(c) ((unsigned)(c).y) -#define SET_REF(c,ref) do { (c).x = REF_MARKER; (c).y = ref ; } while(0) +/* + * These macros are designed to handle maptool internal node id reference representation. This representation does not leak + * to binfile, so it's safe to change it without breaking binfile binary compatibility. + * Currently it keeps low 31 bits in y coordinate and up to 30 high order bits in x coordinate, allowing for 61 bit osm node id in total. + */ +#define REF_MARKER (1ull << 30) +#define REF_MASK (3ull << 30) +#define IS_REF(c) (((c).x & REF_MASK)==REF_MARKER) +#define GET_REF(c) ((((osmid)(c).x & ~REF_MARKER)<<31) + (c).y ) +#define SET_REF(c,ref) do { (c).x = REF_MARKER | ((osmid)(ref)>>31); (c).y = (osmid)(ref) & 0x7fffffffull; } while(0) /* Table of country codes with possible is_in spellings. * Note: If you update this list, check also country array in country.c @@ -397,7 +403,6 @@ struct country_table { static char *attrmap={ "n *=* point_unkn\n" -// "n Annehmlichkeit=Hochsitz poi_hunting_stand\n" "? addr:housenumber=* house_number\n" "? aeroway=aerodrome poi_airport\n" "? aeroway=airport poi_airport\n" @@ -508,7 +513,7 @@ static char *attrmap={ "? shop=car_repair poi_repair_service\n" "? shop=clothes poi_shop_apparel\n" "? shop=convenience poi_shop_grocery\n" - "? shop=drogist poi_shop_drugstore\n" + "? shop=chemist poi_shop_drugstore\n" "? shop=florist poi_shop_florist\n" "? shop=fruit poi_shop_fruit\n" "? shop=furniture poi_shop_furniture\n" @@ -793,7 +798,7 @@ build_attrmap_line(char *line) kvl=NULL; if (!(idx=(int)(long)g_hash_table_lookup(attr_hash, kv))) { idx=attr_present_count++; - g_hash_table_insert(attr_hash, kv, (gpointer)(long)idx); + g_hash_table_insert(attr_hash, kv, (gpointer)(long long)idx); } attr_mapping=g_realloc(attr_mapping, sizeof(struct attr_mapping)+(attr_mapping_count+1)*sizeof(int)); attr_mapping->attr_present_idx[attr_mapping_count++]=idx; @@ -926,7 +931,7 @@ item_bin_get_nodeid(struct item_bin *ib) osmid item_bin_get_wayid(struct item_bin *ib) { - long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); + unsigned long long *ret=item_bin_get_attr(ib, attr_osm_wayid, NULL); if (ret) return *ret; return 0; @@ -1325,8 +1330,9 @@ node_buffer_to_hash(void) { int i,count=node_buffer.size/sizeof(struct node_item); struct node_item *ni=(struct node_item *)node_buffer.base; + for (i = 0 ; i < count ; i++) - g_hash_table_insert(node_hash, (gpointer)(long)(ni[i].id), (gpointer)(long)i); + g_hash_table_insert(node_hash, (gpointer)(long long)(ni[i].nd_id), (gpointer)(long long)i); } void @@ -1374,23 +1380,24 @@ osm_add_node(osmid id, double lat, double lon) osmid_attr_value=id; current_node=allocate_node_item_in_buffer(); - current_node->id=id; + dbg_assert(id < ((2ull<<NODE_ID_BITS)-1)); + current_node->nd_id=id; current_node->ref_way=0; current_node->c.x=lon*6371000.0*M_PI/180; current_node->c.y=log(tan(M_PI_4+lat*M_PI/360))*6371000.0; if (! node_hash) { - if (current_node->id > id_last_node) { - id_last_node=current_node->id; + if (current_node->nd_id > id_last_node) { + id_last_node=current_node->nd_id; } else { fprintf(stderr,"INFO: Nodes out of sequence (new " OSMID_FMT " vs old " OSMID_FMT "), adding hash\n", - (osmid)current_node->id, id_last_node); + (osmid)current_node->nd_id, id_last_node); node_hash=g_hash_table_new(NULL, NULL); node_buffer_to_hash(); } } else - if (!g_hash_table_lookup(node_hash, (gpointer)(long)(current_node->id))) - g_hash_table_insert(node_hash, (gpointer)(long)(current_node->id), - (gpointer)(long)(current_node-(struct node_item *)node_buffer.base)); + if (!g_hash_table_lookup(node_hash, (gpointer)(long long)(current_node->nd_id))) + g_hash_table_insert(node_hash, (gpointer)(long long)(current_node->nd_id), + (gpointer)(long long)(current_node-(struct node_item *)node_buffer.base)); else { remove_last_node_item_from_buffer(); nodeid=0; @@ -1415,21 +1422,21 @@ node_item_find_index_in_ordered_list(osmid id) long long node_count=node_buffer.size/sizeof(struct node_item); long long search_step=node_count>4 ? node_count/4 : 1; long long search_index=node_count/2; - if (node_buffer_base[0].id > id) + if (node_buffer_base[0].nd_id > id) return -1; - if (node_buffer_base[node_count-1].id < id) + if (node_buffer_base[node_count-1].nd_id < id) return -1; - while (node_buffer_base[search_index].id != id) { + while (node_buffer_base[search_index].nd_id != id) { #if 0 fprintf(stderr,"search_index=%d node_count=%d search_step=%d id=%d node_buffer_base[search_index].id=%d\n", search_index, node_count, search_step, id, node_buffer_base[search_index].id); #endif - if (node_buffer_base[search_index].id < id) { + if (node_buffer_base[search_index].nd_id < id) { search_index+=search_step; if (search_step == 1) { if (search_index >= node_count) return -1; - if (node_buffer_base[search_index].id > id) + if (node_buffer_base[search_index].nd_id > id) return -1; } else { if (search_index >= node_count) @@ -1440,7 +1447,7 @@ node_item_find_index_in_ordered_list(osmid id) if (search_step == 1) { if (search_index < 0) return -1; - if (node_buffer_base[search_index].id < id) + if (node_buffer_base[search_index].nd_id < id) return -1; } else { if (search_index < 0) @@ -1461,7 +1468,7 @@ node_item_get(osmid id) if (node_hash) { // Use g_hash_table_lookup_extended instead of g_hash_table_lookup // to distinguish a key with a value 0 from a missing key. - if (!g_hash_table_lookup_extended (node_hash, (gpointer)(long)(id), NULL, + if (!g_hash_table_lookup_extended (node_hash, (gpointer)(id), NULL, (gpointer)&result_index)) { result_index=-1; } @@ -1755,9 +1762,9 @@ osm_end_way(struct maptool_osm *osm) return; if (dedupe_ways_hash) { - if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long)wayid)) + if (g_hash_table_lookup(dedupe_ways_hash, (gpointer)(long long)wayid)) return; - g_hash_table_insert(dedupe_ways_hash, (gpointer)(long)wayid, (gpointer)1); + g_hash_table_insert(dedupe_ways_hash, (gpointer)(long long)wayid, (gpointer)1); } count=attr_longest_match(attr_mapping_way, attr_mapping_way_count, types, sizeof(types)/sizeof(enum item_type)); @@ -3002,8 +3009,8 @@ write_item_way_subsection_index(FILE *out, FILE *out_index, FILE *out_graph, str idx[0]=item_bin_get_wayid(orig); idx[1]=ftello(out); if (way_hash) { - if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long)idx[0], NULL, NULL))) - g_hash_table_insert(way_hash, (gpointer)(long)idx[0], (gpointer)(long)idx[1]); + if (!(g_hash_table_lookup_extended(way_hash, (gpointer)(long long)idx[0], NULL, NULL))) + g_hash_table_insert(way_hash, (gpointer)(long long)idx[0], (gpointer)(long long)idx[1]); } else { if (!last_id || *last_id != idx[0]) dbg_assert(fwrite(idx, sizeof(idx), 1, out_index)==1); @@ -3067,6 +3074,7 @@ resolve_ways(FILE *in, FILE *out) c[i].x=ni->c.x; c[i].y=ni->c.y; } + } item_bin_write(ib,out); } @@ -3122,7 +3130,6 @@ map_resolve_coords_and_split_at_intersections(FILE *in, FILE *out, FILE *out_ind struct item_bin *ib; struct node_item *ni; long long last_id=0; - processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0; sig_alrm(0); while ((ib=read_item(in))) { |
