From c46504d01dce2f389e1a723ba7348864abd487e5 Mon Sep 17 00:00:00 2001 From: zaxl Date: Tue, 20 Nov 2007 18:55:41 +0000 Subject: [PATCH] Rename attr_limit to attr_flags and define what the flags are git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@570 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/src/attr.h | 7 +++++++ navit/src/attr_def.h | 2 +- navit/src/data/garmin/garmin.c | 3 ++- navit/src/data/mg/street.c | 12 ++++++------ navit/src/osm2navit.c | 22 +++++++++++----------- navit/src/route.c | 40 ++++++++++++++++++++++++++-------------- navit/src/route.h | 2 +- navit/src/track.c | 2 +- 8 files changed, 55 insertions(+), 35 deletions(-) diff --git a/navit/src/attr.h b/navit/src/attr.h index e9d678a..0d0b7df 100644 --- a/navit/src/attr.h +++ b/navit/src/attr.h @@ -17,6 +17,13 @@ enum attr_type { #undef ATTR }; +#define AF_ONEWAY (1<<0) +#define AF_ONEWAYREV (1<<1) +#define AF_NOPASS (AF_ONEWAY|AF_ONEWAYREV) +#define AF_ONEWAYMASK (AF_ONEWAY|AF_ONEWAYREV) +#define AF_SEGMENTED (1<<2) + + struct attr { enum attr_type type; union { diff --git a/navit/src/attr_def.h b/navit/src/attr_def.h index 8b52400..e93f767 100644 --- a/navit/src/attr_def.h +++ b/navit/src/attr_def.h @@ -16,7 +16,7 @@ ATTR2(0x0001ffff,type_item_end) ATTR2(0x00020000,type_int_begin) ATTR(h) ATTR(id) -ATTR(limit) +ATTR(flags) ATTR(w) ATTR(x) ATTR(y) diff --git a/navit/src/data/garmin/garmin.c b/navit/src/data/garmin/garmin.c index 8717fd1..595acf8 100644 --- a/navit/src/data/garmin/garmin.c +++ b/navit/src/data/garmin/garmin.c @@ -311,7 +311,7 @@ point_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) case attr_street_name: attr->type = attr_street_name; return garmin_object_label(g, attr); - case attr_limit: + case attr_flags: return 0; default: dlog(1, "Dont know about attribute %d[%04X]=%s yet\n", attr_type,attr_type, attr_to_name(attr_type)); @@ -507,6 +507,7 @@ garmin_get_selection(struct map_rect_priv *map, struct map_selection *sel) && sel->order[layer_street]) { // Get all roads flags = GO_GET_ROUTABLE; + sel = NULL; } else if (sel) flags = GO_GET_SORTED; diff --git a/navit/src/data/mg/street.c b/navit/src/data/mg/street.c index b1a7220..2a93eb6 100644 --- a/navit/src/data/mg/street.c +++ b/navit/src/data/mg/street.c @@ -242,7 +242,7 @@ street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) attr->u.str=street->name.name2; return ((attr->u.str && attr->u.str[0]) ? 1:0); case attr_street_name_systematic: - street->attr_next=attr_limit; + street->attr_next=attr_flags; nameid=L(street->str->nameid); if (! nameid) return 0; @@ -250,13 +250,13 @@ street_attr_get(void *priv_data, enum attr_type attr_type, struct attr *attr) street_name_get_by_id(&street->name,street->name_file,nameid); attr->u.str=street->name.name1; return ((attr->u.str && attr->u.str[0]) ? 1:0); - case attr_limit: + case attr_flags: if (street->str->type & 0x40) { - attr->u.num=(street->str->limit & 0x30) ? 2:0; - attr->u.num|=(street->str->limit & 0x03) ? 1:0; + attr->u.num=(street->str->limit & 0x30) ? AF_ONEWAYREV:0; + attr->u.num|=(street->str->limit & 0x03) ? AF_ONEWAY:0; } else { - attr->u.num=(street->str->limit & 0x30) ? 1:0; - attr->u.num|=(street->str->limit & 0x03) ? 2:0; + attr->u.num=(street->str->limit & 0x30) ? AF_ONEWAY:0; + attr->u.num|=(street->str->limit & 0x03) ? AF_ONEWAYREV:0; } street->attr_next=attr_country_id; return 1; diff --git a/navit/src/osm2navit.c b/navit/src/osm2navit.c index bb188cd..0a6ad30 100644 --- a/navit/src/osm2navit.c +++ b/navit/src/osm2navit.c @@ -163,10 +163,10 @@ struct attr_bin debug_attr = { }; char debug_attr_buffer[1024]; -struct attr_bin limit_attr = { - 0, attr_limit +struct attr_bin flags_attr = { + 0, attr_flags }; -int limit_attr_value; +int flags_attr_value; static void pad_text_attr(struct attr_bin *a, char *buffer) @@ -218,12 +218,12 @@ add_tag(char *k, char *v) level=7; if (! strcmp(k,"oneway")) { if (! strcmp(v,"true") || !strcmp(v,"yes")) { - limit_attr_value=1; - limit_attr.len=2; + flags_attr_value=AF_ONEWAY; + flags_attr.len=2; } if (! strcmp(v,"-1")) { - limit_attr_value=2; - limit_attr.len=2; + flags_attr_value=AF_ONEWAYREV; + flags_attr.len=2; } if (!in_way) level=6; @@ -459,7 +459,7 @@ add_way(int id) item.type=type_street_unkn; label_attr.len=0; debug_attr.len=0; - limit_attr.len=0; + flags_attr.len=0; sprintf(debug_attr_buffer,"way_id=%d", wayid); } @@ -497,15 +497,15 @@ end_way(FILE *out) alen+=label_attr.len+1; if (debug_attr.len) alen+=debug_attr.len+1; - if (limit_attr.len) - alen+=limit_attr.len+1; + if (flags_attr.len) + alen+=flags_attr.len+1; item.clen=coord_count*2; item.len=item.clen+2+alen; fwrite(&item, sizeof(item), 1, out); fwrite(coord_buffer, coord_count*sizeof(struct coord), 1, out); write_attr(out, &label_attr, label_attr_buffer); write_attr(out, &debug_attr, debug_attr_buffer); - write_attr(out, &limit_attr, &limit_attr_value); + write_attr(out, &flags_attr, &flags_attr_value); } static void diff --git a/navit/src/route.c b/navit/src/route.c index 3c60490..002ab58 100644 --- a/navit/src/route.c +++ b/navit/src/route.c @@ -63,7 +63,7 @@ struct route_graph_segment { struct route_graph_point *start; struct route_graph_point *end; struct item item; - int limit; + int flags; int len; }; @@ -395,7 +395,7 @@ route_graph_free_points(struct route_graph *this) } static void -route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, int len, struct item *item, int limit) +route_graph_add_segment(struct route_graph *this, struct route_graph_point *start, struct route_graph_point *end, int len, struct item *item, int flags) { struct route_graph_segment *s; s=g_new0(struct route_graph_segment,1); @@ -408,7 +408,7 @@ route_graph_add_segment(struct route_graph *this, struct route_graph_point *star g_assert(len >= 0); s->len=len; s->item=*item; - s->limit=limit; + s->flags=flags; s->next=this->route_segments; this->route_segments=s; if (debug_route) @@ -673,7 +673,7 @@ route_process_street_graph(struct route_graph *this, struct item *item) } e_pnt=route_graph_add_point(this,&l); g_assert(len >= 0); - if (item_attr_get(item, attr_limit, &attr)) + if (item_attr_get(item, attr_flags, &attr)) route_graph_add_segment(this, s_pnt, e_pnt, len, item, attr.u.num); else route_graph_add_segment(this, s_pnt, e_pnt, len, item, 0); @@ -729,14 +729,14 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli heap = fh_makeheap(); fh_setcmp(heap, compare); - if (! (sd->limit & 2)) { + if (! (sd->flags & AF_ONEWAYREV)) { end=route_graph_get_point(this, &sd->c[0]); g_assert(end != 0); end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, -1)); end->el=fh_insert(heap, end); } - if (! (sd->limit & 1)) { + if (! (sd->flags & AF_ONEWAY)) { end=route_graph_get_point(this, &sd->c[sd->count-1]); g_assert(end != 0); end->value=route_value(speedlist, &sd->item, route_info_length(NULL, dst, 1)); @@ -761,7 +761,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli new=min+val; if (debug_route) printf("begin %d len %d vs %d (0x%x,0x%x)\n",new,val,s->end->value, s->end->c.x, s->end->c.y); - if (new < s->end->value && !(s->limit & 1)) { + if (new < s->end->value && !(s->flags & AF_ONEWAY)) { s->end->value=new; s->end->seg=s; if (! s->end->el) { @@ -787,7 +787,7 @@ route_graph_flood(struct route_graph *this, struct route_info *dst, int *speedli new=min+val; if (debug_route) printf("end %d len %d vs %d (0x%x,0x%x)\n",new,val,s->start->value,s->start->c.x, s->start->c.y); - if (new < s->start->value && !(s->limit & 2)) { + if (new < s->start->value && !(s->flags & AF_ONEWAYREV)) { old=s->start->value; s->start->value=new; s->start->seg=s; @@ -826,14 +826,14 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in struct street_data *sd=pos->street; struct route_path *ret; - if (! (sd->limit & 1)) { + if (! (sd->flags & AF_ONEWAY)) { start1=route_graph_get_point(this, &sd->c[0]); if (! start1) return NULL; val1=start1->value+route_value(speedlist, &sd->item, route_info_length(pos, NULL, -1)); dbg(1,"start1: %d(route)+%d=%d\n", start1->value, val1-start1->value, val1); } - if (! (sd->limit & 2)) { + if (! (sd->flags & AF_ONEWAYREV)) { start2=route_graph_get_point(this, &sd->c[sd->count-1]); if (! start2) return NULL; @@ -881,7 +881,7 @@ route_path_new(struct route_graph *this, struct route_info *pos, struct route_in } sd=dst->street; dbg(1,"start->value=%d 0x%x,0x%x\n", start->value, start->c.x, start->c.y); - dbg(1,"dst sd->limit=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->limit, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y); + dbg(1,"dst sd->flags=%d sd->c[0]=0x%x,0x%x sd->c[sd->count-1]=0x%x,0x%x\n", sd->flags, sd->c[0].x,sd->c[0].y, sd->c[sd->count-1].x, sd->c[sd->count-1].y); if (start->c.x == sd->c[0].x && start->c.y == sd->c[0].y) dst->dir=-1; else if (start->c.x == sd->c[sd->count-1].x && start->c.y == sd->c[sd->count-1].y) @@ -976,10 +976,10 @@ street_get_data (struct item *item) ret=g_malloc(sizeof(struct street_data)+count*sizeof(struct coord)); ret->item=*item; ret->count=count; - if (item_attr_get(item, attr_limit, &attr)) - ret->limit=attr.u.num; + if (item_attr_get(item, attr_flags, &attr)) + ret->flags=attr.u.num; else - ret->limit=0; + ret->flags=0; memcpy(ret->c, c, count*sizeof(struct coord)); return ret; @@ -1018,12 +1018,24 @@ route_find_nearest_street(struct mapset *ms, struct pcoord *pc) struct coord lp, sc[1000]; struct street_data *sd; struct coord c; + struct coord_geo g; c.x = pc->x; c.y = pc->y; + /* + * This is not correct for two reasons: + * - You may need to go back first + * - Currently we allow mixing of mapsets + */ sel = route_rect(18, &c, &c, 0, max_dist); h=mapset_open(ms); while ((m=mapset_next(h,1))) { + c.x = pc->x; + c.y = pc->y; + if (map_projection(m) != pc->pro) { + transform_to_geo(pc->pro, &c, &g); + transform_from_geo(map_projection(m), &g, &c); + } mr=map_rect_new(m, sel); while ((item=map_rect_get_item(mr))) { if (item->type >= type_street_0 && item->type <= type_ferry) { diff --git a/navit/src/route.h b/navit/src/route.h index bf2c18c..d4f9f5d 100644 --- a/navit/src/route.h +++ b/navit/src/route.h @@ -14,7 +14,7 @@ struct route_crossings { struct street_data { struct item item; int count; - int limit; + int flags; struct coord c[0]; }; diff --git a/navit/src/track.c b/navit/src/track.c index 73c87cf..fb75bd2 100644 --- a/navit/src/track.c +++ b/navit/src/track.c @@ -247,7 +247,7 @@ tracking_update(struct tracking *tr, struct coord *c, int angle) while (t) { struct street_data *sd=t->street; int dir; - switch(sd->limit & 3) { + switch(sd->flags & AF_ONEWAYMASK) { case 0: dir=0; break; -- 2.7.4