====== Source Code DesktopEditionSample VehicleDirection CS 090728.zip ======
====Form1.cs====
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Forms;
using ThinkGeo.MapSuite.Core;
using ThinkGeo.MapSuite.DesktopEdition;
namespace VehicleDirection
{
public partial class Form1 : Form
{
private int count1 = 0;
private int count2 = 0;
Collection pointShapes1;
Collection pointShapes2;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadStreetData();
InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
inMemoryFeatureLayer.Open();
inMemoryFeatureLayer.Columns.Add(new FeatureSourceColumn("Angle"));
inMemoryFeatureLayer.Close();
pointShapes1 = ReadTextFile(@"..\..\Data\GPSreadings1.txt");
pointShapes2 = ReadTextFile(@"..\..\Data\GPSreadings2.txt");
Feature newFeature1 = new Feature(pointShapes1[count1]);
newFeature1.ColumnValues["Angle"] = System.Convert.ToString(pointShapes1[count1].Z);
inMemoryFeatureLayer.InternalFeatures.Add("Vehicle1", newFeature1);
Feature newFeature2 = new Feature(pointShapes2[count2]);
newFeature2.ColumnValues["Angle"] = System.Convert.ToString(pointShapes2[count2].Z);
inMemoryFeatureLayer.InternalFeatures.Add("Vehicle2", newFeature2);
RotatedImageStyle rotatedImageStyle = new RotatedImageStyle(new GeoImage(@"..\..\Data\vehicle2.png"), "Angle");
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Clear();
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(rotatedImageStyle);
inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay pointOverLayer = new LayerOverlay();
pointOverLayer.Layers.Add(inMemoryFeatureLayer);
winformsMap1.Overlays.Add("Points Overlay", pointOverLayer);
timer1.Start();
winformsMap1.CurrentExtent = new RectangleShape(-66.8581, 10.4995, -66.8456, 10.4915);
winformsMap1.Refresh();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (count1 == pointShapes1.Count) count1 = 0;
if (count2 == pointShapes2.Count) count2 = 0;
try
{
winformsMap1.Overlays["Points|Overlay"].Lock.EnterWriteLock();
LayerOverlay pointOverLay = (LayerOverlay)winformsMap1.Overlays["Points|Overlay"];
InMemoryFeatureLayer inMemoryFeatureLayer = (InMemoryFeatureLayer)pointOverLay.Layers[0];
Feature feature = inMemoryFeatureLayer.InternalFeatures["Vehicle1"];
feature.ColumnValues["Angle"] = System.Convert.ToString(pointShapes1[count1].Z);
PointShape pointShape1 = feature.GetShape() as PointShape;
pointShape1.X = pointShapes1[count1].X;
pointShape1.Y = pointShapes1[count1].Y;
pointShape1.Id = "Vehicle1";
Feature feature2 = inMemoryFeatureLayer.InternalFeatures["Vehicle2"];
feature2.ColumnValues["Angle"] = System.Convert.ToString(pointShapes2[count2].Z);
PointShape pointShape2 = feature2.GetShape() as PointShape;
pointShape2.X = pointShapes2[count2].X;
pointShape2.Y = pointShapes2[count2].Y;
pointShape2.Id = "Vehicle2";
inMemoryFeatureLayer.Open();
inMemoryFeatureLayer.EditTools.BeginTransaction();
inMemoryFeatureLayer.EditTools.Update(pointShape1);
inMemoryFeatureLayer.EditTools.Update(pointShape2);
inMemoryFeatureLayer.EditTools.CommitTransaction();
inMemoryFeatureLayer.Close();
}
finally
{
winformsMap1.Overlays["Points|Overlay"].Lock.ExitWriteLock();
count1 = count1 + 1;
count2 = count2 + 1;
}
winformsMap1.Refresh();
}
private Collection ReadTextFile(string textFile)
{
Collection pointShapes = new Collection();
StreamReader SR = File.OpenText(textFile);
string S;
S = SR.ReadLine();
while (S != null)
{
double X = System.Convert.ToDouble(S.Substring(0, 8));
double Y = System.Convert.ToDouble(S.Substring(9, 7));
double Angle = System.Convert.ToDouble(S.Substring(17, 3));
PointShape pointShape = new PointShape(X, Y, Angle);
pointShapes.Add(pointShape);
S = SR.ReadLine();
}
SR.Close();
return pointShapes;
}
private void LoadStreetData()
{
winformsMap1.BackgroundOverlay.BackgroundBrush = new GeoSolidBrush(GeoColor.FromArgb(255, 233, 232, 214));
ShapeFileFeatureLayer ParksShapeLayer = new ShapeFileFeatureLayer(@"..\..\Data\parks.shp");
ShapeFileFeatureLayer.BuildIndexFile(@"..\..\Data\parks.shp", BuildIndexMode.DoNotRebuild);
ParksShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
ParksShapeLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Park1;
ShapeFileFeatureLayer ParksLabelLayer = new ShapeFileFeatureLayer(@"..\..\Data\parks.shp");
ParksLabelLayer.RequireIndex = false;
ParksLabelLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle = TextStyles.CreateSimpleTextStyle("Name", "Arial", 10, DrawingFontStyles.Bold, GeoColor.StandardColors.SeaGreen, GeoColor.StandardColors.White, 2);
ParksLabelLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
ShapeFileFeatureLayer StreetsShapeLayer = new ShapeFileFeatureLayer(@"..\..\Data\streets.shp");
ShapeFileFeatureLayer.BuildIndexFile(@"..\..\Data\streets.shp", BuildIndexMode.DoNotRebuild);
StreetsShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
ValueStyle valueStyle = new ValueStyle();
valueStyle.ColumnName = "Type";
valueStyle.ValueItems.Add(new ValueItem("A", LineStyles.LocalRoad2));
valueStyle.ValueItems.Add(new ValueItem("M", LineStyles.MajorRoad1));
StreetsShapeLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(valueStyle);
ShapeFileFeatureLayer StreetsLabelLayer = new ShapeFileFeatureLayer(@"..\..\Data\streets.shp");
StreetsLabelLayer.RequireIndex = false;
TextStyle textStyle = new TextStyle();
textStyle.TextColumnName = "St_name";
textStyle.TextSolidBrush = new GeoSolidBrush(GeoColor.StandardColors.Black);
textStyle.Font = new GeoFont("Arial", 7);
textStyle.TextLineSegmentRatio = 10;
textStyle.GridSize = 100;
textStyle.SplineType = SplineType.StandardSplining;
textStyle.DuplicateRule = LabelDuplicateRule.OneDuplicateLabelPerQuadrant;
StreetsLabelLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(textStyle);
StreetsLabelLayer.ZoomLevelSet.ZoomLevel01.DefaultTextStyle.GridSize = 5;
StreetsLabelLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
LayerOverlay staticOverlay = new LayerOverlay();
staticOverlay.Layers.Add("Parks", ParksShapeLayer);
staticOverlay.Layers.Add("Streets", StreetsShapeLayer);
staticOverlay.Layers.Add("Parks Labels", ParksLabelLayer);
staticOverlay.Layers.Add("Streets Labels", StreetsLabelLayer);
winformsMap1.Overlays.Add("Street Overlay", staticOverlay);
}
}
}
====Program.cs====
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace VehicleDirection
{
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
====RotatedImageStyle.cs====
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using ThinkGeo.MapSuite.Core;
namespace VehicleDirection
{
class RotatedImageStyle : Style
{
private GeoImage geoImage;
private string angleColumnName;
public RotatedImageStyle()
: this(new GeoImage(), string.Empty)
{ }
public RotatedImageStyle(GeoImage geoImage, string angleColumnName)
{
this.geoImage = geoImage;
this.angleColumnName = angleColumnName;
}
public GeoImage GeoImage
{
get { return geoImage; }
set { GeoImage = value; }
}
public string AngleColumnName
{
get { return angleColumnName; }
set { AngleColumnName = value; }
}
protected override void DrawCore(IEnumerable features, GeoCanvas canvas, Collection labelsInThisLayer, Collection labelsInAllLayers)
{
foreach (Feature feature in features)
{
float angleData = Convert.ToSingle(feature.ColumnValues[angleColumnName]);
PointShape pointShape = (PointShape)feature.GetShape();
canvas.DrawWorldImageWithoutScaling(geoImage, pointShape.X, pointShape.Y, DrawingLevel.LevelFour, 0, 0, 360 - angleData); //angleData);
}
}
protected override Collection GetRequiredColumnNamesCore()
{
Collection columns = new Collection();
if (!columns.Contains(angleColumnName))
{
columns.Add(angleColumnName);
}
return columns;
}
}
}