加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
VC++实现实时信息在矢量地图背景显示
来源:fjzsksw.com 2010-1-11 编辑:zhoupanyu 【字体:小 大】
电子地图应用作为一门新兴学科,已不仅限于地图制作中。本文利用VC++和OLE(Object Linking and Embedding, 对象连接和嵌入)编程技术,实现了实时信息在矢量地图背景上的显示。

 

  一、 前言

  电子地图应用作为一门新兴学科,已不仅限于地图制作中。本文利用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类,并增加了"mapinfow.h"和"mapinfow.cpp"两个源文件。

  3. 用OLE方式嵌入MapInfo进程

  在"mapApp.cpp"中CMapAppApp theApp语句下面加入下面的语句:

  DMapInfo mapinfo; file://mapinfo对象

  在CMapAppApp::InitInstance() 函数中增加OLE的初始化,代码如下:

  程序清单1 MapApp.cpp文件

  将"mapbasic.h"文件拷贝到本项目的目录中,在“stdafx.h”中增加以下代码,把mapinfo说明为全局变量:

  4. 显示地图窗口

  为CmapAppView类增加地图窗口的标识和句柄变量,在MapAppView.h文件中添加如下代码:

  打开类向导窗口,在Class Name下拉列表框中选择类CmapAppView,Object Ids列表框中选择CmapAppView,Messages列表框中选择OnInitialUpdate,单击Add Function为CmapAppView重载OnInitialUpdate()函数,然后在函数中添加显示地图窗口的代码。

  程序清单2 MapAppView.cpp文件

  5. 编译运行软件,将屏幕显示分辨率设置为1600′1024,则在右半屏出现地图窗口。现在剩下的工作只是加入接收目标数据并转换为经纬度后进行实时显示,这里只给出同地图窗口有关的部分,假设正在不断接收目标数据,写入全局变量中,并向CmapAppView类发送消息,调用CmapAppView类的 ShowMapLine()函数。在MapApp.cpp文件中添加全局变量定义:

  在MapApp.h文件中添加全局变量说明:

  在CmapAppView::OnInitialUpdate()函数的结束部分添加如下代码:

  /////////////////定义mapinfo中所用的变量

  在CmapAppView:: ShowMapLine()函数代码如下:

  程序清单3 MapAppView.cpp文件

  6. 编译运行软件,显示界面如下:

  要保存plane表,可在CmapAppView类的析构函数中添加下面的代码:

  程序清单4 MapAppView.cpp文件

  左屏显示内容的构造,可根据各软件系统的要求,显示数据,图表等,由VC++编程实现。

  三、 其它说明

  上面程序清单2中

  sprintf(str,"Add Map Window %lu Layer plane Animate",m_lWindowid);

  语句中的Animate属性一定要有,这表示将plane图层设置为动态(Animate)图层,每个地图窗口只能有一个动态图层,当这个图层上的对象变化时,地图窗口只刷新此图层,以便可以实现快速刷新。

  在应用OLE技术嵌入地图窗口的应用中,还可根据需要加入多种工具,用于地图信息的修改和查询,如标尺窗口,信息窗口,图层控制,图层选择编辑等,但在实时接收数据并显示的状态下,有些功能的使用将会导致访问冲突,以致程序出错,如图层控制、图层编辑等,原因是实时数据正在对plane表进行编辑,此时再改变其它图层,就与mapInfo一次只能编辑一个图层的原则产生了冲突。

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机