ThinkGeo.com    |     Documentation    |     Premium Support

How to snap to the edges of a polygon?

If I want to snap to a polygon, I can use the FeatureLayer.QueryTools.GetFeaturesWithinDistanceOf() to find the polygons close to the cursor point. But if I just want to snap to the edges of the polygon, which function can I use? So far, I use GetFeaturesWithinDistanceOf to find the polygon, and then check if the cursor point is contained in it. In this way, the edge can be snapped only when the cursor point is outside the polygon. Is there any other way better than this? Thanks.

Attaching files.

Hi Jue, 
  
 I think you can find the nearest polygon first, then call this API as below: 
  
  

PolygonShape polygonShape;
            
polygonShape.GetClosestPointTo

 
  
 Regards, 
  
 Don

Hi Don, 
  
 Thanks for your reply. The API you mentioned is just to find the closet point on the polygon. What I want is to check if the cursor point is close to the edge of the polygon or not. Do you mean, by using this method, I can do as below? 
 1.Get the closet point on the polygon edge; 
 2.Calculate the distance from this point to the cursor point; 
 3.Check if the distance is in the tolerance. 
  
 The description of polygonShape.GetClosestPointTo says, this method returns the point on the current shape that is closet to the target shape. If the target shape is inside the polygon, will it returns the point on the polygon edge? If so, this is a solution for my problem. And I want to make sure there’s no other way better than this one. 
  
 Thanks 
 Jue

Hi Jue, 
  
 1.Get the closet point on the polygon edge;                               
  
 polygonShape.GetClosestPointTo(Pointshape…  // This only works when point out the polygon 
  
 2.Calculate the distance from this point to the cursor point;  
  
 point.GetDistanceTo(Pointshape…  // This can calculate the distance between two points 
  
 3.Check if the distance is in the tolerance.  
  
 You can compare the distance to tolerance, please make sure they are with same map unit. 
  
  
 Because the first function only works when the point out of polygon, so you need to do something like this: 
  
 1. Make sure point is contained or not by any polygon.   
  
 ShapeFileFeatureLayer layer; 
 layer.QueryTools.GetFeaturesContaining(PointShape… 
  
 2. If not contained by any polygon, find the nearest polygon and get the nearest point on it 
  
 ShapeFileFeatureLayer layer; 
 layer.QueryTools.GetFeaturesNearestTo(PointShape… 
  
 polygonShape.GetClosestPointTo(Pointshape… 
  
 3. If contained by any polygon, convert the outer ring of the polygon and find the nearest point on it. 
  
             PolygonShape polygon; 
             System.Collections.ObjectModel.Collection<Vertex> vertexes = polygon.OuterRing.Vertices; 
             vertexes.RemoveAt(vertexes.Count - 1); 
             LineShape line = new LineShape(vertexes); 
             line.GetClosestPointTo(PointShape… 
  
  
 Wish that’s helpful. 
  
 Regards, 
  
 Don

Hi Don, 
  
 From your 3rd answer, I can see the best way to check the spatial relationship of a polygon edges is converting the edges to a line. Then all the other operations can be processed based on this line. 
  
 Thanks for your help. 
  
 Best regards 
 Jue 


Hi Jue, 
  
 Yes, you’re right.  
  
 If you have any other questions, please feel free to let us know. 
  
 Thanks,