ThinkGeo.com    |     Blog    |     Wiki    |     Support

Poking again at a sore subject: u-turns

Good morning,



I don’t really want to bring this up but I have been tasked to check on the status of this issue.  The last time I can see a discussion about U-turns taking place was more than two years ago.  



The route we are looking is fairly simple.  It starts at the off-ramp off a highway and ends south of the interchange.  At the end of the ramp the routing engine would make a left turn, but there is a physical barrier.  After implementing turn restrictions the route now goes north on Oregon Pike but makes a U-turn the first chance it can get.  This would require crossing numerous lanes and is probably not legal.  We would like to see the U-turn postponed until North Point Blvd/ Eden Rd where there is a left-turn lane without a “No U Turn” where a U-turn would be safe.  From time to time people do it now.



From what I recall, there is nothing built in to the extension to allow this.  I don’t want to revisit this whole discussion; simply a “we still can’t do that” answer is all I need.



Thanks!

Allen






After looking at Google, I need to make a correction.  At the bottom of the ramp there probably is a “no left turn” sign for obvious reasons.  There is a physical divider between the north and south lanes but some vehicles could probably cross it.  This is not what we call a “Jersey barrier” which is around three-feet in height, but just an elevated island.  I don’t know what they’re called, but here’s a picture of the road from Google…this is about the point (right before the gas station) where the routing engine makes the U-turn, which is not a good idea.  Unless you’re driving a compact vehicle with a small turning radius, I don’t think it a U-turn can be made here without backing up into four lanes of traffic or driving over the curb.








Hello Allen,



Thanks for you detailed interpretation on this question, I think it makes sense based on your description, but I guess this need a specified data to support this, we found this place following your description and do a route shown as following on Google Maps:







        
  • but seems like it gives a
        similar “T-Turn” there, I also zoom to the street View to check the road signs,
        but seems that here isn’t any an obvious warning board there to show “U-Turn
        allowed”. Anyway, we can support this by adding some restrictions at these
        places, could you check the data you are using for route to see if there is a
        restriction collection or a column to specify these places, if it exists, I
        think there are 2 ways to support it, just shown as following:


1. Use the BuildingRoutingData event when re-generate the data


private void RtgRoutingSource_BuildingRoadData(object sender, BuildingRoutingDataRtgRoutingSourceEventArgs e)
        {
            featureSource.Open();
            Feature feature = featureSource.GetFeatureById(e.LineShape.Id, new string[] { “TurnRestrictions” });
 
            string turnRestrictions = feature.ColumnValues[“TurnRestrictions”];
            // Pass in current lineShape and get the adjacent lineShapes by feature ids from feature source, calculate turn directions.
            Dictionary directions = GetAdjacentDirections(e.LineShape, e.RouteSegment.StartPointAdjacentIds, featureSource);
 
            if (turnRestrictions == “Right”)
            {
                foreach (var item in directions.Keys)
                {
                    if (directions[item] == DrivingDirection.Right)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }
                }
            }
            else if (turnRestrictions == “Left”)
            {
                foreach (var item in directions.Keys)
                {
                    if (directions[item] == DrivingDirection.Left)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }
                }
            }
        }



2. Use the FindingRoute event when getting the route, we don’t need to re-generate the routing index if taking this way


private void Algorithm_FindingPath(object sender, FindingRouteRoutingAlgorithmEventArgs e)
        {
            featureSource.Open();
            Feature feature = featureSource.GetFeatureById(e.RouteSegment.FeatureId, new string[] { “TurnRestrictions” });
 
            string turnRestrictions = feature.ColumnValues[“TurnRestrictions”];
            // Pass in current lineShape and get the adjacent lineShapes by feature ids from feature source, calculate turn directions.
            Dictionary directions = GetAdjacentDirections((LineShape)feature.GetShape(), e.RouteSegment.StartPointAdjacentIds, featureSource);
 
            if (turnRestrictions == “Right”)
            {
                foreach (var item in directions.Keys)
                {
                    if (directions[item] == DrivingDirection.Right)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }
                }
            }
            else if (turnRestrictions == “Left”)
            {
                foreach (var item in directions.Keys)
                {
                    if (directions[item] == DrivingDirection.Left)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }
                }
            }
        }

Hope it helps,



Thanks,

Johnny