基于GIS组件技术的软件开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于GIS组件技术的软件开发
摘要:分析了GIS的功能组件MapX的主要框架和功能,旨在探讨如何在Visual C ++
析功能的MapX技术构建专用电子地图。

结果表明,在GIS组件的软件开发中,采用VC ++MapX的地理信息系统(GIS)开发技术相结合来开发电子地图,既方便灵活,又增强了软件的功能和可视效果。

关键词:MapX组件;电子地图;地理信息系统
0 引言
GIS是地理信息系统(Geographical Information System)的简称,是一种将空间位置信息与属性数据相结合的系统。

在实际应用中,以GIS技术为基础的应用软件已广泛用于军事、商业、航空等多种领域。

MapX是MapInfo公司提供的数字地图绘制控件,是一组基于GIS技术的应用组件,它由一个称为Map的ActiveX 控件(OCX)和约45个自动化对象组成,在标准的Windows编程环境下,能够与其他图形、多媒体、数据库开发技术组成完全独立的综合性应用软件,是基于前端应用业务的良好的地图开发环境。

使用MapX进行软件开发,可以向应用程序中添加强大的地图绘制功能,增强软件的空间分析能力。

1 MapX控件基础
1.1 MapX的结构分析
从横向分析,MapX是空间索引与空间实体相结合的一种结构,空间实体是地理图形信息的一种抽象模型,包括点、线、面3种类型。

任何点、线、面实体都可以用直角坐标点x、y来表示。

点可以表示成一组坐标(x,y),对于线和面,则均被表示成多组坐标(x1,y1,x2,y2,...,xn,yn);空间索引是查询空间实体的一种机制,通过空间索引,就能够以尽量快的速度查询到给定坐标范围内的空间实体及其所对应的数据;从纵向分析,MapX的空间数据结构是一种分层存放的结构。

如图1。

1.2 MapX的模型结构
MapX组件的基本构成单元是Object(单个对象)和Collection(集合)。

其中,集合包括对象,是多个对象的组合。

每种对象和集合负责处理地图某一方面的功能。

位于顶层的是Map 对象本身,其它均由Map对象继承。

Layers、DataSets、Annotations 是Map对象下面的三个重要的分支。

其中Layer主要用于操作地图的图层,DataSet用于访问空间数据表,Annotation用于在地图上增加文本或者符号。

1.3 MapX的主要功能
专题地图绘制。

使用专题地图绘制可以直观地表示数据。

将数据与地图上的对象相关联,然后使用颜色编码(或其它样式)来直观地表现数据。

逐层细化地图绘制。

通过简单的点击即可详查数据。

对于OLAP/DSS,可以通过点击让用户逐层细化到地图上的区域。

数据绑定。

可以连接大型数据库,通过空间数据服务技术,MapX可以动态操作数据库中存储的地理空间数据,并在空间服务器的支持下,完成高级的地理信息查询和复杂的空间分析功能。

注释。

可以自行定义注释的显示方位。

突出显示特定数据。

还可加入文本、符号、表格使地图信息更加丰富直观。

图层化。

可以显示和控制地图图层,使其缩放程度在预设的距离内时才显示。

可以使用或创建无缝图层,通过特殊图层来支持特殊的应用,这些特殊图层包括动画图层和UserDraw图层。

自动标签。

可以自动向地图添加标签,并可以控制其属性和显示。

特征工厂。

用FeatureFactory对象可以创建、合并、缓冲或清除点、线、区域对象。

工具集。

用户可以通过单击和拖放操作来与地图交互。

可以使用MapX内置的导航、选择、标签、缩放工具,或者创建自定义的工具来满足程序的要求。

地图编辑。

允许用户添加、修改、删除地图上的文本、编辑区域、点等特殊对象。

投影和坐标系。

通过支持各种坐标系统和地图投影,MapX 允许微调地图的显示并在本地坐标中处理X-Y坐标数据。

2 VC环境下软件开发
2.1 背景地图设置
首先要将MapX.h与Mapx.cpp两个文件加入工程中,定义并实现MapX对象的类。

前者是类的说明,后者是具体实现。

在访问MapX对象属性都是通过调用类的成员函数实现的。

MapX 中使用的图层有两种:一种是矢量图层,即一种基于坐标的数据结构,用于表达地图特性;另一种是栅格图层,即位图,它不能象矢量图层那样附加数据。

地图设置是在视图类(CMapxView)中实现。

在CMapxView中WM_CREATE的消息映射函数中创建地图,代码如下:
if(m_ctrlMapX.Create(NULL,WS_VISIBLE,CRect(0,0,300,300),thi s,IDC_MAP) == false) return 0;
调整地图尺寸是在CMapxView中的WM_SIZE的消息映射函数中实现,代码如下:
void CMapxView::OnSize(UINT nType,int cx,int cy)
{
CWnd::OnSize(nType,cx,cy);
if(cx!=0&&cy!=0) m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}
这样就可以实现视图大小改变时,地图也随之改变大小,使其充满客户区。

MapX是按图层组织地图的,图层对象代表矢量地图数据,其包含了一组地理特征。

