namespace ExampleCodeSnippets { using cd = CreatingData; public class SymbolRotationTheming { /// /// Name of the column, which contains the rotation angle in degrees [0°, 360°] /// public System.String StyleRotationColumn { get; set; } /// /// Default vector style from which parts are to be modified /// public SharpMap.Styles.VectorStyle DefaultStyle { get; set; } /// /// Creates an instance of this class /// /// Name of the column, which contains the rotation angle in degrees [0°, 360°] public SymbolRotationTheming(System.String styleRotationColumn) :this(styleRotationColumn, new SharpMap.Styles.VectorStyle()) { } /// /// Creates an instance of this class /// /// Name of the column, which contains the rotation angle in degrees [0°, 360°] /// Default vector style from which parts are to be modified public SymbolRotationTheming(System.String styleRotationColumn, SharpMap.Styles.VectorStyle defaultStyle) { StyleRotationColumn = styleRotationColumn; DefaultStyle = defaultStyle; } private static SharpMap.Styles.VectorStyle CloneStyle(SharpMap.Styles.VectorStyle styleToClone) { SharpMap.Styles.VectorStyle style = new SharpMap.Styles.VectorStyle { Enabled = styleToClone.Enabled, MinVisible = styleToClone.MinVisible, MaxVisible = styleToClone.MaxVisible, Line = styleToClone.Line.Clone() as System.Drawing.Pen, Fill = styleToClone.Fill.Clone() as System.Drawing.Brush, Outline = styleToClone.Outline.Clone() as System.Drawing.Pen, EnableOutline = styleToClone.EnableOutline, Symbol = styleToClone.Symbol.Clone() as System.Drawing.Bitmap, SymbolOffset = styleToClone.SymbolOffset, SymbolRotation = styleToClone.SymbolRotation, SymbolScale = styleToClone.SymbolScale }; return style; } public SharpMap.Styles.VectorStyle GetRotatedSymol(SharpMap.Data.FeatureDataRow row) { if (!System.String.IsNullOrEmpty(StyleRotationColumn)) try { SharpMap.Styles.VectorStyle dataStyle = CloneStyle(DefaultStyle); dataStyle.SymbolRotation = System.Convert.ToSingle(row[StyleRotationColumn]); return dataStyle; } catch { } return null; } } public class SymbolFromFeatureDataRowTheming { /// /// Name of the column, which contains the rotation angle in degrees [0°, 360°] /// public System.String SymbolColumn { get; set; } /// /// Default vector style from which parts are to be modified /// public SharpMap.Styles.VectorStyle DefaultStyle { get; set; } /// /// Creates an instance of this class /// /// Name of the column, which contains the symbol public SymbolFromFeatureDataRowTheming(System.String symbolColumn) : this(symbolColumn, new SharpMap.Styles.VectorStyle()) { } /// /// Creates an instance of this class /// /// Name of the column, which contains the symbol /// Default vector style from which parts are to be modified public SymbolFromFeatureDataRowTheming(System.String styleRotationColumn, SharpMap.Styles.VectorStyle defaultStyle) { SymbolColumn = styleRotationColumn; DefaultStyle = defaultStyle; } private static SharpMap.Styles.VectorStyle CloneStyle(SharpMap.Styles.VectorStyle styleToClone) { SharpMap.Styles.VectorStyle style = new SharpMap.Styles.VectorStyle { Enabled = styleToClone.Enabled, MinVisible = styleToClone.MinVisible, MaxVisible = styleToClone.MaxVisible, Line = styleToClone.Line.Clone() as System.Drawing.Pen, Fill = styleToClone.Fill.Clone() as System.Drawing.Brush, Outline = styleToClone.Outline.Clone() as System.Drawing.Pen, EnableOutline = styleToClone.EnableOutline, Symbol = styleToClone.Symbol.Clone() as System.Drawing.Bitmap, SymbolOffset = styleToClone.SymbolOffset, SymbolRotation = styleToClone.SymbolRotation, SymbolScale = styleToClone.SymbolScale }; return style; } public SharpMap.Styles.VectorStyle GetRotatedSymol(SharpMap.Data.FeatureDataRow row) { if (!System.String.IsNullOrEmpty(SymbolColumn)) try { SharpMap.Styles.VectorStyle dataStyle = CloneStyle(DefaultStyle); if (!row.IsNull(SymbolColumn)) { dataStyle.Symbol = new System.Drawing.Bitmap( new System.IO.MemoryStream((byte[]) row[SymbolColumn])); } return dataStyle; } catch { } return null; } } [NUnit.Framework.TestFixture] public class SymbolRotationThemingTest { private static readonly System.Random _randomNumberGenerator = new System.Random(); static System.Double[] GetRandomOrdinates(System.Int32 size, System.Double min, System.Double max) { System.Double[] arr = new System.Double[size]; System.Double width = max - min; for(System.Int32 i = 0; i < size; i++) { System.Double randomValue = _randomNumberGenerator.NextDouble(); arr[i] = min + randomValue*width; } return arr; } [NUnit.Framework.Test] public void TestSymbolRotationTheming() { //Create a map SharpMap.Map map = new SharpMap.Map(new System.Drawing.Size(720,360)); //Create some random sample data SharpMap.Data.FeatureDataTable fdt = cd.CreatePointFeatureDataTableFromArrays(cd.GetRandomOrdinates(80, -180, 180), cd.GetRandomOrdinates(80, -90, 90), null); //Add rotation column and fill with random rotation values fdt.Columns.Add("Rotation", typeof (System.Double)); foreach (SharpMap.Data.FeatureDataRow row in fdt.Rows) row["Rotation"] = _randomNumberGenerator.NextDouble()*360d; //Create layer and datasource SharpMap.Layers.VectorLayer vl = new SharpMap.Layers.VectorLayer("Points", new SharpMap.Data.Providers.GeometryFeatureProvider(fdt)); //Create default style SharpMap.Styles.VectorStyle defaultStyle = new SharpMap.Styles.VectorStyle(); defaultStyle.Symbol = new System.Drawing.Bitmap(@"..\..\..\DemoWinForm\Resources\flag.png"); defaultStyle.SymbolScale = 0.5f; //Create theming class and apply to layer SymbolRotationTheming srt = new SymbolRotationTheming("Rotation", defaultStyle); vl.Theme = new SharpMap.Rendering.Thematics.CustomTheme(srt.GetRotatedSymol); map.Layers.Add(vl); map.ZoomToExtents(); System.Drawing.Image mapImage = map.GetMap(); mapImage.Save("SymbolRotation.bmp"); } } [NUnit.Framework.TestFixture] public class SymbolFromFeatureDataRowTest { //private static readonly System.Random _randomNumberGenerator = new System.Random(); //static System.Double[] GetRandomOrdinates(System.Int32 size, System.Double min, System.Double max) //{ // System.Double[] arr = new System.Double[size]; // System.Double width = max - min; // for (System.Int32 i = 0; i < size; i++) // { // System.Double randomValue = _randomNumberGenerator.NextDouble(); // arr[i] = min + randomValue * width; // } // return arr; //} [NUnit.Framework.Test] public void TestSymbolSelectionTheming() { //Create a map SharpMap.Map map = new SharpMap.Map(new System.Drawing.Size(720, 360)); //Create some random sample data SharpMap.Data.FeatureDataTable fdt = cd.CreatePointFeatureDataTableFromArrays(cd.GetRandomOrdinates(80, -180, 180), cd.GetRandomOrdinates(80, -90, 90), null); //Add rotation column and fill with random rotation values fdt.Columns.Add("Symbol", typeof(System.Byte[])); foreach (SharpMap.Data.FeatureDataRow row in fdt.Rows) row["Symbol"] = RandomSymbol((int)System.Math.Floor(cd.RandomNumberGenerator.NextDouble() * 360d)); //Create layer and datasource SharpMap.Layers.VectorLayer vl = new SharpMap.Layers.VectorLayer("Points", new SharpMap.Data.Providers.GeometryFeatureProvider(fdt)); //Create default style SharpMap.Styles.VectorStyle defaultStyle = new SharpMap.Styles.VectorStyle(); defaultStyle.Symbol = new System.Drawing.Bitmap(@"..\..\..\DemoWinForm\Resources\flag.png"); defaultStyle.SymbolScale = 0.5f; //Create theming class and apply to layer SymbolFromFeatureDataRowTheming srt = new SymbolFromFeatureDataRowTheming("Symbol", defaultStyle); vl.Theme = new SharpMap.Rendering.Thematics.CustomTheme(srt.GetRotatedSymol); map.Layers.Add(vl); map.ZoomToExtents(); System.Drawing.Image mapImage = map.GetMap(); mapImage.Save("SymbolFromFDR.bmp"); } private byte[] RandomSymbol(int number) { number = number%360; string text =""; System.Drawing.Brush brush = null; if (number < 60) return null; if (number < 120) { text = "<120"; brush = System.Drawing.Brushes.DarkGreen; } else if(number < 240) { text = number.ToString(); brush = System.Drawing.Brushes.Orange; } else { text = ">240"; brush = System.Drawing.Brushes.Red; } System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(120, 60); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp); System.Drawing.RectangleF size = new System.Drawing.RectangleF(0f, 0f, 120f, 60f); g.FillRectangle(System.Drawing.Brushes.White, size); var sf = new System.Drawing.StringFormat(System.Drawing.StringFormatFlags.NoWrap) {Alignment = System.Drawing.StringAlignment.Center}; g.DrawString(text, new System.Drawing.Font("Arial", 24), brush, size, sf); g.Flush(); g.Dispose(); var ms = new System.IO.MemoryStream(); bmp.MakeTransparent(System.Drawing.Color.White); bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); } } public class TestExternalData { public void DoTest() { SharpMap.Data.Providers.ShapeFile sf = new SharpMap.Data.Providers.ShapeFile("cities.shp"); SharpMap.Data.FeatureDataSet fds = new SharpMap.Data.FeatureDataSet(); sf.ExecuteIntersectionQuery(sf.GetExtents(), fds); SharpMap.Data.Providers.GeometryFeatureProvider gfp = new SharpMap.Data.Providers.GeometryFeatureProvider(fds.Tables[0]); System.Data.DataTable dt = new System.Data.DataTable("external"); dt.Columns.Add("city", typeof (string)); dt.Columns.Add("males", typeof (int)); dt.Columns.Add("females", typeof (int)); } } }