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;
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;
};
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)
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;
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);
}
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
struct route_graph_point *start;
struct route_graph_point *end;
struct item item;
- int limit;
+ int flags;
int len;
};
}
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);
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)
}
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);
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));
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) {
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;
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;
}
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)
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;
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) {