ThinkGeo Cloud
ThinkGeo UI Controls
ThinkGeo Open Source
Help and Support
External Resources
ThinkGeo Cloud
ThinkGeo UI Controls
ThinkGeo Open Source
Help and Support
External Resources
This is an old revision of the document!
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<PointShape> pointShapes1; Collection<PointShape> 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<PointShape> ReadTextFile(string textFile) { Collection<PointShape> pointShapes = new Collection<PointShape>(); 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); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace VehicleDirection { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
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<Feature> features, GeoCanvas canvas, Collection<SimpleCandidate> labelsInThisLayer, Collection<SimpleCandidate> 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<string> GetRequiredColumnNamesCore() { Collection<string> columns = new Collection<string>(); if (!columns.Contains(angleColumnName)) { columns.Add(angleColumnName); } return columns; } } }