ThinkGeo.com    |     Documentation    |     Premium Support

Getting the vertex on a line closest to a given point

Is there a faster way of doing the following? I am using GetLineOnALine below to find the next vertext on a line from a given point on that line. The reason I am doing this is I already have stops that are displayed on the map indexed by vertex. Some of the LineShapes I am dealing with have over 1000 vertices so it can take quite a while to do it this way -


public ServiceableStop GetNextStopOnRoute(

            PointShape pointNearRoute, 

            LineShape routePath,

            Route route)

{

 PointShape intersectionPoint =

         routePath.GetClosestPointTo(pointNearRoute, GeographyUnit.Meter);


 EllipseShape intersectionSphere = new EllipseShape(

         intersectionPoint,

                10,

                GeographyUnit.Meter,

                ThinkGeo.MapSuite.Core.DistanceUnit.Meter);


 RectangleShape intersectionRect = intersectionSphere.GetBoundingBox();


 int intersectionIndex = -1;

        for (int index = 0; index < routePath.Vertices.Count - 1; index++)

        {

         Vertex vertex0 = routePath.Vertices[index];

         Vertex vertex1 = routePath.Vertices[index + 1];


         LineBaseShape lineSegment = routePath.GetLineOnALine(

          new PointShape(vertex0),

                 new PointShape(vertex1));


         if ((((LineShape)lineSegment).Vertices.Count > 0) &&

                    lineSegment.Intersects(intersectionRect))

                {

                    intersectionIndex = index + 1;

                    break;

                }

 }


        ServiceableStop nextStopOnRoute = null;

        for (int index = 0; index < route.StopIndices.Length; index++)

        {

         if (route.StopIndices[index] >= (intersectionIndex - 1))

                {

                    // TODO - FirstTrip is incorrect need to rework

                    nextStopOnRoute = route.FirstTrip.Stops[index] as ServiceableStop;

                    break;

                }

        }


 return nextStopOnRoute;

}



Christopher, 
  
  Thank you for your post. Can you explain a little more concretely your scenario? We don’t quite understand what you are doing and what the purpose of getting the next vertex on the line given a point. Also, we looked at the sample code you displayed but it is a little bit difficult to make sense of it without being able to run it. The ideal would be to have that code packaged into a sample app and I think that this way we will be in a real good situation to help you.

Sure Val - I understand i will see what I can do - i may have to just rig up an example since it will be hard to really extract this into something I could send you. Basically what this method supports is the user being able to drag and drop a stop onto a route and determining what the next stop on that route is from the drop point. The vertex at which each stop is located on a route is pre-calculated so if I could just get the next vertex on a line from a given point on that line it will be very fast to compare the stop vertices to that vertex and determine what is the next stop. Also - we are using our own drag & drop framework since we need to support dragging onto and off the map control but that probably doesn’t matter. Functionally this code works fine as it does allow me to determine at what line segment the drop point intersects and then what the next vertex on the routePath is. 
  
 Thanks, 
 Chris

you know what i think i’ve brainfarted this whole thing and don’t need GetLineOnALine.I think I just create a line shape from the two vertices and that is going to work. 
  
 Thanks. 
  
  


Glad to hear this will work for you.

Christopher, 
  
  Thank you for sharing the more detailed explantion to us on this interesting functionality. Also that gave me some ideas for some future Code Community samples.