Exemple #1
0
        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());
        }
Exemple #2
0
        /// <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());
        }
Exemple #3
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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);
        }
Exemple #8
0
        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);
                }
            }
        }