Simplified WmsImageLayer

This commit is contained in:
ClemensFischer 2024-09-08 15:56:48 +02:00
parent 6b7fd84c7b
commit 7df36512b8
3 changed files with 80 additions and 71 deletions

View file

@ -208,14 +208,14 @@ namespace MapControl
private Rect? GetViewRect(BoundingBox boundingBox) private Rect? GetViewRect(BoundingBox boundingBox)
{ {
var mapRect = parentMap.MapProjection.BoundingBoxToMap(boundingBox); var rect = parentMap.MapProjection.BoundingBoxToMap(boundingBox);
if (mapRect.HasValue) if (rect.HasValue)
{ {
return GetViewRect(mapRect.Value); rect = GetViewRect(rect.Value);
} }
return null; return rect;
} }
private Rect GetViewRect(Rect mapRect) private Rect GetViewRect(Rect mapRect)

View file

@ -138,7 +138,9 @@ namespace MapControl
ParentMap.ActualWidth > 0d && ParentMap.ActualWidth > 0d &&
ParentMap.ActualHeight > 0d) ParentMap.ActualHeight > 0d)
{ {
var uri = GetFeatureInfoRequestUri(position, format); var boundingBox = ParentMap.ViewRectToBoundingBox(new Rect(0d, 0d, ParentMap.ActualWidth, ParentMap.ActualHeight));
var uri = GetFeatureInfoRequestUri(boundingBox, position, format);
if (!string.IsNullOrEmpty(uri)) if (!string.IsNullOrEmpty(uri))
{ {
@ -229,73 +231,75 @@ namespace MapControl
/// </summary> /// </summary>
protected virtual string GetMapRequestUri(BoundingBox boundingBox) protected virtual string GetMapRequestUri(BoundingBox boundingBox)
{ {
string uri = null;
var mapRect = ParentMap.MapProjection.BoundingBoxToMap(boundingBox); var mapRect = ParentMap.MapProjection.BoundingBoxToMap(boundingBox);
if (!mapRect.HasValue) if (mapRect.HasValue)
{ {
return null; var width = ParentMap.ViewTransform.Scale * mapRect.Value.Width;
var height = ParentMap.ViewTransform.Scale * mapRect.Value.Height;
uri = GetRequestUri(new Dictionary<string, string>
{
{ "SERVICE", "WMS" },
{ "VERSION", "1.3.0" },
{ "REQUEST", "GetMap" },
{ "LAYERS", WmsLayers ?? "" },
{ "STYLES", WmsStyles ?? "" },
{ "FORMAT", "image/png" },
{ "CRS", GetCrsValue() },
{ "BBOX", GetBboxValue(boundingBox, mapRect.Value) },
{ "WIDTH", Math.Round(width).ToString("F0") },
{ "HEIGHT", Math.Round(height).ToString("F0") }
});
} }
var width = ParentMap.ViewTransform.Scale * mapRect.Value.Width; return uri;
var height = ParentMap.ViewTransform.Scale * mapRect.Value.Height;
return GetRequestUri(new Dictionary<string, string>
{
{ "SERVICE", "WMS" },
{ "VERSION", "1.3.0" },
{ "REQUEST", "GetMap" },
{ "LAYERS", WmsLayers ?? "" },
{ "STYLES", WmsStyles ?? "" },
{ "FORMAT", "image/png" },
{ "CRS", GetCrsValue() },
{ "BBOX", GetBboxValue(mapRect.Value) },
{ "WIDTH", Math.Round(width).ToString("F0") },
{ "HEIGHT", Math.Round(height).ToString("F0") }
});
} }
/// <summary> /// <summary>
/// Returns a GetFeatureInfo request URL string. /// Returns a GetFeatureInfo request URL string.
/// </summary> /// </summary>
protected virtual string GetFeatureInfoRequestUri(Point position, string format) protected virtual string GetFeatureInfoRequestUri(BoundingBox boundingBox, Point position, string format)
{ {
var viewport = new Rect(0d, 0d, ParentMap.ActualWidth, ParentMap.ActualHeight); string uri = null;
var boundingBox = ParentMap.ViewRectToBoundingBox(viewport);
var mapRect = ParentMap.MapProjection.BoundingBoxToMap(boundingBox); var mapRect = ParentMap.MapProjection.BoundingBoxToMap(boundingBox);
if (!mapRect.HasValue) if (mapRect.HasValue)
{ {
return null; var width = ParentMap.ViewTransform.Scale * mapRect.Value.Width;
var height = ParentMap.ViewTransform.Scale * mapRect.Value.Height;
var transform = ViewTransform.CreateTransformMatrix(
-ParentMap.ActualWidth / 2d, -ParentMap.ActualWidth / 2d,
-ParentMap.ViewTransform.Rotation,
width / 2d, height / 2d);
var imagePos = transform.Transform(position);
var queryParameters = new Dictionary<string, string>
{
{ "SERVICE", "WMS" },
{ "VERSION", "1.3.0" },
{ "REQUEST", "GetFeatureInfo" },
{ "LAYERS", WmsLayers ?? "" },
{ "STYLES", WmsStyles ?? "" },
{ "FORMAT", "image/png" },
{ "INFO_FORMAT", format },
{ "CRS", GetCrsValue() },
{ "BBOX", GetBboxValue(boundingBox, mapRect.Value) },
{ "WIDTH", Math.Round(width).ToString("F0") },
{ "HEIGHT", Math.Round(height).ToString("F0") },
{ "I", Math.Round(imagePos.X).ToString("F0") },
{ "J", Math.Round(imagePos.Y).ToString("F0") }
};
// GetRequestUri may modify queryParameters["LAYERS"]
//
uri = GetRequestUri(queryParameters) + "&QUERY_LAYERS=" + queryParameters["LAYERS"];
} }
var width = ParentMap.ViewTransform.Scale * mapRect.Value.Width; return uri;
var height = ParentMap.ViewTransform.Scale * mapRect.Value.Height;
var transform = ViewTransform.CreateTransformMatrix(
-viewport.Width / 2d, -viewport.Height / 2d,
-ParentMap.ViewTransform.Rotation,
width / 2d, height / 2d);
var imagePos = transform.Transform(position);
var queryParameters = new Dictionary<string, string>
{
{ "SERVICE", "WMS" },
{ "VERSION", "1.3.0" },
{ "REQUEST", "GetFeatureInfo" },
{ "LAYERS", WmsLayers ?? "" },
{ "STYLES", WmsStyles ?? "" },
{ "FORMAT", "image/png" },
{ "INFO_FORMAT", format },
{ "CRS", GetCrsValue() },
{ "BBOX", GetBboxValue(mapRect.Value) },
{ "WIDTH", Math.Round(width).ToString("F0") },
{ "HEIGHT", Math.Round(height).ToString("F0") },
{ "I", Math.Round(imagePos.X).ToString("F0") },
{ "J", Math.Round(imagePos.Y).ToString("F0") }
};
return GetRequestUri(queryParameters) + "&QUERY_LAYERS=" + queryParameters["LAYERS"];
} }
protected virtual string GetCrsValue() protected virtual string GetCrsValue()
@ -311,22 +315,27 @@ namespace MapControl
return crsId; return crsId;
} }
protected virtual string GetBboxValue(Rect rect) protected virtual string GetBboxValue(BoundingBox boundingBox, Rect mapRect)
{ {
var crsId = ParentMap.MapProjection.CrsId; var crsId = ParentMap.MapProjection.CrsId;
var format = "{0:F2},{1:F2},{2:F2},{3:F2}"; string format;
var x1 = rect.X; double x1, y1, x2, y2;
var y1 = rect.Y;
var x2 = rect.X + rect.Width;
var y2 = rect.Y + rect.Height;
if (crsId == "CRS:84" || crsId == "EPSG:4326") 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}"; format = crsId == "CRS:84" ? "{0:F8},{1:F8},{2:F8},{3:F8}" : "{1:F8},{0:F8},{3:F8},{2:F8}";
x1 /= MapProjection.Wgs84MeterPerDegree; x1 = boundingBox.West;
y1 /= MapProjection.Wgs84MeterPerDegree; y1 = boundingBox.South;
x2 /= MapProjection.Wgs84MeterPerDegree; x2 = boundingBox.East;
y2 /= MapProjection.Wgs84MeterPerDegree; y2 = boundingBox.North;
}
else
{
format = "{0:F2},{1:F2},{2:F2},{3:F2}";
x1 = mapRect.X;
y1 = mapRect.Y;
x2 = mapRect.X + mapRect.Width;
y2 = mapRect.Y + mapRect.Height;
} }
return string.Format(CultureInfo.InvariantCulture, format, x1, y1, x2, y2); return string.Format(CultureInfo.InvariantCulture, format, x1, y1, x2, y2);

View file

@ -48,7 +48,7 @@ namespace MapControl
return image; return image;
} }
private DrawingImage GetImage(MapProjection projection, Rect rect, IEnumerable<IMapDrawingItem> items) private DrawingImage GetImage(MapProjection projection, Rect mapRect, IEnumerable<IMapDrawingItem> items)
{ {
var scale = ParentMap.ViewTransform.Scale; var scale = ParentMap.ViewTransform.Scale;
var rotation = ParentMap.ViewTransform.Rotation; var rotation = ParentMap.ViewTransform.Rotation;
@ -62,13 +62,13 @@ namespace MapControl
.Select(point => point.Value) .Select(point => point.Value)
.ToList(); .ToList();
if (points.Any(point => rect.Contains(point))) if (points.Any(point => mapRect.Contains(point)))
{ {
for (int i = 0; i < points.Count; i++) for (int i = 0; i < points.Count; i++)
{ {
points[i] = new Point( points[i] = new Point(
scale * (points[i].X - rect.X), scale * (points[i].X - mapRect.X),
scale * ((rect.Y + rect.Height) - points[i].Y)); scale * ((mapRect.Y + mapRect.Height) - points[i].Y));
} }
drawings.Children.Add(item.GetDrawing(points, scale, rotation)); drawings.Children.Add(item.GetDrawing(points, scale, rotation));
@ -79,7 +79,7 @@ namespace MapControl
{ {
Drawing = drawings, Drawing = drawings,
ViewboxUnits = BrushMappingMode.Absolute, ViewboxUnits = BrushMappingMode.Absolute,
Viewbox = new Rect(0, 0, scale * rect.Width, scale * rect.Height), Viewbox = new Rect(0, 0, scale * mapRect.Width, scale * mapRect.Height),
}; };
var drawing = new GeometryDrawing( var drawing = new GeometryDrawing(