From f11c71799f4e0985bef19b010c549f2283b6c9c8 Mon Sep 17 00:00:00 2001 From: ClemensF Date: Thu, 21 Nov 2013 21:16:29 +0100 Subject: [PATCH] Version 1.10.0: Removed Location.TransformedLatitude, cleanup in MapBase and TileImageLoader. --- .../FileDbCache/Properties/AssemblyInfo.cs | 4 +- .../ImageFileCache/Properties/AssemblyInfo.cs | 4 +- MapControl/Location.cs | 36 ++---- MapControl/MapBase.cs | 112 ++++++++---------- MapControl/MapGraticule.Silverlight.WinRT.cs | 7 +- MapControl/MapGraticule.WPF.cs | 67 ++++------- MapControl/MapPanel.cs | 17 +-- MapControl/MapRectangle.cs | 10 +- MapControl/MapTransform.cs | 22 ++++ MapControl/MercatorTransform.cs | 33 +++--- MapControl/Properties/AssemblyInfo.cs | 4 +- MapControl/TileImageLoader.WPF.cs | 65 +++++----- MapControl/WinRT/Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../WpfApplication/Properties/AssemblyInfo.cs | 4 +- .../WpfApplication/WpfApplication.csproj | 1 - 19 files changed, 187 insertions(+), 219 deletions(-) diff --git a/Caching/FileDbCache/Properties/AssemblyInfo.cs b/Caching/FileDbCache/Properties/AssemblyInfo.cs index 3ee6117a..b1541348 100644 --- a/Caching/FileDbCache/Properties/AssemblyInfo.cs +++ b/Caching/FileDbCache/Properties/AssemblyInfo.cs @@ -8,8 +8,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © Clemens Fischer 2012-2013")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("1.9.2")] -[assembly: AssemblyFileVersion("1.9.2")] +[assembly: AssemblyVersion("1.10.0")] +[assembly: AssemblyFileVersion("1.10.0")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/Caching/ImageFileCache/Properties/AssemblyInfo.cs b/Caching/ImageFileCache/Properties/AssemblyInfo.cs index e2c89f78..15708cd0 100644 --- a/Caching/ImageFileCache/Properties/AssemblyInfo.cs +++ b/Caching/ImageFileCache/Properties/AssemblyInfo.cs @@ -8,8 +8,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © Clemens Fischer 2012-2013")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("1.9.2")] -[assembly: AssemblyFileVersion("1.9.2")] +[assembly: AssemblyVersion("1.10.0")] +[assembly: AssemblyFileVersion("1.10.0")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/MapControl/Location.cs b/MapControl/Location.cs index 3e21188d..d6aa1883 100644 --- a/MapControl/Location.cs +++ b/MapControl/Location.cs @@ -15,15 +15,6 @@ namespace MapControl #endif public partial class Location { - /// - /// TransformedLatitude is set by the Transform methods in MercatorTransform. - /// It holds the transformed latitude value to avoid redundant recalculation. - /// -#if !SILVERLIGHT && !NETFX_CORE - [NonSerialized] -#endif - internal double TransformedLatitude = double.NaN; - private double latitude; private double longitude; @@ -33,24 +24,14 @@ namespace MapControl public Location(double latitude, double longitude) { - this.latitude = Math.Min(Math.Max(latitude, -90d), 90d); - this.longitude = longitude; - } - - internal Location(double transformedLatitude, double latitude, double longitude) - : this(latitude, longitude) - { - TransformedLatitude = transformedLatitude; + Latitude = latitude; + Longitude = longitude; } public double Latitude { get { return latitude; } - set - { - latitude = Math.Min(Math.Max(value, -90d), 90d); - TransformedLatitude = double.NaN; - } + set { latitude = Math.Min(Math.Max(value, -90d), 90d); } } public double Longitude @@ -79,7 +60,16 @@ namespace MapControl public static double NormalizeLongitude(double longitude) { - return (longitude >= -180d && longitude <= 180d) ? longitude : ((longitude + 180d) % 360d + 360d) % 360d - 180d; + if (longitude > 180) + { + longitude = ((longitude - 180d) % 360d) - 180d; + } + else if (longitude < -180d) + { + longitude = ((longitude + 180d) % 360d) + 180d; + } + + return longitude; } } } diff --git a/MapControl/MapBase.cs b/MapControl/MapBase.cs index ad16a8fd..07000926 100644 --- a/MapControl/MapBase.cs +++ b/MapControl/MapBase.cs @@ -26,6 +26,8 @@ namespace MapControl /// public partial class MapBase : MapPanel { + private const double MaximumZoomLevel = 22d; + public static TimeSpan AnimationDuration = TimeSpan.FromSeconds(0.5); public static EasingFunctionBase AnimationEasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseOut }; @@ -394,14 +396,10 @@ namespace MapControl /// public void ZoomMap(Point origin, double zoomLevel) { - SetTransformOrigin(origin); - - var targetZoomLevel = TargetZoomLevel; - TargetZoomLevel = zoomLevel; - - if (TargetZoomLevel == targetZoomLevel) // TargetZoomLevel might be coerced + if (zoomLevel >= MinZoomLevel && zoomLevel <= MaxZoomLevel) { - ResetTransformOrigin(); + SetTransformOrigin(origin); + TargetZoomLevel = zoomLevel; } } @@ -572,48 +570,38 @@ namespace MapControl internalPropertyChange = false; } - private bool CoerceLocation(ref Location location, double latitudeEpsilon = 0d) + private void AdjustCenterProperty(DependencyProperty property, ref Location center) { - if (location == null) - { - location = new Location(); - return true; - } - - var maxLatitude = mapTransform.MaxLatitude + latitudeEpsilon; - var latitude = Math.Min(Math.Max(location.Latitude, -maxLatitude), maxLatitude); - var longitude = Location.NormalizeLongitude(location.Longitude); - - if (location.Latitude != latitude || location.Longitude != longitude) - { - location.Latitude = latitude; - location.Longitude = longitude; - return true; - } - - return false; - } - - private void CoerceCenterProperty(DependencyProperty property, ref Location center) - { - if (CoerceLocation(ref center)) + if (center == null) { + center = new Location(); InternalSetValue(property, center); } + else + { + var latitude = Math.Min(Math.Max(center.Latitude, -mapTransform.MaxLatitude), mapTransform.MaxLatitude); + var longitude = Location.NormalizeLongitude(center.Longitude); + + if (center.Latitude != latitude || center.Longitude != longitude) + { + center = new Location(latitude, longitude); + InternalSetValue(property, center); + } + } } private void CenterPropertyChanged(Location center) { if (!internalPropertyChange) { - CoerceCenterProperty(CenterProperty, ref center); + AdjustCenterProperty(CenterProperty, ref center); ResetTransformOrigin(); UpdateTransform(); if (centerAnimation == null) { InternalSetValue(TargetCenterProperty, center); - InternalSetValue(CenterPointProperty, new Point(center.Longitude, center.Latitude)); + InternalSetValue(CenterPointProperty, MapTransform.Transform(center)); } } } @@ -622,7 +610,7 @@ namespace MapControl { if (!internalPropertyChange) { - CoerceCenterProperty(TargetCenterProperty, ref targetCenter); + AdjustCenterProperty(TargetCenterProperty, ref targetCenter); if (targetCenter.Latitude != Center.Latitude || targetCenter.Longitude != Center.Longitude) { @@ -634,8 +622,8 @@ namespace MapControl // animate private CenterPoint property by PointAnimation centerAnimation = new PointAnimation { - From = new Point(Center.Longitude, Center.Latitude), - To = new Point(targetCenter.Longitude, targetCenter.Latitude), + From = MapTransform.Transform(Center), + To = MapTransform.Transform(targetCenter, Center.Longitude), Duration = AnimationDuration, EasingFunction = AnimationEasingFunction, FillBehavior = FillBehavior.HoldEnd @@ -655,7 +643,7 @@ namespace MapControl centerAnimation = null; InternalSetValue(CenterProperty, TargetCenter); - InternalSetValue(CenterPointProperty, new Point(TargetCenter.Longitude, TargetCenter.Latitude)); + InternalSetValue(CenterPointProperty, MapTransform.Transform(TargetCenter)); RemoveAnimation(CenterPointProperty); // remove holding animation in WPF ResetTransformOrigin(); @@ -667,7 +655,8 @@ namespace MapControl { if (!internalPropertyChange) { - InternalSetValue(CenterProperty, new Location(centerPoint.Y, centerPoint.X)); + centerPoint.X = Location.NormalizeLongitude(centerPoint.X); + InternalSetValue(CenterProperty, MapTransform.Transform(centerPoint)); ResetTransformOrigin(); UpdateTransform(); } @@ -675,11 +664,9 @@ namespace MapControl private void MinZoomLevelPropertyChanged(double minZoomLevel) { - var coercedValue = Math.Min(Math.Max(minZoomLevel, 0d), MaxZoomLevel); - - if (coercedValue != minZoomLevel) + if (minZoomLevel < 0d || minZoomLevel > MaxZoomLevel) { - minZoomLevel = coercedValue; + minZoomLevel = Math.Min(Math.Max(minZoomLevel, 0d), MaxZoomLevel); InternalSetValue(MinZoomLevelProperty, minZoomLevel); } @@ -691,11 +678,9 @@ namespace MapControl private void MaxZoomLevelPropertyChanged(double maxZoomLevel) { - var coercedValue = Math.Min(Math.Max(maxZoomLevel, MinZoomLevel), 22d); - - if (coercedValue != maxZoomLevel) + if (maxZoomLevel < MinZoomLevel || maxZoomLevel > MaximumZoomLevel) { - maxZoomLevel = coercedValue; + maxZoomLevel = Math.Min(Math.Max(maxZoomLevel, MinZoomLevel), MaximumZoomLevel); InternalSetValue(MaxZoomLevelProperty, maxZoomLevel); } @@ -705,13 +690,11 @@ namespace MapControl } } - private void CoerceZoomLevelProperty(DependencyProperty property, ref double zoomLevel) + private void AdjustZoomLevelProperty(DependencyProperty property, ref double zoomLevel) { - var coercedValue = Math.Min(Math.Max(zoomLevel, MinZoomLevel), MaxZoomLevel); - - if (coercedValue != zoomLevel) + if (zoomLevel < MinZoomLevel || zoomLevel > MaxZoomLevel) { - zoomLevel = coercedValue; + zoomLevel = Math.Min(Math.Max(zoomLevel, MinZoomLevel), MaxZoomLevel); InternalSetValue(property, zoomLevel); } } @@ -720,7 +703,7 @@ namespace MapControl { if (!internalPropertyChange) { - CoerceZoomLevelProperty(ZoomLevelProperty, ref zoomLevel); + AdjustZoomLevelProperty(ZoomLevelProperty, ref zoomLevel); UpdateTransform(); if (zoomLevelAnimation == null) @@ -734,7 +717,7 @@ namespace MapControl { if (!internalPropertyChange) { - CoerceZoomLevelProperty(TargetZoomLevelProperty, ref targetZoomLevel); + AdjustZoomLevelProperty(TargetZoomLevelProperty, ref targetZoomLevel); if (targetZoomLevel != ZoomLevel) { @@ -772,13 +755,11 @@ namespace MapControl } } - private void CoerceHeadingProperty(DependencyProperty property, ref double heading) + private void AdjustHeadingProperty(DependencyProperty property, ref double heading) { - var coercedValue = (heading >= -180d && heading <= 360d) ? heading : (((heading % 360d) + 360d) % 360d); - - if (coercedValue != heading) + if (heading < -180d || heading > 360d) { - heading = coercedValue; + heading = ((heading % 360d) + 360d) % 360d; InternalSetValue(property, heading); } } @@ -787,7 +768,7 @@ namespace MapControl { if (!internalPropertyChange) { - CoerceHeadingProperty(HeadingProperty, ref heading); + AdjustHeadingProperty(HeadingProperty, ref heading); UpdateTransform(); if (headingAnimation == null) @@ -801,7 +782,7 @@ namespace MapControl { if (!internalPropertyChange) { - CoerceHeadingProperty(TargetHeadingProperty, ref targetHeading); + AdjustHeadingProperty(TargetHeadingProperty, ref targetHeading); if (targetHeading != Heading) { @@ -858,11 +839,18 @@ namespace MapControl { center = ViewportPointToLocation(new Point(RenderSize.Width / 2d, RenderSize.Height / 2d)); - var coerced = CoerceLocation(ref center, 1e-3); + var latitude = center.Latitude; + center.Latitude = Math.Min(Math.Max(latitude, -mapTransform.MaxLatitude), mapTransform.MaxLatitude); InternalSetValue(CenterProperty, center); - if (coerced) + if (centerAnimation == null) + { + InternalSetValue(TargetCenterProperty, center); + InternalSetValue(CenterPointProperty, MapTransform.Transform(center)); + } + + if (center.Latitude != latitude) { ResetTransformOrigin(); scale = SetViewportTransform(center); diff --git a/MapControl/MapGraticule.Silverlight.WinRT.cs b/MapControl/MapGraticule.Silverlight.WinRT.cs index ffab582b..ff01f086 100644 --- a/MapControl/MapGraticule.Silverlight.WinRT.cs +++ b/MapControl/MapGraticule.Silverlight.WinRT.cs @@ -179,9 +179,6 @@ namespace MapControl if (!lineStart.Equals(graticuleStart) || !lineEnd.Equals(graticuleEnd)) { - ParentMap.MapTransform.Transform(lineStart); // get lineStart.TransformedLatitude - ParentMap.MapTransform.Transform(lineEnd); // get lineEnd.TransformedLatitude - graticuleStart = lineStart; graticuleEnd = lineEnd; @@ -216,14 +213,14 @@ namespace MapControl { var figure = new PathFigure { - StartPoint = ParentMap.MapTransform.Transform(new Location(lineStart.TransformedLatitude, lineStart.Latitude, lon)), + StartPoint = ParentMap.MapTransform.Transform(new Location(lineStart.Latitude, lon)), IsClosed = false, IsFilled = false }; figure.Segments.Add(new LineSegment { - Point = ParentMap.MapTransform.Transform(new Location(lineEnd.TransformedLatitude, lineEnd.Latitude, lon)), + Point = ParentMap.MapTransform.Transform(new Location(lineEnd.Latitude, lon)), }); geometry.Figures.Add(figure); diff --git a/MapControl/MapGraticule.WPF.cs b/MapControl/MapGraticule.WPF.cs index 0cef838c..99bc10ee 100644 --- a/MapControl/MapGraticule.WPF.cs +++ b/MapControl/MapGraticule.WPF.cs @@ -12,28 +12,14 @@ namespace MapControl { public partial class MapGraticule : MapOverlay { - private class LonLabel + private class Label { - public readonly double Longitude; + public readonly double Position; public readonly string Text; - public LonLabel(double longitude, string text) + public Label(double position, string text) { - Longitude = longitude; - Text = text; - } - } - - private class LatLabel - { - public readonly double TransformedLatitude; - public readonly double Latitude; - public readonly string Text; - - public LatLabel(double transformedLatitude, double latitude, string text) - { - TransformedLatitude = transformedLatitude; - Latitude = latitude; + Position = position; Text = text; } } @@ -59,10 +45,8 @@ namespace MapControl if (ParentMap != null) { var bounds = ParentMap.ViewportTransform.Inverse.TransformBounds(new Rect(ParentMap.RenderSize)); - var startPoint = new Point(bounds.X, bounds.Y); - var endPoint = new Point(bounds.X + bounds.Width, bounds.Y + bounds.Height); - var startLocation = ParentMap.MapTransform.Transform(startPoint); - var endLocation = ParentMap.MapTransform.Transform(endPoint); + var start = ParentMap.MapTransform.Transform(new Point(bounds.X, bounds.Y)); + var end = ParentMap.MapTransform.Transform(new Point(bounds.X + bounds.Width, bounds.Y + bounds.Height)); var minSpacing = MinLineSpacing * 360d / (Math.Pow(2d, ParentMap.ZoomLevel) * TileSource.TileSize); var spacing = LineSpacings[LineSpacings.Length - 1]; @@ -73,31 +57,28 @@ namespace MapControl var labelFormat = spacing < 1d ? "{0} {1}°{2:00}'" : "{0} {1}°"; var labelStart = new Location( - Math.Ceiling(startLocation.Latitude / spacing) * spacing, - Math.Ceiling(startLocation.Longitude / spacing) * spacing); + Math.Ceiling(start.Latitude / spacing) * spacing, + Math.Ceiling(start.Longitude / spacing) * spacing); - var latLabels = new List((int)((endLocation.Latitude - labelStart.Latitude) / spacing) + 1); - var lonLabels = new List((int)((endLocation.Longitude - labelStart.Longitude) / spacing) + 1); + var latLabels = new List