Equirectangular projections

This commit is contained in:
ClemensFischer 2024-08-03 23:42:09 +02:00
parent 419e2dee16
commit 218071faea
4 changed files with 24 additions and 15 deletions

View file

@ -24,6 +24,13 @@ namespace MapControl
CrsId = crsId;
}
public override Point GetRelativeScale(Location location)
{
return new Point(
Math.Cos(Center.Latitude * Math.PI / 180d) / Math.Cos(location.Latitude * Math.PI / 180d),
1d);
}
public override Point? LocationToMap(Location location)
{
return new Point(

View file

@ -48,12 +48,17 @@ namespace MapControl
public override string GetBboxValue(Rect rect)
{
return string.Format(CultureInfo.InvariantCulture,
CrsId == "CRS:84" ? "{0},{1},{2},{3}" : "{1},{0},{3},{2}",
rect.X / Wgs84MeterPerDegree,
rect.Y / Wgs84MeterPerDegree,
(rect.X + rect.Width) / Wgs84MeterPerDegree,
(rect.Y + rect.Height) / Wgs84MeterPerDegree);
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);
}
}
}

View file

@ -128,14 +128,9 @@ namespace MapControl
/// </summary>
public virtual string GetBboxValue(Rect rect)
{
// Truncate values for seamless stitching of two WMS images at 180° longitude,
// as done in WmsImageLayer.GetImageAsync.
//
return string.Format(CultureInfo.InvariantCulture, "{0:F2},{1:F2},{2:F2},{3:F2}",
0.01 * Math.Ceiling(100d * rect.X),
0.01 * Math.Ceiling(100d * rect.Y),
0.01 * Math.Floor(100d * (rect.X + rect.Width)),
0.01 * Math.Floor(100d * (rect.Y + rect.Height)));
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);
}
}
}

View file

@ -25,7 +25,9 @@ namespace MapControl
return new WorldMercatorProjection();
case EquirectangularProjection.DefaultCrsId:
return new EquirectangularProjection();
case "CRS:84":
case "EPSG:4087":
return new EquirectangularProjection(crsId);
case UpsNorthProjection.DefaultCrsId:
return new UpsNorthProjection();