ThinkGeo.com    |     Blog    |     Wiki    |     Support

Optimize roadtype

We refer to the Optimize Roadtype sample(samples.thinkgeo.com/RoutingEdition/HowDoISamples/) online.

In our project, we have 3 types of road and 3 types of vehicles. It is one-one relation. We used the “Algorithm_FindingPath” in the example, but met some problems.

1.Good(Red)                                              1Car(Good)

2.Average (Orange)                                  2.Bus(Average)

3.Poor(Green)                                           3.Truck( Poor)



Q1: If I choose “Truck” button, it means that the route should be green. In the algorithm, the Good and Average set are removed if Poor.Count>0.

But sometimes the route shows that the majority of the roads are green. Some parts are red and orange. Why?





Q2: We used a listbox to show the Poor set and a textbox to show the count of Poor. I choose the startpoint and endpoint on a green road.

If these two points are very near, it shows that the “Algorithm_FindingPath” algorithm is not executed because the listbox and textbox are null( I also verified by debugging the code step by step).

If these two points are far away from each other, everything is correct.





Q3:If I choose the startpoint and endpoint on a “Red” road and click “Truck” button, it should be no route exists. But the listbox and textbox told me some green roads have been found. It seems that this “Algorithm_FindingPath” algorithm finds the routes according to the adjacent points of start/end points.(Is there any Green roads around point A and B? We hope the algorithm is that is there any Green roads which links A and B? )





 // Truck button
        private void button6_Click(object sender, EventArgs e)
        {
            i = 1;
            featureSource = new ShapeFileFeatureSource(str1);
            featureSource.Open();
            RoutingSource routingSource = new RtgRoutingSource(str2);
            routingEngine = new RoutingEngine(routingSource, featureSource);  
            routingEngine.RoutingAlgorithm.FindingRoute += new EventHandler<FindingRouteRoutingAlgorithmEventArgs>(Algorithm_FindingPath);
            Route1();
           



        }






        private void Route1()
        {
            RoutingLayer routingLayer = (RoutingLayer)((LayerOverlay)mapControl.Overlays[“RoutingOverlay”]).Layers[“RoutingLayer”];
            RoutingResult routingResult = routingEngine.GetRoute(routingLayer.StartPoint, routingLayer.EndPoint);
            routingLayer.Routes.Clear();
            routingLayer.Routes.Add(routingResult.Route);



            mapControl.CurrentExtent = new RectangleShape(-97.7632741244507, 30.2776084974365, -97.7315167697143, 30.2549491956787);
            mapControl.Refresh(mapControl.Overlays[“RoutingOverlay”]);
        }  






        void Algorithm_FindingPath(object sender, FindingRouteRoutingAlgorithmEventArgs e)
        {
            Collection<string> Good = new Collection<string>();
            Collection<string> Average = new Collection<string>();
            Collection<string> Poor = new Collection<string>();



            foreach (string item in e.RouteSegment.StartPointAdjacentIds)
            {
                RouteSegment road = routingEngine.RoutingSource.GetRouteSegmentByFeatureId(item);



                if (road.Distance == 2)
                {
                    Good.Add(item);
                }



                if (road.Distance == 1)
                {
                    Average.Add(item);
                }



                if (road.Distance == 0)
                {
                    Poor.Add(item);
                }



            }



            foreach (string item in e.RouteSegment.EndPointAdjacentIds)
            {



                RoutingLayer routingLayer = (RoutingLayer)((LayerOverlay)mapControl.Overlays[“RoutingOverlay”]).Layers[“RoutingLayer”];
                RouteSegment road = routingEngine.RoutingSource.GetRouteSegmentByFeatureId(item);



                if (road.Distance == 2)
                {
                    Good.Add(item);
                }



                if (road.Distance == 1)
                {
                    Average.Add(item);
                }



                if (road.Distance == 0)
                {
                    Poor.Add(item);
                }









            }



            int a = Poor.Count;
            textBox1.Text = a.ToString();
            listBox1.Items.Add(Poor);



            if (i == 1)
            {
                if (Poor.Count > 0)
                {
                    foreach (string item in Good)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }



                    foreach (string item in Average)
                    {
                        e.RouteSegment.StartPointAdjacentIds.Remove(item);
                        e.RouteSegment.EndPointAdjacentIds.Remove(item);
                    }
                    i = 0;



                }
                else
                {
                    MessageBox.Show(“No Route Exists!”);
                    i = 0;
                    routingLayer.Routes.Clear();
                    mapControl.Refresh(routingOverlay);
                    return;
                }
                return;
            }






        }









