ThinkGeo.com    |     Documentation    |     Premium Support

Catch if user clicks on a line or point on a map

My VB.Net MapSuite 5.5 application uses the following code to catch a right-click event on a MapSuite map and then determines if the user right-clicked on a user-drawn shape.  Map1_Click() catches the click event and IsInsideShape() determines if the point clicked is inside a user-drawn circle, rectangle, polygon, etc.  This code works well - but I need to catch if a user clicks on a user-drawn line or point, which doesn't work.  What code can I use to add in here and also catch if a user clicks a line or point?



 



'check for right-click on a map object

 


 


 


Private Sub Map1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Map1.ClickDim mouseEventArgs As MouseEventArgs = CType(e, MouseEventArgs)'check for right-click on the map

 


If mouseEventArgs.Button = Windows.Forms.MouseButtons.Right Then

 


'calculate the point we right-clicked on the map

 


 



_selectedShape = IsInsideShapeClick(clickedLocation)


 



 



Dim clickedLocation As PointShape = ExtentHelper.ToWorldCoordinate(Map1.CurrentExtent, mouseEventArgs.X, mouseEventArgs.Y, Map1.Width, Map1.Height)'see if point is inside a user-drawn shape

If _selectedShape IsNot Nothing Then

contextMenuShapes.Show(mouseEventArgs.X, mouseEventArgs.Y)


 


End If

 


End If

 


End Sub 

 


Private Function IsInsideShapeClick(ByVal clickLocation As PointShape) As DrawnShapesClass

 


'This function will determine if a given point is inside a shape

 


Dim selectedShape As DrawnShapesClass = Nothing

 


 


 


Dim drawnFeaturesLayer As MapShapeFeatureLayer = DirectCast(Map1.FindFeatureLayer(Name_ShapeFeatureLayer), MapShapeFeatureLayer)Dim i As Integer = 0'loop through each shape to see if any contain the clickLocation point

 


 


For Each mapShape As ExtendedMapShape In drawnFeaturesLayer.MapShapesIf clickLocation.Intersects(mapShape.Feature) Then

selectedShape = shapeArray(i)


 


End If

i = i + 1


 


Next

 


 


 


Return selectedShapeEnd Function 




Michael,


  I see what you are doing with the function IsInsideShape and even though you say that this is working well with area based shapes such as circle, rectangle and polygon, I will be a little bit critical to your approach. I did not run your code but by looking at it it seems that the user has to click right inside the shape to get it which can be a little awkward when the map is zoomed out and the shape appears smaller. Typically, when it comes to user interaction with the map for getting shapes, this is done based on screen tolerance which is a friendlier approach to the user.


 I suggest you look at the sample GetFeatureClicked On (Desktop) in the Code Community wiki.thinkgeo.com/wiki/Map_Suite_De...Desktop.29. In this sample, you wil see the technique for finding the feature the user clicked on for polygon and also point and line based features. The underlying technique uses buffers in screen coordinate which makes it working working smoothly regardless of the zoom level. I think that this sample will give you the tools for improving what you currently have and for having it working for lines and points. This is a C# sample but you should not have problems translating to VB.



Thanks Val - funny story, I paid ThinkGeo to write that code.  It does work great, just need to extend it to support lines and points.  If that approach doesn’t support lines/points, I’ll look to rewrite if possible based on the Code Community sample.  Thanks!

Michael,


  Yes, if you want to have it extended to support lines and points, I think that you are going to find what you need in the link I gave you in my previous response. I am also preparing right now a new more complete sample app for the Code Community on that aspect of getting features at user mouse clicking. It will show that in one map with all types of shapes and in a projected state. More to come on that.



Michael,


 As promised, we posted a new sample in the Code Community, Get Feature Clicked On With Projection wiki.thinkgeo.com/wiki/Map_Suite_Wp...Projection


I think you will find it interesting. Thank you.




Thanks Val - dug into that sample code and was able to modify for my application.  Makes much more sense now and works great, thanks for the help!

Michael,


 You are welcome. I am glad that the sample code we posted in the Code Community helped you for your development. Any other questions, let us know.