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

一、实验工具:

①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通信标准格式是美国国家海洋局电子协会制定的,语句达数十种之多,各种数据句型均以“$”开头,数据主要由帧头、帧尾和帧内数据组成,主要语句有GPGGA,GPVTG,GPRMC等。

数据提取:此实验中,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
(
20<atof(Edit3->Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=40)
{
Image1->Canvas->Pen->Color=clYellow;
}
else if
(10<atof(Edit3->Text.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 <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include<Jpeg.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <ExtDlgs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed ComponentsTButton *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 <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
#include<stdio.h>
#include<Jpeg.hpp>
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(o<u)
{
if(stop==1) break;    //停止
for(;flag==0;)          //暂停
{
Sleep(1);
Application->ProcessMessages();
}
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
(20<atof(Edit3->Text.c_str())*1.852&&atof(Edit3->Text.c_str())*1.852<=40)
{
Image1->Canvas->Pen->Color=clYellow;
}
else if
(10<atof(Edit3->Text.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; //经度bbfloat b=(atof(Edit1->Text.c_str())-a)/0.6+a;float bb=b/100;int c=int(atof(Edit2->Text.c_str())/100)*100;  //纬度ddfloat 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 ");
}
//---------------------------------------------------------------------------

GPS参数提取与轨迹重现实验相关推荐

  1. GPS参数提取及轨迹重现

    本项目分为两个版本: 1.基于百度地图API的轨迹快速重现,项目体验地址:GPS轨迹重现在线版 2.基于Leaflet的状态及轨迹重现,项目体验地址:GPS数据提取及轨迹重现 两者均采用在线地图,都需 ...

  2. 基于QT的运动参数提取与轨迹重现

    基于QT的运动参数提取与轨迹重现 前言 本项目中的原始数据可通过GPS模块读取串口内容或者直接利用手机某些APP导出原始文件得到,大概数据图如下: 本项目的核心就是利用上述数据,重现出整个运动轨迹并显 ...

  3. 语音信号的基音参数提取

    文章目录 一.目的及原理 1.短时自相关法 2.倒谱法 二.两种方法实现 1.短时自相关法 1.程序代码 2.运行结果 2.倒谱法 1.程序代码 2.仿真结果 三.分析对比 1.自相关法运行结果 2. ...

  4. 参数提取类毕业论文文献包含哪些?

    本文是为大家整理的参数提取主题相关的10篇毕业论文文献,包括5篇期刊论文和5篇学位论文,为参数提取选题相关人员撰写毕业论文提供参考. 1.[期刊论文]高精度GaAs PHEMT小信号模型参数提取 期刊 ...

  5. 【神经网络扩展】:断点续训和参数提取

    课程来源:人工智能实践:Tensorflow笔记2 文章目录 前言 断点续训主要步骤 参数提取主要步骤 总结 前言 本讲目标:断点续训,存取最优模型:保存可训练参数至文本 断点续训主要步骤 读取模型: ...

  6. 滤波器设计软件_滤波器设计——电路仿真软件的滤波器参数提取(下)

    本文章仅代表个人观点,如有错误缺漏,欢迎指正. 接上一节的内容. 按照上一节的方法,用仿真得到的频率和耦合曲线,修正电磁仿真软件的尺寸,经过5次迭代,就可以满足回波和带外抑制的要求.迭代过程如下(继续 ...

  7. matlab下对齿轮图片的参数提取

    matlab下对齿轮图片的参数提取 目标:基于matlab对下面图片的各个参数进行提取 图片预处理: 首先读入图片,二值化,用canny算子边缘提取,由于接下来要用与中心提取,细化边缘. 代码: bw ...

  8. 【FDTD Lumerical超材料S参数提取】

    FDTD Lumerical超材料S参数提取 一.S参数简介 二.S参数的提取原理 三.S-parameter分析组参数设置 四.S参数设置脚本 本文重点参考自Lumerical官方的此篇文章,以翻译 ...

  9. 信号完整性之Ansys SIwave_S参数提取(四)

    接着上一章的信号完整性之Cadence Sigrity Power SI_S参数提取(三),今天总结一下Ansys SIwave的S参数提取,顺便看一下两个不同软件对于同一个仿真流程有哪些相同点和不同 ...

最新文章

  1. 微生物组学研究的可再现性、可重现性、稳定性与普适性
  2. 少儿编程教会孩子如何思考,重视孩子的素质提升
  3. 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)
  4. ul li列表元素浮动导致border没有底边解决办法
  5. c 内嵌php 韩天峰,PHP-X系列教程之内置函数的使用示例
  6. 智能会议系统(32)---WebRTC学习之三:录音和播放
  7. SpringMVC多拦截器的执行
  8. 性能测试很难吗?一文带你学会性能测试核心流程和概念
  9. win7用计算机名共享打印机,WIN7共享打印机 可以同时多少台电脑共享一台打印机-win7一键共享打印机,win7一键共享工具软件...
  10. 计算有向图可达矩阵Matlab实现
  11. [NISACTF 2022]
  12. 修改ps工具栏字体大小
  13. 华为“不造车”的承诺,快到期了
  14. 逐行解析linux kernel NIC驱动
  15. VMware发布Linux虚拟桌面技术预览版
  16. 【gradle Composing builds】gradle依赖管理Composing builds之杂症-快速同步
  17. latex解决数据库中与或非符号如何打
  18. 洛谷三月月赛——P5238 整数校验器
  19. 新能源汽车车载双向OBC,PFC,LLC,V2G 双向 充电 新能源汽车车载双向OBC
  20. 二叉树进阶--二叉搜索树

热门文章

  1. 企业级360°全方位用户画像:标签系统[四]
  2. 网页图片无缝循环滚动html代码
  3. 【紧急整理】《信息资源管理》信息资源管理的标准与法规,第5章
  4. 阿克曼移动机器人优势介绍
  5. 光盘显示0字节可用_HT光盘刻录管理系统~一套光盘智能管理的系统解决方案
  6. 疑难杂症篇(三)--电脑显示已连接网络但是无Internet访问的解决方案
  7. python3.7教程百度云盘_Python新手教程百度网盘《怎么安装python3.7》
  8. 什么是公链,私链,联盟链?
  9. Setting学习(一)-静态界面
  10. 零售店铺想要日进斗金?这三个点照着做就行!