diff --git a/SampleApps/UniversalApp/MainPage.xaml b/SampleApps/UniversalApp/MainPage.xaml index f4c7542c..96a26a65 100644 --- a/SampleApps/UniversalApp/MainPage.xaml +++ b/SampleApps/UniversalApp/MainPage.xaml @@ -100,12 +100,18 @@ + + diff --git a/SampleApps/UniversalApp/MainPage.xaml.cs b/SampleApps/UniversalApp/MainPage.xaml.cs index db13056c..d416e192 100644 --- a/SampleApps/UniversalApp/MainPage.xaml.cs +++ b/SampleApps/UniversalApp/MainPage.xaml.cs @@ -1,8 +1,12 @@ using MapControl; using MapControl.UiTools; using System; +using System.Diagnostics; using System.Globalization; using System.IO; +using System.Linq; +using Windows.Devices.Input; +using Windows.System; using Windows.UI; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; @@ -83,34 +87,52 @@ namespace SampleApplication map.TargetHeading = 0d; } + private async void MapPointerPressed(object sender, PointerRoutedEventArgs e) + { + if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) + { + var point = e.GetCurrentPoint(map); + + if (point.Properties.IsRightButtonPressed) + { + var location = map.ViewToLocation(point.Position); + + if (location != null) + { + measurementLine.Visibility = Visibility.Visible; + measurementLine.Locations = new LocationCollection(location); + } + } + else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && + map.MapLayer is WmsImageLayer wmsLayer) + { + Debug.WriteLine(await wmsLayer.GetFeatureInfoAsync(point.Position)); + } + } + } + + private void MapPointerReleased(object sender, PointerRoutedEventArgs e) + { + measurementLine.Visibility = Visibility.Collapsed; + measurementLine.Locations = null; + } + private void MapPointerMoved(object sender, PointerRoutedEventArgs e) { var location = map.ViewToLocation(e.GetCurrentPoint(map).Position); if (location != null) { - var latitude = (int)Math.Round(location.Latitude * 60000d); - var longitude = (int)Math.Round(Location.NormalizeLongitude(location.Longitude) * 60000d); - var latHemisphere = 'N'; - var lonHemisphere = 'E'; - - if (latitude < 0) - { - latitude = -latitude; - latHemisphere = 'S'; - } - - if (longitude < 0) - { - longitude = -longitude; - lonHemisphere = 'W'; - } - - mouseLocation.Text = string.Format(CultureInfo.InvariantCulture, - "{0} {1:00} {2:00.000}\n{3} {4:000} {5:00.000}", - latHemisphere, latitude / 60000, (latitude % 60000) / 1000d, - lonHemisphere, longitude / 60000, (longitude % 60000) / 1000d); mouseLocation.Visibility = Visibility.Visible; + mouseLocation.Text = GetLatLonText(location); + + var start = measurementLine.Locations?.FirstOrDefault(); + + if (start != null) + { + measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location); + mouseLocation.Text += GetDistanceText(location.GetDistance(start)); + } } else { @@ -124,5 +146,45 @@ namespace SampleApplication mouseLocation.Visibility = Visibility.Collapsed; mouseLocation.Text = string.Empty; } + + private static string GetLatLonText(Location location) + { + var latitude = (int)Math.Round(location.Latitude * 60000d); + var longitude = (int)Math.Round(Location.NormalizeLongitude(location.Longitude) * 60000d); + var latHemisphere = 'N'; + var lonHemisphere = 'E'; + + if (latitude < 0) + { + latitude = -latitude; + latHemisphere = 'S'; + } + + if (longitude < 0) + { + longitude = -longitude; + lonHemisphere = 'W'; + } + + return string.Format(CultureInfo.InvariantCulture, + "{0} {1:00} {2:00.000}\n{3} {4:000} {5:00.000}", + latHemisphere, latitude / 60000, (latitude % 60000) / 1000d, + lonHemisphere, longitude / 60000, (longitude % 60000) / 1000d); + } + + private string GetDistanceText(double distance) + { + var unit = "m"; + + if (distance >= 1000d) + { + distance /= 1000d; + unit = "km"; + } + + var distanceFormat = distance >= 100d ? "F0" : "F1"; + + return string.Format(CultureInfo.InvariantCulture, "\n {0:" + distanceFormat + "} {1}", distance, unit); + } } } diff --git a/SampleApps/WinUiApp/MainWindow.xaml b/SampleApps/WinUiApp/MainWindow.xaml index 3c0fbb29..1c35250b 100644 --- a/SampleApps/WinUiApp/MainWindow.xaml +++ b/SampleApps/WinUiApp/MainWindow.xaml @@ -108,12 +108,17 @@ + + diff --git a/SampleApps/WinUiApp/MainWindow.xaml.cs b/SampleApps/WinUiApp/MainWindow.xaml.cs index c34e643b..c69c2762 100644 --- a/SampleApps/WinUiApp/MainWindow.xaml.cs +++ b/SampleApps/WinUiApp/MainWindow.xaml.cs @@ -10,7 +10,9 @@ using System; using System.Diagnostics; using System.Globalization; using System.IO; +using System.Linq; using System.Threading.Tasks; +using Windows.System; namespace SampleApplication { @@ -104,46 +106,51 @@ namespace SampleApplication private async void MapPointerPressed(object sender, PointerRoutedEventArgs e) { - if (map.MapLayer is WmsImageLayer wmsLayer && - e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) + if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) { - PointerPoint point = e.GetCurrentPoint(map); + var point = e.GetCurrentPoint(map); if (point.Properties.IsRightButtonPressed) + { + var location = map.ViewToLocation(point.Position); + + if (location != null) + { + measurementLine.Visibility = Visibility.Visible; + measurementLine.Locations = new LocationCollection(location); + } + } + else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && + map.MapLayer is WmsImageLayer wmsLayer) { Debug.WriteLine(await wmsLayer.GetFeatureInfoAsync(point.Position)); } } } + private void MapPointerReleased(object sender, PointerRoutedEventArgs e) + { + measurementLine.Visibility = Visibility.Collapsed; + measurementLine.Locations = null; + } + private void MapPointerMoved(object sender, PointerRoutedEventArgs e) { - var location = map.ViewToLocation(e.GetCurrentPoint(map).Position); + var point = e.GetCurrentPoint(map); + var location = map.ViewToLocation(point.Position); if (location != null) { - var latitude = (int)Math.Round(location.Latitude * 60000d); - var longitude = (int)Math.Round(Location.NormalizeLongitude(location.Longitude) * 60000d); - var latHemisphere = 'N'; - var lonHemisphere = 'E'; - - if (latitude < 0) - { - latitude = -latitude; - latHemisphere = 'S'; - } - - if (longitude < 0) - { - longitude = -longitude; - lonHemisphere = 'W'; - } - - mouseLocation.Text = string.Format(CultureInfo.InvariantCulture, - "{0} {1:00} {2:00.000}\n{3} {4:000} {5:00.000}", - latHemisphere, latitude / 60000, (latitude % 60000) / 1000d, - lonHemisphere, longitude / 60000, (longitude % 60000) / 1000d); mouseLocation.Visibility = Visibility.Visible; + mouseLocation.Text = GetLatLonText(location); + + var start = measurementLine.Locations?.FirstOrDefault(); + + if (start != null) + { + measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location); + mouseLocation.Text += GetDistanceText(location.GetDistance(start)); + } } else { @@ -157,5 +164,45 @@ namespace SampleApplication mouseLocation.Visibility = Visibility.Collapsed; mouseLocation.Text = string.Empty; } + + private static string GetLatLonText(Location location) + { + var latitude = (int)Math.Round(location.Latitude * 60000d); + var longitude = (int)Math.Round(Location.NormalizeLongitude(location.Longitude) * 60000d); + var latHemisphere = 'N'; + var lonHemisphere = 'E'; + + if (latitude < 0) + { + latitude = -latitude; + latHemisphere = 'S'; + } + + if (longitude < 0) + { + longitude = -longitude; + lonHemisphere = 'W'; + } + + return string.Format(CultureInfo.InvariantCulture, + "{0} {1:00} {2:00.000}\n{3} {4:000} {5:00.000}", + latHemisphere, latitude / 60000, (latitude % 60000) / 1000d, + lonHemisphere, longitude / 60000, (longitude % 60000) / 1000d); + } + + private string GetDistanceText(double distance) + { + var unit = "m"; + + if (distance >= 1000d) + { + distance /= 1000d; + unit = "km"; + } + + var distanceFormat = distance >= 100d ? "F0" : "F1"; + + return string.Format(CultureInfo.InvariantCulture, "\n {0:" + distanceFormat + "} {1}", distance, unit); + } } } diff --git a/SampleApps/WpfApplication/MainWindow.xaml b/SampleApps/WpfApplication/MainWindow.xaml index 05b44d76..9ad88adf 100644 --- a/SampleApps/WpfApplication/MainWindow.xaml +++ b/SampleApps/WpfApplication/MainWindow.xaml @@ -117,9 +117,15 @@ Center="53.5,8.2" ManipulationMode="All" MouseLeftButtonDown="MapMouseLeftButtonDown" MouseRightButtonDown="MapMouseRightButtonDown" - MouseMove="MapMouseMove" MouseLeave="MapMouseLeave" + MouseRightButtonUp="MapMouseRightButtonUp" + MouseMove="MapMouseMove" + MouseLeave="MapMouseLeave" ManipulationInertiaStarting="MapManipulationInertiaStarting"> + + = 1000d) + { + distance /= 1000d; + unit = "km"; + } + + var distanceFormat = distance >= 100d ? "F0" : "F1"; + + return string.Format(CultureInfo.InvariantCulture, "\n {0:" + distanceFormat + "} {1}", distance, unit); + } } }