Hi Guys,
Here’s a little app that plots a couple of GreatCircles to a common point and allows you to drag the common point around in real time. Basically click and then drag the point between the two GreatCircles.
The version 2 is infinitely faster than the Version 3, how do we get the same speed of drawing from version 3?
Version 2
using System;
using System.Windows.Forms;
using MapSuite;
using MapSuite.DesktopEdition;
using MapSuite.Geometry;
namespace TG2
{
public partial class Form1 : Form
{
private PointShape gcOneStart;
private PointShape gcTwoEnd;
private PointMapShape target;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
map1.MapUnit = MapLengthUnits.DecimalDegrees;
Layer worldLayer = new Layer(@"..\..\SampleData\SampleData\World\cntry02.shp", true); worldLayer.ZoomLevel01.GeoStyle = GeoAreaStyles.Country1; worldLayer.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.ZoomLevel18; map1.Layers.Add(worldLayer);
gcOneStart = new PointShape(0, 60.0);
gcTwoEnd = new PointShape(-80.0, 11.0);
target = new PointMapShape(new PointShape(-40, 20.0));
target.ZoomLevel01.GeoStyle = GeoPointStyles.City1;
target.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.ZoomLevel18;
map1.MapShapes.Add(target);
PlotGreatCircles();
map1.Mode = ModeType.Selection;
map1.CurrentExtent = worldLayer.Extent;
}
private void PlotGreatCircles()
{
if (map1.MapShapes.Count > 1)
{
map1.MapShapes.RemoveAt(1);
map1.MapShapes.RemoveAt(1);
}
LineMapShape gcFrom = new LineMapShape();
gcFrom.Shape = gcOneStart.GetShortestLineTo(map1.MapUnit, target.BaseShape);
gcFrom.Symbols.Add(new LineSymbol(new GeoPen(GeoColor.KnownColors.Black)));
gcFrom.Dragable = false;
map1.MapShapes.Add(gcFrom);
LineMapShape gcTo = new LineMapShape();
gcTo.Shape = gcTwoEnd.GetShortestLineTo(map1.MapUnit, target.BaseShape);
gcTo.Symbols.Add(new LineSymbol(new GeoPen(GeoColor.KnownColors.Black)));
gcTo.Dragable = false;
map1.MapShapes.Add(gcTo);
}
private void map1_MapShapesDrag(BaseMapShapeCollection MapShapes)
{
PlotGreatCircles();
}
}
}
Version 3
using System;
using System.Windows.Forms;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.DesktopEdition;
namespace TG3
{
public partial class Form1 : Form
{
private readonly PointShape gcOneStart;
private readonly PointShape gcTwoEnd;
private PointShape targetPoint;
private readonly InMemoryFeatureLayer lineLayer;
public Form1()
{
InitializeComponent();
winformsMap1.MapUnit = GeographyUnit.DecimalDegree;
ShapeFileFeatureLayer worldLayer = new ShapeFileFeatureLayer(@"..\..\SampleData\Data\Countries02.shp");
worldLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1;
worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
lineLayer = new InMemoryFeatureLayer();
lineLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.Equator1;
lineLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.City1;
lineLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
targetPoint = new PointShape("POINT(-40 20)");
gcOneStart = new PointShape("POINT(0 60)");
gcTwoEnd = new PointShape("POINT(-80 11)");
lineLayer.InternalFeatures.Add("Target", new Feature(targetPoint));
lineLayer.InternalFeatures.Add("GCOne", new Feature(gcOneStart.GetShortestLineTo(targetPoint, GeographyUnit.DecimalDegree)));
lineLayer.InternalFeatures.Add("GCTwo", new Feature(targetPoint.GetShortestLineTo(gcTwoEnd, GeographyUnit.DecimalDegree)));
winformsMap1.StaticOverlay.Layers.Add("WorldLayer", worldLayer); winformsMap1.DynamicOverlay.Layers.Add("LineLayer", lineLayer); winformsMap1.MapBackground.BackgroundBrush = new GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean);
winformsMap1.CurrentExtent = new RectangleShape(-180.0, 83.0, 180.0, -90.0);
winformsMap1.Refresh();
}
private void winformsMap1_MouseMove(object sender, MouseEventArgs e)
{
if (winformsMap1.EditOverlay.TrackMode == TrackMode.Edit && (e.Button & MouseButtons.Left) == MouseButtons.Left)
{
lineLayer.InternalFeatures.Clear();
targetPoint = ExtentHelper.ToWorldCoordinate(winformsMap1.CurrentExtent, e.X, e.Y, winformsMap1.Width, winformsMap1.Height);
lineLayer.InternalFeatures.Add("Target", new Feature(targetPoint)); lineLayer.InternalFeatures.Add("GCOne", new Feature(gcOneStart.GetShortestLineTo(targetPoint, GeographyUnit.DecimalDegree)));
lineLayer.InternalFeatures.Add("GCTwo", new Feature(targetPoint.GetShortestLineTo(gcTwoEnd, GeographyUnit.DecimalDegree)));
winformsMap1.RefreshDynamic();
}
}
private void winformsMap1_MapClick(object sender, MapClickEventArgs e)
{
winformsMap1.EditOverlay.EditLayer.InternalFeatures.Add(new Feature(targetPoint));
winformsMap1.EditOverlay.EditSettings.IsDraggable = true;
winformsMap1.EditOverlay.EditSettings.IsReshapable = false;
winformsMap1.EditOverlay.EditSettings.IsResizable = false;
winformsMap1.EditOverlay.EditSettings.IsRotatable = false;
winformsMap1.EditOverlay.TrackMode = TrackMode.Edit;
}
}
}
Regards
John