GPS参数提取与轨迹重现实验

       一个简单的小实验,还有很多地方需要改进。

一、实验工具:

①C++ builder

②Google earth——定位和获取校准点的经纬度,界定截图的大致范围

③Getscreen——配合Google earth的小插件,获得合适的拼接大地图

④绘图工具——确定像素点坐标,以便于计算像素点间距离与经纬度之间的比例关系

⑤USB接口的GPS接收机,包括相应的驱动,pc机上查看连接收集数据的软件sirfdemo_NMEA

二、GPS数据

1、数据的采集

         GPS信号的数据采集,参数提取及存储系统设计采用了基于Windows操作平台上的面向对象的程序设计。

        启动GPS信号接收机,从GPS信号中提取“经度”、“纬度”、“速度”、“日期”等数据,以 NMEA-0813格式保存数据,提取数据。

        使用GPS接收机采集数据时,将GPS接收机连接到移动电脑上,启动接收机,开始接收数据。

       大多数GPS 接收机都能输出符合NEMA0183 标准的ASCII码形式的各种数据信息,NEMA0183通信标准格式是美国国家海洋局电子协会制定的,语句达数十种之多,各种数据句型均以“$”开头,数据主要由帧头、帧尾和帧内数据组成,主要语句有GPGGAGPVTGGPRMC

       数据提取:此实验中,GPS参数纬度、经度、速度信息均由GPRMC提出。由于每行数据均是由“$”加标志符开头,在从原始采集数据提取上述数据中,以“$”和标志符的组合来判断信息来源。由于每项数据项均是以“,”作为分隔符,数据的位数通常是变长的,但每类数据的相对位置不变,因此在查找经度纬度等的时候,只需查找并记录“,”的个数,即能将各类参数提取出来。从原始数据中将经度、纬度、速度信息经过一次提取,并将之存于另一存储文件中,以便于在轨迹重现中能够更快更有效地将提出来的数据用于重现轨迹。在存储时,在考虑到轨迹重现时从此存储文件中进行二次提取数据不易将各类数据项识别开来,遂将每个定点的每项数据用一个字母结束,以便作为第二次参数提取时的分隔符。

2、数据保存

       记录的数据保存为TXT格式的文本文件,保存格式为:

$  GPGGA ,……(时间),……(纬度),……(北纬),……(经度),……(东经),……

$  GPRMC,…………

………………………………

      以及高度、速度等数据。如:

$GPRMC,025957,A,3037.8723,N,10404.8260,E,000.0,000.0,271004,001.1,W*6C

$GPGGA,025957,3037.8723,N,10404.8260,E,1,06,1.5,507.4,M,-32.1,M,,*63

$GPGSA,A,3,01,,06,14,16,20,,25,,,,,2.6,1.5,2.1*31

$GPGSV,3,1,09,01,73,016,51,03,04,182,,06,19,068,48,14,32,118,47*7B

$GPGSV,3,2,09,16,66,206,49,20,36,293,44,23,15,314,39,25,57,016,52*7C

$GPGSV,3,3,09,30,03,041,,,,,,,,,,,,,*45

三、实验步骤

①大致流程:(天线)GPS接收机——连接笔记本(通过串口USB)——(数据处理、保存并留作再处理)GPS数据采集——

             按数据确定地图范围并截取——界面设计(C++builder)并开始编程——数据存储(第一次提取按标准格式存储)

                         ——二次提取数据并轨迹重现(校准)

②GPS数据的采集: 使用GPS接收机和PC机实现移动坐标点数据采集

          1、安装Driver.exe驱动程序;
          2、插上接收机;
          3、重启系统;
          4、检测到新硬件提示——有效;
          5、运行 sirfdemo_NMEA.exe;
          6、在“数据源”选项中,设置端口号  COM1~COM4 (根据具体情况调整);
          7、运行“连接”,看见数据即可;
          8、点击“磁盘符号”设置保存数据文件位置(先停止连接,设置好文件名称后再连接,屏幕数据应有变化);
          9、使用“资源管理器”,不停地打开该文件,检查文件容量是否在增加,最后面的数据是否在变化,若都在变,说明采集的GPS数据正不停地存入指定文件。
          10、上面的内容弄好后,就可以出去测数据了

