结束部分添加如下代码:
/////////////////定义mapinfo中所用的变量
mapinfo.Do("Dim obj1 As Object"); file://飞机图标点对象
mapinfo.Do("Dim Line1 As Object"); file://航迹线对象
global_num = 0; file://接收目标数据计数初始化为0
在CmapAppView:: ShowMapLine()函数代码如下:
程序清单3 MapAppView.cpp文件
void CMapAppView::ShowMapLine()
{
char str[256];
file://画飞机图标
double m_angle = COPI*atan2((global_lat - global_lat_last),
(global_long - global_long_last))-90;//目标角度
sprintf(str,
"Create Point Into Variable obj1 (%lf,%lf) Symbol (85,255,30,\"MapInfo Transportation\",0,%lf)",
global_long, global_lat, m_angle); file://设置飞机目标显示的样式
mapinfo.Do(str); file://创建目标图标对象
if (global_num >0 )
{/*收到的第一点,在plane表中插入第一条记录,后面的点都是更新第一条记录*/
sprintf(str,
"Update plane Set Obj = obj1 Where RowID = %lu",1);}
else {
sprintf(str,
"Inset Into plane (ID,Obj) Values (%lu,Line1) ", global_num);
}
mapinfo.Do(str);//用obj1对象更新表中的记录
file://画各设备的航迹
sprintf(str,
"Create Line Into Variable Line1 (%lf,%lf) (%lf,%lf) Pen MakePen(2,2,255)",
global_long_last, global_lat_last , global_long, global_lat);
mapinfo.Do(str);//创建line1对象
if (global_num >0 )
{//第一个点不画航迹
sprintf(str,"Fetch Last From plane");
mapinfo.Do(str);
file://插入line1到表中
sprintf(str,"Insert Into plane (ID,Obj) Values (%lu,Line1)",global_num);
mapinfo.Do(str);
}
global_num ++;
}
6. 编译运行软件,
要保存plane表,可在CmapAppView类的析构函数中添加下面的代码:
程序清单4 MapAppView.cpp文件
CMapAppView::~CMapAppView()
{
char str[256];
if (m_hWindowHwnd) file://地图窗口存在
{
sprintf(str,"Close Window %lu",m_lWindowid);
mapinfo.Do(str);
m_hWindowHwnd = NULL;
m_lWindowid = 0L;
mapinfo.Do("Commit Table plane");//保存实时航迹表
}
}
左屏显示内容的构造,可根据各软件系统的要求,显示数据,图表等,由VC++编程实现。
三、 其它说明
上面程序清单2中
sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);
语句中的Animate属性一定要有,这表示将plane图层设置为动态(Animate)图层,每个地图窗口只能有一个动态图层,当这个图层上的对象变化时,地图窗口只刷新此图层,以便可以实现快速刷新。
在应用OLE技术嵌入地图窗口的应用中,还可根据需要加入多种工具,用于地图信息的修改和
查询,如标尺窗口,信息窗口,图层控制,图层选择编辑等,但在实时接收数据并显示的状态下,有些功能的使用将会导致访问冲突,以致程序出错,如图层控制、图层编辑等,原因是实时数据正在对plane表进行编辑,此时再改变其它图层,就与mapInfo一次只能编辑一个图层的原则产生了冲突。