Ticket #1279: routing.diff

File routing.diff, 6.7 KB (added by jandegr, 6 years ago)
  • navit/navit/attr_def.h

     
    121121ATTR_UNUSED
    122122ATTR(route_status)
    123123ATTR(route_weight)
    124 ATTR_UNUSED
     124ATTR(roundabout_weight)
    125125ATTR(route_mode)
    126126ATTR(maxspeed_handling)
    127127ATTR(flags_forward_mask)
  • navit/navit/maptool/osm.c

     
    606606        "w      highway=trunk_link                      ramp\n"
    607607        "w      highway=primary                         street_4_land\n"
    608608        "w      highway=primary,name=*,rural=1          street_4_land\n"
    609         "w      highway=primary,name=*                  street_4_city\n"
     609        "w      highway=primary,name=*                  street_4_land\n"
    610610        "w      highway=primary,rural=0                 street_4_city\n"
    611         "w      highway=primary_link                    ramp\n"
     611        "w      highway=primary_link                    street_4_land\n"
    612612        "w      highway=secondary                       street_3_land\n"
    613613        "w      highway=secondary,name=*,rural=1        street_3_land\n"
    614         "w      highway=secondary,name=*                street_3_city\n"
     614        "w      highway=secondary,name=*                street_3_land\n"
    615615        "w      highway=secondary,rural=0               street_3_city\n"
    616616        "w      highway=secondary,area=1                poly_street_3\n"
    617         "w      highway=secondary_link                  ramp\n"
     617        "w      highway=secondary_link                  street_3_land\n"
    618618        "w      highway=tertiary                        street_2_land\n"
    619619        "w      highway=tertiary,name=*,rural=1         street_2_land\n"
    620         "w      highway=tertiary,name=*                 street_2_city\n"
     620        "w      highway=tertiary,name=*                 street_2_land\n"
    621621        "w      highway=tertiary,rural=0                street_2_city\n"
    622622        "w      highway=tertiary,area=1                 poly_street_2\n"
    623         "w      highway=tertiary_link                   ramp\n"
     623        "w      highway=tertiary_link                   street_2_land\n"
    624624        "w      highway=residential                     street_1_city\n"
    625625        "w      highway=residential,area=1              poly_street_1\n"
    626626        "w      highway=unclassified                    street_1_city\n"
  • navit/navit/roadprofile.c

     
    3636        case attr_route_weight:
    3737                this->route_weight=attr->u.num;
    3838                break;
     39        case attr_roundabout_weight:
     40                        this->roundabout_weight=attr->u.num;
     41                        break;
    3942        default:
    4043                break;
    4144        }
  • navit/navit/roadprofile.h

     
    2525        NAVIT_OBJECT
    2626        int speed;
    2727        int route_weight;
     28        int roundabout_weight;
    2829        int maxspeed;
    2930};
    3031
  • navit/navit/route.c

     
    19161916 * @brief Returns the estimated speed on a segment
    19171917 *
    19181918 * This function returns the estimated speed to be driven on a segment, 0=not passable
     1919 * Uses route_weight and roundabout_weight from the roadprofile in navit.xml to
     1920 * modify the speed or OSM maxspeed
    19191921 *
     1922 *
    19201923 * @param profile The routing preferences
    19211924 * @param over The segment which is passed
    19221925 * @param dist A traffic distortion if applicable
     
    19271930{
    19281931        struct roadprofile *roadprofile=vehicleprofile_get_roadprofile(profile, over->item.type);
    19291932        int speed,maxspeed;
    1930         if (!roadprofile || !roadprofile->route_weight)
    1931                 return 0;
    1932         /* maxspeed_handling: 0=always, 1 only if maxspeed restricts the speed, 2 never */
    1933         speed=roadprofile->route_weight;
    1934         if (profile->maxspeed_handling != 2) {
    1935                 if (over->flags & AF_SPEED_LIMIT) {
     1933        int route_averaging = 100;
     1934        if (!roadprofile || !roadprofile->speed)
     1935                        return 0;
     1936        /* maxspeed_handling: 0=always, 1 only if maxspeed restricts the speed,
     1937         *  2 never
     1938         *  */
     1939
     1940
     1941        if (roadprofile->route_weight)
     1942                route_averaging =roadprofile->route_weight;
     1943
     1944        if ((over->flags & AF_ROUNDABOUT) && roadprofile->roundabout_weight)
     1945                route_averaging = (route_averaging * roadprofile->roundabout_weight)/100;
     1946
     1947        speed=(roadprofile->speed * route_averaging)/100 ;
     1948        if (profile->maxspeed_handling != 2)
     1949        {
     1950                if (over->flags & AF_SPEED_LIMIT)
     1951                {
    19361952                        maxspeed=RSD_MAXSPEED(over);
    1937                         if (!profile->maxspeed_handling)
    1938                                 speed=maxspeed;
    1939                 } else
     1953                        if (!profile->maxspeed_handling) /*always handle maxspeed*/
     1954                                maxspeed=(maxspeed * route_averaging)/100 ;
     1955                }
     1956                else
    19401957                        maxspeed=INT_MAX;
     1958
    19411959                if (dist && maxspeed > dist->maxspeed)
    19421960                        maxspeed=dist->maxspeed;
    1943                 if (maxspeed != INT_MAX && (profile->maxspeed_handling != 1 || maxspeed < speed))
     1961
     1962                /*below handling 0=always or 1=restricting */
     1963                if (maxspeed != INT_MAX && (profile->maxspeed_handling == 0 || maxspeed < speed))
    19441964                        speed=maxspeed;
    19451965        }
    1946         if (over->flags & AF_DANGEROUS_GOODS) {
     1966        else /* handling=2, don't use maxspeed*/
     1967                speed=(roadprofile->speed * route_averaging)/100 ;
     1968        if (over->flags & AF_DANGEROUS_GOODS)
     1969        {
    19471970                if (profile->dangerous_goods & RSD_DANGEROUS_GOODS(over))
    19481971                        return 0;
    19491972        }
     
    20492072                route_get_traffic_distortion(over, &dist) && dir != 2 && dir != -2) {
    20502073                        distp=&dist;
    20512074        }
     2075        if (profile->mode != 3)/*not new shortest*/
    20522076        ret=route_time_seg(profile, &over->data, distp);
     2077        else ret = over->data.len; /*new shortest mode*/
     2078
    20532079        if (ret == INT_MAX)
    20542080                return ret;
    20552081        if (!route_through_traffic_allowed(profile, over) && from && route_through_traffic_allowed(profile, from->seg))
     
    25502576
    25512577        if (profile->mode == 2 || (profile->mode == 0 && pos->lenextra + dst->lenextra > transform_distance(map_projection(pos->street->item.map), &pos->c, &dst->c)))
    25522578                return route_path_new_offroad(this, pos, dst);
     2579        if (profile->mode != 3) /*not shortest on-road*/{
    25532580        while ((s=route_graph_get_segment(this, pos->street, s))) {
    25542581                val=route_value_seg(profile, NULL, s, 2);
    25552582                if (val != INT_MAX && s->end->value != INT_MAX) {
     
    25802607                        }
    25812608                }
    25822609        }
     2610        }
     2611        else /*experimental shortest route*/
     2612        {
     2613                dbg(lvl_debug,"experimental shortest route calc\n")
     2614                while ((s=route_graph_get_segment(this, pos->street, s))) {
     2615                        val = s->data.len;
     2616                                if (val != INT_MAX && s->end->value != INT_MAX) {
     2617                                        val=val*(100-pos->percent)/100;
     2618                                        dbg(lvl_debug,"val1 %d\n",val);
     2619
     2620                                        dbg(lvl_debug,"val1 %d\n",val);
     2621                                        val1_new=s->end->value+val;
     2622                                        dbg(lvl_debug,"val1 +%d=%d\n",s->end->value,val1_new);
     2623                                        if (val1_new < val1) {
     2624                                                val1=val1_new;
     2625                                                s1=s;
     2626                                        }
     2627                                }
     2628                                dbg(0,"val=%i\n",val);
     2629                                val = s->data.len;
     2630                                if (val != INT_MAX && s->start->value != INT_MAX) {
     2631                                        val=val*pos->percent/100;
     2632                                        dbg(lvl_debug,"val2 %d\n",val);
     2633
     2634                                        dbg(lvl_debug,"val2 %d\n",val);
     2635                                        val2_new=s->start->value+val;
     2636                                        dbg(lvl_debug,"val2 +%d=%d\n",s->start->value,val2_new);
     2637                                        if (val2_new < val2) {
     2638                                                val2=val2_new;
     2639                                                s2=s;
     2640                                        }
     2641                                }
     2642                        }
     2643        }
     2644
     2645
    25832646        if (val1 == INT_MAX && val2 == INT_MAX) {
    25842647                dbg(lvl_error,"no route found, pos blocked\n");
    25852648                return NULL;