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