====== Source Code ServicesEditionSample MergingLayers CS 091008.zip ====== ====Program.cs==== using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace MergingLayers { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new TestForm()); } } } ====TestForm.cs==== using System; using System.IO; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; using System.Windows.Forms; using ThinkGeo.MapSuite.Core; namespace MergingLayers { public partial class TestForm : Form { private MapEngine mapEngine = new MapEngine(); private Bitmap bitmap = null; public TestForm() { InitializeComponent(); } private void TestForm_Load(object sender, EventArgs e) { // Sets the full extent and the background color mapEngine.CurrentExtent = ExtentHelper.GetDrawingExtent(new RectangleShape(-88.86,35.62,-76.98,24.45), Map.Width, Map.Height); mapEngine.BackgroundFillBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean); // Adds the static layers to the MapEngine //Adds the state background layer. ShapeFileFeatureLayer stateLayer = new ShapeFileFeatureLayer(@"..\..\Data\USStates.shp", ShapeFileReadWriteMode.ReadOnly); stateLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.State1; stateLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; mapEngine.StaticLayers.Add("StateLayer", stateLayer); //Adds the three layers for the counties of Georgia, South Carolina and Florida. ShapeFileFeatureLayer GeorgiaLayer = new ShapeFileFeatureLayer(@"..\..\Data\GeorgiaCounties.shp", ShapeFileReadWriteMode.ReadOnly); GeorgiaLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightPink, GeoColor.StandardColors.Black); GeorgiaLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; mapEngine.StaticLayers.Add("GeorgiaCountiesLayer", GeorgiaLayer); ShapeFileFeatureLayer SouthCoralinaLayer = new ShapeFileFeatureLayer(@"..\..\Data\SouthCarolinaCounties.shp", ShapeFileReadWriteMode.ReadOnly); SouthCoralinaLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightGreen, GeoColor.StandardColors.Black); SouthCoralinaLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; mapEngine.StaticLayers.Add("SouthCoralinaCountiesLayer", SouthCoralinaLayer); ShapeFileFeatureLayer FloridaLayer = new ShapeFileFeatureLayer(@"..\..\Data\FloridaCounties.shp", ShapeFileReadWriteMode.ReadOnly); FloridaLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightCyan, GeoColor.StandardColors.Black); FloridaLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; mapEngine.StaticLayers.Add("FloridaCountiesLayer", FloridaLayer); DrawImage(); } private void btnMerge_Click(object sender, EventArgs e) { //deletes the files for the merge shapefile if they already exist. if (File.Exists(@"..\..\Data\SouthEastCounties.shp")) { DeleteMergeFiles(); } //Adds to collection the three layers to be merged. Collection shapeFileFeatureLayerToMerge = new Collection(); shapeFileFeatureLayerToMerge.Add((ShapeFileFeatureLayer)mapEngine.StaticLayers["GeorgiaCountiesLayer"]); shapeFileFeatureLayerToMerge.Add((ShapeFileFeatureLayer)mapEngine.StaticLayers["SouthCoralinaCountiesLayer"]); shapeFileFeatureLayerToMerge.Add((ShapeFileFeatureLayer)mapEngine.StaticLayers["FloridaCountiesLayer"]); //Gets the collection of DbfColumn to be used for the merge layer. ShapeFileFeatureLayer shapeFileFeatureLayer = (ShapeFileFeatureLayer)mapEngine.StaticLayers["GeorgiaCountiesLayer"]; shapeFileFeatureLayer.Open(); Collection dbfColumns = ((ShapeFileFeatureSource)shapeFileFeatureLayer.FeatureSource).GetDbfColumns(); shapeFileFeatureLayer.Close(); //Calls the MergeShapeFiles function. ShapeFileFeatureLayer mergeLayer = MergeShapeFiles(shapeFileFeatureLayerToMerge, dbfColumns,@"..\..\Data\SouthEastCounties.shp"); //Removes the three original county layers and add the new merge county layer. mapEngine.StaticLayers.Remove("GeorgiaCountiesLayer"); mapEngine.StaticLayers.Remove("SouthCarolinaCountiesLayer"); mapEngine.StaticLayers.Remove("FloridaCountiesLayer"); ShapeFileFeatureLayer GeorgiaLayer = new ShapeFileFeatureLayer(@"..\..\Data\SouthEastCounties.shp", ShapeFileReadWriteMode.ReadOnly); GeorgiaLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.StandardColors.LightPink, GeoColor.StandardColors.Black); GeorgiaLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; mapEngine.StaticLayers.Add("SouthEastCountiesLayer", GeorgiaLayer); DrawImage(); } private ShapeFileFeatureLayer MergeShapeFiles( Collection ShapeFileFeatureLayersToMerge, Collection DbfColumns, string OutputShapeFilePath) { //creates the shapefileFeatureSource for the merging. ShapeFileFeatureSource.CreateShapeFile(ShapeFileType.Polygon, OutputShapeFilePath, DbfColumns); ShapeFileFeatureSource mergeFeatureSource = new ShapeFileFeatureSource(OutputShapeFilePath, ShapeFileReadWriteMode.ReadWrite); mergeFeatureSource.Open(); mergeFeatureSource.BeginTransaction(); //Loops thru the layers to merge. int count = 0; foreach (ShapeFileFeatureLayer shapefileFeatureLayer in ShapeFileFeatureLayersToMerge) { shapefileFeatureLayer.Open(); Collection features = shapefileFeatureLayer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns); shapefileFeatureLayer.Close(); //loops thru the features to add to the merge layer. foreach (Feature feature in features) { //Gets the shape of the current feature. MultipolygonShape multipolygonShape = (MultipolygonShape)feature.GetShape(); multipolygonShape.Id = Convert.ToString(count); //Gets the relevant columns to add. Dictionary columnValues = new Dictionary(); foreach (DbfColumn dbfColumn in DbfColumns) { columnValues.Add(dbfColumn.ColumnName, feature.ColumnValues[dbfColumn.ColumnName]); } Feature newFeature = new Feature(multipolygonShape, columnValues); mergeFeatureSource.AddFeature(newFeature); count += 1; } } //Commits and closes the open resources. mergeFeatureSource.CommitTransaction(); mergeFeatureSource.Close(); //Creates the merge shapefile to return. ShapeFileFeatureLayer mergeShapeFile = new ShapeFileFeatureLayer(OutputShapeFilePath, ShapeFileReadWriteMode.ReadOnly); return mergeShapeFile; } private void DeleteMergeFiles() { File.Delete(@"..\..\Data\SouthEastCounties.shp"); File.Delete(@"..\..\Data\SouthEastCounties.ids"); File.Delete(@"..\..\Data\SouthEastCounties.idx"); File.Delete(@"..\..\Data\SouthEastCounties.dbf"); File.Delete(@"..\..\Data\SouthEastCounties.shx"); } private void DrawImage() { if (bitmap != null) { bitmap.Dispose(); } bitmap = new Bitmap(Map.Width, Map.Height); mapEngine.OpenAllLayers(); mapEngine.DrawStaticLayers(bitmap, GeographyUnit.DecimalDegree); mapEngine.CloseAllLayers(); Map.Image = bitmap; } private void ToolBar_ButtonClick(object sender, ToolBarButtonClickEventArgs e) { switch (e.Button.Tag.ToString()) { case "Zoom In": mapEngine.CurrentExtent.ScaleDown(50); break; case "Zoom Out": mapEngine.CurrentExtent.ScaleUp(50); break; case "Full Extent": mapEngine.CurrentExtent = ExtentHelper.GetDrawingExtent(new RectangleShape(-180.0, 83.0, 180.0, -90.0), Map.Width, Map.Height); break; case "Pan Left": mapEngine.CurrentExtent = ExtentHelper.Pan(mapEngine.CurrentExtent, PanDirection.Left, 20); break; case "Pan Right": mapEngine.CurrentExtent = ExtentHelper.Pan(mapEngine.CurrentExtent, PanDirection.Right, 20); break; case "Pan Up": mapEngine.CurrentExtent = ExtentHelper.Pan(mapEngine.CurrentExtent, PanDirection.Up, 20); break; case "Pan Down": mapEngine.CurrentExtent = ExtentHelper.Pan(mapEngine.CurrentExtent, PanDirection.Down, 20); break; default: break; } DrawImage(); } private void btnClose_Click(object sender, EventArgs e) { this.Close(); } } }