using System;
using System.Collections.ObjectModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Printing;
using System.Web.UI;
using PdfSharp;
using PdfSharp.Pdf;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.WebEdition;
using System.Web.UI.WebControls;
using System.Text;
namespace CSSamples.Samples
{
public partial class Sample : System.Web.UI.Page
{
#region add PrinterLayer Elements
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetupMapWithBlankPage();
AddMapLayer();
AddTitleLayer();
}
}
private void SetupMapWithBlankPage()
{
Map1.MapTools.Logo.Enabled = false;
Map1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.FromHtml("#E5E3DF"));
Map1.MapUnit = GeographyUnit.Meter;
PagePrinterLayer pagePrinterLayer = new PagePrinterLayer(PrinterPageSize.AnsiA, PrinterOrientation.Portrait);
pagePrinterLayer.Open();
Map1.ZoomLevelSet = new PrinterZoomLevelSet(Map1.MapUnit, PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit));
Map1.CurrentExtent = pagePrinterLayer.GetBoundingBox();
Map1.CurrentScale = PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit) * 2;
LayerOverlay printerInteractiveOverlay = new LayerOverlay();
printerInteractiveOverlay.Name = "PageOverlay";
printerInteractiveOverlay.Layers.Add("PageLayer", pagePrinterLayer);
Map1.CustomOverlays.Add(printerInteractiveOverlay);
pagePrinterLayer.Close();
}
private void AddMapLayer()
{
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
ShapeFileFeatureLayer worldMapLayer = new ShapeFileFeatureLayer(MapPath(@"~\SampleData\Countries02.shp"));
worldMapLayer.FeatureSource.Projection = new Proj4Projection(Proj4Projection.GetDecimalDegreesParametersString(), Proj4Projection.GetGoogleMapParametersString());
worldMapLayer.FeatureSource.Projection.Open();
worldMapLayer.Open();
Collection features = worldMapLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
worldMapLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldMapLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
MapPrinterLayer mapPrinterLayer = new MapPrinterLayer();
mapPrinterLayer.BackgroundMask = new AreaStyle(new GeoPen(GeoColor.StandardColors.Black, 1));
mapPrinterLayer.MapUnit = GeographyUnit.Meter;
mapPrinterLayer.MapExtent = worldMapLayer.GetBoundingBox();
worldMapLayer.Close();
mapPrinterLayer.SetPosition(8, 7, pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y + 1, PrintingUnit.Inch);
mapPrinterLayer.Layers.Add(worldMapLayer);
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
printerInteractiveOverlay.Layers.Add("mapPrinterLayer", mapPrinterLayer);
}
private void AddTitleLayer()
{
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
LabelPrinterLayer labelPrinterLayer = new LabelPrinterLayer();
labelPrinterLayer.Text = "Population > 70 Million";
labelPrinterLayer.Font = new GeoFont("Arial", 10, DrawingFontStyles.Bold);
labelPrinterLayer.TextBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
labelPrinterLayer.PrinterWrapMode = PrinterWrapMode.AutoSizeText;
PointShape labelCenter = new PointShape();
labelCenter.X = pageBoundingbox.UpperRightPoint.X - pageBoundingbox.Width / 2;
labelCenter.Y = pageBoundingbox.UpperLeftPoint.Y - .5;
labelPrinterLayer.SetPosition(5, 1, labelCenter, PrintingUnit.Inch);
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
printerInteractiveOverlay.Layers.Add("title", labelPrinterLayer);
}
private void AddGridLayer()
{
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
DataGridPrinterLayer dataGridPrinterLayer = new DataGridPrinterLayer();
dataGridPrinterLayer.TextFont = new GeoFont("Arial", 8);
dataGridPrinterLayer.TextHorizontalAlignment = TextHorizontalAlignment.Left;
dataGridPrinterLayer.DataTable = new DataTable();
dataGridPrinterLayer.DataTable.Columns.Add("FIPS_CNTRY");
dataGridPrinterLayer.DataTable.Columns.Add("CNTRY_NAME");
dataGridPrinterLayer.DataTable.Columns.Add("LONG_NAME");
dataGridPrinterLayer.DataTable.Columns.Add("POP_CNTRY");
ShapeFileFeatureLayer postgreLayer = (((MapPrinterLayer)GetPageOverlay().Layers["mapPrinterLayer"]).Layers[0]) as ShapeFileFeatureLayer;
postgreLayer.Open();
RectangleShape _boundingbox = postgreLayer.FeatureSource.GetBoundingBox();
Collection features = postgreLayer.QueryTools.GetAllFeatures(ReturningColumnsType.AllColumns);
postgreLayer.Close();
int pageSize = 0;
foreach (Feature feature in features)
{
if (pageSize < 11 && int.Parse(feature.ColumnValues["POP_CNTRY"]) > 70000000)
{
pageSize++;
dataGridPrinterLayer.DataTable.Rows.Add(new object[4] { feature.ColumnValues["FIPS_CNTRY"], feature.ColumnValues["CNTRY_NAME"], feature.ColumnValues["LONG_NAME"], feature.ColumnValues["POP_CNTRY"] });
}
}
dataGridPrinterLayer.SetPosition(8, 2.5, pageBoundingbox.GetCenterPoint().X, pageBoundingbox.GetCenterPoint().Y - 4, PrintingUnit.Inch);
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
if (printerInteractiveOverlay.Layers.Contains("grid"))
{
string script = @"alert('We have added a data grid!');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
else
{
printerInteractiveOverlay.Layers.Add("grid", dataGridPrinterLayer);
}
}
private void AddLogoImage()
{
GeoImage compassGeoImage = new GeoImage(MapPath(@"~\SampleData\Compass.png"));
ImagePrinterLayer imagePrinterLayer = new ImagePrinterLayer(compassGeoImage);
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
imagePrinterLayer.SetPosition(.75, .75, pageBoundingbox.GetCenterPoint().X + 3.5, pageBoundingbox.GetCenterPoint().Y - 2.0, PrintingUnit.Inch);
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
if (printerInteractiveOverlay.Layers.Contains("logo"))
{
string script = @"alert('We have added an image!');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
else
{
printerInteractiveOverlay.Layers.Add("logo", imagePrinterLayer);
}
}
private void AddScaleLineLayer()
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
MapPrinterLayer mapPrinterLayer = (MapPrinterLayer)printerInteractiveOverlay.Layers["mapPrinterLayer"];
ScaleLinePrinterLayer scaleLinePrinterLayer = new ScaleLinePrinterLayer(mapPrinterLayer);
scaleLinePrinterLayer.MapUnit = GeographyUnit.Meter;
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
scaleLinePrinterLayer.SetPosition(1.25, .25, pageBoundingbox.GetCenterPoint().X - 3.25, pageBoundingbox.GetCenterPoint().Y - 2.25, PrintingUnit.Inch);
if (printerInteractiveOverlay.Layers.Contains("ScaleLineLayer"))
{
string script = @"alert('We have added a scale line!');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
else
{
printerInteractiveOverlay.Layers.Add("ScaleLineLayer", scaleLinePrinterLayer);
}
}
private void AddLabelLayer()
{
StringBuilder noteSpace = new StringBuilder();
noteSpace.Append("Notes: ");
for (int i = 0; i < 160; i++)
{
noteSpace.Append("_ ");
}
LabelPrinterLayer labelPrinterLayer = new LabelPrinterLayer();
//Setup the text and the font..
labelPrinterLayer.Text = noteSpace.ToString();
labelPrinterLayer.Font = new GeoFont("Arial", 14, DrawingFontStyles.Regular);
labelPrinterLayer.TextBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
labelPrinterLayer.PrinterWrapMode = PrinterWrapMode.WrapText;
RectangleShape pageBoundingbox = GetPageBoundingBox(PrintingUnit.Inch);
double noteSpaceWidth = 3.6;
labelPrinterLayer.SetPosition(noteSpaceWidth, 2, pageBoundingbox.LowerLeftPoint.X + 0.25 + noteSpaceWidth / 2 + 4.3, pageBoundingbox.LowerLeftPoint.Y + 1.5, PrintingUnit.Inch);
// Find the PrinterInteractiveOverlay so we can add the new LabelPrinterLayer
LayerOverlay printerInteractiveOverLay = GetPageOverlay();
if (printerInteractiveOverLay.Layers.Contains("label"))
{
string script = @"alert('We have added a label!');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
else
{
printerInteractiveOverLay.Layers.Add("label", labelPrinterLayer);
}
}
#endregion
#region Helper Methods
private LayerOverlay GetPageOverlay()
{
foreach (var item in Map1.CustomOverlays)
{
if (item.Name == "PageOverlay")
{
return (item as LayerOverlay);
}
}
return null;
}
private RectangleShape GetPageBoundingBox(PrintingUnit unit)
{
PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)GetPageOverlay().Layers["PageLayer"];
return pagePrinterLayer.GetPosition(unit);
}
private PageSize GetPdfPageSize(PrinterPageSize pageSize)
{
PageSize pdfPageSize = PageSize.Letter;
switch (pageSize)
{
case PrinterPageSize.AnsiA:
pdfPageSize = PageSize.Letter;
break;
case PrinterPageSize.AnsiB:
pdfPageSize = PageSize.Ledger;
break;
case PrinterPageSize.AnsiC:
pdfPageSize = PageSize.A2;
break;
case PrinterPageSize.AnsiD:
pdfPageSize = PageSize.A1;
break;
case PrinterPageSize.AnsiE:
pdfPageSize = PageSize.A0;
break;
case PrinterPageSize.Custom:
throw new NotSupportedException();
default:
throw new NotSupportedException();
}
return pdfPageSize;
}
private PaperSize GetPrintPreviewPaperSize(PagePrinterLayer pagePrinterLayer)
{
PaperSize printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
switch (pagePrinterLayer.PageSize)
{
case PrinterPageSize.AnsiA:
printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
break;
case PrinterPageSize.AnsiB:
printPreviewPaperSize = new PaperSize("AnsiB", 1100, 1700);
break;
case PrinterPageSize.AnsiC:
printPreviewPaperSize = new PaperSize("AnsiC", 1700, 2200);
break;
case PrinterPageSize.AnsiD:
printPreviewPaperSize = new PaperSize("AnsiD", 2200, 3400);
break;
case PrinterPageSize.AnsiE:
printPreviewPaperSize = new PaperSize("AnsiE", 3400, 4400);
break;
case PrinterPageSize.Custom:
printPreviewPaperSize = new PaperSize("Custom Size", (int)pagePrinterLayer.CustomWidth, (int)pagePrinterLayer.CustomHeight);
break;
default:
break;
}
return printPreviewPaperSize;
}
#endregion
#region Export Buttons
protected void btnToBitmap_Click(object sender, EventArgs e)
{
PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)(GetPageOverlay().Layers["PageLayer"]);
Bitmap bitmap = null;
try
{
pagePrinterLayer.Open();
bitmap = new Bitmap((int)pagePrinterLayer.GetBoundingBox().Width, (int)pagePrinterLayer.GetBoundingBox().Height);
GdiPlusGeoCanvas gdiPlusGeoCanvas = new GdiPlusGeoCanvas();
gdiPlusGeoCanvas.BeginDrawing(bitmap, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);
Collection labelsInAllLayers = new Collection();
foreach (Layer item in GetPageOverlay().Layers)
{
PrinterLayer printerLayer = (PrinterLayer)item;
printerLayer.Open();
printerLayer.IsDrawing = true;
if (!(printerLayer is PagePrinterLayer))
{
printerLayer.Draw(gdiPlusGeoCanvas, labelsInAllLayers);
}
printerLayer.IsDrawing = false;
printerLayer.Close();
}
gdiPlusGeoCanvas.EndDrawing();
pagePrinterLayer.Close();
string filename = MapPath(@"~\SampleData\PrintingResults.bmp");
bitmap.Save(filename);
Process.Start(filename);
}
catch (Exception ex)
{
string script = @"alert('" + ex.Message + " " + ex.StackTrace + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
finally
{
if (bitmap != null) { bitmap.Dispose(); }
GetPageOverlay().Redraw();
}
}
protected void btnToPDF_Click(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
PagePrinterLayer pagePrinterLayer = printerInteractiveOverlay.Layers["PageLayer"] as PagePrinterLayer;
PdfDocument pdfDocument = null;
PdfPage pdfPage = null;
try
{
pdfDocument = new PdfDocument();
pdfPage = pdfDocument.AddPage();
pdfPage.Orientation = pagePrinterLayer.Orientation == PrinterOrientation.Portrait ? PageOrientation.Portrait : PageOrientation.Landscape;
pdfPage.Size = GetPdfPageSize(pagePrinterLayer.PageSize);
PdfGeoCanvas pdfGeoCanvas = new PdfGeoCanvas();
pagePrinterLayer.Open();
pdfGeoCanvas.BeginDrawing(pdfPage, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);
pagePrinterLayer.Close();
Collection labelsInAllLayers = new Collection();
foreach (Layer item in printerInteractiveOverlay.Layers)
{
PrinterLayer printerLayer = item as PrinterLayer;
printerLayer.Open();
printerLayer.IsDrawing = true;
if (!(printerLayer is PagePrinterLayer))
{
printerLayer.Draw(pdfGeoCanvas, labelsInAllLayers);
}
printerLayer.IsDrawing = false;
printerLayer.Close();
}
pdfGeoCanvas.EndDrawing();
string filename = MapPath(@"~\SampleData\PrintingResults.pdf");
pdfDocument.Save(filename);
Process.Start(filename);
}
catch (Exception ex)
{
string script = @"alert('" + ex.Message + " " + ex.StackTrace + "');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
finally
{
if (pdfDocument != null) { pdfDocument.Dispose(); }
printerInteractiveOverlay.Redraw();
}
}
protected void btnToPrinter_Click(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
PagePrinterLayer pagePrinterLayer = printerInteractiveOverlay.Layers["PageLayer"] as PagePrinterLayer;
PrintDocument printDocument = new PrintDocument();
printDocument.DefaultPageSettings.Landscape = true;
if (pagePrinterLayer.Orientation == PrinterOrientation.Portrait)
{
printDocument.DefaultPageSettings.Landscape = false;
}
printDocument.DefaultPageSettings.PaperSize = GetPrintPreviewPaperSize(pagePrinterLayer);
PrinterGeoCanvas printerGeoCanvas = new PrinterGeoCanvas();
printerGeoCanvas.DrawingArea = new Rectangle(0, 0, Convert.ToInt32(printDocument.DefaultPageSettings.PrintableArea.Width), Convert.ToInt32(printDocument.DefaultPageSettings.PrintableArea.Height));
pagePrinterLayer.Open();
printerGeoCanvas.BeginDrawing(printDocument, pagePrinterLayer.GetBoundingBox(), Map1.MapUnit);
pagePrinterLayer.Close();
Collection labelsInAllLayers = new Collection();
foreach (Layer item in printerInteractiveOverlay.Layers)
{
PrinterLayer printerLayer = item as PrinterLayer;
printerLayer.Open();
printerLayer.IsDrawing = true;
if (!(printerLayer is PagePrinterLayer))
{
printerLayer.Draw(printerGeoCanvas, labelsInAllLayers);
}
printerLayer.IsDrawing = false;
printerLayer.Close();
}
printerGeoCanvas.EndDrawing();
printerInteractiveOverlay.Redraw();
}
#endregion
#region Pan & Zoom Buttons
protected void btnZoomIn_Click(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));
if (!mapPrinterLayer.IsOpen)
{
mapPrinterLayer.Open();
}
ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
double newScale = ZoomLevelSet.GetLowerZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);
printerInteractiveOverlay.Redraw();
}
protected void btnZoomOut_Click(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));
if (!mapPrinterLayer.IsOpen)
{
mapPrinterLayer.Open();
}
ZoomLevelSet zoomLevelSet = new ZoomLevelSet();
double newScale = ZoomLevelSet.GetHigherZoomLevelScale(ExtentHelper.GetScale(mapPrinterLayer.MapExtent, (float)mapPrinterLayer.GetBoundingBox().Width, mapPrinterLayer.MapUnit), zoomLevelSet);
mapPrinterLayer.MapExtent = ExtentHelper.ZoomToScale(newScale, mapPrinterLayer.MapExtent, mapPrinterLayer.MapUnit, (float)mapPrinterLayer.GetBoundingBox().Width, (float)mapPrinterLayer.GetBoundingBox().Height);
printerInteractiveOverlay.Redraw();
}
protected void btnPan_Click(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
MapPrinterLayer mapPrinterLayer = ((MapPrinterLayer)(printerInteractiveOverlay.Layers["mapPrinterLayer"]));
if (sender == btnPanNorth)
{ mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Up, 30); }
else if (sender == btnPanWest)
{ mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Left, 30); }
else if (sender == btnPanEast)
{ mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Right, 30); }
else if (sender == btnPanSouth)
{ mapPrinterLayer.MapExtent = ExtentHelper.Pan(mapPrinterLayer.MapExtent, PanDirection.Down, 30); }
printerInteractiveOverlay.Redraw();
}
#endregion
#region Combo Boxes & ContextMenu
protected void lisSize_SelectedIndexChanged(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)printerInteractiveOverlay.Layers["PageLayer"];
string selectText = lisSize.SelectedItem.Text;
if (selectText.StartsWith("ANSI A"))
pagePrinterLayer.PageSize = PrinterPageSize.AnsiA;
else if (selectText.StartsWith("ANSI B"))
pagePrinterLayer.PageSize = PrinterPageSize.AnsiB;
else if (selectText.StartsWith("ANSI C"))
pagePrinterLayer.PageSize = PrinterPageSize.AnsiC;
else if (selectText.StartsWith("ANSI D"))
pagePrinterLayer.PageSize = PrinterPageSize.AnsiD;
else if (selectText.StartsWith("ANSI E"))
pagePrinterLayer.PageSize = PrinterPageSize.AnsiE;
printerInteractiveOverlay.Redraw();
}
protected void lisOrientation_SelectedIndexChanged(object sender, EventArgs e)
{
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
PagePrinterLayer pagePrinterLayer = (PagePrinterLayer)printerInteractiveOverlay.Layers["PageLayer"];
string selectText = lisOrientation.SelectedItem.Text;
if (selectText.ToUpper() == "LANDSCAPE")
{
pagePrinterLayer.Orientation = PrinterOrientation.Landscape;
}
else if (selectText.ToUpper() == "PORTRAIT")
{
pagePrinterLayer.Orientation = PrinterOrientation.Portrait;
}
printerInteractiveOverlay.Redraw();
}
protected void lisPercentage_SelectedIndexChanged(object sender, EventArgs e)
{
String zoomString = lisPercentage.SelectedItem.Text;
double currentZoom = Double.Parse(zoomString.Replace("%", ""));
Map1.CurrentScale = PrinterHelper.GetPointsPerGeographyUnit(Map1.MapUnit) / (currentZoom / 100);
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
printerInteractiveOverlay.Redraw();
}
#endregion
#region ToolBox
protected void btnAddContrl_Click(object sender, ImageClickEventArgs e)
{
ImageButton btn = sender as ImageButton;
if (btn == btnAddLabel)
{
AddLabelLayer();
}
else if (btn == btnAddImage)
{
AddLogoImage();
}
else if (btn == btnAddScaleLine)
{
AddScaleLineLayer();
}
else if (btn == btnAddScaleBar)
{
string script = @"alert('Not Implemented!');";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alertForm", script, true);
}
else if (btn == btnAddGrid)
{
AddGridLayer();
}
LayerOverlay printerInteractiveOverlay = GetPageOverlay();
printerInteractiveOverlay.Redraw();
}
#endregion
}
}