mirror of
https://github.com/ClemensFischer/XAML-Map-Control.git
synced 2025-12-06 07:12:04 +01:00
Simplified MapProjection
This commit is contained in:
parent
eb046d97ad
commit
03ac94a002
|
|
@ -19,14 +19,36 @@ namespace MapControl
|
|||
Type = MapProjectionType.Azimuthal;
|
||||
}
|
||||
|
||||
public override BoundingBox MapToBoundingBox(Rect rect)
|
||||
public override Rect? BoundingBoxToMap(BoundingBox boundingBox)
|
||||
{
|
||||
var rectCenter = new Point(rect.X + rect.Width / 2d, rect.Y + rect.Height / 2d);
|
||||
Rect? mapRect = null;
|
||||
var center = LocationToMap(boundingBox.Center);
|
||||
|
||||
if (center.HasValue)
|
||||
{
|
||||
var width = boundingBox.Width * Wgs84MeterPerDegree;
|
||||
var height = boundingBox.Height * Wgs84MeterPerDegree;
|
||||
var x = center.Value.X - width / 2d;
|
||||
var y = center.Value.Y - height / 2d;
|
||||
|
||||
mapRect = new Rect(x, y, width, height);
|
||||
}
|
||||
|
||||
return mapRect;
|
||||
}
|
||||
|
||||
public override BoundingBox MapToBoundingBox(Rect mapRect)
|
||||
{
|
||||
BoundingBox boundingBox = null;
|
||||
var rectCenter = new Point(mapRect.X + mapRect.Width / 2d, mapRect.Y + mapRect.Height / 2d);
|
||||
var center = MapToLocation(rectCenter);
|
||||
|
||||
return center != null
|
||||
? new CenteredBoundingBox(center, rect.Width / Wgs84MeterPerDegree, rect.Height / Wgs84MeterPerDegree)
|
||||
: null;
|
||||
if (center != null)
|
||||
{
|
||||
boundingBox = new CenteredBoundingBox(center, mapRect.Width / Wgs84MeterPerDegree, mapRect.Height / Wgs84MeterPerDegree);
|
||||
}
|
||||
|
||||
return boundingBox;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
// Licensed under the Microsoft Public License (Ms-PL)
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
#if WPF
|
||||
using System.Windows;
|
||||
#endif
|
||||
|
|
@ -51,20 +50,5 @@ namespace MapControl
|
|||
point.Y / Wgs84MeterPerDegree,
|
||||
point.X / Wgs84MeterPerDegree);
|
||||
}
|
||||
|
||||
public override string GetBboxValue(Rect rect)
|
||||
{
|
||||
if (CrsId == DefaultCrsId || CrsId == "CRS:84")
|
||||
{
|
||||
return string.Format(CultureInfo.InvariantCulture,
|
||||
CrsId == DefaultCrsId ? "{1:F8},{0:F8},{3:F8},{2:F8}" : "{0:F8},{1:F8},{2:F8},{3:F8}",
|
||||
rect.X / Wgs84MeterPerDegree,
|
||||
rect.Y / Wgs84MeterPerDegree,
|
||||
(rect.X + rect.Width) / Wgs84MeterPerDegree,
|
||||
(rect.Y + rect.Height) / Wgs84MeterPerDegree);
|
||||
}
|
||||
|
||||
return base.GetBboxValue(rect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -360,16 +360,16 @@ namespace MapControl
|
|||
/// </summary>
|
||||
public void ZoomToBounds(BoundingBox boundingBox)
|
||||
{
|
||||
var rect = MapProjection.BoundingBoxToMap(boundingBox);
|
||||
var mapRect = MapProjection.BoundingBoxToMap(boundingBox);
|
||||
|
||||
if (rect.HasValue)
|
||||
if (mapRect.HasValue)
|
||||
{
|
||||
var rectCenter = new Point(rect.Value.X + rect.Value.Width / 2d, rect.Value.Y + rect.Value.Height / 2d);
|
||||
var rectCenter = new Point(mapRect.Value.X + mapRect.Value.Width / 2d, mapRect.Value.Y + mapRect.Value.Height / 2d);
|
||||
var targetCenter = MapProjection.MapToLocation(rectCenter);
|
||||
|
||||
if (targetCenter != null)
|
||||
{
|
||||
var scale = Math.Min(ActualWidth / rect.Value.Width, ActualHeight / rect.Value.Height);
|
||||
var scale = Math.Min(ActualWidth / mapRect.Value.Width, ActualHeight / mapRect.Value.Height);
|
||||
|
||||
TargetZoomLevel = ScaleToZoomLevel(scale);
|
||||
TargetCenter = targetCenter;
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@
|
|||
// Licensed under the Microsoft Public License (Ms-PL)
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
#if WPF
|
||||
using System.Windows;
|
||||
#endif
|
||||
|
|
@ -67,70 +66,34 @@ namespace MapControl
|
|||
/// </summary>
|
||||
public virtual Rect? BoundingBoxToMap(BoundingBox boundingBox)
|
||||
{
|
||||
Rect? rect = null;
|
||||
Rect? mapRect = null;
|
||||
var southWest = LocationToMap(new Location(boundingBox.South, boundingBox.West));
|
||||
var northEast = LocationToMap(new Location(boundingBox.North, boundingBox.East));
|
||||
|
||||
if (boundingBox.South < boundingBox.North && boundingBox.West < boundingBox.East)
|
||||
if (southWest.HasValue && northEast.HasValue)
|
||||
{
|
||||
var p1 = LocationToMap(new Location(boundingBox.South, boundingBox.West));
|
||||
var p2 = LocationToMap(new Location(boundingBox.North, boundingBox.East));
|
||||
|
||||
if (p1.HasValue && p2.HasValue)
|
||||
{
|
||||
rect = new Rect(p1.Value, p2.Value);
|
||||
}
|
||||
}
|
||||
else if (boundingBox.Center != null)
|
||||
{
|
||||
// boundingBox is a CenteredBoundingBox
|
||||
//
|
||||
var center = LocationToMap(boundingBox.Center);
|
||||
|
||||
if (center.HasValue)
|
||||
{
|
||||
var width = boundingBox.Width * Wgs84MeterPerDegree;
|
||||
var height = boundingBox.Height * Wgs84MeterPerDegree;
|
||||
var x = center.Value.X - width / 2d;
|
||||
var y = center.Value.Y - height / 2d;
|
||||
|
||||
rect = new Rect(x, y, width, height);
|
||||
}
|
||||
mapRect = new Rect(southWest.Value, northEast.Value);
|
||||
}
|
||||
|
||||
return rect;
|
||||
return mapRect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Transforms a Rect in projected map coordinates to a BoundingBox in geographic coordinates.
|
||||
/// Returns null when the MapRect can not be transformed.
|
||||
/// </summary>
|
||||
public virtual BoundingBox MapToBoundingBox(Rect rect)
|
||||
public virtual BoundingBox MapToBoundingBox(Rect mapRect)
|
||||
{
|
||||
var southWest = MapToLocation(new Point(rect.X, rect.Y));
|
||||
var northEast = MapToLocation(new Point(rect.X + rect.Width, rect.Y + rect.Height));
|
||||
BoundingBox boundingBox = null;
|
||||
var southWest = MapToLocation(new Point(mapRect.X, mapRect.Y));
|
||||
var northEast = MapToLocation(new Point(mapRect.X + mapRect.Width, mapRect.Y + mapRect.Height));
|
||||
|
||||
return southWest != null && northEast != null
|
||||
? new BoundingBox(southWest, northEast)
|
||||
: null;
|
||||
if (southWest != null && northEast != null)
|
||||
{
|
||||
boundingBox = new BoundingBox(southWest, northEast);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the CRS parameter value for a WMS GetMap request.
|
||||
/// </summary>
|
||||
public virtual string GetCrsValue()
|
||||
{
|
||||
return CrsId.StartsWith("AUTO2:") || CrsId.StartsWith("AUTO:")
|
||||
? string.Format(CultureInfo.InvariantCulture, "{0},1,{1},{2}", CrsId, Center.Longitude, Center.Latitude)
|
||||
: CrsId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the BBOX parameter value for a WMS GetMap request.
|
||||
/// </summary>
|
||||
public virtual string GetBboxValue(Rect rect)
|
||||
{
|
||||
return string.Format(CultureInfo.InvariantCulture,
|
||||
"{0:F2},{1:F2},{2:F2},{3:F2}",
|
||||
rect.X, rect.Y, rect.X + rect.Width, rect.Y + rect.Height);
|
||||
return boundingBox;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
|
|
@ -297,12 +298,36 @@ namespace MapControl
|
|||
|
||||
protected virtual string GetCrsValue()
|
||||
{
|
||||
return ParentMap.MapProjection.GetCrsValue();
|
||||
var projection = ParentMap.MapProjection;
|
||||
var crsId = projection.CrsId;
|
||||
|
||||
if (crsId.StartsWith("AUTO2:") || crsId.StartsWith("AUTO:"))
|
||||
{
|
||||
crsId = string.Format(CultureInfo.InvariantCulture, "{0},1,{1},{2}", crsId, projection.Center.Longitude, projection.Center.Latitude);
|
||||
}
|
||||
|
||||
return crsId;
|
||||
}
|
||||
|
||||
protected virtual string GetBboxValue(Rect rect)
|
||||
{
|
||||
return ParentMap.MapProjection.GetBboxValue(rect);
|
||||
var crsId = ParentMap.MapProjection.CrsId;
|
||||
var format = "{0:F2},{1:F2},{2:F2},{3:F2}";
|
||||
var x1 = rect.X;
|
||||
var y1 = rect.Y;
|
||||
var x2 = rect.X + rect.Width;
|
||||
var y2 = rect.Y + rect.Height;
|
||||
|
||||
if (crsId == "CRS:84" || crsId == "EPSG:4326")
|
||||
{
|
||||
format = crsId == "CRS:84" ? "{0:F8},{1:F8},{2:F8},{3:F8}" : "{1:F8},{0:F8},{3:F8},{2:F8}";
|
||||
x1 /= MapProjection.Wgs84MeterPerDegree;
|
||||
y1 /= MapProjection.Wgs84MeterPerDegree;
|
||||
x2 /= MapProjection.Wgs84MeterPerDegree;
|
||||
y2 /= MapProjection.Wgs84MeterPerDegree;
|
||||
}
|
||||
|
||||
return string.Format(CultureInfo.InvariantCulture, format, x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
protected string GetRequestUri(IDictionary<string, string> queryParameters)
|
||||
|
|
|
|||
|
|
@ -37,11 +37,11 @@ namespace MapControl
|
|||
|
||||
if (projection != null && items != null)
|
||||
{
|
||||
var rect = projection.BoundingBoxToMap(boundingBox);
|
||||
var mapRect = projection.BoundingBoxToMap(boundingBox);
|
||||
|
||||
if (rect.HasValue)
|
||||
if (mapRect.HasValue)
|
||||
{
|
||||
image = await Task.Run(() => GetImage(projection, rect.Value, items));
|
||||
image = await Task.Run(() => GetImage(projection, mapRect.Value, items));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue