ThinkGeo.com    |     Documentation    |     Premium Support

Snapping to Feature

Hi,


I have extended the example where tracking is used to measure the length of a line string with some snapping functionality. This is working fine when tracking the start and the end point of the track. But snapping to a vertex fails.


The same snapping function is also used tracking a polygon to measure the area. All points will be snapped correct.


The function SnapToFeature will handle the feature which should be snapped as a MultiPoint geometry (therefore a feature will be parsed and with my function ExtractPoints the MultiPoint will be returned).


Any idea why the vertex from a line string will not be drawn/created correct? Snapping is correct but the replacement of the clicked point and the snapped point has no effect to the track geometry and this will return a wrong measurement.


Attached the track class and the functions from my solution.


Regards


Hardy




sample.vb (13 KB)

Hi Hardy,



Would you please try the below codes in your TrackHandler method:


    Private Sub TrackHandler()
        Try
                  If Me.Vertices.Count > 2 Then
                    Me.Vertices(Me.Vertices.Count - 2) = v
                  End If
            rulerRouteShape = Me.GetTrackingShape
        Catch ex As Exception
 
        End Try
    End Sub

Actually, we should modify the last but one vertex. 

If the issue still persists, please feel free to let us know and I will give your more details.

Thanks,

Troy

Hi Troy,


what do you mean with "v" => Me.Vertices(Me.Vertices.Count - 2) = v ?


I think there is something missing...


Regards


Hardy



Hi Troy,


I have just recreated my Track class. Have a look at the attachment.


Now it's working fine, but I think there is a problem with the internal handling of the trackshape. Maybe this is buffered and the Vertices will not be handled correctly. Addvertex is in my focus and to me it seems to be working wrong.


I'm collecting all points (clicked or snapped) in a collection and draw this on the canvas.


Regards


Hardy



RouteTrackInteractiveOverlay.vb (5.53 KB)

Hardy,



Sorry the previous reply is a mistake.



I checked the attached file and found you added a PointList array in your latest code. Then you add the points in the tracking layer and redraw the layer in some events. I have some questions now. Do you mean the second attached file(with pointList) is just a workaround and you still want to use the first one which implement the snapping by changing the e.AddingVertex value? can you please let us know what’s the issue with your second file code?



I did some modifications in the Vertexhandler method from the first attached file, as the following:


Private Sub Vertexhandler(sender As Object, e As VertexAddingTrackInteractiveOverlayEventArgs)
            Try
                Lock.EnterWriteLock()
                'Dim StartPoint As New PointShape(New Vertex(e.AddingVertex.X, e.AddingVertex.Y))
 
                'StartPoint = SnapToFeature(StartPoint)
                'If StartPoint Is Nothing Then
                ’    StartPoint = New PointShape(New Vertex(e.AddingVertex.X, e.AddingVertex.Y))
                'End If
 
                e.AddingVertex = SnapToFeature(Me.Vertices(Me.Vertices.Count - 1)) 'New Vertex(StartPoint.X, StartPoint.Y)
 
                Me.Vertices(Me.Vertices.Count - 1) = SnapToFeature(Me.Vertices(Me.Vertices.Count - 1))
 
                Lock.ExitWriteLock()
            Catch ex As Exception
 
            End Try
        End Sub

Would you please have a try?



Thanks,
Troy




Hi Troy,


I like to have the e.addedvertex getting the new (snapped) coordinate. But it seems to me that the internal handling of the trackshape is doing something wrong.


My last file is the working solution. What I like to get is a LineString which is built from all points the user will click on. If the click is near to an existing geometry the nearest vertex should be snapped.


Regards


Hardy



Hi Hardy,



 The issue that modifying the e.addedVertex value doesn’t affect, does not make sense, and seems a bug, but I think we will take more time to verify it. Before that, I think the workaround I provide before should work for it.

                

                e.AddingVertex = SnapToFeature(Me.Vertices(Me.Vertices.Count - 1)) 'New Vertex(StartPoint.X, StartPoint.Y)
                Me.Vertices(Me.Vertices.Count - 1) = SnapToFeature(Me.Vertices(Me.Vertices.Count - 1))



Anyway, still good to hear you figure out a solution.

Any questions, don’t hesitate to let us know.

Thanks,

Troy