VC++调用MapInfo实时显示数据
更新时间:2024-01-31 07:10:01 阅读量: 教育文库 文档下载
摘要 本文介绍了在VC++实现的实时显示系统中,用OLE方式嵌入MapInfo矢量地图的编程方法,简要叙述了其实现过程。
一、 前言
电子地图应用作为一门新兴学科,已不仅限于地图制作中。本文利用VC++和OLE(Object Linking and Embedding, 对象连接和嵌入)编程技术,实现了实时信息在矢量地图背景上的显示。
程序应用于显示处理终端,接收并处理网络信息的部分在不同的系统中有不同的要求,这里不再赘述。
MapInfo矢量地图用图层方式进行存储和管理,每个图层对应地图上的一类要素(如居民地,水系,铁路,公路等),对于每个包含图形信息的图层,需要有4个文件(.dat, .tab, .map, .id)支持。
MapInfo地图允许嵌入一个地图窗口到任何能接受OLE对象的应用程序中。从服务器(如MapInfo)插入一个OLE对象到容器应用程序(如Microsoft Word),并在该应用程序中对这个对象进行处理。被嵌入的对象是来自服务器应用程序的对象的一个副本。对象一旦位于容器中,它将不再被链接到源对象。
在VC++应用程序中用OLE方式嵌入MapInfo进程,需定义了一个MapInfo对象(DMapInfo类),DMapInfo类在MapInfo类型库(Mapinfow.tlb)中定义。MapInfo软件提供了自己的编程语言MapBasic, VC++对地图进程的操作主要通过发送MapBasic命令来实现。
二、 创建程序框架
程序框架是用MFC实现的,MFC 应用程序向导(AppWizard)生成了大部分的代码,然后加入MapInfo进程。步骤如下:
1. 创建一个新项目,项目类型选择MFC AppWizard(exe),项目名称设为MapApp,其它按照提示进行设置即可。应用程序向导自动生成了三个类:
CmapAppApp 应用程序类
CmapAppDoc 文档类
CmapAppView 视图类
CmainFrame 主框架类
2. 添加MapInfo类型库
运行类向导,单击增加类按钮(Add Class ?),选择“From a type library”,找到
“Mapinfow.tlb”文件并打开,在“Confirm Classes”中选择“DMapInfo”类,单击OK确认输入并关闭对话框。现在MapApp应用程序中已添加了DMapInfo类,并增加了\和\两个源文件。
3. 用OLE方式嵌入MapInfo进程
在\中CMapAppApp theApp语句下面加入下面的语句:
DMapInfo mapinfo; file://mapinfo对象
在CMapAppApp::InitInstance() 函数中增加OLE的初始化,代码如下:
程序清单1 MapApp.cpp文件
BOOL CMapAppApp::InitInstance() {
if (!AfxOleInit()) file://OLE初始化
{ file://失败
AfxMessageBox(\失败!\
return FALSE; }
if (!mapinfo.CreateDispatch(\地图窗口处理进程
{ file://失败
AfxMessageBox(\
file://::MessageBox(0, mapinfo.GetFullName(), \
return FALSE; }
/*本处省略MFC自动生成的代码*/ }
将\文件拷贝到本项目的目录中,在“stdafx.h”中增加以下代码,把mapinfo说明为全局变量:
#include \
#include \
extern DMapInfo mapinfo; file://全局变量,地图窗口对象
4. 显示地图窗口
为CmapAppView类增加地图窗口的标识和句柄变量,在MapAppView.h文件中添加如下代码:
unsigned long m_lWindowid; file://地图窗口标识
HWND m_hWindowHwnd; file://地图窗口句柄
打开类向导窗口,在Class Name下拉列表框中选择类CmapAppView,Object Ids列表框中选择CmapAppView,Messages列表框中选择OnInitialUpdate,单击Add Function为CmapAppView重载OnInitialUpdate()函数,然后在函数中添加显示地图窗口的代码。
程序清单2 MapAppView.cpp文件
void CMapAppView::OnInitialUpdate() {
char str[256];
CView::OnInitialUpdate();
char str[256];
///创建航显底图
mapinfo.Do(\
mapinfo.Do(\
mapinfo.Do(\
sprintf(str,\
mapinfo.Do(str);//创建地图窗口
/*设置地图窗口的图层,由最上一层开始是中国疆域,各省疆域,省会城市,并标注上省会城市的名字*/
mapinfo.Do(\
mapinfo.Do(\Visibility On\
//获取地图窗口的ID号和句柄
m_lWindowid = atol(mapinfo.Eval(\窗口ID
sprintf(str,\窗口HWND
m_hWindowHwnd = (HWND)atol(mapinfo.Eval(str));
//调整地图窗口尺寸,将地图窗口放置在右半屏上
sprintf(str,
\Window %lu Position (8.3,0) Width 8.4 Height 6.05 ScrollBars Off SysMenuClose Off\m_lWindowid);
mapinfo.Do(str);
//调整地图窗口视野和中心点
double m_dView_center_x=113.35; file://地图窗口中心点,经纬度
double m_dView_center_y=35.04;
double m_dView_zoom = 4000.0; file://地图窗口视野,\
sprintf(str,\\\\
mapinfo.Do(str);//设置地图窗口中心点窗口视野
//设置地图窗口漫游缩放的右键菜单
mapinfo.Do(\漫游\\\缩小\\\calling 1706, \\\放大\\\
//创建实时航迹显示图层
mapinfo.Do(\
mapinfo.Do(\
sprintf(str,\
mapinfo.Do(str); file://实时航迹图层设置为快速刷新}
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(\飞机图标点对象
mapinfo.Do(\航迹线对象
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,
\\\\Transportation\\\
global_long, global_lat, m_angle); file://设置飞机目标显示的样式
mapinfo.Do(str); file://创建目标图标对象
if (global_num >0 )
{/*收到的第一点,在plane表中插入第一条记录,后面的点都是更新第一条记录*/
sprintf(str,
\ else {
sprintf(str,
\ }
mapinfo.Do(str);//用obj1对象更新表中的记录
//画各设备的航迹
sprintf(str,
\
global_long_last, global_lat_last , global_long, global_lat);
mapinfo.Do(str);//创建line1对象
if (global_num >0 )
{//第一个点不画航迹
sprintf(str,\
mapinfo.Do(str);
file://插入line1到表中
sprintf(str,\
mapinfo.Do(str); }
global_num ++; }
6. 编译运行软件,显示界面如下:
要保存plane表,可在CmapAppView类的析构函数中添加下面的代码:
程序清单4 MapAppView.cpp文件
CMapAppView::~CMapAppView() {
char str[256];
if (m_hWindowHwnd) file://地图窗口存在 {
sprintf(str,\
mapinfo.Do(str);
m_hWindowHwnd = NULL;
m_lWindowid = 0L;
mapinfo.Do(\保存实时航迹表 } }
左屏显示内容的构造,可根据各软件系统的要求,显示数据,图表等,由VC++编程实现。
三、 其它说明
上面程序清单2中
sprintf(str,\
语句中的Animate属性一定要有,这表示将plane图层设置为动态(Animate)图层,每个地图窗口只能有一个动态图层,当这个图层上的对象变化时,地图窗口只刷新此图层,以便可以实现快速刷新。
在应用OLE技术嵌入地图窗口的应用中,还可根据需要加入多种工具,用于地图信息的修改和查询,如标尺窗口,信息窗口,图层控制,图层选择编辑等,但 在实时接收数据并显示的状态下,有些功能的使用将会导致访问冲突,以致程序出错,如图层控制、图层编辑等,原因是实时数据正在对plane表进行编辑,此 时再改变其它图层,就与mapInfo一次只能编辑一个图层的原则产生了冲突。
正在阅读:
VC++调用MapInfo实时显示数据01-31
企业财务管理的重要性05-07
2022年乡村振兴驻村工作述职报告07-31
方山初级中2016—2017学年度第一学期前半期工作总结05-30
妈妈,不要对我发火12-29
6S考评和奖惩制度11-13
生物技术概论的期末复习总结11-19
实验小学科技活动计划,总结04-30
内层09-30
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 调用
- 实时
- MapInfo
- 数据
- 显示
- VC
- 咨询工程师继续教育试卷及答案 工程项目管理-98分
- 《思想道德修养与法律基础》讲稿之模块1:我的大学 我的青春
- 功能性服装工程和设计外文文献翻译 - 图文
- 必修一双向细目表 - 图文
- 生态水稻栽培技术
- 电动机的缺相保护
- 计算机组成原理课后习题解答
- 2016中职计算机网络技术模拟试题三
- 二年级古诗竞赛试卷
- 国际规则、规范最新发展及其对新造船的影响(HCSR EEDI)
- 河北文化古迹归总
- 二年级上册表内乘法口算练习题(10套)
- 青海省人民政府关于印发西宁经济技术开发区招商引资优惠政策的通知
- 什么是真正的男女平等?
- 隧道施工测量
- 李良荣 新闻学导论 强化练习及答案
- Linux VI
- 阿镇第二小学组织机构及其职能
- 学习策略 练习题含答案
- 河南省农村信用社贷后管理办法豫农信贷(2011.52号2011.6.29)