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<ShapeFileFeatureLayer> shapeFileFeatureLayerToMerge = new Collection<ShapeFileFeatureLayer>();
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<DbfColumn> 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<ShapeFileFeatureLayer> ShapeFileFeatureLayersToMerge, Collection<DbfColumn> 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<Feature> 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<string, string> columnValues = new Dictionary<string, string>();
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();
}
}
}