ThinkGeo.com    |     Documentation    |     Premium Support

Best way to detect if a point lies on a line

Hello ThinkGeo-Team,


what is the best way to detect if a point, that is created by the user with InteractiveOverlay, lies on a line that is part of another layer.


Is there a spatial method to get this information?


I tried crossing() method but this did not work.


Thomas



Thomas,


 
Thanks for your post and questions.
 
Yes, I agree with you that the crossing cannot be applied directly here, because it is only useful in area type shapes query.
 
From my point of understanding, the point created by user in InterativeOverlay is rarely possible in one line shape because of mathematic pureness. While if a calculation tolerance is given, then it is somehow practical useful. My solution is trying to the API GetFeaturesInsideBoundingBox against the other layer, the passed in boundingbox is composed with the point and the tolerance. What do you think?
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Thomas: 
  
 I did a similar process.  I have a road network in UTM (MultilineShape).  The user clicks a point on the map.  I needed to locate the line "clicked" on, and reposition the point exactly along the line. 
  
 I used the winformsMap1_MouseDown(object sender, MouseEventArgs e) method to get the click point from the user, and convert to PointShape worldPoint.  I used a tolerance of 15 meters and did the following, with worldPoint being the road network file: 
  
                         Collection<Feature> selectedFeaturesR = roads.QueryTools.GetFeaturesWithinDistanceOf( 
                             (BaseShape)worldPoint, GeographyUnit.Meter, DistanceUnit.Meter, 
                             15, ReturningColumnsType.AllColumns); 
  
 I then moved through each of the returned features to find the closest line.   
  
                             distance = 999999999.99999F; 
                             tmppos = -1; 
                             for (d = 0; d < selectedFeaturesR.Count; d++) 
                             { 
                                     MultilineShape lineshape2 = (MultilineShape)(selectedFeaturesR[d].GetShape()); 
                                     tmpdistance = lineshape2.GetDistanceTo(worldPoint, GeographyUnit.Meter, DistanceUnit.Meter); 
                                     if (tmpdistance < distance) { distance = tmpdistance; tmppos = d; } 
                                 } 
                             } 
                             d = tmppos; 
  
 Using the located closest feature, I then used the code from the snapping examples  (Dragged Point Style, Snap To Layer, Snap To Vertex)to reposition the point exactly along the line. 
  
 Hopefully this helps. 
  
 Elisa 


 We have a Code Community sample, Get FeatureClicked On (Desktop),  that shows how to know if a user clicked on a feature (point, line or area based). You can set the tolerance in screen coordinates which what I think you are looking for. If the user clicked on a line within the tolerance, you can put it right on the line using the GetClosestPointTo method. So the line of code would look like:



 



PointShape myPointShape = multilineShape.GetClosestPointTo(clickedPointShape, myMap.MapUnit);

wiki.thinkgeo.com/wiki/Map_Suite_De...ns_Samples




Thanks Val and Elisa for pointing me in the right way. 
 I see I have to work with tolerance and distance to get my result. 
  
 Thomas 
  


Thomas, 
  
 Thanks for letting me know your status. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


I want to snap a point to the neareast vertex. 


how i would do this 



Hi, 
  
 Assume the vertices are in a polygon, then you can use the method Polygon.GetClosestPointTo(point, unit), to get the nearest vertex. 
  
 Regards, 
  
 Edgar