private string GetRequestUrl(Envelope box, TileSet tileSet) { Client.WmsOnlineResource resource = GetPreferredMethod(); StringBuilder strReq = new StringBuilder(resource.OnlineResource); if (!resource.OnlineResource.Contains("?")) { strReq.Append("?"); } if (!strReq.ToString().EndsWith("&") && !strReq.ToString().EndsWith("?")) { strReq.Append("&"); } strReq.AppendFormat(Map.NumberFormatEnUs, "&REQUEST=GetMap&BBOX={0},{1},{2},{3}", box.MinX, box.MinY, box.MaxX, box.MaxY); strReq.AppendFormat("&WIDTH={0}&Height={1}", tileSet.Width, tileSet.Height); strReq.Append("&LAYERS="); // LAYERS is set in caps because the current version of tilecache.py does not accept mixed case (a little bug) if (tileSet.Layers != null && tileSet.Layers.Count > 0) { foreach (string layer in tileSet.Layers) { strReq.AppendFormat("{0},", layer); } strReq.Remove(strReq.Length - 1, 1); } strReq.AppendFormat("&FORMAT={0}", tileSet.Format); if (_WmsClient.WmsVersion == "1.3.0") { strReq.AppendFormat("&CRS={0}", tileSet.Srs); } else { strReq.AppendFormat("&SRS={0}", tileSet.Srs); } strReq.AppendFormat("&VERSION={0}", _WmsClient.WmsVersion); if (tileSet.Styles != null && tileSet.Styles.Count > 0) { strReq.Append("&STYLES="); foreach (string style in tileSet.Styles) { strReq.AppendFormat("{0},", style); } strReq.Remove(strReq.Length - 1, 1); } if (_CustomParameters != null && _CustomParameters.Count > 0) { foreach (string name in _CustomParameters.Keys) { string value = _CustomParameters[name]; strReq.AppendFormat("&{0}={1}", name, value); } } return(strReq.ToString()); }
/// <summary> /// Gets the URL for a map request base on current settings, the image size and boundingbox /// </summary> /// <param name="box">Area the WMS request should cover</param> /// <param name="size">Size of image</param> /// <returns>URL for WMS request</returns> public virtual string GetRequestUrl(Envelope box, Size size) { Client.WmsOnlineResource resource = GetPreferredMethod(); var strReq = new StringBuilder(resource.OnlineResource); if (!resource.OnlineResource.Contains("?")) { strReq.Append("?"); } if (!strReq.ToString().EndsWith("&") && !strReq.ToString().EndsWith("?")) { strReq.Append("&"); } strReq.AppendFormat(Map.NumberFormatEnUs, "REQUEST=GetMap&BBOX={0},{1},{2},{3}", box.MinX, box.MinY, box.MaxX, box.MaxY); strReq.AppendFormat("&WIDTH={0}&HEIGHT={1}", size.Width, size.Height); strReq.Append("&LAYERS="); if (_layerList != null && _layerList.Count > 0) { foreach (string layer in _layerList) { strReq.AppendFormat("{0},", layer); } strReq.Remove(strReq.Length - 1, 1); } strReq.AppendFormat("&FORMAT={0}", _mimeType); if (SRID < 0) { throw new ApplicationException("Spatial reference system not set"); } if (Version == "1.3.0") { strReq.AppendFormat("&CRS={0}:{1}", Authority, SRID); } else { strReq.AppendFormat("&SRS={0}:{1}", Authority, SRID); } strReq.AppendFormat("&VERSION={0}", Version); strReq.Append("&Styles="); if (_stylesList != null && _stylesList.Count > 0) { foreach (string style in _stylesList) { strReq.AppendFormat("{0},", style); } strReq.Remove(strReq.Length - 1, 1); } strReq.AppendFormat("&TRANSPARENT={0}", Transparent); if (!Transparent) { //var background = Uri.EscapeDataString(ColorTranslator.ToHtml(_bgColor)); strReq.AppendFormat("&BGCOLOR={0}", ToHexValue(_bgColor)); } return(strReq.ToString()); }
/// <summary> /// Gets the URL for a map request base on current settings, the image size and boundingbox /// </summary> /// <param name="box">Area the WMS request should cover</param> /// <param name="size">Size of image</param> /// <returns>URL for WMS request</returns> public string GetRequestUrl(BoundingBox box, Size size) { Client.WmsOnlineResource resource = GetPreferredMethod(); StringBuilder strReq = new StringBuilder(resource.OnlineResource); if (!resource.OnlineResource.Contains("?")) { strReq.Append("?"); } if (!strReq.ToString().EndsWith("&") && !strReq.ToString().EndsWith("?")) { strReq.Append("&"); } strReq.AppendFormat(Map.NumberFormatEnUs, "REQUEST=GetMap&BBOX={0},{1},{2},{3}", box.Min.X, box.Min.Y, box.Max.X, box.Max.Y); strReq.AppendFormat("&WIDTH={0}&Height={1}", size.Width, size.Height); strReq.Append("&Layers="); if (_LayerList != null && _LayerList.Count > 0) { foreach (string layer in _LayerList) { strReq.AppendFormat("{0},", layer); } strReq.Remove(strReq.Length - 1, 1); } strReq.AppendFormat("&FORMAT={0}", _MimeType); if (SRID < 0) { throw new ApplicationException("Spatial reference system not set"); } if (wmsClient.WmsVersion == "1.3.0") { strReq.AppendFormat("&CRS=EPSG:{0}", SRID); } else { strReq.AppendFormat("&SRS=EPSG:{0}", SRID); } strReq.AppendFormat("&VERSION={0}", wmsClient.WmsVersion); strReq.Append("&Styles="); if (_StylesList != null && _StylesList.Count > 0) { foreach (string style in _StylesList) { strReq.AppendFormat("{0},", style); } strReq.Remove(strReq.Length - 1, 1); } strReq.AppendFormat("&TRANSPARENT={0}", _Transparancy); if (!_Transparancy) { strReq.AppendFormat("&BGCOLOR={0}", ColorTranslator.ToHtml(_BgColor)); } return(strReq.ToString()); }
private Bitmap WmsGetMap(Envelope extent, TileSet tileSet) { Stream responseStream = null; Bitmap bitmap = null; Client.WmsOnlineResource resource = GetPreferredMethod(); string requestUrl = GetRequestUrl(extent, tileSet); Uri myUri = new Uri(requestUrl); WebRequest webRequest = WebRequest.Create(myUri); webRequest.Method = resource.Type; webRequest.Timeout = TimeOut; if (Credentials != null) { webRequest.Credentials = Credentials; } else { webRequest.Credentials = CredentialCache.DefaultCredentials; } if (Proxy != null) { webRequest.Proxy = Proxy; } HttpWebResponse webResponse = null; try { webResponse = (HttpWebResponse)webRequest.GetResponse(); if (webResponse.ContentType.StartsWith("image")) { responseStream = webResponse.GetResponseStream(); bitmap = (Bitmap)Bitmap.FromStream(responseStream); return((Bitmap)bitmap); } else { //if the result was not an image retrieve content anyway for debugging. responseStream = webResponse.GetResponseStream(); StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8); StringWriter stringWriter = new StringWriter(); stringWriter.Write(readStream.ReadToEnd()); string message = "Failed to retrieve image from the WMS in layer '" + LayerName + "'. Was expecting image but received this: " + stringWriter.ToString(); HandleGetMapException(message, null); ; return(null); } } catch (WebException webEx) { string message = "There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'"; HandleGetMapException(message, webEx); } catch (Exception ex) { string message = "There was a problem while retrieving the image from the WMS in layer '" + LayerName + "'"; HandleGetMapException(message, ex); } finally { if (webResponse != null) { webResponse.Close(); } if (responseStream != null) { responseStream.Close(); responseStream.Dispose(); } } return(bitmap); }
/// <summary> /// Renders the layer /// </summary> /// <param name="g">Graphics object reference</param> /// <param name="map">Map which is rendered</param> public override void Render(Graphics g, Map map) { Client.WmsOnlineResource resource = GetPreferredMethod(); Uri myUri = new Uri(GetRequestUrl(map.Envelope, map.Size)); WebRequest myWebRequest = WebRequest.Create(myUri); myWebRequest.Method = resource.Type; myWebRequest.Timeout = _TimeOut; if (_Credentials != null) { myWebRequest.Credentials = _Credentials; } else { myWebRequest.Credentials = CredentialCache.DefaultCredentials; } if (_Proxy != null) { myWebRequest.Proxy = _Proxy; } try { HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse(); if (myWebResponse != null) { Stream dataStream = myWebResponse.GetResponseStream(); if (dataStream != null && myWebResponse.ContentType.StartsWith("image")) { Image img = Image.FromStream(dataStream); if (_ImageAttributes != null) { g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ImageAttributes); } else { g.DrawImageUnscaled(img, 0, 0, map.Size.Width, map.Size.Height); } dataStream.Close(); } myWebResponse.Close(); } } catch (WebException webEx) { if (!_ContinueOnError) { throw (new RenderException( "There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'", webEx)); } Trace.Write("There was a problem connecting to the WMS server when rendering layer '" + LayerName + "': " + webEx.Message); } catch (Exception ex) { if (!_ContinueOnError) { throw (new RenderException("There was a problem rendering layer '" + LayerName + "'", ex)); } Trace.Write("There was a problem connecting to the WMS server when rendering layer '" + LayerName + "': " + ex.Message); } base.Render(g, map); }
/// <summary> /// Renders the layer /// </summary> /// <remarks> /// Change from SharpMap: /// throws RenderException when Content Type is not an image. /// Does not log. /// </remarks> /// <param name="g">Graphics object reference</param> /// <param name="map">Map which is rendered</param> public override void Render(Graphics g, MapViewport map) { Client.WmsOnlineResource resource = GetPreferredMethod(); var myUri = new Uri(GetRequestUrl(map.Envelope, map.Size)); var myWebRequest = WebRequest.Create(myUri); myWebRequest.Method = resource.Type; myWebRequest.Timeout = TimeOut; if (myWebRequest is HttpWebRequest) { (myWebRequest as HttpWebRequest).Accept = _mimeType; (myWebRequest as HttpWebRequest).KeepAlive = false; (myWebRequest as HttpWebRequest).UserAgent = "SharpMap-WMSLayer"; } if (Credentials != null) { myWebRequest.Credentials = Credentials; myWebRequest.PreAuthenticate = true; } else { myWebRequest.Credentials = CredentialCache.DefaultCredentials; } if (Proxy != null) { myWebRequest.Proxy = Proxy; } try { using (var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse()) { using (var dataStream = myWebResponse.GetResponseStream()) { if (dataStream != null && myWebResponse.ContentType.StartsWith("image")) { var cLength = (int)myWebResponse.ContentLength; Image img; using (var ms = new MemoryStream()) { var buf = new byte[50000]; int numRead = 0; DateTime lastTimeGotData = DateTime.Now; var moreToRead = true; do { try { int nr = dataStream.Read(buf, 0, buf.Length); ms.Write(buf, 0, nr); numRead += nr; if (nr == 0) { int testByte = dataStream.ReadByte(); if (testByte == -1) { //moreToRead = false; break; } if ((DateTime.Now - lastTimeGotData).TotalSeconds > TimeOut) { return; } //Did not get data... sleep for a while to not spin System.Threading.Thread.Sleep(10); } else { lastTimeGotData = DateTime.Now; } } catch (IOException /*ee*/) { //This can be valid since in some cases .NET failed to parse 0-sized chunks in responses.. //For now, just safely ignore the exception and assume we read all data... //Either way we will get an error later if we did not.. moreToRead = false; } } while (moreToRead); ms.Seek(0, SeekOrigin.Begin); img = Image.FromStream(ms); } if (ImageAttributes != null) { g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ImageAttributes); } else { g.DrawImage(img, Rectangle.FromLTRB(0, 0, map.Size.Width, map.Size.Height)); } dataStream.Close(); } else { if (!ContinueOnError) { throw new RenderException("Bad Content Type, WMS server dit not return an image."); } } } myWebResponse.Close(); } } catch (WebException webEx) { if (!ContinueOnError) { throw (new RenderException( "There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'", webEx)); } } catch (Exception ex) { if (!ContinueOnError) { throw (new RenderException("There was a problem rendering layer '" + LayerName + "'", ex)); } } base.Render(g, map); }
/// <summary> /// Renders the layer /// </summary> /// <param name="g">Graphics object reference</param> /// <param name="map">Map which is rendered</param> public override void Render(Graphics g, MapViewport map) { if (Logger.IsDebugEnabled) { Logger.Debug("Rendering wmslayer: " + LayerName); } Client.WmsOnlineResource resource = GetPreferredMethod(); var myUri = new Uri(GetRequestUrl(map.Envelope, map.Size)); if (Logger.IsDebugEnabled) { Logger.Debug("Url: " + myUri); } var myWebRequest = WebRequest.Create(myUri); myWebRequest.Method = resource.Type; myWebRequest.Timeout = TimeOut; if (myWebRequest is HttpWebRequest) { (myWebRequest as HttpWebRequest).Accept = _mimeType; (myWebRequest as HttpWebRequest).KeepAlive = false; (myWebRequest as HttpWebRequest).UserAgent = "SharpMap-WMSLayer"; } if (Credentials != null) { myWebRequest.Credentials = Credentials; myWebRequest.PreAuthenticate = true; } else { myWebRequest.Credentials = CredentialCache.DefaultCredentials; } if (Proxy != null) { myWebRequest.Proxy = Proxy; } try { if (Logger.IsDebugEnabled) { Logger.Debug("Beginning request"); } using (var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse()) { if (Logger.IsDebugEnabled) { Logger.Debug("Got response"); } using (var dataStream = myWebResponse.GetResponseStream()) { if (dataStream != null && myWebResponse.ContentType.StartsWith("image")) { if (Logger.IsDebugEnabled) { Logger.Debug("Reading image from stream"); } var cLength = (int)myWebResponse.ContentLength; if (Logger.IsDebugEnabled) { Logger.Debug("Content-Length: " + cLength); } Image img; using (var ms = new MemoryStream()) { var buf = new byte[50000]; int numRead = 0; DateTime lastTimeGotData = DateTime.Now; var moreToRead = true; do { try { int nr = dataStream.Read(buf, 0, buf.Length); ms.Write(buf, 0, nr); numRead += nr; if (nr == 0) { int testByte = dataStream.ReadByte(); if (testByte == -1) { //moreToRead = false; break; } if ((DateTime.Now - lastTimeGotData).TotalSeconds > TimeOut) { if (Logger.IsInfoEnabled) { Logger.Info("Did not get any data for " + TimeOut + " seconds, aborting"); } return; } if (Logger.IsDebugEnabled) { Logger.Debug("No data to read. Have received: " + numRead + " of " + cLength); } //Did not get data... sleep for a while to not spin System.Threading.Thread.Sleep(10); } else { lastTimeGotData = DateTime.Now; } } catch (IOException /*ee*/) { //This can be valid since in some cases .NET failed to parse 0-sized chunks in responses.. //For now, just safely ignore the exception and assume we read all data... //Either way we will get an error later if we did not.. moreToRead = false; } catch (Exception ee) { Logger.Error("Error reading from WMS-server..", ee); throw; } } while (moreToRead); if (Logger.IsDebugEnabled) { Logger.Debug("Have received: " + numRead); } ms.Seek(0, SeekOrigin.Begin); img = Image.FromStream(ms); } if (Logger.IsDebugEnabled) { Logger.Debug("Image read.. Drawing"); } if (Opacity < 1f) { using (var ia = CreateImageAttributes(Opacity)) { g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia); } } else { g.DrawImage(img, Rectangle.FromLTRB(0, 0, map.Size.Width, map.Size.Height)); } if (Logger.IsDebugEnabled) { Logger.Debug("Draw complete"); } dataStream.Close(); } } myWebResponse.Close(); } } catch (WebException webEx) { if (!_continueOnError) { throw (new RenderException( "There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'", webEx)); } Logger.Error("There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'", webEx); } catch (Exception ex) { if (!_continueOnError) { throw (new RenderException("There was a problem rendering layer '" + LayerName + "'", ex)); } Logger.Error("There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'", ex); } // Obsolete (and will cause infinite loop) //base.Render(g, map); }
public void DrawToGraphics(Map m, BoundingBox e, Graphics g) { Client.WmsOnlineResource resource = this.GetPreferredMethod(); Uri myUri = new Uri(this.GetRequestUrl(m.Envelope, m.Size)); WebRequest myWebRequest = WebRequest.Create(myUri); myWebRequest.Method = resource.Type; myWebRequest.Timeout = this.TimeOut; if (this.Credentials != null) { myWebRequest.Credentials = this.Credentials; } else { myWebRequest.Credentials = CredentialCache.DefaultCredentials; } if (this.Proxy != null) { myWebRequest.Proxy = this.Proxy; } try { HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse(); Stream dataStream = myWebResponse.GetResponseStream(); if (myWebResponse.ContentType.StartsWith("image")) { Image img = Image.FromStream(myWebResponse.GetResponseStream()); if (this.ImageAttributes != null) { g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, this.ImageAttributes); } else { g.DrawImageUnscaled(img, 0, 0, m.Size.Width, m.Size.Height); } } dataStream.Close(); myWebResponse.Close(); } catch (WebException webEx) { if (!this.ContinueOnError) { throw (new RenderException("There was a problem connecting to the WMS server when rendering layer '" + this.LayerName + "'", webEx)); } else { //Write out a trace warning instead of throwing an error to help debugging WMS problems Trace.Write("There was a problem connecting to the WMS server when rendering layer '" + this.LayerName + "': " + webEx.Message); } } catch (Exception ex) { if (!this.ContinueOnError) { throw (new RenderException("There was a problem rendering layer '" + this.LayerName + "'", ex)); } else { //Write out a trace warning instead of throwing an error to help debugging WMS problems Trace.Write("There was a problem connecting to the WMS server when rendering layer '" + this.LayerName + "': " + ex.Message); } } }