====== Source Code ServicesEditionSample FilterRadarImage CS 090817.zip ======
====Program.cs====
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace FilterRadarImage
{
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.Drawing;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using ThinkGeo.MapSuite.Core;
namespace FilterRadarImage
{
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)
{
// Set the full extent and the background color
mapEngine.CurrentExtent = ExtentHelper.GetDrawingExtent(new RectangleShape(-99.28,30.98,-96.58,29.10), Map.Width, Map.Height);
LoadBackgroundLayers();
//Add the unfiltered radar image
GdiPlusRasterLayer radarImageLayer = new GdiPlusRasterLayer(@"..\..\Data\EWX_N0R_0.gif");
radarImageLayer.UpperThreshold = double.MaxValue;
radarImageLayer.LowerThreshold = 0;
mapEngine.StaticLayers.Add("RadarImageLayer", radarImageLayer);
//Add the Adorment Layer for the legend. Note that the Legend is simply on image showing the dBz scale values.
LegendAdornmentLayer legendAdornmentLayer = new LegendAdornmentLayer(new GeoImage(@"..\..\Data\Legend1.bmp"));
mapEngine.AdornmentLayers.Add(legendAdornmentLayer);
DrawImage();
}
//This function takes a collection of colors to filter out. Alpha is for the transparency to apply over the entire output map.
private void FilterRadarImage(Collection Colors, int Alpha, string InputImageFile, string OutputImageFile)
{
//Create the bitmap from the input image.
Bitmap bitmap = new Bitmap(InputImageFile);
//Create the bitmap for the output image with the same size as the input image. The PixelFormat is 32bppPArgb so that it accepts
//the Alpha channel for transparency.
Bitmap newBitmap = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
//Loop thru every pixel of the input image and set the pixel ARGB value for every pixel of the output image.
for (int y = 0; y < bitmap.Height; ++y)
{
for (int x = 0; x < bitmap.Width; ++x)
{
Color currentColor = bitmap.GetPixel(x, y);
//If the pixel is not tranparent, do the checking to set the pixel of the output image.
if (currentColor.A != 0)
{
bool change = false;
//Loop thru the collection of colors to filter out.
foreach (Color color in Colors)
{
//If the current pixel has the same RGB value of one of the colors to filter out,
//set the the output pixel to completely tranparent.
if ((currentColor.R == color.R) & (currentColor.G == color.G) & (currentColor.B == color.B))
{
newBitmap.SetPixel(x, y, Color.FromArgb(0, currentColor));
change = true;
break;
}
}
//If the current pixel does not have any of the RGB values of the colors to be filtered out,
//set the output pixel to the alpha value passed as a parameter.
if (change == false)
{ newBitmap.SetPixel(x, y, Color.FromArgb(Alpha, currentColor)); }
}
//If the pixel is tranparent set the pixel of the output image as is.
else
{ newBitmap.SetPixel(x, y, currentColor); }
}
}
newBitmap.Save(OutputImageFile);
bitmap.Dispose();
newBitmap.Dispose();
}
private void btnFilter_Click(object sender, EventArgs e)
{
//Add to the collection all the colors we want to filter out such as
//all the blues and grays.
Collection Colors = new Collection();
Colors.Add(Color.FromArgb(255, 240, 240, 240));
Colors.Add(Color.FromArgb(255, 238, 238, 238));
Colors.Add(Color.FromArgb(255, 235, 235, 235));
Colors.Add(Color.FromArgb(255, 232, 232, 232));
Colors.Add(Color.FromArgb(255, 230, 230, 230));
Colors.Add(Color.FromArgb(255, 227, 227, 227));
Colors.Add(Color.FromArgb(255, 225, 225, 225));
Colors.Add(Color.FromArgb(255, 253, 253, 253));
Colors.Add(Color.FromArgb(255, 254, 254, 254));
Colors.Add(Color.FromArgb(255, 4, 233, 231));
Colors.Add(Color.FromArgb(255, 1, 159, 244));
Colors.Add(Color.FromArgb(255, 3, 0, 244));
//We call FilerRadarImage function to create the filtered radar image with the transparency.
//Keep in mind that the created image needs to have an acompanying world file of the same name, EWX_NOR_0_filtered.gfw
FilterRadarImage(Colors, 150, @"..\..\Data\EWX_N0R_0.gif", @"..\..\Data\EWX_N0R_0_filtered.gif");
//Remove the unfiltered Radar image.
mapEngine.StaticLayers.Remove("RadarImageLayer");
//Add the filtered Radar image.
GdiPlusRasterLayer filteredRadarImageLayer = new GdiPlusRasterLayer(@"..\..\Data\EWX_N0R_0_filtered.gif");
filteredRadarImageLayer.UpperThreshold = double.MaxValue;
filteredRadarImageLayer.LowerThreshold = 0;
mapEngine.StaticLayers.Add("FilteredRadarImageLayer", filteredRadarImageLayer);
//Add the Adorment Layer for the legend of the filtered radar image.
mapEngine.AdornmentLayers.Clear();
LegendAdornmentLayer legendAdornmentLayer = new LegendAdornmentLayer(new GeoImage(@"..\..\Data\Legend2.bmp"));
mapEngine.AdornmentLayers.Add(legendAdornmentLayer);
DrawImage();
btnFilter.Enabled = false;
}
private void LoadBackgroundLayers()
{
mapEngine.BackgroundFillBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
// Add the static layers to the MapEngine
ShapeFileFeatureLayer countyLayer = new ShapeFileFeatureLayer(@"..\..\Data\texascounties.shp", ShapeFileReadWriteMode.ReadOnly);
ShapeFileFeatureLayer.BuildIndexFile(@"..\..\Data\texascounties.shp", BuildIndexMode.DoNotRebuild);
countyLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.County1;
countyLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
mapEngine.StaticLayers.Add("CountyLayer", countyLayer);
// Add the label layer to the MapEngine
ShapeFileFeatureLayer labelLayer = new ShapeFileFeatureLayer(@"..\..\Data\texascounties.shp");
labelLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(TextStyles.County2("NAME"));
labelLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
mapEngine.StaticLayers.Add("LabelLayer", labelLayer);
}
private void DrawImage()
{
if (bitmap != null) { bitmap.Dispose(); }
bitmap = new Bitmap(Map.Width, Map.Height);
mapEngine.OpenAllLayers();
mapEngine.DrawStaticLayers(bitmap, GeographyUnit.DecimalDegree);
mapEngine.DrawAdornmentLayers(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();
}
}
}
//Adornment inherited class for the legend.
class LegendAdornmentLayer : AdornmentLayer
{
private GeoImage legend;
public LegendAdornmentLayer(GeoImage Legend)
{
this.legend = Legend;
}
public GeoImage Legend
{
get
{
return legend;
}
set
{
legend = value;
}
}
protected override void DrawCore(GeoCanvas canvas, Collection labelsInAllLayers)
{
canvas.DrawScreenImageWithoutScaling(legend, (legend.GetWidth() /2) + 10, (legend.GetHeight() /2) + 10, DrawingLevel.LevelFour, 0, 0, 0);
}
}