Esempio n. 1
0
        // export map as raster-image
        private void renderButton_Click(object sender, EventArgs e)
        {
            toolBuilder.addHeader("Export to GeoTiff", false);
            // textbox for increase in resolution
            var zoom = toolBuilder.addTextboxWithCaption("Zoom factor:", "1");
            // textbox and button for new file name input
            var file = toolBuilder.addTextboxWithCaption("Filename:", "");
            var browsebutton = toolBuilder.addButton("Browse...");
            browsebutton.Click += (o, w) =>
            {
                 SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                 saveFileDialog1.Filter = "bmp files (*.bmp)|*.bmp"  ;
                 if(saveFileDialog1.ShowDialog() == DialogResult.OK)
                     file.Text = saveFileDialog1.FileName;
            };
            // label for errors
            var error = toolBuilder.addErrorLabel();

            // button for performing rasterization
            Button button = toolBuilder.addButton("Export", (Layer selectedLayer) =>
            {
                // no filename is given
                if (file.Text == "")
                {
                    toolBuilder.setError("Please provide filename");
                    return;
                }
                // æøå not accepted in filename, not supported by GDAL
                if (file.Text.ToLower().IndexOfAny("æøå".ToCharArray()) > -1)
                {
                    toolBuilder.setError("No æøå in filename");
                    return;
                }
                double zoomfactor = 1;
                if (!double.TryParse(zoom.Text, out zoomfactor))
                {
                    // zoom factor must be a number
                    toolBuilder.setError("Zoom factor not a number");
                    return;
                }

                // calulate image resolution and new real world coordinates
                var oldWindowRect = ScreenManager.WindowsRect.Clone();
                ScreenManager.WindowsRect = new ScreenManager.SGISEnvelope(0, oldWindowRect.MaxX * zoomfactor, 0, oldWindowRect.MaxY * zoomfactor);
                ScreenManager.Calculate();
                Bitmap mapTemp = new Bitmap((int)ScreenManager.WindowsRect.Width,
                                            (int)ScreenManager.WindowsRect.Height);
                var mapRectTemp = ScreenManager.MapScreenToReal(ScreenManager.WindowsRect);
                OgcCompliantGeometryFactory fact = new OgcCompliantGeometryFactory();
                var boundingGeometry = fact.ToGeometry(mapRectTemp);
                Render render = new Render(ScreenManager.Scale, ScreenManager.Offset);
                ScreenManager.WindowsRect.Set(oldWindowRect);
                ScreenManager.Calculate();

                // background worker for performing rasterisation in another thread
                BackgroundWorker bwRender = new BackgroundWorker();
                bwRender.DoWork += (obj, args) =>
                {
                    var mapGraphics = Graphics.FromImage(mapTemp);

                    // draw background maps
                    foreach (Photo p in photos)
                    {
                        // only if visible
                        if (p.Geometry.Intersects(boundingGeometry))
                            render.Draw(p, mapGraphics);
                    }
                    // draw layers
                    foreach (Layer l in Layers.Reverse())
                    {
                        // only if visible
                        if (!l.Visible)
                            continue;
                        // draw only visible features
                        var visibleFeatures = l.getWithin(boundingGeometry);
                        lock (l) // lock layer to prevent multithreaded access to style when drawing
                        {
                            // render feature
                            foreach (Feature s in visibleFeatures)
                            {
                                render.Draw(s.Geometry, mapGraphics, l.Style);
                            }
                        }
                    }
                };
                // georeference drawn bitmap
                bwRender.RunWorkerCompleted += (obj, args) =>
                {
                    // remove .bmp ending if present
                    if (file.Text.EndsWith(".bmp"))
                        file.Text = file.Text.Substring(0, file.Text.Length-4);
                    // save render
                    mapTemp.Save(file.Text+".bmp");

                   // init GDAL and copy image
                   OSGeo.GDAL.Gdal.AllRegister();
                   OSGeo.GDAL.Driver srcDrv = OSGeo.GDAL.Gdal.GetDriverByName("GTiff");
                   OSGeo.GDAL.Dataset srcDs = OSGeo.GDAL.Gdal.Open(file.Text+".bmp", OSGeo.GDAL.Access.GA_ReadOnly);
                   OSGeo.GDAL.Dataset dstDs = srcDrv.CreateCopy(file.Text+".tiff", srcDs, 0, null, null, null);

                   //Set the map projection
                    {
                        OSGeo.OSR.SpatialReference oSRS = new OSGeo.OSR.SpatialReference("");
                        oSRS.ImportFromProj4( SRS.ToString() );
                        string wkt;
                        // convert projection to wkt
                        oSRS.ExportToWkt(out wkt);
                        dstDs.SetProjection(wkt);
                   }

                   //Set the map coordinates
                   double mapWidth = mapRectTemp.Width;
                   double mapHeight = mapRectTemp.Height;
                   double[] geoTransfo = new double[] { mapRectTemp.MinX, mapWidth / mapTemp.Width, 0, mapRectTemp.MaxY, 0, -mapHeight / mapTemp.Height };
                   dstDs.SetGeoTransform(geoTransfo);

                   dstDs.FlushCache();
                   dstDs.Dispose();
                   srcDs.Dispose();
                   srcDrv.Dispose();

                    /////////////////////////
                };
                bwRender.RunWorkerAsync();
            });
        }
