pgRouting

Changeset 79

Show
Ignore:
Timestamp:
12/17/07 16:41:08 (1 year ago)
Author:
anton
Message:

--

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sandbox/orkney/dijkstra.h

    r78 r79  
    7878        edge_descriptor *er;  
    7979        //adding an edge for opposite direction 
    80         bool inserted = addEdge(er, edges[j], graph); 
     80            bool inserted = addEdge(er, edges[j], graph); 
    8181 
    8282        graph[*er].id = j;//set id 
    8383     
    8484        if (HasReverseCost()) 
    85        
     85           
    8686          graph[*er].cost = edges[j]->GetFieldAsDouble(RC_FEATURE);//set reverse cost 
    87        
    88         else  
    89        
    90           graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 
    91        
     87           
     88            else  
     89           
     90              graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 
     91           
    9292      }     
    9393    } 
     
    131131      while (target != source)  
    132132      { 
    133         if (target == predecessors[target])  
    134        
    135             return NO_PATH_FOUND; 
    136        
    137         target = predecessors[target]; 
     133            if (target == predecessors[target])  
     134           
     135              return NO_PATH_FOUND; 
     136           
     137            target = predecessors[target]; 
    138138 
    139         path_vect.push_back(target); 
    140         if (!max--)  
    141        
    142             return OVERFLOW; 
    143        
     139            path_vect.push_back(target); 
     140            if (!max--)  
     141           
     142              return OVERFLOW; 
     143           
    144144      } 
    145145 
     
    151151      for(int i = path_vect.size() - 1, int j = 0; i >= 0; i--, j++) 
    152152      { 
    153         graph_traits < graph_t >::vertex_descriptor v_src; 
    154         graph_traits < graph_t >::vertex_descriptor v_targ; 
    155         graph_traits < graph_t >::edge_descriptor e; 
    156         graph_traits < graph_t >::out_edge_iterator out_i, out_end; 
     153            graph_traits < graph_t >::vertex_descriptor v_src; 
     154            graph_traits < graph_t >::vertex_descriptor v_targ; 
     155            graph_traits < graph_t >::edge_descriptor e; 
     156            graph_traits < graph_t >::out_edge_iterator out_i, out_end; 
    157157         
    158         if (i == 0)  
    159        
    160             continue; 
    161        
     158            if (i == 0)  
     159           
     160              continue; 
     161           
    162162 
    163         v_src = path_vect.at(i); 
    164         v_targ = path_vect.at(i - 1); 
     163            v_src = path_vect.at(i); 
     164            v_targ = path_vect.at(i - 1); 
    165165 
    166         for (tie(out_i, out_end) = out_edges(v_src, graph);  
    167              out_i != out_end; ++out_i) 
    168        
    169           graph_traits < graph_t >::vertex_descriptor v, targ; 
    170           e = *out_i; 
    171           v = source(e, graph); 
    172           targ = target(e, graph); 
     166            for (tie(out_i, out_end) = out_edges(v_src, graph);  
     167                 out_i != out_end; ++out_i) 
     168           
     169              graph_traits < graph_t >::vertex_descriptor v, targ; 
     170              e = *out_i; 
     171              v = source(e, graph); 
     172              targ = target(e, graph); 
    173173                                                                 
    174           if (targ == v_targ) 
    175          
    176             (*result)[j] = (*edges)[graph[*out_i].id]; 
    177             break; 
    178          
    179        
     174              if (targ == v_targ) 
     175             
     176                (*result)[j] = (*edges)[graph[*out_i].id]; 
     177                break; 
     178             
     179           
    180180      } 
    181181 
  • sandbox/orkney/shootingstar.h

    r77 r79  
    214214                              adjacent_edges[edges[j]->GetFieldAsInteger(ID_FEATURE)].begin(),  
    215215                              adjacent_edges[edges[j]->GetFieldAsInteger(ID_FEATURE)].end() ); 
    216             adjacent_edges.erase(edges[j]->GetFieldAsInteger(ID_FEATURE)); 
     216                adjacent_edges.erase(edges[j]->GetFieldAsInteger(ID_FEATURE)); 
    217217          } 
    218218 
    219219          edge_descriptor *er;  
    220220          //adding an edge for opposite direction 
    221           bool inserted = addEdge(er, edges[j], graph); 
     221              bool inserted = addEdge(er, edges[j], graph); 
    222222 
    223223          graph[*er].id = j;//set id 
    224224     
    225225          if (HasReverseCost()) 
    226          
     226             
    227227            graph[*er].cost = edges[j]->GetFieldAsDouble(RC_FEATURE);//set reverse cost 
    228          
    229           else  
    230          
    231             graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 
    232          
     228             
     229              else  
     230             
     231                graph[*er].cost = edges[j]->GetFieldAsDouble(COST_FEATURE);//set cost 
     232             
    233233 
    234234        }   
     
    236236        adjacent_edges.clear(); 
    237237        rule_num = 0; 
     238         
    238239      } 
    239240      else 
     
    245246};   
    246247 
     248    int getRoute(int start, int end, OGRFeature **result, int *resultCount, graph_t &graph) 
     249    {       
     250      edge_descriptor source_edge; 
     251      edge_descriptor target_edge; 
     252   
     253      bool source_found = false, target_found = false;       
     254 
     255      graph_traits<graph_t>::edge_iterator ei, ei_end; 
     256 
     257      for(tie(ei, ei_end) = edges(graph); ei != ei_end; ++ei)  
     258      { 
     259        if(graph[*ei].id == start) 
     260        { 
     261          source_edge = *ei; 
     262          source_found = true; 
     263          break; 
     264        } 
     265      } 
     266 
     267      if (!source_found)  
     268      { 
     269        return NO_SOURCE_FOUND; 
     270      } 
     271 
     272 
     273      for(tie(ei, ei_end) = edges(graph); ei != ei_end; ++ei)  
     274      { 
     275        if(graph[*ei].id == end) 
     276        { 
     277          target_edge = *ei; 
     278          target_found = true; 
     279          break; 
     280        } 
     281      } 
     282 
     283      if (!target_found) 
     284      { 
     285        return NO_TARGET_FOUND; 
     286      } 
     287 
     288      property_map<graph_t, int Edge::*>::type edge_index = get(&Edge::id, graph); 
     289 
     290      std::map< int, edge_descriptor, std::less<int> > predecessors; 
     291   
     292      property_map<graph_t, float Edge::*>::type rank = get(&Edge::rank, graph); 
     293      property_map<graph_t, float Edge::*>::type distance = get(&Edge::distance, graph); 
     294   
     295      try  
     296      { 
     297        shooting_star_search 
     298          (graph, source_edge, 
     299           distance_heuristic<graph_t, float>(graph, target_edge), 
     300           weight_map(get(&Edge::cost, graph)). 
     301           weight_map2(get(&Edge::adjacent_edges, graph)). 
     302           edge_color_map(get(&Edge::color, graph)). 
     303           visitor(shooting_star_goal_visitor<edge_descriptor>(target_edge, e_max_id)), 
     304           edge_index, 
     305           distance, rank, 
     306           predecessors, e_max_id 
     307           ); 
     308      }  
     309      catch(found_goal &fg)  
     310      { 
     311        return makeResult(*target, *source, *predecessors, result, resultCount, graph); 
     312      }   
     313    } 
     314     
     315    virtual int  makeResult(edge_descriptor *target_edge, edge_descriptor *source_edge,  
     316                          std::map< int, edge_descriptor, std::less<int> > *predecessors,  
     317                          OGRFeature **result, int *resultCount, graph_t &graph) 
     318    { 
     319    vector<edge_descriptor> path_vect; 
     320    int max = MAX_NODES; 
     321 
     322    path_vect.push_back(target_edge); 
     323     
     324    while (target_edge != source_edge)  
     325      { 
     326         
     327        if ((target_edge == predecessors[graph[target_edge].id]) && (predecessors[graph[target_edge].id] != source_edge)) 
     328            { 
     329          return NO_PATH_FOUND;     
     330            } 
     331   
     332            target_edge = predecessors[graph[target_edge].id]; 
     333 
     334        path_vect.push_back(target_edge); 
     335 
     336        if (!max--)  
     337            { 
     338           return OVERFLOW; 
     339            } 
     340      } 
     341 
     342      //*result = (OGRFeature *) malloc(sizeof(OGRFeature) * (path_vect.size() + 1)); 
     343      //Let's try to do it in C++ style 
     344      *result = new OGRFeature * [path_vect.size() + 1]; 
     345      *path_count = path_vect.size(); 
     346 
     347      for(int i = path_vect.size() - 1, j = 0; i >= 0; i--, j++) 
     348      { 
     349        graph_traits < graph_t >::edge_descriptor e; 
     350 
     351        e = path_vect.at(i); 
     352 
     353        if(graph[e].id > e_max_id) 
     354        { 
     355          graph[e].id -= e_max_id;       
     356        } 
     357       
     358        (*result)[j] = graph[e].id; 
     359      } 
     360 
     361      return EXIT_SUCCESS; 
     362    } 
     363     
     364};  
     365 
    247366#endif