diff --git a/MapProjections/Shared/AutoUtmProjection.cs b/MapProjections/Shared/AutoUtmProjection.cs index 14c67142..8fd1d0a8 100644 --- a/MapProjections/Shared/AutoUtmProjection.cs +++ b/MapProjections/Shared/AutoUtmProjection.cs @@ -3,6 +3,7 @@ // Licensed under the Microsoft Public License (Ms-PL) using ProjNet.CoordinateSystems; +using System; using System.Windows; namespace MapControl.Projections @@ -21,7 +22,7 @@ namespace MapControl.Projections public bool UseZoneCrsId { get; set; } - public override Point LocationToMap(Location location) + public override Point? LocationToMap(Location location) { UpdateZone(); @@ -39,7 +40,7 @@ namespace MapControl.Projections { var north = Center.Latitude >= 0d; var lon = Location.NormalizeLongitude(Center.Longitude); - var zone = (int)(lon + 180d) / 6 + 1; + var zone = (int)Math.Floor(lon / 6d) + 31; if (ZoneNumber != zone || ZoneIsNorth != north) { diff --git a/MapProjections/Shared/GeoApiProjection.cs b/MapProjections/Shared/GeoApiProjection.cs index 79de1a00..22996be3 100644 --- a/MapProjections/Shared/GeoApiProjection.cs +++ b/MapProjections/Shared/GeoApiProjection.cs @@ -116,7 +116,7 @@ namespace MapControl.Projections public IMathTransform MapToLocationTransform { get; private set; } - public override Point LocationToMap(Location location) + public override Point? LocationToMap(Location location) { if (LocationToMapTransform == null) { @@ -126,6 +126,11 @@ namespace MapControl.Projections var coordinate = LocationToMapTransform.Transform( new Coordinate(location.Longitude, location.Latitude)); + if (coordinate == null) + { + return null; + } + return new Point(coordinate.X * scaleFactor, coordinate.Y * scaleFactor); } @@ -142,7 +147,7 @@ namespace MapControl.Projections return new Location(coordinate.Y, coordinate.X); } - public override string GetBboxValue(Rect rect) + public override string GetBboxValue(MapRect rect) { return string.Format(CultureInfo.InvariantCulture, bboxFormat, rect.X / scaleFactor, rect.Y / scaleFactor, diff --git a/MapProjections/Shared/PolarStereographicProjection.cs b/MapProjections/Shared/PolarStereographicProjection.cs index 862a13ef..2aab6858 100644 --- a/MapProjections/Shared/PolarStereographicProjection.cs +++ b/MapProjections/Shared/PolarStereographicProjection.cs @@ -33,7 +33,7 @@ namespace MapControl.Projections FalseNorthing = falseNorthing; } - public override Vector GetRelativeScale(Location location) + public override Scale GetRelativeScale(Location location) { var lat = (IsNorth ? location.Latitude : -location.Latitude) * Math.PI / 180d; var a = Wgs84EquatorialRadius; @@ -45,10 +45,10 @@ namespace MapControl.Projections var m = Math.Cos(lat) / Math.Sqrt(1d - eSinLat * eSinLat); var k = rho / (a * m); - return new Vector(k, k); + return new Scale(k, k); } - public override Point LocationToMap(Location location) + public override Point? LocationToMap(Location location) { var lat = location.Latitude * Math.PI / 180d; var lon = location.Longitude * Math.PI / 180d; diff --git a/MapProjections/Shared/WebMercatorProjection.cs b/MapProjections/Shared/WebMercatorProjection.cs index 1a0c48d1..b10bb785 100644 --- a/MapProjections/Shared/WebMercatorProjection.cs +++ b/MapProjections/Shared/WebMercatorProjection.cs @@ -21,11 +21,11 @@ namespace MapControl.Projections CoordinateSystem = ProjectedCoordinateSystem.WebMercator; } - public override Vector GetRelativeScale(Location location) + public override Scale GetRelativeScale(Location location) { var k = 1d / Math.Cos(location.Latitude * Math.PI / 180d); // p.44 (7-3) - return new Vector(k, k); + return new Scale(k, k); } } } diff --git a/MapProjections/Shared/WorldMercatorProjection.cs b/MapProjections/Shared/WorldMercatorProjection.cs index bb3adc7b..3a6a158e 100644 --- a/MapProjections/Shared/WorldMercatorProjection.cs +++ b/MapProjections/Shared/WorldMercatorProjection.cs @@ -42,13 +42,13 @@ namespace MapControl.Projections + "AUTHORITY[\"EPSG\",\"3395\"]]"; } - public override Vector GetRelativeScale(Location location) + public override Scale GetRelativeScale(Location location) { var lat = location.Latitude * Math.PI / 180d; var eSinLat = Wgs84Eccentricity * Math.Sin(lat); var k = Math.Sqrt(1d - eSinLat * eSinLat) / Math.Cos(lat); // p.44 (7-8) - return new Vector(k, k); + return new Scale(k, k); } } }