diff options
| author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-07-11 13:22:47 +0000 |
|---|---|---|
| committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-07-11 13:22:47 +0000 |
| commit | a429046695a0f8a23ed4e50eaf41d3bbecb427e4 (patch) | |
| tree | 6858313b45dbb159869e9f3cf39506ca5f609000 /navit/maptool/boundaries.c | |
| parent | 4e42fdd85cfb47569d19cbf9017ba95a86fb54b3 (diff) | |
| download | navit-a429046695a0f8a23ed4e50eaf41d3bbecb427e4.tar.gz | |
Fix:maptool:Let boundaries use new relation mechanism
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4624 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/maptool/boundaries.c')
| -rw-r--r-- | navit/maptool/boundaries.c | 93 |
1 files changed, 36 insertions, 57 deletions
diff --git a/navit/maptool/boundaries.c b/navit/maptool/boundaries.c index 54f1b0e94..bc10cd59b 100644 --- a/navit/maptool/boundaries.c +++ b/navit/maptool/boundaries.c @@ -20,29 +20,6 @@ #include <string.h> #include "maptool.h" -struct boundary_member { - long long wayid; - enum geom_poly_segment_type role; - struct boundary *boundary; -}; - -static guint -boundary_member_hash(gconstpointer key) -{ - const struct boundary_member *memb=key; - return (memb->wayid >> 32)^(memb->wayid & 0xffffffff); -} - -static gboolean -boundary_member_equal(gconstpointer a, gconstpointer b) -{ - const struct boundary_member *memba=a; - const struct boundary_member *membb=b; - return (memba->wayid == membb->wayid); -} - -GHashTable *member_hash; - static char * osm_tag_value(struct item_bin *ib, char *key) { @@ -61,12 +38,22 @@ osm_tag_name(struct item_bin *ib) return osm_tag_value(ib, "name"); } +static void +process_boundaries_member(void *func_priv, void *relation_priv, struct item_bin *member, void *member_priv) +{ + struct boundary *b=relation_priv; + enum geom_poly_segment_type role=(long)member_priv; + b->segments=g_list_prepend(b->segments,item_bin_to_poly_segment(member, role)); +} + static GList * -build_boundaries(FILE *boundaries) +process_boundaries_setup(FILE *boundaries, struct relations *relations) { struct item_bin *ib; GList *boundaries_list=NULL; + struct relations_func *relations_func; + relations_func=relations_func_new(process_boundaries_member, NULL); while ((ib=read_item(boundaries))) { char *member=NULL; struct boundary *boundary=g_new0(struct boundary, 1); @@ -85,22 +72,19 @@ build_boundaries(FILE *boundaries) long long wayid; int read=0; if (sscanf(member,"2:%Ld:%n",&wayid,&read) >= 1) { - struct boundary_member *memb=g_new(struct boundary_member, 1); - char *role=member+read; - memb->wayid=wayid; - memb->boundary=boundary; - if (!strcmp(role,"outer")) - memb->role=geom_poly_segment_type_way_outer; - else if (!strcmp(role,"inner")) - memb->role=geom_poly_segment_type_way_inner; - else if (!strcmp(role,"")) - memb->role=geom_poly_segment_type_way_unknown; + char *rolestr=member+read; + enum geom_poly_segment_type role; + if (!strcmp(rolestr,"outer")) + role=geom_poly_segment_type_way_outer; + else if (!strcmp(rolestr,"inner")) + role=geom_poly_segment_type_way_inner; + else if (!strcmp(rolestr,"")) + role=geom_poly_segment_type_way_unknown; else { - printf("Unknown role %s\n",role); - memb->role=geom_poly_segment_type_none; + printf("Unknown role %s\n",rolestr); + role=geom_poly_segment_type_none; } - g_hash_table_insert(member_hash, memb, g_list_append(g_hash_table_lookup(member_hash, memb), memb)); - + relations_add_func(relations, relations_func, boundary, (gpointer)role, 2, wayid); } } boundary->ib=item_bin_dup(ib); @@ -170,26 +154,10 @@ boundary_bbox_compare(gconstpointer a, gconstpointer b) return 0; } -GList * -process_boundaries(FILE *boundaries, FILE *ways) +static GList * +process_boundaries_finish(GList *boundaries_list) { - struct item_bin *ib; - GList *boundaries_list,*l,*sl,*l2,*ln; - - member_hash=g_hash_table_new_full(boundary_member_hash, boundary_member_equal, NULL, NULL); - boundaries_list=build_boundaries(boundaries); - while ((ib=read_item(ways))) { - long long *wayid=item_bin_get_attr(ib, attr_osm_wayid, NULL); - if (wayid) { - GList *l=g_hash_table_lookup(member_hash, wayid); - while (l) { - struct boundary_member *memb=l->data; - memb->boundary->segments=g_list_prepend(memb->boundary->segments,item_bin_to_poly_segment(ib, memb->role)); - - l=g_list_next(l); - } - } - } + GList *l,*sl,*l2,*ln; l=boundaries_list; while (l) { struct boundary *boundary=l->data; @@ -243,3 +211,14 @@ process_boundaries(FILE *boundaries, FILE *ways) #endif return boundaries_list; } + +GList * +process_boundaries(FILE *boundaries, FILE *ways) +{ + GList *boundaries_list; + struct relations *relations=relations_new(); + + boundaries_list=process_boundaries_setup(boundaries, relations); + relations_process(relations, NULL, ways, NULL); + return process_boundaries_finish(boundaries_list); +} |