Hi Junxuan, 
  
 I have some questions for you before providing the reply here, just outline them as following: 
 1. For 3 kinds of road type, you just only have one routing index file (.rtg and .rtx), or have 3 different routing index file for different type? 
 2. If I choose “Truck”, does that mean the route calculated just should include the “Green” road segments, no Red and Orange? 
 3. Is it possible to update a demo data, including the .rtg and .rtx to us for test? If it’s a big data, please let me know what’s the boundingbox of the map you shew in the pictures. You can send the data to forumsupport@thinkgeo.com or ask support@thinkgeo.com for a FTP address. 
  
 Here as following are the replies of your questions, now I just can give you brief description of my guess, I need your demo data, better a demo code as well to determine what exactly is. 
 Q1: I guess the reason is in attached code, seems like the codes in Algorithm_FindingPath event just take the scenario that the route from “Poor” into account, but missed the other 2 scenarios. Please update your demo to us, we will try correct for you. 
 Q2: “Very near” should mean the start and end point is on the same route segment, right? If not please let me know.  
 Q3: May have the same problem mentioned in Q1, but not very sure, please update your demo to us for debug. 
  
 Thanks, 
 Johnny 


Hi Junxuan, 
  
 I have some questions for you before providing the reply here, just outline them as following: 
 1. For 3 kinds of road type, you just only have one routing index file (.rtg and .rtx), or have 3 different routing index file for different type? 
 2. If I choose “Truck”, does that mean the route calculated just should include the “Green” road segments, no Red and Orange? 
 3. Is it possible to update a demo data, including the .rtg and .rtx to us for test? If it’s a big data, please let me know what’s the boundingbox of the map you shew in the pictures. You can send the data to forumsupport@thinkgeo.com or ask support@thinkgeo.com for a FTP address. 
  
 Here as following are the replies of your questions, now I just can give you brief description of my guess, I need your demo data, better a demo code as well to determine what exactly is. 
 Q1: I guess the reason is in attached code, seems like the codes in Algorithm_FindingPath event just take the scenario that the route from “Poor” into account, but missed the other 2 scenarios. Please update your demo to us, we will try correct for you. 
 Q2: “Very near” should mean the start and end point is on the same route segment, right? If not please let me know.  
 Q3: May have the same problem mentioned in Q1, but not very sure, please update your demo to us for debug. 
  
 Thanks, 
 Johnny 


Hi Junxuan, 
  
 I have some questions for you before providing the reply here, just outline them as following: 
 1. For 3 kinds of road type, you just only have one routing index file (.rtg and .rtx), or have 3 different routing index file for different type? 
 2. If I choose “Truck”, does that mean the route calculated just should include the “Green” road segments, no Red and Orange? 
 3. Is it possible to update a demo data, including the .rtg and .rtx to us for test? If it’s a big data, please let me know what’s the boundingbox of the map you shew in the pictures. You can send the data to forumsupport@thinkgeo.com or ask support@thinkgeo.com for a FTP address. 
  
 Here as following are the replies of your questions, now I just can give you brief description of my guess, I need your demo data, better a demo code as well to determine what exactly is. 
 Q1: I guess the reason is in attached code, seems like the codes in Algorithm_FindingPath event just take the scenario that the route from “Poor” into account, but missed the other 2 scenarios. Please update your demo to us, we will try correct for you. 
 Q2: “Very near” should mean the start and end point is on the same route segment, right? If not please let me know.  
 Q3: May have the same problem mentioned in Q1, but not very sure, please update your demo to us for debug. 
  
 Thanks, 
 Johnny 


Hi Junxuan, 
  
 I have some questions for you before providing the reply here, just outline them as following: 
 1. For 3 kinds of road type, you just only have one routing index file (.rtg and .rtx), or have 3 different routing index file for different type? 
 2. If I choose “Truck”, does that mean the route calculated just should include the “Green” road segments, no Red and Orange? 
 3. Is it possible to update a demo data, including the .rtg and .rtx to us for test? If it’s a big data, please let me know what’s the boundingbox of the map you shew in the pictures. You can send the data to forumsupport@thinkgeo.com or ask support@thinkgeo.com for a FTP address. 
  
 Here as following are the replies of your questions, now I just can give you brief description of my guess, I need your demo data, better a demo code as well to determine what exactly is. 
 Q1: I guess the reason is in attached code, seems like the codes in Algorithm_FindingPath event just take the scenario that the route from “Poor” into account, but missed the other 2 scenarios. Please update your demo to us, we will try correct for you. 
 Q2: “Very near” should mean the start and end point is on the same route segment, right? If not please let me know.  
 Q3: May have the same problem mentioned in Q1, but not very sure, please update your demo to us for debug. 
  
 Thanks, 
 Johnny 


HI, 

Thanks for your reply.



1. Only one routing index file(.rtg and .rtx)

2. Yes. "Truck" means green route only. "Bus" means orange route only. "Car" means red route only.

3. Yes. "Very near" means the start and end points are on the same route segment.



I send the demo data and two codes to forumsupport@thinkgeo.com

First we use TexasRoads.shp to generate TexasRoad1.rtg file. In the shapefile, there is a column called "NHS".

