ThinkGeo.com    |     Documentation    |     Premium Support

Routing(Turn Restrictions) issue

Hi all,


Turn Restrictions:


Turn Restrictions mean that there is a sign on the road that says DO NOT TURN RIGHT.  So we cannot turn right at that intersection, even if doing so would be convenient.




I think we should Update the rtg database so that it has this intelligence and take this intelligence into consideration when creating a route.  This is the problem i have to solve.

I have a list of turn restrictions, but have not added to the database because I do not know the best way to do this.


Thanks.



 


Hi Tahir,
Before the answer, I have a small question. Do you mean that we find a route which includes the “turn right” segment, but show a sign on the “right turn” intersection saying “DO NOT TURN RIGHT”? If in that case, I’m sorry that I’m a little confused, do we need to search another route based on the “DO NOT TURN RIGHT” intersection and target point? Anyway, I’m just a little curious. As far as I know, we needn’t add the restrictions to the rtg database, and here are hints:
1.       Find the route between points
2.       Define an InMemoryFeatureSource based on the restriction points.
3.       Get the boundingBox of the route.
4.       Get the restriction points in the boundingBox of the route.
5.       Loop the restriction points inside the boundingBox to show the sign “DO NOT TURN RIGHT”.
Please let us know whether we understand you properly.
Thanks,
Johnny
 

I am afraid you have not understood the problem.  I am attaching a simple drawing, where A is the start point of the route and B is the destination, or end point of the route. 
  
 There are two ways to get from A to B. 
  
 The least-cost way takes you through the blue and green streets.  The longer way through the blue and green streets. 
  
 Out-of-the box the routing algorithm will arrive at the first alternative, the least cost. 
  
 However this is not legal.  There is a sign ON THE STREET, painted in RED that says DO NOT TURN RIGHT. Penalty of $200 dollars!. 
  
 But the routing algorithm has no knowledge that such a sign exists.  We do, because we have a paper map on the wall with all the turn restrictions marked in bright red indelible ink!!! 
  
 The question is, how do we tell it to take the alternate route, to avoid the fine? 
  
 We are not interested in showing the sign.  We are interested in creating the alternate route. 
  
 How do we do this? 
  
 This is two-part question.  The first part is, how do we encode the turn restrictions, the second part is, how do we tell the routing extension to take the turn restrictions into consideration when creating a route? 
  


Sorry, I cannot find a way up attaching the simple drawing.  Please send me instructions on how to do this.


Finally figured out how to send an attachment.  


Please take a look at this image.  The blue-red path is the one we want, to avoid the fine!!



Hi Al, 
  
 Can you send the simple drawing to forumsupport@thinkgeo.com
  
 Thanks, 
 Johnny

Done.

Get it. I’m gonna work on it and give the solution later. 
  
 Thanks, 
  
 Johnny

AI,


T hanks for you detailed explanation. As far as I know, there are two ways. The first one is that we can remove the adjacent roads which are restricted to “Turn Right” from rtg file using BuildingRoutingData event while building the routing index file (rtg). The second way is very similar to the first but it happens during finding the path in run-time using FindingPath event. Personally, we recommend the first one , It always gives a better performance, here is the demo code about using BuildingRoutingData event, please pay more attention to “Todo:”


private void RtgRoutingSource_BuildingRoadData(object sender, BuildingRoutingDataRtgRoutingSourceEventArgs e)
        {
            // Create the restriction FeatureSource, this part should be outside of the method.
            Collection<PointShape> restrictions = GetRestrictions();

            InMemoryFeatureSource restricitionFeatureSource = new InMemoryFeatureSource(new Collection<FeatureSourceColumn>());
            restricitionFeatureSource.BeginTransaction();
            foreach (PointShape point in restrictions)
            {
                restricitionFeatureSource.InternalFeatures.Add(new Feature(point));
            }
            restricitionFeatureSource.CommitTransaction();

            // The featuresource of the road  network
            FeatureSource roadFeatureSource = GetRoadFeatureSource();
           
            // Check the start point of current segment
            RectangleShape bufferedStart = GetBufferedBBox(e.RouteSegment.StartPoint);
            Collection<Feature> restrictedFeatures = restricitionFeatureSource.GetFeaturesInsideBoundingBox(bufferedStart, ReturningColumnsType.NoColumns);
            if (restrictedFeatures != null & restrictedFeatures.Count != 0)
            { 
                // There is restricted points at start point
                // Todo: Calculate the angle bettween current segment and adjacent segments,
                //      and remove the ones on the right.
            }

            // Todo: Check the end point of current segment following the similar way of checking start point.
            // ....
        }

 
Thanks, and any question please let us know.
 
