using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ThinkGeo.MapSuite.Core;
namespace PacificRim
{
//This class, inheriting from Projection, applies the very simple projection of offsetting all the points
//360 degrees to the left.
class OffsetProjection: Projection, IDisposable
{
protected override Vertex[] ConvertToExternalProjectionCore(double[] x, double[] y)
{
Vertex[] vertices = new Vertex[x.Length];
for (int i = 0; i < vertices.Length; i++)
{
vertices[i] = new Vertex(x[i] - 360, y[i]);
}
return vertices;
}
protected override Vertex[] ConvertToInternalProjectionCore(double[] x, double[] y)
{
Vertex[] vertices = new Vertex[x.Length];
for (int i = 0; i < vertices.Length; i++)
{
vertices[i] = new Vertex(x[i] + 360, y[i]);
}
return vertices;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
Close();
}
}
}
using System;
using System.Drawing;
using System.Windows.Forms;
using ThinkGeo.MapSuite.Core;
using System.Collections.ObjectModel;
namespace PacificRim
{
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)
{
//We are loading the same ShapeFile twice: Once unprojected and a second time projecting
//all the features 360 degrees to the left.
ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\Data\countries02.shp");
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
mapEngine.StaticLayers.Add("WorldLayer", worldLayer);
OffsetProjection offsetProj = new OffsetProjection();
//Loads the country layer with the Projection offsetting all the features 360 degrees to the left.
ShapeFileFeatureLayer worldLayerOffset = new ShapeFileFeatureLayer(@"..\..\Data\countries02.shp", @"..\..\Data\countries_offset.idx");
worldLayerOffset.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayerOffset.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
worldLayerOffset.FeatureSource.Projection = offsetProj;
mapEngine.StaticLayers.Add("World Offset", worldLayerOffset);
mapEngine.BackgroundFillBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
//Notice that the current extent has to be expressed in the projected values to have the map
//centered on the Pacific.
//80 - 360 = -280
mapEngine.CurrentExtent = ExtentHelper.GetDrawingExtent(new RectangleShape(-280, 58, -70, -20), Map.Width, Map.Height);
DrawImage();
}
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(-280, 58, -70, -20), 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();
}
}
}