If NHS>4, RouteSegment.Distance=2

If 1<=NHS<=3, RouteSegment.Distance=1

If NHS=0, RouteSegment.Distance=0



In the RoadType code, we divided the road two 3 categories.

If  RouteSegment.Distance=2, then "Good"

If  RouteSegment.Distance=1, then "Average"

If  RouteSegment.Distance=0, then "Poor"

For the details, please refer to the code.





Junxuan

Hi Junxuan, 
  
 Thanks for your demo and detailed description, we will dig into it and try doing some change to your demo to make sure it fits your requirement, it may need around 2 days, once it’s completed, I will update it here. 
  
 Thanks, 
 Johnny

HI, Johnny:



Thanks for your reply. Currently, our project this routing function urgently. Please keep me updated.



Junxuan

Hi Junxuan,



Thanks for the waiting!



First of all, We want you to know we upgrade the rtg file version to make the RouteSegmentType field back and so in the below codes, we are using the RouteSegmentType instead of Instance. The fixed version should be 9.0.108.0 or higher, please get it in product center.



For the #2 issue, we think this makes sense the event won’t be triggered, the reason is they belong to a same segment and we are using a segment as an unit to route. As for #1 and #3, looks like are the same one which the unexpected road type are added into the result path, would you confirm it? The below is the finding for #1 and #3, please check as below:



Looks like there are some issues when you are generating the rtg file, please try the below codes:


private void BuildRtgFile()
        {
            RtgRoutingSource.GenerateRoutableShapeFile(sourceShp,routableShp,OverwriteMode.DoNotOverwrite);
             
            featureSource = new ShapeFileFeatureSource(routableShp);
            featureSource.Open();
 
            RtgRoutingSource.BuildingRoutingData += new EventHandler<BuildingRoutingDataRtgRoutingSourceEventArgs>(RtgRoutingSource_BuildingRoadData);
            RtgRoutingSource.GenerateRoutingData(rtgFile, sourceShp, routableShp, BuildRoutingDataMode.Rebuild, GeographyUnit.DecimalDegree, DistanceUnit.Meter);
        }
 
        private void RtgRoutingSource_BuildingRoadData(object sender, BuildingRoutingDataRtgRoutingSourceEventArgs e)
        {
            featureSource.Open();
            Feature feature = featureSource.GetFeatureById(e.RouteSegment.FeatureId, new string[] { “NHS” });
 
            if (Convert.ToInt32(feature.ColumnValues[“NHS”]) > 4)
            {
                e.RouteSegment.RouteSegmentType = 2;
            }
 
            if (Convert.ToInt32(feature.ColumnValues[“NHS”]) >= 1 && Convert.ToInt32(feature.ColumnValues[“NHS”]) <= 3)
            {
                e.RouteSegment.RouteSegmentType = 1;
            }
 
            if (Convert.ToInt32(feature.ColumnValues[“NHS”]) == 0)
            {
                e.RouteSegment.RouteSegmentType = 0;
            }
        }

There are two parts you may notice, one is we need to generate the routable file at first and then use it as the FeatureSource in the future. The other one is we are using the segment.FeatureId instead of e.LineShape.Id.



After generating the new rtg file, then in FindingPath event, we use the below codes:


void Algorithm_FindingPath(object sender, FindingRouteRoutingAlgorithmEventArgs e)
        {
            Collection<string> Good = new Collection<string>();
            Collection<string> Average = new Collection<string>();
            Collection<string> Poor = new Collection<string>();
 
            for (int i = e.RouteSegment.StartPointAdjacentIds.Count - 1; i >= 0; i–)
            {
                RouteSegment road = routingEngine.RoutingSource.GetRouteSegmentByFeatureId(e.RouteSegment.StartPointAdjacentIds<i>);
                if (road.RouteSegmentType != int.Parse(cbmPrioritiy.Text.ToString()))
                {
                    e.RouteSegment.StartPointAdjacentIds.Remove(e.RouteSegment.StartPointAdjacentIds<i>);
                }
            }
            for (int i = e.RouteSegment.EndPointAdjacentIds.Count - 1; i >= 0; i–)
            {
                RouteSegment road = routingEngine.RoutingSource.GetRouteSegmentByFeatureId(e.RouteSegment.EndPointAdjacentIds<i>);
                if (road.RouteSegmentType != int.Parse(cbmPrioritiy.Text.ToString()))
                {
                    e.RouteSegment.EndPointAdjacentIds.Remove(e.RouteSegment.EndPointAdjacentIds<i>);
                }
            }
        }

Then, I did some tests and looks like the routing is correct and have no unexpected road type are added. One of the test looks like:







In case you need the routable shape file and new rtg file, I attached them, please download and test them. If the issue persists, would you mind to let us know your test start/end position, or your application is better.



Thanks,



Troy


Please download the files with this link: ap.thinkgeo.com:5001/fbsharing/SGxeTQa8