获得图层集合对象是用MapX对象的GetLayers成员函数。

增加图层,是用图层集合对象的Add成员函数。

删除图层是用图层集合对象的Remove成员函数。

以下源代码能实现添加图层,同时在地图窗口显示该图层:
Layer = m_ctrlMapX.GetLayers().Add(varName,varPosition);
2.2 图形绘制方法
对于常用图形的绘制,如绘制符号、直线、多点线、区域及其格式,还有放大、缩小、漫游、选择等功能,MapX控件提供了接口,只需调用CMapX::SetCurrentTool(...)即可实现。

对于专用图形,如舰船、指挥所、站址徽标等图元的绘制,则要采用自定义方法,其步骤如下:
2.2.1 创建自定义工具
其函数为CmapX::CreateCustomTool(...)。

2.2.2 定义槽事件
在VC应用程序中利用ON_EVENT(the Class,id,dispid,pfnHandler,vtsParams)定义系列槽事件,如鼠标按下事件(DISPID_MOUSEDOWN),鼠标弹起事件(DISPID_MOUSEUP),工具被使用事件(MapX_DISPID_TOOLUSED)等来实现控件事件的触发。

2.2.3 使用自定义工具进行绘图
(1)图形的绘制。

首先,获取图形的关键点坐标:将鼠标在屏幕上按下,触发MapX控件窗口的MouseDown事件,记下按点坐标(x1,y1),并拖动后再弹起,触发MouseUp事件,记下弹起点坐标(x2,y2)。

接着,利用CmapX3ConvertCoord(...)函数将屏幕坐标转换成经纬度坐标(x1',y1'),(x2',y2'),再利用(x1',y1'),(x2',y2')组成矩形,在此矩形内选取绘制图形的关键点坐标;获取图形的关键点坐标,再利用如下函数实现线、弧或区域图元:
m_ctrlMapX.GetFeatureFactory().CreateLine(...);
m_ctrlMapX.GetFeatureFactory().CreateArc(...);
m_ctrlMapX.GetFeatureFactory().CreateRegion(...);
最后利用m_ctrlMapX.GetFeatureFactory().CombineFeatures(...)将图元组合成一个实体图形,取出实体图形的中心坐标(x0,y0),并转化为屏幕坐标(x0',y0')。

(2)图形的移动、放大、缩小。

对于图形的移动、放大、
缩小,只需用Select工具选中拖动即可。

(3)图形的旋转。

首先,利用ConvertCoord(...)函数,将图形关键点经纬度坐标转换为屏幕坐标,然后进行坐标平移变换,变成以图形中心点(x0',y0')为原点的坐标,再利用旋转变换公式:
x' = xcos θ–ysin θ,y' = xsin θ+ ycos θ,
进行旋转变换,得到新的以中心点为原点的坐标,接着进行坐标逆平移变换,得到新的关键点屏幕坐标,再将这些关键点屏幕坐标转化为经纬度坐标,重新进行图形绘制,并通过void CMapXLayer::DeleteFeature(...)来删除初始图形。

2.3 目标航迹的绘制
根据目标信息中的位置、航向等信息,在电子地图上,根据需要可实时显示目标的航迹。

首先,定义航迹图元:CMapXFeature MapXTrackFeature;然后,定义航迹点集,包括使用多点航迹:
CMapXPoints TrackPoints;
MapXTrackFeature.SetType(miFeatureTypeMulti-point);
由于该系统采用的是线型航迹,所以定义:
MapXTrackFeature.SetType(miFeatureTypeLine);
以下为目标航迹显示代码:
For(int i=0;i<PNum;i++)
{ if ((pTrackP[i].nX<=0)‖(pTrackP[i].nY<=0))
{
TrackPoints.DetachDispatch(); return FALSE;
}
TrackPoints.AddXY(pTrackP[i].nX/100,pTrackP[i].nY/100);
}
MapXTrackFeature.GetParts().Add(TrackPoints);
MapXTrackFeature.Update();
……
3 结束语
在地理信息系统中利用基于AcitveX技术的MapX组件建立进行软件开发,与其它技术相比,GIS组件开发速度快,占用资源少,而且易实现许多底层的编程和开发功能,加之结合应用成熟的VC ++
一步增强了软件的可视化效果。

但由于MapX支持的空间数据有限,无法直接操作除MapInfo格式之外的地理信息数据,限制了其在特殊领域的应用。

此外,电子地图的精度有待于进一步提高,这些方面都是今后还须完善的地方。

参考文献:
[1]刘光.地理信息系统二次开发教程-组件篇[M].北京:清华大学出版社,2004.
[2]邬伦,刘瑜.地理信息系统-原理,方法和应用[M].
北京:科学出版社,2005.
[3]李兰友,VC ++.NET图形图像编程[M].北京:电子工业出版社,2005.
[4]刘刀桂、孟繁晶.VisualC ++-数据库篇[M].北京:中国铁道出版社,2003.
[5]梁日辉,罗建军.MapX在VC ++
用图标系统的研究[J].计算机应用与软件,2005(6).。

相关文档
最新文档