Ended up encapsulating System.Device.Location.GeoCoordinateWatcher in a static class to get around the NaN coordinates returned from an uninitialized GeoCoordinateWatcher as it turns out that GMap.NET doesn't like NaN at all.
using System.Device.Location; namespace dreamstatecoding.blogspot.com { public static class GeoProvider { private static GeoCoordinateWatcher _watcher = new GeoCoordinateWatcher(); public static bool IsInitialized { get; private set; } static GeoProvider() { _watcher.PositionChanged += _watcher_PositionChanged; _watcher.Start(); } public static void Cleanup() { _watcher.Stop(); _watcher.Dispose(); _watcher = null; } private static void _watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { IsInitialized = true; ; } public static GeoCoordinate GetCoordinates() { var coordinates = _watcher.Position.Location; if (double.IsNaN(coordinates.Latitude)) return new GeoCoordinate(0, 0); return coordinates; } } }Usage: Giving the provider some time to get hold of the first coordinates. If it doesn't, the coordinate returned would be longitude:0;latitude:0. So pretty much in the ocean outside of Africa.
private void SetupMap() { for(int i = 0; i < 1000; i++) { if (GeoProvider.IsInitialized) break; Thread.Sleep(151); } var coordinates = GeoProvider.GetCoordinates(); gmap.MapProvider = GMapProviders.GoogleMap; gmap.Position = new PointLatLng(coordinates.Latitude, coordinates.Longitude); gmap.MinZoom = 0; gmap.MaxZoom = 24; gmap.Zoom = 15; }
It seems that the thread in the GeoCoordinateWatcher is not set to Background as default. So I just force kill it when the application shuts down for now. I put this in my Program.cs file in the WinForms project:
[STAThread] static void Main() { Application.ApplicationExit += Application_ApplicationExit; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } private static void Application_ApplicationExit(object sender, EventArgs e) { GeoProvider.Cleanup(); }
All code provided as-is. This is copied from my own code-base, May need some additional programming to work. Use for whatever you want, how you want! If you find this helpful, please leave a comment or share a link, not required but appreciated! :)
Works like a charm. Thanks.
ReplyDelete