③截取地图:这里要用到工具Google earth、Getscreen、绘图工具。可以采用类似工具替换,比如用百度地图。

        参考点坐标在Google earth上得到,像素点在绘图工具上得到。至于大地图的拼接,先打开Google earth,在用与它配套的小插件Getscreen可以得到范围很大,有一定经度的拼图,由于我的电脑超过250M的图片不能读取,所以我在250M以下,规定范围内尽可能截出精确的小比例图。
  地图由Google Earth截取的成都市卫星地图。截下的图像精度较高,道路清晰。Google Earth可以让用户旋转角度来观看地形和建筑物,为地图增添注释。
④一次数据提取:大致流程如下,其中K统计了循环的次数,既有多少组数据
     1、定义经纬度、速度高度等变量

        2、指定采集数据的文件路径

        3、数据以"$GPRMC"开头则继续读后面的数据,否则读下一行

       4、指针向前提取纬度、速度、经度,是以"$GPGGA"*开头则提取高度

       5、继续进入循环(第3步)直到文件结束

       6、将纬度,经度,速度分别赋值个相应的文本输出,第一次提取结束

提取前的数据形式:
$GPRMC,025957,A,3037.8723,N,10404.8260,E,000.0,000.0,271004,001.1,W*6C
$GPGGA,025957,3037.8723,N,10404.8260,E,1,06,1.5,507.4,M,-32.1,M,,*63
$GPGSA,A,3,01,,06,14,16,20,,25,,,,,2.6,1.5,2.1*31
$GPGSV,3,1,09,01,73,016,51,03,04,182,,06,19,068,48,14,32,118,47*7B
$GPGSV,3,2,09,16,66,206,49,20,36,293,44,23,15,314,39,25,57,016,52*7C
$GPGSV,3,3,09,30,03,041,,,,,,,,,,,,,*45
…………………………………………………………………………
…………………………………………………………………………
第一次提取后的数据格式:
纬度:3039.9234n
经度:10407.9395e
速度:9.49v
高度:447.8m

纬度:3039.9256n
经度:10407.9415e
速度:10.11v
高度:447.7m

纬度:3039.9277n
经度:10407.9435e
速度:9.77v
高度:447.5m
………………………………………………………………
…………………………………………………………………
         一共统计有K组,便于第二次提取的时候判断文件结束,先在FORM1上设置相应的按钮等,在填写相应的响应代码。
  一次提取出需要的经度、纬度、速度、高度并存放在d:\\gps数据.txt中,因为速度和高度不在同一行数据中,所以一个循环内要判断两次,程序里我第一次先判断的经度、纬度、速度,再判断的高度。我设置了一个全局变量K用来计算有多少组参数(经度纬度速度高度一次循环为一组),用于在轨迹重现中计算要读出几组数据实现文件的正常结束。程序具体的实现见代码和相应的注释。

