using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using System.Net;
using System.Xml.Serialization;
using SharpMap.Serialization.Model;
namespace SharpMap.Serialization
{
public static class MapSerialization
{
///
/// Parses a Map from a MapDocument
///
/// Instance of
/// Map Document accodring to the MapDocument
public static Map LoadMapFromStream(Stream s)
{
XmlSerializer ser = new XmlSerializer(typeof(MapDefinition));
MapDefinition md = (MapDefinition)ser.Deserialize(s);
Map m = new Map();
if (md.Extent != null)
m.ZoomToBox(new GeoAPI.Geometries.Envelope(md.Extent.Xmin, md.Extent.Xmax, md.Extent.Ymin, md.Extent.Ymax));
if (!string.IsNullOrEmpty(md.BackGroundColor))
{
m.BackColor = ColorTranslator.FromHtml(md.BackGroundColor);
}
m.SRID = md.SRID;
foreach (var l in md.Layers)
{
SharpMap.Layers.ILayer lay = null;
//WMSLayer?
if (l is WmsLayer)
{
ICredentials cred = null;
if (!string.IsNullOrEmpty((l as WmsLayer).WmsUser))
cred = new NetworkCredential((l as WmsLayer).WmsUser, (l as WmsLayer).WmsPassword);
SharpMap.Layers.WmsLayer wmsl = new Layers.WmsLayer(l.Name, (l as WmsLayer).OnlineURL, TimeSpan.MaxValue, WebRequest.DefaultWebProxy, cred);
if ((l as WmsLayer).WmsLayers != null)
{
string[] layers = (l as WmsLayer).WmsLayers.Split(',');
foreach (var wl in layers)
{
wmsl.AddLayer(wl);
}
}
else
{
wmsl.AddChildLayers(wmsl.RootLayer,true);
}
lay = wmsl;
}
//And some simple tiled layers
else if (l is OsmLayer)
{
var ol = (OsmLayer) l;
BruTile.Predefined.KnownTileSource kts;
if (!Enum.TryParse(ol.KnownTileSource, out kts))
kts = BruTile.Predefined.KnownTileSource.OpenStreetMap;
if (ol.Async)
lay = new Layers.TileAsyncLayer(BruTile.Predefined.KnownTileSources.Create(kts, ol.ApiKey), l.Name);
else
lay = new Layers.TileLayer(BruTile.Predefined.KnownTileSources.Create(kts, ol.ApiKey), l.Name);
}
/*
else if (l is GoogleLayer)
{
lay = new Layers.TileLayer(new BruTile.Web.GoogleTileSource(BruTile.Web.GoogleMapType.GoogleMap), l.Name);
}
else if (l is GoogleSatLayer)
{
lay = new Layers.TileLayer(new BruTile.Web.GoogleTileSource(BruTile.Web.GoogleMapType.GoogleSatellite), l.Name);
}
else if (l is GoogleTerrainLayer)
{
lay = new Layers.TileLayer(new BruTile.Web.GoogleTileSource(BruTile.Web.GoogleMapType.GoogleTerrain), l.Name);
}
*/
if (lay != null)
{
lay.MinVisible = l.MinVisible;
lay.MaxVisible = l.MaxVisible;
m.Layers.Add(lay);
}
}
return m;
}
public static void SaveMapToStream(Map m, Stream s)
{
MapDefinition md = new MapDefinition();
md.Extent = new Extent()
{
Xmin = m.Envelope.MinX,
Xmax = m.Envelope.MaxX,
Ymin = m.Envelope.MinY,
Ymax = m.Envelope.MaxY
};
md.BackGroundColor = ColorTranslator.ToHtml(m.BackColor);
md.SRID = m.SRID;
List layers = new List();
foreach (var layer in m.Layers)
{
MapLayer ml = null;
if (layer is SharpMap.Layers.VectorLayer)
{
}
else if (layer is SharpMap.Layers.WmsLayer)
{
WmsLayer sl = new WmsLayer();
sl.OnlineURL = (layer as SharpMap.Layers.WmsLayer).CapabilitiesUrl;
sl.WmsLayers = string.Join(",", (layer as SharpMap.Layers.WmsLayer).LayerList.ToArray());
if ((layer as SharpMap.Layers.WmsLayer).Credentials is NetworkCredential)
{
sl.WmsUser = ((layer as SharpMap.Layers.WmsLayer).Credentials as NetworkCredential).UserName;
sl.WmsPassword = ((layer as SharpMap.Layers.WmsLayer).Credentials as NetworkCredential).Password;
}
ml = sl;
}
ml.MinVisible = layer.MinVisible;
ml.MaxVisible = layer.MaxVisible;
ml.Name = layer.LayerName;
if (ml != null)
layers.Add(ml);
}
md.Layers = layers.ToArray();
XmlSerializer serializer = new XmlSerializer(typeof(MapDefinition));
serializer.Serialize(s, md);
}
}
}