WTH is GMap.NET?
Simply put: it’s an open source .net component that can show online mapping service (such as Google Map, Bing Map, OpenStreetMap) in your .NET app.
Download the binary here: http://greatmaps.codeplex.com/
Extract it. You’ll get the .net 2.0 and .net 4.0 version, since I’m using VS 2015, we’ll use the .net 4.0 version.
What will we do now is about how to move a marker inside the map (for tracking/visualizing object movement, etc). We’ll just move the marker randomly in this tutorial.
- Create new VB Windows Form project
- Add GMap.NET component into your project reference
- Add GMap.NET component into your toolbar.
- Now drag and drop the GMap.NET control into your Form, I name it myMap
- We’ll also add another controls: 1 Button (name: btnMove), 1 Timer (name: tmr1), 1 Label (name: lblInfo)
I also add new bitmap resource into our project properties. This will be used as our marker symbol.
You can see the Form’s full source code at the bottom of this post. I’ll just point out some important parts:
- Map initialization is on Form1_Load event code (zoom level, initial position, provider used, marker type, etc)
- When you click on the btnMove, it’ll start generating new random position for our marker. The random change is happened in the timer event (tmr1_Tick)
- The process to update the map visual is delegated into function update_map(), so it will run in different thread and the form still responsive
- In this tutorial, we are using BingSatelliteMapProvider, you can use another provider such as GoogleMapProvider or OviSatelliteMapProvider. Just see MapProviders namespace to see all supported providers.
Here’s the full source code:
Imports GMap.NET Imports GMap.NET.WindowsForms Public Class Form1 Private Delegate Sub UpdateFormDelegate() Private UpdateFormDelegate1 As UpdateFormDelegate Private copter_lat, copter_lon As Double Private WithEvents copter_marker As Markers.GMarkerGoogle Private WithEvents copter_layer As GMapOverlay Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load copter_lat = -7.076275 copter_lon = 110.428952 myMap.MinZoom = 5 myMap.MaxZoom = 20 myMap.Zoom = 17 myMap.Position = New PointLatLng(-7.076275, 110.428952) myMap.MapProvider = MapProviders.BingSatelliteMapProvider.Instance myMap.Manager.Mode = AccessMode.ServerAndCache copter_layer = New GMapOverlay("copter_layer") copter_marker = New Markers.GMarkerGoogle(New PointLatLng(-7.076275, 110.428952), My.Resources.purple_drone) copter_layer.Markers.Add(copter_marker) myMap.Overlays.Add(copter_layer) myMap.UpdateMarkerLocalPosition(copter_marker) myMap.Invalidate() update_map() End Sub Private Sub tmr1_Tick(sender As Object, e As EventArgs) Handles tmr1.Tick Randomize() Dim delta_lat As Double = ((100 * Rnd()) + 20) / 10000000.0 Dim delta_lon As Double = ((100 * Rnd()) + 20) / 10000000.0 Dim not_lat As Single = Rnd() Dim not_lon As Single = Rnd() If not_lat >= 0.5 Then copter_lat += delta_lat Else copter_lat -= delta_lat End If If not_lon >= 0.5 Then copter_lon += delta_lon Else copter_lon -= delta_lon End If UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf update_map) Invoke(UpdateFormDelegate1) End Sub Private Sub btnMove_Click(sender As Object, e As EventArgs) Handles btnMove.Click If tmr1.Enabled Then tmr1.Enabled = False MsgBox("Random Move stop") Else tmr1.Enabled = True MsgBox("Random Move start") End If End Sub Private Sub myMap_OnMapZoomChanged() Handles myMap.OnMapZoomChanged lblInfo.Text = "Info : Lat= " + CStr(copter_lat) + ", Lon= " + CStr(copter_lon) + ", Zoom Level= " + CStr(myMap.Zoom) End Sub Private Sub update_map() copter_marker.Position = New PointLatLng(copter_lat, copter_lon) myMap.UpdateMarkerLocalPosition(copter_marker) myMap.Invalidate() lblInfo.Text = "Info : Lat= " + CStr(copter_lat) + ", Lon= " + CStr(copter_lon) + ", Zoom Level= " + CStr(myMap.Zoom) End Sub End Class