ThinkGeo.com    |     Blog    |     Wiki    |     Support

Routing not using closest point?

Good evening,


In the picture below we are generating a route from the building marked with the pushpin to a point east on Marietta Avenue (to the lower right of the picture's coverage area).  Based on measurement lines drawn by our application, it appears that the road closest to the point is not being selected as the starting point and the route is starting on Route 30 W instead of Marietta Avenue, although Marietta Avenue is more than 60 feet closer.  Instead of generating a route that should go a few blocks it generates a route that goes out onto a highway, finds a ramp, goes onto the eastbound lane, and comes back onto Marietta Avenue via a road to the north, etc.  The bottom picture shows the same area in the routing shapefile.  Note that Marietta Avenue is also Route 23.


Any idea what's going on here?  The one thing that occurs to me is that the closest point of the road segment to the starting point is not being used, but perhaps some other point of the segment.


Thanks,


Allen


 





 


Hi Allen,
Thanks for your post and detailed description.
To make sure I understand you clearly, please allow me to confirm how you get the closest point? Are you trying the steps as following:
1.       Get the nearest feature(road) with method like “featureSource.GetFeaturesNearestTo”.
2.       Get the closest point on the feature as the routing start point with method like “nearestFeatureLine.GetClosestPointTo(currentMousePosition, winformsMap1.MapUnit);”.
 
If yes, there might be a bug in the method “GetFeaturesNearestTo” and now, we are working on it, now can you try the workaround as following:



            double minDistance = double.MaxValue;
            Feature nearestFeature = null;
            Collection<Feature> possibleNearestFeatures = featureSource.GetFeaturesNearestTo(pushpinPosition, winformsMap1.MapUnit, 1, new string[] {});
            foreach (var item in possibleNearestFeatures)
            {
                LineBaseShape line = item.GetShape() as LineBaseShape;
                double currentDistance = line.GetDistanceTo(currentMousePosition, winformsMap1.MapUnit, DistanceUnit.Meter);
                if (currentDistance < minDistance)
                {
                    minDistance = currentDistance;
                    nearestFeature = item;
                }
            }
            if (nearestFeature != null)
            {
                LineBaseShape line = nearestFeature.GetShape() as LineBaseShape;
                closestPoint = line.GetClosestPointTo(pushpinPosition, winformsMap1.MapUnit);
            }



From the code above, we know we still use the method “featureSource.GetFeaturesNearestTo” to get the “optional” nearest features, but do a minor changes here, maybe you have noticed there is a input parameter “maxItemsToFind” for this method, now we can assign it as like 3, Which means we might get at most 3 nearest features on this point.
If we fixed this bug, we will update the status here as soon as possible.
Sorry for any inconvenient.
Best regards
Johnny

Good afternoon Johnny, 
  
 It’s actually much simplier than that.  The user right-clicks on the map and a contextual menu comes up with an option to plot a “call point”.  This is the yellow pushpin on the map above.  The user then right-clicks on the map again and selects the “start route here” menu option.  So we are passing the two points into the routing engine, and, presumably, letting it find the closest road segments.  MOST OF THE TIME this works properly, but in the case above the routing engine seems to prefer the highway over the local road (even though the local road is closer) as the ending point (at the building with the pushpin), but there is no nearby access to the highway at that point. There has been some speculation in the office that the routing engine may prefer highways (using the segment weight) over local roads, but I have no way of knowing that. 
  
 To get around this to some degree, we have extended our logic to look at the roads at the start and end of the route and only use a highway or ramp if it’s within 10 meters of the point, giving preference to local roads which would be actual access points to the route. 
  
 Allen

 Hi Allen, 


Do you mean the two points for routing engine are the location where the user right-click on? Also, you didn’t get the closest point on the road and let it as the routing engine start/end point? 


If it is, I guess it is caused by the same reason above, as routing engine find a wrong closest point on the road from the user click position. So, we need to do pre-work to set the start point and end point before we fixed the bug. A little work is like I mentioned before, we need to get the closest point on the road from the position where user click.




 

Double maxItemsToFind = 3;

double minDistance = double.MaxValue;

            Feature nearestFeature = null;

            Collection<Feature> possibleNearestFeatures = featureSource.GetFeaturesNearestTo(pushpinPosition, winformsMap1.MapUnit, maxItemsToFind, new string[] {});

            foreach (var item in possibleNearestFeatures)

            {

                LineBaseShape line = item.GetShape() as LineBaseShape;

                double currentDistance = line.GetDistanceTo(pushpinPosition, winformsMap1.MapUnit, DistanceUnit.Meter);

                if (currentDistance < minDistance)

                {

                    minDistance = currentDistance;

                    nearestFeature = item;

                }

            }

            if (nearestFeature != null)

            {

                LineBaseShape line = nearestFeature.GetShape() as LineBaseShape;

                closestPoint = line.GetClosestPointTo(pushpinPosition, winformsMap1.MapUnit);

            }

 


Please follow the above workaround and have a try.


Thanks,


Johnny



Hi Johnny, 
  
 I may be mistaken here…for some reason I thought when I fed two points into the routing engine that I had read that it would find the closest road segments to the starting and ending points, but I can’t find anything documenting that at the moment.  If it’s supposed to do that then this might be a bug, but if it’s not supposed to do that, then I agree 100% with what you said and we can forget the whole thing! 
  
 Anyway, as I noted above, I have implemented something like you suggest: I get the 10 closest roads to both the starting and ending points and scan them, giving local roads more priority over highways and ramps to avoid the situation like I show in the picture: only if a ramp or highway is within 10 meters is it used.  The result is that the ending point (near the yellow pushpin) is placed on Marietta Avenue instead of the middle of a highway that can’t be accessed without driving miles to a ramp. 
  
 Allen

 Hi Allen,


I think you were correct, it should be a bug here, what we expected is what you did for the first time. we are still working on it now, I will try getting the fix ASAP and let you know here.



For the problem shown in the picture you provided, I don’t think it is caused by the priority between highways and ramps. It is still caused by this bug. So, I guess you can try removing code for checking the priority.


Sorry for the inconvenience.


 


Best regards,


Johnny




Hi Allen, 
  
 We have fixed the bug, would you please download the latest version 6.0.361.0 or 6.0.0.361 and try it again? 
  
 Hope it helps 
  
 Johnny