Skip to content

Commit

Permalink
Add wrapper for RenderMap API
Browse files Browse the repository at this point in the history
Fixes #121
  • Loading branch information
jumpinjackie committed Dec 15, 2021
1 parent 2b847de commit c3a376e
Show file tree
Hide file tree
Showing 6 changed files with 345 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ public override void TestRender12k()
base.TestRender12k();
}

[SkippableFact]
public override void TestRenderMap()
{
base.TestRenderMap();
}

[SkippableFact]
public override void TestLegendIconRendering()
{
Expand Down
60 changes: 60 additions & 0 deletions OSGeo.MapGuide.MaestroAPI.IntegrationTests/RuntimeMapTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,60 @@ public virtual void TestRender12k()
RenderDynamicOverlayAndVerifyConvenience(map, TestPrefix + "TestRenderOverlay12kConvenience_ParcelsBackOn.png", "PNG");
}

public virtual void TestRenderMap()
{
Skip.If(_fixture.Skip, _fixture.SkipReason);

//Render a map of sheboygan at 12k
//Only programmatically verify the returned stream can be fed to a
//System.Drawing.Image object.
var conn = _fixture.CreateTestConnection();
var resSvc = conn.ResourceService;
var mapSvc = conn.GetService((int)ServiceType.Mapping) as IMappingService;
Assert.NotNull(mapSvc);

double x = -87.7230072, y = 43.7649574, scale = 12000;
int width = 1024, height = 1024;

IEnumerable<string> showLayers = null;
IEnumerable<string> showGroups = null;
IEnumerable<string> hideLayers = null;
IEnumerable<string> hideGroups = null;

// Render default
using (var s = mapSvc.RenderMap("Library://UnitTests/Maps/Sheboygan.MapDefinition", x, y, scale, width, height, showLayers: showLayers, hideLayers: hideLayers, showGroups: showGroups, hideGroups: hideGroups))
{
using (var fs = File.OpenWrite("RenderMap12k.png"))
{
s.CopyTo(fs);
}
}

// Turn off parcels
hideLayers = new[] { "Parcels" };

// Render again
using (var s = mapSvc.RenderMap("Library://UnitTests/Maps/Sheboygan.MapDefinition", x, y, scale, width, height, showLayers: showLayers, hideLayers: hideLayers, showGroups: showGroups, hideGroups: hideGroups))
{
using (var fs = File.OpenWrite("RenderMap12k_ParcelsOff.png"))
{
s.CopyTo(fs);
}
}

// Turn parcels back on
hideLayers = null;

// Render again
using (var s = mapSvc.RenderMap("Library://UnitTests/Maps/Sheboygan.MapDefinition", x, y, scale, width, height, showLayers: showLayers, hideLayers: hideLayers, showGroups: showGroups, hideGroups: hideGroups))
{
using (var fs = File.OpenWrite("RenderMap12k_ParcelsOnAgain.png"))
{
s.CopyTo(fs);
}
}
}

public virtual void TestMapManipulation()
{
Skip.If(_fixture.Skip, _fixture.SkipReason);
Expand Down Expand Up @@ -1295,6 +1349,12 @@ public override void TestRender75k()
base.TestRender75k();
}

[SkippableFact]
public override void TestRenderMap()
{
base.TestRenderMap();
}

[SkippableFact]
public override void TestRender12k()
{
Expand Down
81 changes: 81 additions & 0 deletions OSGeo.MapGuide.MaestroAPI.Local/LocalConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1309,6 +1309,87 @@ public Task<Stream> GetTileAsync(string mapDefinition, string baseLayerGroup, in
{
return Task.FromResult(GetTile(mapDefinition, baseLayerGroup, column, row, scaleIndex));
}

public Stream RenderMap(string mapDefinitionId,
double x,
double y,
double scale,
int width,
int height,
int dpi = 96,
string format = "PNG",
bool clip = false,
IEnumerable<string> showLayers = null,
IEnumerable<string> hideLayers = null,
IEnumerable<string> showGroups = null,
IEnumerable<string> hideGroups = null)
{
GetByteReaderMethod fetch = () =>
{
var mdfId = new MgResourceIdentifier(mapDefinitionId);
var map = new MgdMap(mdfId);
map.SetViewCenterXY(x, y);
map.SetViewScale(scale);
map.SetDisplaySize(width, height);
map.SetDisplayDpi(dpi);
var layers = map.GetLayers();
var groups = map.GetLayerGroups();
if (showLayers?.Any() == true)
{
foreach (var layer in showLayers)
{
var idx = layers.IndexOf(layer);
if (idx >= 0)
{
var lyr = layers.GetItem(idx);
lyr.SetVisible(true);
}
}
}
if (hideLayers?.Any() == true)
{
foreach (var layer in hideLayers)
{
var idx = layers.IndexOf(layer);
if (idx >= 0)
{
var lyr = layers.GetItem(idx);
lyr.SetVisible(false);
}
}
}
if (showGroups?.Any() == true)
{
foreach (var group in showGroups)
{
var idx = groups.IndexOf(group);
if (idx >= 0)
{
var grp = groups.GetItem(idx);
grp.SetVisible(true);
}
}
}
if (hideGroups?.Any() == true)
{
foreach (var group in hideGroups)
{
var idx = groups.IndexOf(group);
if (idx >= 0)
{
var grp = groups.GetItem(idx);
grp.SetVisible(false);
}
}
}
var service = GetRenderingService();
return service.RenderMap(map, null, format, false, clip);
};
return new MgReadOnlyStream(fetch);
}
}

internal class LocalLongTransaction : ILongTransaction
Expand Down
30 changes: 30 additions & 0 deletions OSGeo.MapGuide.MaestroAPI/Http/HttpServerConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,36 @@ public override Stream RenderDynamicOverlay(RuntimeMap map, MapSelection selecti
}
}