Esempio n. 2
0
File: SGIS.cs Progetto: hakbra/SGIS
        // draws map
        private void SGIS_Paint(object sender, PaintEventArgs e)
        {
            // if map is to be cmpletely redrawn
            if (mapDirty)
            {
                mapDirty = false;
                // create temporary map and bounding box
                Bitmap mapTemp = new Bitmap(mapWindow.Width, mapWindow.Height);
                var mapRectTemp = ScreenManager.MapScreenToReal(ScreenManager.WindowsRect);
                Layer selectedLayer = (Layer)layerList.SelectedItem;
                OgcCompliantGeometryFactory fact = new OgcCompliantGeometryFactory();
                var boundingGeometry = fact.ToGeometry(mapRectTemp);
                // create new render instance
                Render render = new Render(ScreenManager.Scale, ScreenManager.Offset);

                // if we are already rendering a new map
                if (bw.IsBusy)
                {
                    // cancel previous rendering
                    bw.CancelAsync();
                    while(bw.IsBusy)
                        Application.DoEvents();
                }
                bw = new BackgroundWorker();
                bw.WorkerSupportsCancellation = true;
                // start new rendering in other thread
                // this avoids making the application unresponsive
                bw.DoWork += (obj, args) =>
                {
                    var mapGraphics = Graphics.FromImage(mapTemp);

                    // draw wms-maps
                    foreach(Photo p in photos)
                    {
                        if (p.Geometry.Intersects(boundingGeometry))
                            p.Draw(mapGraphics);
                    }

                    // draw layers
                    foreach (Layer l in Layers.Reverse())
                    {
                        // skip layer if not visible
                        if (!l.Visible)
                            continue;
                        // get all visible features in layer
                        var visibleFeatures = l.getWithin(boundingGeometry);
                        lock (l)
                        {
                            // draw feature
                            foreach (Feature s in visibleFeatures)
                            {
                                // abort if this rendering has been cancelled
                                if (bw.CancellationPending)
                                {
                                    args.Cancel = true;
                                    return;
                                }
                                if (!s.Selected || l != selectedLayer)
                                    render.Draw(s.Geometry, mapGraphics, l.Style);
                                else if (l == selectedLayer)
                                    render.Draw(s.Geometry, mapGraphics, Style.Selected);
                            }
                            // render quad tree, only for debug purposes
                            //if (l.QuadTree != null)
                            //    l.QuadTree.render(e.Graphics);
                        }
                    }
                };
                bw.RunWorkerCompleted += (obj, args) =>
                {
                    // if rendering was not cancelled
                    if (!args.Cancelled)
                    {
                        // copy temporary map to stored map
                        map = mapTemp;
                        mapRect = mapRectTemp;
                        // draw new map
                        redrawDirty();
                    }
                };
                bw.RunWorkerAsync();
            }

            try
            {
                // draw map stored in member map
                var screenRect = ScreenManager.MapRealToScreen(mapRect);

                // draw background color
                if (mapBgColor != Color.White)
                    e.Graphics.Clear(mapBgColor);

                e.Graphics.DrawImage(map, screenRect);
            }
            catch (Exception ex)
            {
                // Will happen after changing SRS
            }

            // if current srs is projected, draw scale in lower left corner
            if (!SRS.IsLatLong)
                renderScale(e.Graphics);

            // calls mouse render function, will only draw select-rectangle when select is being used
            mouse.render(e.Graphics);
        }