⑤二次提取数据:第二次提取过程与第一次大致相同,只是数据的存储格式不同 。

       1、初始变量设置,设置暂停、继续等功能

       2、每组数据行数Line最大为5,根据line值提取经纬度等
       3、赋值给相应的变量用于重绘轨迹 

       4、显示纬度经度速度信息,根据速度设置光点颜色

       5、纬度经度数据转换并定位

       6、绘制光点

       7、根据K判断提取是否结束

        二次数据提取是以相应字母(m、v、n 、e)作为分隔符,将经度纬度和速度信息从上述存储文件d:\\gps数据.txt中中提取出来,以便更方便的将这些数据用于轨迹重现。这次提取出来的数据不再存储,直接用于轨迹显示。
  K用于计算什么时候文件读取数据结束,防止while(!feof(……))寻找不到文件结束而造成卡死,该程序分为第二次提取数据,参考点选择,经纬度格式转换,轨迹坐标点计算,以及实现ScrollBox的滑动条随轨迹自动移动等功能。

 ⑥ 轨迹重现

           在该段程序中,我们利用stop是否等于1来实现强行跳出循环,利用flag是否为0以及与函数

 if(flag==0)
{
    Button5->Caption="暂停";
    flag=1;
}
else
{
    Button5->Caption="继续";
    flag=0;
}//实现程序的暂停。
      由于在存储是以@结束的,所以在重新提取纬度,经度,速度是均以@为标记。
      采用C++BUILDER中的ComboBox1我们实现了定位的选择以及速度颜色范围的选择。
      光点的实现主要运用了Image1->Canvas->Pen->Width=4;
      点的颜色采用了Image1->Canvas->Pen->Color=(颜色名)这一命令。
     float x=(bb-j1)*(x1-x2)/(j1-j2)+x1;
     float y=(dd-w1)*(y1-y2)/(w1-w2)+y1;
     Image1->Canvas->MoveTo(x,y);
     Image1->Canvas->LineTo(x,y);实现点的定位与移动

  速度的设定是通过Edit3中实际的速度来实现的,速度的划分可有三种划分方式,以便在不同的速度等级也能将不同的速度段区分开来,每种划分均分成四个段,分别用不同的颜色表示。如:

ComboBox1->Items->Add(">80");
ComboBox2->Items->Add("60~80");
ComboBox3->Items->Add("40~60");
ComboBox4->Items->Add("<40");
if
(
atof(Edit3->Text.c_str())*1.852>40)
{
Image1->Canvas->Pen->Color=clRed;
}
else if
(
20Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=40)
{
Image1->Canvas->Pen->Color=clYellow;
}
else if
(
 10Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=20)
{
Image1-> Canvas->Pen->Color=clGreen;
}
else
{
Image1->Canvas->Pen->Color=clBlue;
}

     可从程序交互式界面中直接输入两个定位点在位图中的定位坐标,也可直接输入两个定位点的转化后的经纬度。
  在本实验中,程序给出了成都市大地图的两个校准点和望江校区的两个校准点的经纬度,选择地图确定两个校准点,即可将轨迹定位下来。我们可以直接从界面上选择这四个点。此四个点如下:
    ComboBox1->Items->Add("望江地区校准点一");
    ComboBox1>Items->Add("大地图校准点一");
    ComboBox2>Items->Add("望江地区校准点二");
    ComboBox2->Items->Add("大地图校准点二");
  根据不同的点的选择来确定经纬度如下:   

if(ComboBox1->Text=="望江校区校准点一")
   {
   Edit5->Text="104.081819" ;
   Edit6->Text="30.634669" ;
   Edit7->Text="305" ;
   Edit8->Text="302" ;
   }

else if(ComboBox1->Text=="大地图校准点一")
   {
   Edit5->Text="104.190713" ;
   Edit6->Text="30.736990" ;
   Edit7->Text="3929" ;
   Edit8->Text="2248" ;
   }
if(ComboBox2->Text=="望江校区校准点二")
   {
   Edit9->Text="104.078247" ;
   Edit10->Text="30.632311" ;
   Edit11->Text="164" ;
   Edit12->Text="400" ;
   }
 else if(ComboBox2->Text=="大地图校准点二")
   {
 Edit9->Text="103.847543" ;
 Edit10->Text="30.372218" ;
 Edit11->Text="1412" ;
 Edit12->Text="5364" ;
    }
 float x1=atof(Edit7->Text.c_str());
 float y1=atof(Edit8->Text.c_str());
 float x2=atof(Edit11->Text.c_str());
 float y2=atof(Edit12->Text.c_str());

 float j1=atof(Edit5->Text.c_str());   //若要输入的定点不属于上速的2个点则从界面中输入定标的经度纬度
 float w1=atof(Edit6->Text.c_str());   //把字符串转换成浮点数、x定标 、y定标、
 float j2=atof(Edit9->Text.c_str());
 float w2=atof(Edit10->Text.c_str());
  我提取的数据一共有9个字节,前面3个表示度,后面2个表示分的整数部分,接下来的3个字节表示分的小数部分。有时采用这种表示时,在地图上显示不出来,需要转化为度才行。譬如1024度线。以上程序利用atof();这个函数将数据转化为字符型。经纬度化成标准格式的转化过程如下:
