// 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(); }
// drawm wms-map public void Draw(Photo p, Graphics gr) { Rectangle screenRect = MapRealToScreen(p.Bounds); gr.DrawImage(p.Pic, screenRect); }