Improved MapProjection.Center handling

This commit is contained in:
Clemens 2022-03-06 17:28:27 +01:00
parent f52281ba85
commit 123a9916eb
5 changed files with 32 additions and 11 deletions

View file

@ -734,7 +734,10 @@ namespace MapControl
var viewScale = ViewTransform.ZoomLevelToScale(ZoomLevel);
var projection = MapProjection;
projection.Center = ProjectionCenter ?? Center;
if (projection.Type == MapProjectionType.Azimuthal)
{
projection.Center = ProjectionCenter ?? Center;
}
var mapCenter = projection.LocationToMap(transformCenter ?? Center);
@ -767,7 +770,11 @@ namespace MapControl
{
ResetTransformCenter();
projection.Center = ProjectionCenter ?? center;
if (projection.Type == MapProjectionType.Azimuthal)
{
projection.Center = ProjectionCenter ?? Center;
}
mapCenter = projection.LocationToMap(center);
if (MapProjection.IsValid(mapCenter))

View file

@ -44,7 +44,7 @@ namespace MapControl
public string CrsId { get; protected set; } = string.Empty;
/// <summary>
/// Gets or sets the projection center.
/// Gets or sets an optional projection center.
/// </summary>
public Location Center { get; set; } = new Location();

View file

@ -137,20 +137,30 @@ namespace MapControl
var latPoints = latSegments * interpolationCount;
var centerLon = Math.Round(ParentMap.Center.Longitude / lineDistance) * lineDistance;
var westLimit = centerLon - 180d;
var eastLimit = centerLon + 180d;
if (ParentMap.MapProjection.Type == MapProjectionType.TransverseCylindrical)
{
westLimit = ParentMap.MapProjection.Center.Longitude - 15d;
eastLimit = ParentMap.MapProjection.Center.Longitude + 15d;
westLimit = Math.Floor(westLimit / lineDistance) * lineDistance;
eastLimit = Math.Ceiling(eastLimit / lineDistance) * lineDistance;
}
var minLon = centerLon - lineDistance;
var maxLon = centerLon + lineDistance;
var lonRange = ParentMap.MapProjection.Type == MapProjectionType.TransverseCylindrical ? 15d : 180d;
if (DrawMeridian(path.Figures, centerLon, minLat, interpolationDistance, latPoints))
{
while (DrawMeridian(path.Figures, minLon, minLat, interpolationDistance, latPoints) &&
minLon > centerLon - lonRange)
minLon > westLimit)
{
minLon -= lineDistance;
}
while (DrawMeridian(path.Figures, maxLon, minLat, interpolationDistance, latPoints) &&
maxLon <= centerLon + lonRange)
maxLon < eastLimit)
{
maxLon += lineDistance;
}