用VC++实现矢量地图背景下的实时显示
2008-11-14 19:35:22 来源:WEB开发网5. 编译运行软件,将屏幕显示分辨率设置为1600′1024,则在右半屏出现地图窗口。现在剩下的工作只是加入接收目标数据并转换为经纬度后进行实时显示,这里只给出同地图窗口有关的部分,假设正在不断接收目标数据,写入全局变量中,并向CmapAppView类发送消息,调用CmapAppView类的ShowMapLine()函数。在MapApp.cpp文件中添加全局变量定义: double global_long;//经度
double global_lat;//纬度
double global_long_last;//上一点经度
double global_lat_last;//上一点纬度
unsigned long global_num; file://接收点计数
在MapApp.h文件中添加全局变量说明:
extern double global_long;//经度
extern double global_lat;//纬度
extern double global_long_last;//上一点经度
extern double global_lat_last;//上一点纬度
extern unsigned long global_num; file://接收点计数
在CmapAppView::OnInitialUpdate()函数的结束部分添加如下代码:
/////////////////定义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];
//画飞机图标
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对象更新表中的记录
//画各设备的航迹
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一次只能编辑一个图层的原则产生了冲突。
更多精彩
赞助商链接