Johnny
 


 Johnny, 
  
 Two comments, 
  
 1) If we remove the segment of the road, in your first option, this segment of the road would then not be available to North-South traffic, nor to West-bound traffic (assuming there is no NO LEFT TURN sign for west-bound traffic at this intersection), is this correct?  This is a good way of saving money on road construction as this segment need not be build if it is never going to be used.  Or am I misunderstanding what you are saying? 
  
 2)  You do not answer the first part of the question, which is How do we encode this information, in this case No right Tun for West Bound traffic at node 12345 ? 
  
 And one request, 
  
 Please send me  sample code for your second approach. 
  
 Thanks, 
  
 Al Vigil

 


Hi Al,
Sorry that my explanation confused you. We don’t remove the segment from real network, we just remove its index from the adjacent collection of East-bound traffic segment. For instance, like the figure below:
 
The “Road 1” has 4 adjacent segments “Road 4”, “Road 5”, “Road 2” and “Road 3”, in rtg file, the record for “Road 1” is stored like: 



    
        
            
            Road 1
            
            
            Start Point
            
            
            End Point
            
            
            Start Adjacent Segments
            
            
            End Adjacent Segments
            
        
    


So we just remove the “Road 3” from “Start Adjacent Segments” or “End Adjacent Segments” of “Road 1” recode to let the Routing Extension know “You are unable to turn right at this intersection when coming from Road 1”, but we don’t remove the “Road 3” from adjacent segments from “Road 2”, so this segment is still available to North-South traffic.
Regarding the “how do we encode this information”, I think I’m unable to get you, can you let us know what is “Encode the turn restrictions”? And the sample code for second approach is very similar to the first one except using “FindingPath” event of Algorithm, the similar code can be available at gis.thinkgeo.com/Support/Dis...fault.aspx
Thanks,
Johnny
 

Johnny, 
  
 I think we are making progress.  By the question how do we encode the turn restriction in the rtg file I mean how do we tell the rtg file about turn restrictions.  But I believe you have answered the question.  We remove a segment for East bound traffic at this intersection.  
  
 We will work on this on our end.  We have hundreds of these restrictions and it seems like a daunting piece of work, but we will give it a try. 
  
 Also the reference you have given me is also very valuable, at first glance. 
  
 Thank you for your help, and sorry if I sounded exasperating at times. 
  
 Al Vigil 


Al, 



Glad to hear that it helped. And hope everything goes well with you. Maybe we can make a community demo about the scenario in the future. 

By the way, the RoutingEngine provides two methods for calculating the angle and “DrivingDirection”, the first is “GetAngleBetweenTwoLines” and another one is “GetDrivingDirection”, I think you can make use of them. 



Thanks, 

Johnny 

 



Johnny, 
  
 We would be happy to participate in this community demo.  Will keep you posted on our progress.   
  
 You are right, we can use these two methods you suggest. 
  
 Al Vigil

Johnny, 
  
 Need your help. 
  
 How do we edit the rtg file?  What program do we use?  Ideally this would be an interactive program that displays the segments as a map, to allow the selection of those segments that are to be disabled for certain traffic.   
  
 Does such a program exist?  Or do we have to write one from scratch? 
  
 Thanks 
  
 Al Vigil

Hi Al, 



Maybe you can try the installation sample "CSharp Desktop HowDoISamples\Samples\EditRoutingIndexFile.cs".


By the way, i have submited the requirements of the code community sample to our development team, mabye it can be avaliable next week.



Thanks, 

Johnny



Johnny, 
  
 We have implemented the EditRoutingIndexFile.cs in a VS project. but do not see how this form allows us to edit the routing file for turn restrictions.  I will send you the project, so you can tell us what we are missing. 
  
 Thanks, 
  
 Al Vigil

Al, 
  
 If you can send your project to forumsupport@thinkgeo.com I can do a sample implementation for you.  Could you also include some of your sample data as well as the ids of a couple of road segments that do not allow a right turn? 
  
 Thanks, 
 Phil

Phil, 
  
 Thank you.  I will send you project.  I had already sent to Johnny, but I will send to you again. 
  
 I can also send you the shp and rtg files we are using and suggest a route that will include no right-turn restrictions.  Please tell me how to retrieve an ID for the segments.  The dbf file contains a field that we use to uniquely identify a road segment.  Is this the ID you mean?  Or is a different ID generated when creating an rtg file?  In this case please let me know how to retrieve this ID. 
  
 Al Vigil 


I just reread your post. 
  
 Do you want us to send the entire project? On first read I thought you meant the edit form we created, but now I am not sure. 
  
 The entire project is 65 MB.  Perhaps there is a way to send you a subset. 


Another approach would be for you to use the Austin sample files in the edit form and arbitrarily select a no-right turn intersection.  When you select the intersection you have two remaining tasks: 
  
 1)  Edit the routing file so that this intersection is marked as No Right Turn for Eas-bound traffic, say. 
  
 2) Specify a route where the least-cost algorithm would take a right turn at this intersection. 
  
 I am looking for a simpler approach than sending you our entire project, which will take you a long time to set up.  It uses MySql as the database, which you would also have to set up to make it run. 
  
 Al Vigil