public System.IO.Stream RenderMap(string mapDefinitionId,
double x,
double y,
double scale,
int width,
int height,
int dpi,
string format,
bool clip,
IEnumerable<string> showLayers,
IEnumerable<string> hideLayers,
IEnumerable<string> showGroups,
IEnumerable<string> hideGroups)
{
string req = m_reqBuilder.RenderMap(mapDefinitionId,
x,
y,
scale,
width,
height,
dpi,
format,
clip,
showLayers,
hideLayers,
showGroups,
hideGroups);
return this.OpenRead(req);
}

public Stream RenderMapLegend(RuntimeMap map, int width, int height, Color backgroundColor, string format)
{
string req = m_reqBuilder.RenderMapLegend(map.Name, width, height, Utility.SerializeHTMLColorARGB(backgroundColor, true), format);
Expand Down
42 changes: 42 additions & 0 deletions OSGeo.MapGuide.MaestroAPI/Http/RequestBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
using OSGeo.MapGuide.ObjectModels;
using OSGeo.MapGuide.ObjectModels.Common;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Drawing;
using System.Globalization;
Expand Down Expand Up @@ -1155,6 +1156,47 @@ public System.Net.WebRequest QueryMapFeatures(string mapname, bool persist, stri
return req;
}

internal string RenderMap(string mapDefinitionId,
double x,
double y,
double scale,
int width,
int height,
int dpi,
string format,
bool clip,
IEnumerable<string> showLayers,
IEnumerable<string> hideLayers,
IEnumerable<string> showGroups,
IEnumerable<string> hideGroups)
{
var param = new NameValueCollection
{
{ "OPERATION", "GETMAPIMAGE" },
{ "VERSION", "1.0.0" },
{ "MAPDEFINITION", mapDefinitionId },
{ "SETDISPLAYWIDTH", width.ToString(CultureInfo.InvariantCulture) },
{ "SETDISPLAYHEIGHT", height.ToString(CultureInfo.InvariantCulture) },
{ "SETDISPLAYDPI", dpi.ToString(CultureInfo.InvariantCulture) },
{ "SETVIEWCENTERX", x.ToString(CultureInfo.InvariantCulture) },
{ "SETVIEWCENTERY", y.ToString(CultureInfo.InvariantCulture) },
{ "SETVIEWSCALE", scale.ToString(CultureInfo.InvariantCulture) },
{ "FORMAT", format },
{ "CLIP", clip ? "1" : "0" }
};

if (showLayers?.Any() == true)
param.Add("SHOWLAYERS", string.Join(",", showLayers));
if (showGroups?.Any() == true)
param.Add("SHOWGROUPS", string.Join(",", showGroups));
if (hideLayers?.Any() == true)
param.Add("HIDELAYERS", string.Join(",", hideLayers));
if (hideGroups?.Any() == true)
param.Add("HIDEGROUPS", string.Join(",", hideGroups));

return m_hosturi + "?" + EncodeParameters(param);
}

internal System.Net.WebRequest QueryMapFeatures(string runtimeMapName, int maxFeatures, string wkt, bool persist, string selectionVariant, int? requestData, Services.QueryMapOptions extraOptions, System.IO.Stream outStream)
{
var param = new NameValueCollection
Expand Down
Loading

0 comments on commit c3a376e

Please sign in to comment.