int a=int(atof(Edit1->Text.c_str())/100)*100; //经度bb
float b=(atof(Edit1->Text.c_str())-a)/0.6+a;
float bb=b/100;
int c=int(atof(Edit2->Text.c_str())/100)*100;  //纬度dd
float d=(atof(Edit2->Text.c_str())-c)/0.6+c;
float dd=d/100;
       为了减少在程序运行过程中操作人员的误操作带来的程序运行错误,在此实验中对按钮的有效性进行了设定,当某个按钮是激活态,则为亮色,若按钮处于不可工作状态,则成灰色  

四、实验效果(截自成都市地图)

       四川大学校内的一段:


       成都市区重建的一部分轨迹图,贴两张:


五、可以改进的地方,我是没时间研究了

        1、把地图分为很多个块,重现到相应区域时根据边界位置读取相应下一个块,并释放原来的块,可以减少内存消耗。如果能像百度谷歌地图动态载入释放就更好。

        2、界面效果、地图可以做的更细腻。

六、附上本渣程序,表示没有排版,毫无编程风格,有兴趣就将就看吧。

1、程序中图片设置成了两个,一个是小地图,一个是市区的大地图
2、加了一个保存图片的按钮,把已经绘制轨迹的图片默认保存在D盘 Image1->Picture->SaveToFile("d:\\1.BMP ");
3、已经生成了可执行文件,校准点选了两个,重现前先在下拉框中选校准点,也可以自己手动输入
4、第一次提取和重现默认的GPS数据存在D盘,FILE *fpp=fopen("d:\\gps数据.txt","r");
5、选取参考点——打开图片——打开文件———提取和存储数据——轨迹重现——暂停、保存(D盘中)、停止等相应功能

Unit1.h文件

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
#include
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        TLabel *Label1;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
        TLabel *Label7;
        TButton *Button2;
        TOpenPictureDialog *OpenPictureDialog1;
        TButton *Button3;
        TOpenDialog *OpenDialog1;
        TButton *Button4;
        TButton *Button5;
        TButton *Button6;
        TLabel *Label2;
        TComboBox *ComboBox1;
        TComboBox *ComboBox2;
        TLabel *Label6;
        TLabel *Label8;
        TLabel *Label9;
        TLabel *Label10;
        TLabel *Label11;
        TLabel *Label12;
        TLabel *Label13;
        TLabel *Label14;
        TEdit *Edit5;
        TEdit *Edit6;
        TEdit *Edit7;
        TEdit *Edit8;
        TEdit *Edit9;
        TEdit *Edit10;
        TEdit *Edit11;
        TEdit *Edit12;
        TLabel *Label16;
        TLabel *Label17;
        TLabel *Label18;
        TLabel *Label19;
        TButton *Button7;
        TScrollBox *ScrollBox1;
        TImage *Image1;
        TLabel *Label15;
        TLabel *Label20;
        TLabel *Label21;
        TLabel *Label22;
        TButton *Button8;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall Button5Click(TObject *Sender);
        void __fastcall Button6Click(TObject *Sender);
        void __fastcall Button4Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button7Click(TObject *Sender);
        void __fastcall Button8Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp文件

