Example #1
0
        // load background map from wms
        private void photoButton_Click(object sender, EventArgs e)
        {
            toolBuilder.addHeader("Background WMS", false);
            // textbox for wms-server
            TextBox server = toolBuilder.addTextboxWithCaption("WMS Server", "http://wms.geonorge.no/skwms1/wms.kartdata2");
            // button for fetching available layers
            Button connectButton = toolBuilder.addButton("Get layers");
            toolBuilder.addLabel("Layers");

            // dropdown for available layers
            ComboBox wmsLayers = new ComboBox();
            toolBuilder.addControl(wmsLayers);
            wmsLayers.DropDownStyle = ComboBoxStyle.DropDownList;

            // label for errors
            toolBuilder.addErrorLabel();
            // label for loading selected layer from wms
            Button loadButton = toolBuilder.addButton("Load");
            // button for clearing all loaded wms maps
            Button clearButton = toolBuilder.addButton("Clear");

            connectButton.Click += (o, e2) =>
            {
                // init progress bar
                progressLabel.Text = "Loading layers";
                progressBar.Style = ProgressBarStyle.Marquee;

                XmlNodeList xmlnodes = null;

                // perform connection in worker thread
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += (object wsender, DoWorkEventArgs we) =>
                {
                    // create url
                    var par = "REQUEST=GetCapabilities&VERSION=1.1.1&service=WMS&format=text/xml";
                    if (!server.Text.EndsWith("?"))
                        server.Text += "?";
                    var url = server.Text + par;
                    var capab = "";

                    try
                    {
                        // get response from url
                        var request = System.Net.WebRequest.Create(url);
                        using (var response = request.GetResponse())
                        using (var stream = response.GetResponseStream())
                        {
                            capab = new StreamReader(stream).ReadToEnd();
                        }
                    }
                    // handle errors
                    catch (WebException ex)
                    {
                        if (ex.Status == WebExceptionStatus.ProtocolError)
                        {
                            var response = ex.Response as HttpWebResponse;
                            if (response != null)
                            {
                                int errorNum = (int)response.StatusCode;
                                if (errorNum == 504)
                                {
                                    we.Result = "Server Timeout";
                                    return;
                                }

                                we.Result = "Http Error " + errorNum;
                            }
                        }
                        we.Result = "Server Error";
                        return;
                    }
                    catch (Exception ex)
                    {
                        we.Result = "Server Error";
                        return;
                    }

                    // parse response as xml document
                    XmlDataDocument xmldoc = new XmlDataDocument();
                    xmldoc.LoadXml(capab);
                    xmlnodes = xmldoc.GetElementsByTagName("Name");
                };
                bw.RunWorkerCompleted += (object wsender, RunWorkerCompletedEventArgs we) =>
                {
                    // add available layers to dropdown
                    wmsLayers.Items.Clear();
                    if (xmlnodes != null)
                    {
                        foreach (XmlNode n in xmlnodes)
                            if (n.ParentNode.Name == "Layer")
                                wmsLayers.Items.Add(n.InnerText);
                        if (wmsLayers.Items.Count > 0)
                            wmsLayers.SelectedIndex = 0;
                        toolBuilder.setError("");
                    }
                    else
                        toolBuilder.setError((string)we.Result);

                    // reset progress bar
                    progressLabel.Text = "";
                    progressBar.Style = ProgressBarStyle.Continuous;
                };
                bw.RunWorkerAsync();
            };

            loadButton.Click += (o, e2) =>
            {
                // create url request
                var d = CultureInfo.InvariantCulture;
                var b = ScreenManager.RealWindowsRect;
                var sb = ScreenManager.MapRealToScreen(b);
                var bbox = "BBOX=" + b.MinX.ToString(d) + "," + b.MinY.ToString(d) + "," + b.MaxX.ToString(d) + "," + b.MaxY.ToString(d) + "&WIDTH=" + sb.Width.ToString(d) + "&HEIGHT=" + sb.Height.ToString(d)+"&";
                var srs = "SRS=EPSG:32633&";
                var par = "STYLES=&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&";
                if (wmsLayers.SelectedIndex == -1)
                {
                    toolBuilder.setError("Select layer");
                    return;
                }
                var layerString = "LAYERS=" + wmsLayers.SelectedItem + "&";

                if (!server.Text.EndsWith("?"))
                    server.Text += "?";
                var url = server.Text + layerString + par + srs + bbox;
                Photo p = null;

                // init progress bar
                progressLabel.Text = "Loading map";
                progressBar.Style = ProgressBarStyle.Marquee;

                // peform loading in worker thread
                BackgroundWorker bw = new BackgroundWorker();
                bw.DoWork += (object wsender, DoWorkEventArgs we) =>
                {
                    // try loading bitmap from url response
                    try
                    {
                        var request = System.Net.WebRequest.Create(url);
                        using (var response = request.GetResponse())
                        {
                            using (var stream = response.GetResponseStream())
                            {
                                p = new Photo(Bitmap.FromStream(stream), b);
                            }
                        }
                    }
                    // handle errors
                    catch (WebException ex)
                    {
                        p = null;
                        if (ex.Status == WebExceptionStatus.ProtocolError)
                        {
                            var response = ex.Response as HttpWebResponse;
                            if (response != null)
                            {
                                int errorNum = (int)response.StatusCode;
                                if(errorNum == 504)
                                {
                                    we.Result = "Server Timeout";
                                    return;
                                }

                                we.Result = "Http Error " + errorNum;
                            }
                        }
                        we.Result = "Server Error";
                        return;
                    }
                    catch (Exception ex)
                    {
                        p = null;
                        we.Result = "Server Error";
                        return;
                    }
                };
                bw.RunWorkerCompleted += (object wsender, RunWorkerCompletedEventArgs we) =>
                {
                    // update map if loading went ok
                    if (p != null)
                    {
                        photos.Add(p);
                        redraw();
                        toolBuilder.setError("");
                    }
                    else
                        toolBuilder.setError((string) we.Result);

                    // reset progress bar
                    progressLabel.Text = "";
                    progressBar.Style = ProgressBarStyle.Continuous;
                };
                bw.RunWorkerAsync();
            };

            // clear loaded maps
            clearButton.Click += (o, e2) => {
                photos.Clear();
                redraw();
            };

            toolBuilder.reset();
        }
Example #2
0
 // drawm wms-map
 public void Draw(Photo p, Graphics gr)
 {
     Rectangle screenRect = MapRealToScreen(p.Bounds);
     gr.DrawImage(p.Pic, screenRect);
 }