ThinkGeo.com    |     Documentation    |     Premium Support

Marker Drag is reporting wrong coordinates

I am adding a marker move feature to our test app so a user can correct the Lat & Lon of an address that is not accurate.  So in my example when I search for the address it returns one result and shows the marker.  (Coordinates are 40.983363, -74.305872)







So the first problem I noticed is when I search for the same coordinates on OpenStreetMaps It  does not show in the same spot. (See Below)



Moving on… So now I want to drag the pin to the new location. I drag it and when it is dropped the coordinates are updated as (40.983464, -74.307388) and an the pin is showing here (See below)



Now if I take this new coordinates and pop them into OpenStreetMaps you can see the pin location differs drastically from what is shown in the application.





Why is this occurring?  There is certainly no way I can put out a feature like this that is so inaccurate.



The code for loading our map is pretty basic.


01.mapCtrl.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
02.mapCtrl.MapResizeMode = MapResizeMode.PreserveScaleAndCenter
03. 
04.mapCtrl.MapUnit = GeographyUnit.DecimalDegree
05.mapCtrl.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)
06.mapCtrl.CurrentExtent = New RectangleShape(-75.412903, 41.409776, -73.979187, 38.826871)
07. 
08.simpleMarkerOverlay = New SimpleMarkerOverlay()
09.simpleMarkerOverlay.MapControl = mapCtrl
10. 
11.simpleMarkerOverlay.DragMode = MarkerDragMode.Drag
12. 
13.mapCtrl.Overlays.Add(“WMK”New WorldMapKitWmsDesktopOverlay())
14.mapCtrl.Overlays.Add(“SimpleMarker”, simpleMarkerOverlay)
15. 
16.mapCtrl.Refresh()

For the coordinates after the drag we are handling the MarkerDragged Event.


1.Private Sub simpleMarkerOverlay_MarkerDragged(sender As Object, e As MarkerDraggedSimpleMarkerOverlayEventArgs) Handles simpleMarkerOverlay.MarkerDragged
2.    Dim mouseLocation As PointShape = ExtentHelper.ToWorldCoordinate(mapCtrl.CurrentExtent, New ScreenPointF(e.CurrentLocation.X, e.CurrentLocation.Y), mapCtrl.Width, mapCtrl.Height)
3.    If DevExpress.XtraEditors.XtraMessageBox.Show(“Do you want to store the new Latitude and Longitude for this location?” & vbCrLf & String.Format(CultureInfo.InvariantCulture, “Lat :{0:0.######}”, mouseLocation.Y) & Space(1) & String.Format(CultureInfo.InvariantCulture, “Lon: {0:0.######}”, mouseLocation.X), “Correct Location?”, MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
4.        'Store to Data Source
5.        Me.txtLatitude.EditValue = mouseLocation.Y
6.        Me.txtLongitude.EditValue = mouseLocation.X
7.    End If
8.End Sub


Hi Dave,



I did a search on “35 Macopin Ave Riverdale, New Jersey 07457” and I can see the marker is at the same position as your first snapshots but the centroid point is (40.9833205898633 -74.3059773928841) where I took from the geocoding match result, rather than  (Coordinates are 40.983363, -74.305872). Then I copied the centroid point in OpenStreetMap and they are at the same point. So, would you please let us know where the Latitude/Longitude are from in your demo?



Btw, I also viewed the point (40.983464, -74.307388) and the result is not the same as you saw. The below is what I get and it also matched with OpenStreetMap or BingMaps







Thanks,



Troy

In my code I am first setting the Lat/Lon from the marker point from the returned results that are in my grid.  When the grid row is clicked it takes you to that marker point then populates my 2 text boxes with the FromLatitude and FromLongitude.


Private Sub gvResults_FocusedRowChanged(sender As Object, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs) Handles gvResults.FocusedRowChanged
    Dim dataGrid As DevExpress.XtraGrid.Views.Grid.GridView = TryCast(sender, DevExpress.XtraGrid.Views.Grid.GridView)
    Dim tag As BaseShape = BaseShape.CreateShapeFromWellKnownData(TryCast(Me.gvResults.GetRowCellValue(e.FocusedRowHandle, “CentroidPoint”), String))
    mapCtrl.CurrentExtent = DirectCast(tag, BaseShape).GetBoundingBox()
    mapCtrl.Refresh()
    Me.txtLatitude.EditValue = TryCast(Me.gvResults.GetRowCellValue(e.FocusedRowHandle, “FromLatitude”), String)
    Me.txtLongitude.EditValue = TryCast(Me.gvResults.GetRowCellValue(e.FocusedRowHandle, “FromLongitude”), String)
End Sub

Afterwards, if I want to drag and correct the point I am handling the Marker Dragged event and updating the two text boxes with the new values.


Private Sub simpleMarkerOverlay_MarkerDragged(sender As Object, e As MarkerDraggedSimpleMarkerOverlayEventArgs) Handles simpleMarkerOverlay.MarkerDragged
    Dim mouseLocation As PointShape = ExtentHelper.ToWorldCoordinate(mapCtrl.CurrentExtent, New ScreenPointF(e.CurrentLocation.X, e.CurrentLocation.Y), mapCtrl.Width, mapCtrl.Height)
    If DevExpress.XtraEditors.XtraMessageBox.Show(“Do you want to store the new Latitude and Longitude for this location?” & vbCrLf & String.Format(CultureInfo.InvariantCulture, “Lat :{0:0.######}”, mouseLocation.Y) & Space(1) & String.Format(CultureInfo.InvariantCulture, “Lon: {0:0.######}”, mouseLocation.X), “Correct Location?”, MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
        'Store to Data Source
        Me.txtLatitude.EditValue = mouseLocation.Y
        Me.txtLongitude.EditValue = mouseLocation.X
    End If
End Sub


Hi Dave,



Thanks for the codes, I think I found something.



For the first question, I assume when you click on the Grid row, you are using the Centroid point to update the marker position, but you updated the lon/lat textbox with the FromLoatitude and FromLongtitude. Would you please confirm it?



For the drag mark position, the marker position is calculated incorrect in the dragged event because of the screen point value. Instead of the calculation, we can take the current marker position out from the marker directly, as the marker’s position have been updated when we pass it in the event. So, please change the codes as the below:


Dim mouseLocation As PointShape = ExtentHelper.ToWorldCoordinate(mapCtrl.CurrentExtent, New ScreenPointF(e.CurrentLocation.X, e.CurrentLocation.Y), mapCtrl.Width, mapCtrl.Height)
 
Dim mouseLocation As PointShape = e.Marker.Position;

Hope it helps and please let us know if any questions.

Thanks,

Troy


Yes, your first assumption is correct as shown in the FocusedRowChanged event I has posted previously. 



I will give your second suggestion a try.  I had based much of this on the examples and what little resources I could find out there.



Oh and one additional note… I know I am posting code in VB.NET because we are a VB centric house here but I work in both.  You don’t need to convert anything to VB for me, please post as you are comfortable.  I’m much happier using C# personally.

Hi Dave,



Can’t agree any more, I would like to happy to use C#. :)

Don’t hesitate to let us know if any questions.



Thanks,



Troy