//---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
#include
TForm1 *Form1;
int flag=1; //用来设定暂停标记
int stop=0; //用来设定停止标记
int k=0;    //用于计算有多少组数据、经度纬度速度高度为一组
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Button1->Enabled=false;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
Button8->Enabled=false;
}
//---------------------------------------------------------------------------
/************提取并存储数据**************/
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled=true;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=true;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
Button8->Enabled=false;


 /************变量定义**************/
char v[25];       //速度
char n[19];       //纬度
char e[20];      //经度
char m[25]  ;     //高度
char* cp = OpenDialog1->FileName.c_str();
FILE *fp=fopen(cp,"r");
FILE *ff=fopen("d:\\gps数据.txt","w");

while(!feof(fp))
{
char ch=getc(fp);
/********判定是否为"$GPRMC"*********/
if(ch=='$')
{
ch=getc(fp);
if(ch=='G')
{
ch=getc(fp);
if(ch=='P')
{
ch=getc(fp);
if(ch=='R')
{
ch=getc(fp);
if(ch=='M')
{
ch=getc(fp);
if(ch=='C')
{
/******指针向前定位*******/
ch=getc(fp); //跳过"C"
ch=getc(fp); //跳过第一个","
while(ch!=',')
{
ch=getc(fp);
}
ch=getc(fp); //跳过第二个","
while(ch!=',')
{
ch=getc(fp);
}
ch=getc(fp); //跳过第三个","
/*************提取纬度********************/
n==0;
fputs("纬度:",ff);
int s=0;
for(;ch!=',';s++)
{
n[s]=ch;
putc(ch,ff);
ch=getc(fp);
}
putc('n',ff);
putc('\n',ff);
for(;s<19;s++)
{
n[s]=' ';
}  //防止显示乱码

/******指针向前定位*******/
ch=getc(fp); //跳过第四个","
while(ch!=',')
{
ch=getc(fp);
}
ch=getc(fp); //跳过第五个","

/*************提取经度********************/
e==0;
fputs("经度:",ff);
int p=0;
for(;ch!=',';p++) //提取经度
{
e[p]=ch;
putc(ch,ff);
ch=getc(fp);
}
putc('e',ff);
putc('\n',ff);
for(;p<20;p++)
{
e[p]=' ';
}
/*************指针向前定位********************/
ch=getc(fp); //跳过第六个","
while(ch!=',')
{
ch=getc(fp);
}
ch=getc(fp); //跳过第七个","
v==0;
fputs("速度:",ff);//提取速度
int  i=0;
for(;ch!=',';i++)
{
v[i]=ch;
putc(ch,ff);
ch=getc(fp);
}
putc('v',ff);
putc('\n',ff);
for(;i<25;i++)
{
v[i]=' ';
}
}
}
}
/********判定是否为"$GPGGA"*********/
else  if(ch=='G')
{
ch=getc(fp);
if(ch=='G')
{
ch=getc(fp);
if(ch=='A')
/************指针向前定位******************/
{
ch=getc(fp);
ch=getc(fp);
for(int k=0;k<8;k++)
{
while(ch!=',')
{
ch=getc(fp);
}
ch=getc(fp); //跳过第二个","
}
/*************提取高度*********************/
m==0;
fputs("高度:",ff);
int  z=0;
for(;ch!=',';z++)
{
m[z]=ch;
putc(ch,ff);
ch=getc(fp);
}
for(;z<25;z++)
{
m[z]=' ';
}
putc('m',ff);
putc('\n',ff);
putc('\n',ff);
k++;//统计有多少组参数,经度纬度速度高度为一组
}
}
}
Edit1->Text=n; //纬度
Edit2->Text=e; //经度
Edit3->Text=v; //速度
Edit4->Text=m;
}
}
}
}
fclose(fp);
fclose(ff);
}
//---------------------------------------------------------------------------
/**************打开图片********************/
void __fastcall TForm1::Button2Click(TObject *Sender)
{

if(OpenPictureDialog1->Execute())
{
Button1->Enabled=false;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
Button8->Enabled=false;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
}
//---------------------------------------------------------------------------
/**************打开文件********************/
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Button1->Enabled=true;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=false;
Button5->Enabled=false;
Button6->Enabled=false;
Button7->Enabled=false;
Button8->Enabled=false;
if(OpenDialog1->Execute())
{
}
}
//---------------------------------------------------------------------------
/**************暂停继续********************/
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Button1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=false;
Button5->Enabled=true;
Button6->Enabled=true;
Button7->Enabled=true;
Button8->Enabled=true;
if(flag==0)
{
Button5->Caption="暂停";
flag=1;
}
else
{
Button5->Caption="继续";
flag=0;
}
}
//---------------------------------------------------------------------------
/**************停止********************/
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Button1->Enabled=true;
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=true;
Button5->Enabled=false;
Button6->Enabled=true;
Button7->Enabled=true;
Button8->Enabled=true;
stop=1;
}
//---------------------------------------------------------------------------
/**************轨迹重现********************/
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Button1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=false;
Button5->Enabled=true;
Button6->Enabled=true;
Button7->Enabled=true;
Button8->Enabled=true;

 /**************变量定义********************/
 char v[25]; //速度
 char n[19]; //纬度
 char e[20]; //经度
 char m[25];   //高度
 int line=1; //排
 stop=0;
 char ch;
 FILE *fpp=fopen("d:\\gps数据.txt","r");
 int o=0;
 int u=5*(k-2); //后提取的高度、第一组和最后一组参数可能不完整,故少循环2次

