====== 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; } } }