Mapper.cs
上传用户:tupian
上传日期:2009-05-04
资源大小:93k
文件大小:6k
源码类别:

GPS编程

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Drawing.Drawing2D;
  5. using System.Drawing.Imaging;
  6. using System.Drawing.Text;
  7. using System.Drawing;
  8. using System.IO;
  9. namespace GpsTracer
  10. {
  11.     class Mapper
  12.     {
  13.         private List<Point> m_points;
  14.         private Point m_center;
  15.         int m_drawded = 1;
  16.         private Graphics m_g;
  17.         private Rectangle m_clip;
  18.         static private Pen m_bgPen = new Pen(Color.LightBlue);
  19.         static private Pen m_gridPen = new Pen(Color.LightGray);
  20.         static private Brush m_bgBrush = new SolidBrush(m_bgPen.Color);
  21.         static private Pen m_linePen = new Pen(Color.MediumBlue);
  22.         static private Pen m_pointPen = new Pen(Color.Blue);
  23.         static private Pen m_lastPointPen = new Pen(Color.Red);
  24.         static private Font m_font = new Font("Tahoma", 8, FontStyle.Regular);
  25.         static private Brush m_fontBrush = new SolidBrush(Color.Blue);
  26.         
  27.         public Mapper(Graphics g, int x, int y, int width, int height)
  28.         {
  29.             m_points = new List<Point>();
  30.             m_center = new Point(x + width / 2, y + height / 2);
  31.             m_g = g;
  32.             m_clip = new Rectangle(x, y, width, height);
  33.             m_g.Clip = new Region(m_clip);
  34.             clearAndDraw();
  35.         }
  36.         public void parseAndDraw(string s)
  37.         {
  38.             string[] Words = s.Split(',');
  39.             m_g.FillRectangle(m_bgBrush, new Rectangle(m_clip.X, m_clip.Y + 5, m_clip.Width, 15));
  40.             m_g.DrawString(s, m_font,m_fontBrush, new RectangleF(m_clip.X , m_clip.Y + 5, m_clip.Width, 15));
  41.             switch (Words[0])
  42.             {
  43.                 case "$GPRMC":// $GPRMC,170111,A,4338.5810,N,07015.1010,W,000.0,360.0,060199,017.5,W*73
  44.                     // RMC - Recommended minimum specific GPS/Transit data
  45.                     if (Words[3].Length > 0 && Words[5].Length > 0)
  46.                     {
  47.                         drawLatLong(Words[3], Words[5]);
  48.                     }
  49.                     break;
  50.                 case "$GPGSV":// $GPGSV,2,1,08,03,17,171,42,06,21,047,44,14,28,251,45,16,25,292,44*71
  51.                     // GSV - Satellites in view
  52.                     break;
  53.                 case "$GPGSA":// $GPGGA,170111,4338.581,N,07015.101,W,1,00,2.0,1.1,M,-31.8,M,,*71
  54.                     //GSA - GPS dilution of precision and active satellites
  55.                     break;
  56.                 default:
  57.                     break;
  58.             }
  59.         }
  60.         public void drawLatLong(string latitude, string longitude)
  61.         {
  62.             Point aPoint = new Point();
  63.             aPoint.X = (Convert.ToInt32(latitude.Substring(latitude.Length - 4, 4)));
  64.             aPoint.Y = (Convert.ToInt32(longitude.Substring(longitude.Length - 4, 4)));
  65.             aPoint.X += (Convert.ToInt32(latitude.Substring(latitude.Length - 7, 2))) * 60;
  66.             aPoint.Y += (Convert.ToInt32(longitude.Substring(longitude.Length - 7, 2))) * 60;
  67.             aPoint.X += (Convert.ToInt32(latitude.Substring(latitude.Length - 9, 2))) * 3600;
  68.             aPoint.Y += (Convert.ToInt32(longitude.Substring(longitude.Length - 9, 2))) * 3600;
  69.             m_points.Add(aPoint);
  70.             draw();
  71.         }
  72.         public void draw()
  73.         {
  74.             float xTo = 0;
  75.             float xFrom = 0;
  76.             float yTo = 0;
  77.             float yFrom = 0;
  78.                        
  79.             for (int i = m_drawded; i < m_points.Count; i++)
  80.             {
  81.                 xTo = (m_points[i].X - m_points[0].X) / m_scale + m_center.X;
  82.                 xFrom = (m_points[i - 1].X - m_points[0].X) / m_scale + m_center.X;
  83.                 yTo = (m_points[i].Y - m_points[0].Y) / m_scale + m_center.Y;
  84.                 yFrom = (m_points[i - 1].Y - m_points[0].Y) / m_scale + m_center.Y;
  85.                 m_g.DrawLine(m_linePen, (int)xTo, (int)yTo, (int)xFrom, (int)yFrom);
  86.                 m_g.DrawEllipse(m_pointPen, new Rectangle((int)xFrom - 2, (int)yFrom - 2, 4, 4));
  87.             }
  88.             m_g.DrawEllipse(m_lastPointPen, new Rectangle((int)xTo - 2, (int)yTo - 2, 4, 4));
  89.             m_drawded++;
  90.         }
  91.         private float m_scale = 10;
  92.         public float Scale
  93.         {
  94.             get { return m_scale; }
  95.             set { m_scale = value; }
  96.         }
  97.         public void clearAndDraw()
  98.         {
  99.             m_g.FillRectangle(m_bgBrush, m_clip);
  100.             m_drawded = 1;
  101.             draw();
  102.         }
  103.         public void moveCenter(int x, int y)
  104.         {
  105.             m_center.X -= x;
  106.             m_center.Y -= y;
  107.         }
  108.         public void centerInTheMiddle()
  109.         {
  110.             int n =m_points.Count;
  111.             m_center.X = (int)((m_points[n - 1].X - m_points[0].X) / m_scale);
  112.             m_center.Y = (int)((m_points[n - 1].Y -m_points[0].Y) / m_scale);
  113.                         
  114.             clearAndDraw();
  115.         }
  116.         public void loatPath(String filename)
  117.         {
  118.             StreamReader sr = new StreamReader(filename);
  119.             m_points.Clear();
  120.             int n = 0;
  121.             Point p = new Point();
  122.             while (!sr.EndOfStream)
  123.             {
  124.                 String readed = sr.ReadLine();
  125.                 p.X = Convert.ToInt32(readed);
  126.                 readed = sr.ReadLine();
  127.                 p.Y = Convert.ToInt32(readed);
  128.                 m_points.Add(p);
  129.                 n++;
  130.             }
  131.             m_drawded = 1;
  132.             sr.Close();
  133.             clearAndDraw();
  134.         }
  135.         public void savePath(String filename)
  136.         {
  137.             StreamWriter sw = new StreamWriter(filename);
  138.             foreach (Point p in m_points)
  139.             {
  140.                 sw.WriteLine(Convert.ToString(p.X));
  141.                 sw.WriteLine(Convert.ToString(p.Y));
  142.             }
  143.             sw.Flush();
  144.             sw.Close();
  145.         }
  146.     }
  147. }