/**************校准点坐标参数********************/
if
(ComboBox1->Text=="望江校区校准点一")
   {
   Edit5->Text="104.081819" ;
   Edit6->Text="30.634669" ;
   Edit7->Text="305" ;
   Edit8->Text="302" ;
   }
else if
(ComboBox1->Text=="大地图校准点一")
   {
   Edit5->Text="104.190713" ;
   Edit6->Text="30.736990" ;
   Edit7->Text="3929" ;
   Edit8->Text="2248" ;
   }
if
(ComboBox2->Text=="望江校区校准点二")
   {
   Edit9->Text="104.078247" ;
   Edit10->Text="30.632311" ;
   Edit11->Text="164" ;
   Edit12->Text="400" ;
   }
 else if
(ComboBox2->Text=="大地图校准点二")
   {
 Edit9->Text="103.847543" ;
 Edit10->Text="30.372218" ;
 Edit11->Text="1412" ;
 Edit12->Text="5364" ;
    }
 float x1=atof(Edit7->Text.c_str());
 float y1=atof(Edit8->Text.c_str());
 float x2=atof(Edit11->Text.c_str());
 float y2=atof(Edit12->Text.c_str());
 float j1=atof(Edit5->Text.c_str());   //若要输入的定点不属于上速的2个点则从界面中输入定标的经度纬度
 float w1=atof(Edit6->Text.c_str());   //把字符串转换成浮点数、x定标 、y定标、
 float j2=atof(Edit9->Text.c_str());
 float w2=atof(Edit10->Text.c_str());
