ThinkGeo.com    |     Documentation    |     Premium Support

Error in the one way street

 Hello,


every thing in the project was going fine until i came across this route, as you can see in the picture the route take a wrong turn, even though the tunnel is a one way street, since i have cleared the start point on the tunnels to make it a one way street, I think that the route turn and enter the tunnel before reaching the start point , its like entering the tunnel from the middle not from the start point so it can't see the one way.



 


 


And i found that if I am routing inside one feature, the one way does not apply on it, this is shown in the next pictures....



and i hope that you will find a solution that doesn't alter the data it self


Thanks,


Rami.



I think that to see what is really going on with routing using your data, we would need to test it using your data. Could you send us the data or part of the data you are working on? If you do not feel confortable attaching your data in the Discussion Forum, you can contact support@thinkgeo.com for that. Thank you.

VAL,  
 I will send the data to the Support@ThinkGeo.com E-mail 
  
 Thank you, 
 Rami.

Ok, we are waiting for your data.

 


Rami,
 
Generally there are two columns, one indicates whether the road is one-way, another is for the direction. Could you post them?
 
It seems that there are two reasons: 


        
  1. There is no one-way information in the .rtg file you gave. Building one-way routing index is a little different from normal data. You can refer to the attachment about how to build one-way index file and rebuild .rtg file.

  2.     
  3. Currently, there isn’t a build-in function to deal with routing on a single “one-way” road.  If the input start and end feature id are the same, we need some custom code like below:



 
               PointShape startPoint;
            PointShape endPoint;
            string startFeatureId = featureSource.GetFeaturesNearestTo(startPoint, GeographyUnit.DecimalDegree, 1, ReturningColumnsType.NoColumns)[0].Id;
            string endFeatureId = featureSource.GetFeaturesNearestTo(endPoint, GeographyUnit.DecimalDegree, 1, ReturningColumnsType.NoColumns)[0].Id;
            string startSegmentId = routingSource.GetRouteSegmentByFeatureId(startFeatureId).FeatureId;
            string endSegmentId = routingSource.GetRouteSegmentByFeatureId(endFeatureId).FeatureId;
 
            RoutingResult result = new RoutingResult(); 
            if (startSegmentId == endSegmentId)
            {
                Feature feature = featureSource.GetFeatureById(startFeatureId, new string[] { "ONE_WAY", "INDICATOR" });
                LineShape line = ((MultilineShape)feature.GetShape()).Lines[0];
                double startDistance = startPoint.GetDistanceTo(new PointShape(line.Vertices[0].X, line.Vertices[0].Y), GeographyUnit.DecimalDegree, DistanceUnit.Meter);
                double endDistance = endPoint.GetDistanceTo(new PointShape(line.Vertices[0].X, line.Vertices[0].Y), GeographyUnit.DecimalDegree, DistanceUnit.Meter);
                // if the one-way direction is from start to end
                if (feature.ColumnValues["ONE_WAY"] == "Y" && feature.ColumnValues["INDICATOR"] == "0")
                {
                    if (startDistance < endDistance)
                    {
                        result.Features.Add(new Feature(line));
                    }
                    else
                    {
                        result = routingEngine.GetRoute(startFeatureId, endFeatureId);
                    }
                }
                else if (feature.ColumnValues["ONE_WAY"] == "Y" && feature.ColumnValues["INDICATOR"] == "0")
                {
                    if (startDistance > endDistance)
                    {
                        result.Features.Add(new Feature(line));
                    }
                    else
                    {
                        result = routingEngine.GetRoute(startFeatureId, endFeatureId);
                    }
                }
            }



 



Thanks,
 
Johnny

1910-BuildOneWayData-Step2.zip (3.91 KB)

 


Rami,
 
Generally there are two columns, one indicates whether the road is one-way, another is for the direction. Could you post them?
 
It seems that there are two reasons: 


        
  1. There is no one-way information in the .rtg file you gave. Building one-way routing index is a little different from normal data. You can refer to the attachment about how to build one-way index file and rebuild .rtg file.

  2.     
  3. Currently, there isn’t a build-in function to deal with routing on a single “one-way” road.  If the input start and end feature id are the same, we need some custom code like below:



 
               PointShape startPoint;
            PointShape endPoint;
            string startFeatureId = featureSource.GetFeaturesNearestTo(startPoint, GeographyUnit.DecimalDegree, 1, ReturningColumnsType.NoColumns)[0].Id;
            string endFeatureId = featureSource.GetFeaturesNearestTo(endPoint, GeographyUnit.DecimalDegree, 1, ReturningColumnsType.NoColumns)[0].Id;
            string startSegmentId = routingSource.GetRouteSegmentByFeatureId(startFeatureId).FeatureId;
            string endSegmentId = routingSource.GetRouteSegmentByFeatureId(endFeatureId).FeatureId;
 
            RoutingResult result = new RoutingResult(); 
            if (startSegmentId == endSegmentId)
            {
                Feature feature = featureSource.GetFeatureById(startFeatureId, new string[] { "ONE_WAY", "INDICATOR" });
                LineShape line = ((MultilineShape)feature.GetShape()).Lines[0];
                double startDistance = startPoint.GetDistanceTo(new PointShape(line.Vertices[0].X, line.Vertices[0].Y), GeographyUnit.DecimalDegree, DistanceUnit.Meter);
                double endDistance = endPoint.GetDistanceTo(new PointShape(line.Vertices[0].X, line.Vertices[0].Y), GeographyUnit.DecimalDegree, DistanceUnit.Meter);
                // if the one-way direction is from start to end
                if (feature.ColumnValues["ONE_WAY"] == "Y" && feature.ColumnValues["INDICATOR"] == "0")
                {
                    if (startDistance < endDistance)
                    {
                        result.Features.Add(new Feature(line));
                    }
                    else
                    {
                        result = routingEngine.GetRoute(startFeatureId, endFeatureId);
                    }
                }
                else if (feature.ColumnValues["ONE_WAY"] == "Y" && feature.ColumnValues["INDICATOR"] == "0")
                {
                    if (startDistance > endDistance)
                    {
                        result.Features.Add(new Feature(line));
                    }
                    else
                    {
                        result = routingEngine.GetRoute(startFeatureId, endFeatureId);
                    }
                }
            }



 



Thanks,
 
Johnny

1910-BuildOneWayData-Step2.zip (3.91 KB)


 Johnny, 
  
 I think you took an old file that i send before, I will send it with again with the name (one way). 
  
 the column (is a one way) is  TRAVEL_DIR, and the Direction is from the start Vernice to the end Vernice. 
  
 Thank you, 
  
 Rami.

Rami, 
  
 I have asked the new shape files for our support. And the solution will be sent to you as soon as possible. 
  
 Thanks, 
 Johnny

Thank you, 
  
 Rami.

 


Rami,
 
Please refer to the attachment, which has two files, “BuildingOneWayRoutingDataForRami.cs” is for building one-way routing data based on yours, the others are about how to route with the “One-way” data, which has some custom code posted before.
 
Here are the screenshot:




Thanks,


Johnny



Rami,


Here is the attachment.


Johnny



1918-Samples.zip (7 KB)


 Johnny, 
  
 Thank you very much, you have been a great help… 
  
 Rami.


 You are so welcome, any question please let me know. 
  
 Johnny


 You are so welcome, any question please let me know. 
  
 Johnny