Index: src/Common/SharpMap.Extensions/Layers/WmscLayer.cs =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r5fc71a385897af92ccb092f2f969b5709afab85a --- src/Common/SharpMap.Extensions/Layers/WmscLayer.cs (.../WmscLayer.cs) (revision 8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9) +++ src/Common/SharpMap.Extensions/Layers/WmscLayer.cs (.../WmscLayer.cs) (revision 5fc71a385897af92ccb092f2f969b5709afab85a) @@ -25,13 +25,12 @@ /// public class WmscLayer : AsyncTileLayer { - private ITileCache cache; - - private ITileSchema tileSchema; - private static bool makeLayerVisible; private static ICoordinateTransformation geo2webTransformation; + private ITileCache cache; + + private ITileSchema tileSchema; private IEnvelope schemaEnvelope; public WmscLayer() @@ -47,36 +46,63 @@ { var path = SettingsHelper.GetApplicationLocalUserSettingsDirectory(); return Path.Combine(path, - "cache_wms_" + Url.Replace(':', '_').Replace('/', '_').Replace('&', '_').Replace('?', '_') + WmsLayer); + "cache_wms_" + Url.Replace(':', '_').Replace('/', '_').Replace('&', '_').Replace('?', '_') + WmsLayer); } } public virtual string WmsLayer { get; set; } - private static ICoordinateTransformation Geo2webTransformation + public static ILayer CreateWmsLayersFromUrl(string url) { - get + url += "REQUEST=GetCapabilities&SERVICE=WMS"; + + var webRequest = (HttpWebRequest) WebRequest.Create(url); + + using (var webResponse = webRequest.GetSyncResponse(10000)) { - if (geo2webTransformation == null) + if (webResponse == null) { - var srcSrs = SharpMap.Map.CoordinateSystemFactory.CreateFromEPSG(4326); - var dstSrs = SharpMap.Map.CoordinateSystemFactory.CreateFromEPSG(3857); + throw (new WebException("An error occurred while fetching tile", null)); + } - geo2webTransformation = SharpMap.Map.CoordinateSystemFactory.CreateTransformation(srcSrs, dstSrs); + using (var responseStream = webResponse.GetResponseStream()) + { + var capabilities = new WmsCapabilities(responseStream); + + makeLayerVisible = true; + + return capabilities.Capability.Layer.ChildLayers.Count > 0 + ? CreateChildLayers(url, capabilities.Capability.Layer.ChildLayers, new GroupLayer + { + Name = GetWmsLayerName(capabilities.Capability.Layer), ReadOnly = true + }) + : CreateWmsLayer(url, capabilities.Capability.Layer); } - return geo2webTransformation; } } + public override object Clone() + { + var clone = (WmscLayer) base.Clone(); + clone.schemaEnvelope = (IEnvelope) schemaEnvelope.Clone(); + clone.WmsLayer = WmsLayer; + clone.Url = Url; + return clone; + } + protected override ITileCache GetOrCreateCache() { if (cache == null) { //no cache so mem if (CacheLocation == null) + { cache = new MemoryCache(1000, 100000); + } else + { cache = new FileCache(CacheLocation, "jpg"); + } } return cache; } @@ -96,41 +122,24 @@ protected override IRequest CreateRequest() { - return new WmscRequest(new Uri(Url), tileSchema, new List(new[] { WmsLayer }), null, null, "1.3.0"); + return new WmscRequest(new Uri(Url), tileSchema, new List(new[] + { + WmsLayer + }), null, null, "1.3.0"); } - public override object Clone() + private static ICoordinateTransformation Geo2webTransformation { - var clone = (WmscLayer)base.Clone(); - clone.schemaEnvelope = (IEnvelope) schemaEnvelope.Clone(); - clone.WmsLayer = WmsLayer; - clone.Url = Url; - return clone; - } - - public static ILayer CreateWmsLayersFromUrl(string url) - { - url += "REQUEST=GetCapabilities&SERVICE=WMS"; - - var webRequest = (HttpWebRequest) WebRequest.Create(url); - - using (var webResponse = webRequest.GetSyncResponse(10000)) + get { - if (webResponse == null) + if (geo2webTransformation == null) { - throw (new WebException("An error occurred while fetching tile", null)); - } + var srcSrs = SharpMap.Map.CoordinateSystemFactory.CreateFromEPSG(4326); + var dstSrs = SharpMap.Map.CoordinateSystemFactory.CreateFromEPSG(3857); - using (var responseStream = webResponse.GetResponseStream()) - { - var capabilities = new WmsCapabilities(responseStream); - - makeLayerVisible = true; - - return capabilities.Capability.Layer.ChildLayers.Count > 0 - ? CreateChildLayers(url, capabilities.Capability.Layer.ChildLayers, new GroupLayer { Name = GetWmsLayerName(capabilities.Capability.Layer), ReadOnly = true }) - : CreateWmsLayer(url, capabilities.Capability.Layer); + geo2webTransformation = SharpMap.Map.CoordinateSystemFactory.CreateTransformation(srcSrs, dstSrs); } + return geo2webTransformation; } } @@ -139,8 +148,11 @@ foreach (var childWmsLayer in childLayers) { parent.Layers.Add(childWmsLayer.ChildLayers.Count > 0 - ? CreateChildLayers(url, childWmsLayer.ChildLayers, new GroupLayer { Name = GetWmsLayerName(childWmsLayer), ReadOnly = true }) - : CreateWmsLayer(url, childWmsLayer)); + ? CreateChildLayers(url, childWmsLayer.ChildLayers, new GroupLayer + { + Name = GetWmsLayerName(childWmsLayer), ReadOnly = true + }) + : CreateWmsLayer(url, childWmsLayer)); } return parent; @@ -155,7 +167,7 @@ WmsLayer = wmsLayer.Name, Visible = makeLayerVisible, ReadOnly = true, - schemaEnvelope = CreateEnvelope(wmsLayer) + schemaEnvelope = CreateEnvelope(wmsLayer) }; if (makeLayerVisible) @@ -173,7 +185,29 @@ var minY = wmsLayer.ExGeographicBoundingBox.SouthBoundLatitude; var maxY = wmsLayer.ExGeographicBoundingBox.NorthBoundLatitude; - var pointsGeo = new List {new[] {minX, minY}, new[] {maxX, minY}, new[] {maxX, maxY}, new[] {minX, maxY}}; + var pointsGeo = new List + { + new[] + { + minX, + minY + }, + new[] + { + maxX, + minY + }, + new[] + { + maxX, + maxY + }, + new[] + { + minX, + maxY + } + }; var pointsWeb = Geo2webTransformation.MathTransform.TransformList(pointsGeo); var envelope = new Envelope();