/**************第二次数据提取********************/
while(oProcessMessages();
}
Application->ProcessMessages();
if(line==1)            //二次提取纬度
{
n==0;
ch=fgetc(fpp);
while(ch!=':')
{
ch=fgetc(fpp);
}
ch=fgetc(fpp);  //跳过":"
int u=0;
for(;ch!='n';u++)  //纬度
{
n[u]=ch;
ch=fgetc(fpp);
}
for(;u<19;u++)
{n[u]=' ';}
ch=fgetc(fpp);   //跳过"n"
line++;          //第二行数据
}
else if(line==2)    //二次提取经度
{
e==0;
ch=fgetc(fpp);
while(ch!=':')
{
ch=fgetc(fpp);
}
ch=fgetc(fpp);
int b=0;
for(;ch!='e';b++)  //经度
{
e[b]=ch;
ch=fgetc(fpp);
}
for(;b<20;b++)
{
e[b]=' ';
}
ch=fgetc(fpp);
line++;
}
else if(line==3)     //二次提取速度
{
v==0;
ch=fgetc(fpp);
while(ch!=':')
{
ch=fgetc(fpp);
}
ch=fgetc(fpp);
int c=0 ;
for(;ch!='v';c++)  //速度
{
v[c]=ch;
ch=fgetc(fpp);
}
for(;c<25;c++)
{
v[c]=' ';
}
ch=fgetc(fpp);
line++;
}
else if(line==4)     //二次提取高度
{
m==0;
ch=fgetc(fpp);
while(ch!=':')
{
ch=fgetc(fpp);
}
ch=fgetc(fpp);
int d=0;
for(;ch!='m';d++)  //高度
{
m[d]=ch;
ch=fgetc(fpp);
}
for(;d<25;d++)
{
m[d]=' ';
}
ch=fgetc(fpp);
line++;      //第五行无数据
line++;
}
else
{
line=1;
ch=fgetc(fpp);
}
Edit2->Text=n;    //纬度
Edit1->Text=e;    //经度
Edit3->Text=v;    //速度
Edit4->Text=m;    //高度
Image1->Parent->DoubleBuffered=true; //双缓冲、防止不断刷新导致图片闪烁
Image1->Canvas->Pen->Width=4;   //画笔粗细
/************设置轨迹速度颜色****************/
if
(atof(Edit3->Text.c_str())*1.852>40)
{
Image1->Canvas->Pen->Color=clRed;
}
else if
(20Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=40)
{
Image1->Canvas->Pen->Color=clYellow;
}
else if
(10Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=20)
{
Image1-> Canvas->Pen->Color=clGreen;
}
else
{
Image1->Canvas->Pen->Color=clBlue;
}
 /********经纬度格式转换 *********/
 int a=int(atof(Edit1->Text.c_str())/100)*100; //经度bb
 float b=(atof(Edit1->Text.c_str())-a)/0.6+a;
 float bb=b/100;
 int c=int(atof(Edit2->Text.c_str())/100)*100;  //纬度dd
 float d=(atof(Edit2->Text.c_str())-c)/0.6+c;
 float dd=d/100;
/******坐标点定位和绘制轨迹 *******/
float x=(bb-j1)*(x1-x2)/(j1-j2)+x1;
float y=(dd-w1)*(y1-y2)/(w1-w2)+y1;

Image1->Canvas->MoveTo(x,y);
Image1->Canvas->LineTo(x,y);

/********实现滑动条随轨迹移动**********/
int width=int(x);
int height=int(y);
ScrollBox1-> HorzScrollBar-> Position   =width-ScrollBox1->Width/2;
ScrollBox1-> VertScrollBar-> Position   =height-ScrollBox1->Height/2;
o++;
}
fclose(fpp);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
/*****************画布设置*************************/
void __fastcall TForm1::FormCreate(TObject *Sender)
{
ComboBox1->Items->Add("望江校区校准点一");
ComboBox1->Items->Add("大地图校准点一");
ComboBox2->Items->Add("望江校区校准点二");
ComboBox2->Items->Add("大地图校准点二");
}
//---------------------------------------------------------------------------
/**************** 清楚轨迹**************************/
void __fastcall TForm1::Button7Click(TObject *Sender)
{
Button1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=true;
Button5->Enabled=true;
Button6->Enabled=true;
Button7->Enabled=true;
Button8->Enabled=true;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
//---------------------------------------------------------------------------
/*****************保存图片***********************/
void __fastcall TForm1::Button8Click(TObject *Sender)
{
Button1->Enabled=false;
Button2->Enabled=false;
Button3->Enabled=false;
Button4->Enabled=true;
Button5->Enabled=true;
Button6->Enabled=true;
Button7->Enabled=true;
Button8->Enabled=true;
 Image1->Picture->SaveToFile("d:\\1.BMP ");
}
//---------------------------------------------------------------------------

你可能感兴趣的:(Small,projects)