using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; using ProjNet.CoordinateSystems; using ProjNet.CoordinateSystems.Transformations; using SharpMap; using SharpMap.CoordinateSystems; using SharpMap.CoordinateSystems.Transformations; using SharpMap.Forms; using SharpMap.Forms.Tools; using SharpMap.Layers; using System.Drawing.Drawing2D; using SharpMap.Data; using SharpMap.Rendering.Decoration; using WinFormSamples.Samples; namespace WinFormSamples { public partial class FormMapBox : Form { private static readonly Dictionary MapDecorationTypes = new Dictionary(); private static bool AddToListView; public static bool UseDotSpatial { get { return Session.Instance.CoordinateSystemServices.GetCoordinateSystem(4326) is DotSpatialCoordinateSystem; } set { if (value == UseDotSpatial) return; var s = (Session) Session.Instance; var css = !value ? new CoordinateSystemServices( new CoordinateSystemFactory(), new CoordinateTransformationFactory(), SharpMap.Converters.WellKnownText.SpatialReference.GetAllReferenceSystems()) : new CoordinateSystemServices( new DotSpatialCoordinateSystemFactory(), new DotSpatialCoordinateTransformationFactory(), SharpMap.Converters.WellKnownText.SpatialReference.GetAllReferenceSystems()); s.SetCoordinateSystemServices(css); } } public FormMapBox() { AddToListView = false; InitializeComponent(); mapBox1.ActiveTool = MapBox.Tools.Pan; var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (System.Reflection.Assembly a in loadedAssemblies) LoadMapDecorationTypes(a); foreach (var name in MapDecorationTypes.Keys) { lvwDecorations.Items.Add(name); } AddToListView = true; AppDomain.CurrentDomain.AssemblyLoad += HandleAssemblyLoad; pgMapDecoration.SelectedObject = null; radioButton2.Checked = true; radioButton_Click(radioButton2, EventArgs.Empty); } private void HandleAssemblyLoad(object sender, AssemblyLoadEventArgs args) { LoadMapDecorationTypes(args.LoadedAssembly); } private void LoadMapDecorationTypes(System.Reflection.Assembly a) { var mdtype = typeof(SharpMap.Rendering.Decoration.IMapDecoration); try { foreach (Type type in a.GetTypes()) { if (type.FullName.StartsWith("SharpMap")) Console.WriteLine(type.FullName); if (mdtype.IsAssignableFrom(type)) { if (!type.IsAbstract) { if (AddToListView) lvwDecorations.Items.Add(new ListViewItem(type.Name)); MapDecorationTypes[type.Name] = type; } } } } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception) { } #pragma warning restore CA1031 // Do not catch general exception types } private void UpdatePropertyGrid() { if (pgMap.InvokeRequired) pgMap.Invoke(new MethodInvoker(() => pgMap.Update())); else pgMap.Update(); } private static void AdjustRotation(LayerCollection lc, float angle) { foreach (ILayer layer in lc) { if (layer is VectorLayer) ((VectorLayer) layer).Style.SymbolRotation = -angle; else if (layer is LabelLayer) ((LabelLayer)layer).Style.Rotation = -angle; } } private static string[] GetOpenFileName(string filter) { using (var ofd = new OpenFileDialog()) { ofd.CheckFileExists = true; ofd.ShowReadOnly = false; ofd.Multiselect = true; ofd.Filter = filter; if (ofd.ShowDialog() == DialogResult.OK) return ofd.FileNames; return null; } } private void btnTool_Click(object sender, EventArgs e) { var btn = (Button) sender; IMapTool tool = null; switch (btn.Name) { case "btnTool": tool = (mapBox1.CustomTool is SampleTool) ? null : new SampleTool(mapBox1); break; case "btnTool2": tool = (mapBox1.CustomTool is MagnifierTool) ? null : new MagnifierTool(mapBox1); break; } var oldCustomTool = mapBox1.CustomTool; if (oldCustomTool is SampleTool) btnTool.Font = new Font(btn.Font, FontStyle.Regular); if (oldCustomTool is MagnifierTool) btnTool2.Font = new Font(btn.Font, FontStyle.Regular); if (oldCustomTool is IDisposable) ((IDisposable) oldCustomTool).Dispose(); mapBox1.CustomTool = tool; btn.Font = new Font(btn.Font, tool == null ? FontStyle.Regular : FontStyle.Bold); if (tool == null) mapBox1.ActiveTool = MapBox.Tools.Pan; //if (mapBox1.CustomTool == null) // mapBox1.CustomTool = new SampleTool(mapBox1); //else //{ // mapBox1.CustomTool = null; // mapBox1.ActiveTool = MapBox.Tools.Pan; //} } void mapBox1_MapQueryStarted(object sender, EventArgs e) { dataGridView1.DataSource = _queriedData = null; } void mapBox1_MapQueryEnded(object sender, EventArgs e) { if (_queriedData != null && _queriedData.Tables.Count > 0) dataGridView1.DataSource = _queriedData.Tables[0]; } private FeatureDataSet _queriedData; private void mapBox1_OnMapQueried(FeatureDataTable data) { if (_queriedData == null) _queriedData = new FeatureDataSet(); _queriedData.Tables.Add(data); } private void btnCreateTiles_Click(object sender, EventArgs e) { if (mapBox1.Map == null) return; if (mapBox1.Map.Layers.Count == 0) return; using (var f = new FormCreateTilesSample()) { f.Map = mapBox1.Map; f.ShowDialog(); } } private void radioButton_Click(object sender, EventArgs e) { Cursor mic = mapBox1.Cursor; mapBox1.Cursor = Cursors.WaitCursor; Cursor = Cursors.WaitCursor; if (formSqlServerOpts != null) { formSqlServerOpts.Close(); formSqlServerOpts = null; } try { //mapImage.ActiveTool = MapImage.Tools.None; string text = ((RadioButton)sender).Text; switch (text) { case "Shapefile": mapBox1.Map = ShapefileSample.InitializeMap(tbAngle.Value); break; case "GradientTheme": mapBox1.Map = GradiantThemeSample.InitializeMap(tbAngle.Value); break; case "WFS Client": mapBox1.Map = WfsSample.InitializeMap(tbAngle.Value); break; case "WMS Client": //mapBox1.Map = TiledWmsSample.InitializeMap(); mapBox1.Map = WmsSample.InitializeMap(tbAngle.Value); break; case "OGR - MapInfo": case "OGR - S-57": mapBox1.Map = OgrSample.InitializeMap(tbAngle.Value); break; case "GDAL - GeoTiff": case "GDAL - '.DEM'": case "GDAL - '.ASC'": case "GDAL - '.VRT'": mapBox1.Map = GdalSample.InitializeMap(tbAngle.Value); mapBox1.ActiveTool = MapBox.Tools.Pan; break; case "TileLayer - OSM": case "TileLayer - OSM with XLS": case "TileLayer - Bing Roads": case "TileLayer - Bing Aerial": case "TileLayer - Bing Hybrid": case "TileLayer - GoogleMap": case "TileLayer - GoogleSatellite": case "TileLayer - GoogleTerrain": case "TileLayer - GoogleLabels": case "Eniro": /* tbAngle.Visible = text.Equals("TileLayer - GoogleLabels"); if (!tbAngle.Visible) tbAngle.Value = 0; */ mapBox1.Map = TileLayerSample.InitializeMap(tbAngle.Value); ((RadioButton)sender).Text = (mapBox1.Map.BackgroundLayer.Count > 0) ? ((RadioButton)sender).Text = mapBox1.Map.BackgroundLayer[0].LayerName : ((RadioButton)sender).Text = mapBox1.Map.Layers[0].LayerName; break; case "PostGis": mapBox1.Map = PostGisSample.InitializeMap(tbAngle.Value); break; case "SpatiaLite": mapBox1.Map = SpatiaLiteSample.InitializeMap(tbAngle.Value); break; case "SqlServer": // create empty map with BruTile basemap mapBox1.Map = SqlServerSample.InitializeMap(tbAngle.Value); // check conn string var connStrBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder(Properties.Settings.Default.SqlServerConnectionString); if (string.IsNullOrEmpty(connStrBuilder.DataSource) || string.IsNullOrEmpty(connStrBuilder.InitialCatalog)) { mapBox1.Refresh(); MessageBox.Show("Requires SqlServer connection string to be defined (Project / Settings)", "Sql Server", MessageBoxButtons.OK,MessageBoxIcon.Information); return; } // now show SqlServer dialog formSqlServerOpts = new FormSqlServerOpts() { MapBox = mapBox1, ConnectionString = connStrBuilder.ToString() }; formSqlServerOpts.Show(this); break; case "Oracle": mapBox1.Map = OracleSample.InitializeMap(tbAngle.Value); break; case "shp_TextOnPath": mapBox1.Map = TextOnPathSample.InitializeMapOrig(tbAngle.Value); break; case "GdiImageLayer": mapBox1.Map = GdiImageLayerSample.InitializeMap(tbAngle.Value); break; default: break; } //Add checked Map decorations foreach (ListViewItem checkedItem in lvwDecorations.CheckedItems) { Type mdType; if (MapDecorationTypes.TryGetValue(checkedItem.Text, out mdType)) { IMapDecoration md = Activator.CreateInstance(mdType) as IMapDecoration; mapBox1.Map.Decorations.Add(md); } } mapBox1.Map.Size = Size; mapBox1.Refresh(); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error"); } finally { Cursor = Cursors.Default; mapBox1.Cursor = mic; } } private void mapImage_ActiveToolChanged(MapBox.Tools tool) { UpdatePropertyGrid(); } private void mapImage_MapCenterChanged(GeoAPI.Geometries.Coordinate center) { UpdatePropertyGrid(); } private void mapImage_MapRefreshed(object sender, EventArgs e) { UpdatePropertyGrid(); } private void mapImage_MapZoomChanged(double zoom) { UpdatePropertyGrid(); Console.WriteLine("Current Extents: {0}", mapBox1.Map.Envelope); } private void mapImage_MapZooming(double zoom) { UpdatePropertyGrid(); } private void mapImage_SizeChanged(object sender, EventArgs e) { mapBox1.Refresh(); } private void tbAngle_Scroll(object sender, EventArgs e) { System.Drawing.Drawing2D.Matrix matrix = new Matrix(); if (tbAngle.Value != 0f) matrix.RotateAt(tbAngle.Value, new PointF(mapBox1.Width * 0.5f, mapBox1.Height * 0.5f)); mapBox1.Map.MapTransform = matrix; AdjustRotation(mapBox1.Map.Layers, tbAngle.Value); AdjustRotation(mapBox1.Map.VariableLayers, tbAngle.Value); mapBox1.Refresh(); } private string _gdalConnection = string.Empty; private void radioButton2_MouseUp(object sender, MouseEventArgs e) { var rb = sender as RadioButton; if (rb == null) return; if (e.Button != MouseButtons.Right) return; SharpMap.Map map = null; switch (rb.Name) { case "radioButton2": // ShapeFile map = Samples.ShapefileSample.InitializeMap(tbAngle.Value, GetOpenFileName("Shapefile|*.shp")); break; case "radioButton5": // Ogr map = Samples.OgrSample.InitializeMap(tbAngle.Value, GetOpenFileName("Ogr Datasource|*.*")); break; case "radioButton6": // Gdal if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { string cn = InputBox( "Please enter connection string.\n" + "For e.g. PostGis Rasters sth. like 'PG:host=... port=... dbname=... schema=... table=... column=...'", @"GDAL Raster Layer Connection", _gdalConnection); if (string.IsNullOrEmpty(cn)) return; map = Samples.GdalSample.InitializeMap(tbAngle.Value, new []{ cn }); _gdalConnection = cn; } else { map = Samples.GdalSample.InitializeMap(tbAngle.Value, GetOpenFileName("Gdal Datasource|*.*")); } break; case "radioButton9": // spatialite map = Samples.SpatiaLiteSample.InitializeMap(tbAngle.Value, GetOpenFileName("SpatiaLite 2|*.db;*.sqlite")); break; } if (map == null) return; //Add checked Map decorations foreach (ListViewItem checkedItem in lvwDecorations.CheckedItems) { Type mdType; if (MapDecorationTypes.TryGetValue(checkedItem.Text, out mdType)) { IMapDecoration md = Activator.CreateInstance(mdType) as IMapDecoration; map.Decorations.Add(md); } } mapBox1.Map = map; } private void lvwDecorations_ItemChecked(object sender, ItemCheckedEventArgs e) { Type mdType; if (!MapDecorationTypes.TryGetValue(e.Item.Text, out mdType)) return; if (e.Item.Checked) { IMapDecoration ins = Activator.CreateInstance(mdType) as IMapDecoration; if (ins != null) { mapBox1.Map.Decorations.Add(ins); } } else { foreach (var item in mapBox1.Map.Decorations) { var mdTmpType = item.GetType(); if (mdType.Equals(mdTmpType)) { mapBox1.Map.Decorations.Remove(item); break; } } } e.Item.Selected = true; mapBox1.Refresh(); } private void lvwDecorations_SelectedIndexChanged(object sender, EventArgs e) { if (lvwDecorations.SelectedItems.Count == 0) { pgMapDecoration.SelectedObject = null; return; } var lvwi = (ListViewItem)lvwDecorations.SelectedItems[0]; if (!lvwi.Checked) { pgMapDecoration.SelectedObject = null; pgMapDecoration.Visible = false; return; } Type mdType; if (MapDecorationTypes.TryGetValue(lvwi.Text, out mdType)) { foreach (IMapDecoration mapDecoration in mapBox1.Map.Decorations) { if (mapDecoration.GetType().Equals(mdType)) { pgMapDecoration.SelectedObject = mapDecoration; pgMapDecoration.Visible = true; return; } } } pgMapDecoration.SelectedObject = null; pgMapDecoration.Visible = false; } private static string InputBox(string text, string caption, string defaultValue = null) { var prompt = new Form { Width = 500, Height = 150, FormBorderStyle = FormBorderStyle.FixedDialog, Text = caption, MaximizeBox = false, MinimizeBox = false, ShowInTaskbar = false, StartPosition = FormStartPosition.CenterScreen, Padding = new Padding(5), Margin = new Padding(10) }; var textLabel = new TextBox { Left = prompt.Margin.Left, Top = prompt.Margin.Top, Width = prompt.ClientSize.Width - prompt.Margin.Left - prompt.Margin.Right, BackColor = SystemColors.Control, BorderStyle = BorderStyle.None, Multiline = true, HideSelection = true, ReadOnly = true, Enabled = false }; var size = SizeF.Empty; using (var g = Graphics.FromHwnd(IntPtr.Zero)) size = g.MeasureString(text, DefaultFont, new SizeF(textLabel.Width, 20 * textLabel.Height)); textLabel.Height = System.Drawing.Size.Ceiling(size).Height; textLabel.Lines = text.Split('\n'); textLabel.SelectionStart = 0; textLabel.SelectionLength = 0; var textBox = new TextBox { Left = prompt.Margin.Left, Top = textLabel.Bottom, Width = prompt.ClientSize.Width - prompt.Margin.Left - prompt.Margin.Right, Multiline = true, Text = defaultValue ?? string.Empty }; var confirmation = new Button { Text = "&OK", Width = 100, Left = prompt.ClientSize.Width - prompt.Margin.Right - 100, Top = textBox.Top + textBox.Height + prompt.Padding.Vertical, DialogResult = DialogResult.OK }; prompt.ClientSize = new Size(prompt.ClientSize.Width, confirmation.Bottom + prompt.Padding.Bottom); prompt.AcceptButton = confirmation; confirmation.Click += (sender, e) => { prompt.Close(); }; prompt.Controls.Add(textLabel); prompt.Controls.Add(textBox); prompt.Controls.Add(confirmation); prompt.AcceptButton = confirmation; return prompt.ShowDialog() == DialogResult.OK ? textBox.Text : ""; } private void FormMapBox_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F5) { mapBox1.Invalidate(); mapBox1.Refresh(); //e.SuppressKeyPress = true; e.Handled = true; } } } }