用VC++进行MapX二次开发
Writer:Bluedy er-huang@163.com
1.1 地理信息系统概念
地理信息系统(Geographical Information System),简称GIS,是一种决策支持系统。所谓决策支持系统(Decision Support Syetem),是能从管理信息系统中获得信息,帮助管理者制定决策的系统。从“地理信息系统”的名称上可以看出,地理信息系统可以分成两个部分,即“地理”和“信息”。“地理”代表空间信息,“信息”代表属性信息,两者通过地理编码,组成一个完整的系统。比如,在Mapinfo中,“地理”数据存储在MAP文件中,“信息”即属性数据存储在TAB和DAT文件中,“地理”数据和“信息”数据通过ID文件连接(地理编码)起来。理解这两者的概念,对学习GIS的应用是很有益处的。
1.2 地理信息系统的组成
硬件组成:至于硬件嘛,一台微机+外设。微机的配置要看具体的系统而定,不过,对于Mapinfo来说,要求是很低的,只要你运行Windows98不是很慢就可以了。外设就是个无底洞了,什么数字化仪、解析测图仪、扫描仪、工程打印机、测绘仪器、航测仪器……太多啦,视具体情况而定。当然,微机的一般外设是肯定要的(键盘鼠标等)。
软件组成:那要看选用什么GIS平台了,我们进行MapX二次开发,当然是MapX了,编译器为VC++5.0以上版本,操作系统为Windows系列(当然是Windows95以上了)。
1.3 地理信息系统的功能
至于GIS的功能,你想听学术上所说的功能呢还是想听听老百姓说的功能,学术说的功能,那真是太多了,简直把GIS说得天下独尊了、无所不用、无所不能了,你自己去找找相关的资料吧。就让我们来听听老百姓说的功能------画个地图、写几个字、换个样子。呵呵,神圣的GIS就是这个样子的吗?“群众的眼睛是雪亮的”,差不多吧。GIS的功能首先是显示地理位置(画个地图):我们接触到的很多信息都是与位置有关的,应用也很广泛,比如,你家住在哪里,哪里有商店,车辆开到了哪里,移动基站设在哪里合适,这些都可以用地图轻易地表现出来。GIS的功能其次是记录与位置相关的信息(写几个字):比如,你家的房子面积是多大,几时建的,建筑材料是什么,有几层,这些都可以用地物的属性记录下来。GIS的另外一个功能、也是非常重要的一个功能是:分析和建模。把所得的空间信息和属性信息综合起来进行分析,得到一些新的信息,以满足人们的需要。或建立数学模型,对现实中的事物进行模拟。
1.4 地理信息系统的发展
地理信息系统是随着计算机图形学的发展而发展起来的,在20世纪60年代,GIS还处于研究阶段,70年代就开始快速发展,80年代开始大量应用。不过,这可是国际上的GIS历史,对于我国,则是在80年代才开始研究: 80年代初中科院遥感所成立;武汉测绘科技大学、中国地质大学(武汉)、北京大学着手开发GIS系统;1989年武汉测绘科技大学开设信息工程(GIS)专业……随后,我国的GIS技术有了长足的发展,开始接近世界水平。但由于影像处理、数据库技术等相关技术的制约,GIS的开发还处在一个较浅的层次上。
题外话:由于前美国副总统戈尔提出数字地球的概念,让一直过于专业应用的GIS走到大众面前,GIS着实火了起来。“数字**城市”充斥于各个媒体上,人们都争相“开发”GIS,只要与GIS有一点关系的应用,就把这个庞大的家伙拿出来,“我这个系统采用最新的GIS技术”,浪费人力物力。拿个WEBGIS来说吧,本来GIS最重要的一个功能是空间分析,可人们就是不用桌面的应用程序来分析,却要用慢的象蜗牛功能简陋的象马王堆出土的地图一样的“WEBGIS”来做,至于哪个的分析功能强,我不说了。毕竟,“WEB热”+“GIS热”=“WEBGIS热”是符合数学公式的,我也就不必去推翻了。只是,劳动人民的血汗钱啊,几十万几百万的用来折纸飞机……。
用VC++进行MapX二次开发
之二------使用MapX的基石
Writer:Bluedy er-huang@163.com
在开始之前,我假设读者熟悉VC++编程(了解一些可以),且使用的系统安装好了VC++5.0(或以上版本,建议VC++6.0)和MapX4.0(或以上版本)。若你还没完成以上步骤,GetReader().Stop();请你满足前面的if语句。
好,现在让我们来开始我们的MapX之旅吧!
对于C++程序来说,每个MapX对象(Objects)都在MapX.h 和 MapX.cpp中用一个类来实现,类的名字和MapX对象的名字相同,且已经在CmapX中定义了。例如,DataSet对象用类CmapXDataset实现。这和C++类的定义相一致。
那么,每个对象的属性(Properties)呢?MapX的属性是用类的成员函数来实现的。比如刚才的DataSet对象的名字(Name),就是用Name()函数来实现的,不过,Name()有两种使用方法,即Get和Set。如:
CString GetName();//获取对象名字
void SetName(LPCTSTR);//设置对象名字
你是不是觉得Get和Set有点熟悉?那你看看下面的函数:
GetButtomInfo();GetButtomText();
SetButtomInfo();SetButtomText();
上面的函数可是MFC标准的、而且常用的函数哦。所以,你学MapX开发,可以想象成MapX里面的对象和属性就是MFC里面的类和成员函数。如此而已。
现在让我们来创建我们的MapX基石吧。
第一步:用VC++的程序向导来创建一个单文档程序MapXSample。
第二步:Project> Add To Project>Files,选择MapX.cpp和MapX.h。
第三步:定义一个CmapX对象。
class CMapxSampleView : public CView
{
……
protected:
CMapX m_ctrlMapX;
……
}
第四步:声明一个常量。View > Resource Symbols>New>name为IDC_MAP。
第五步:在类向导中为CMapXSampleView创建WM_SIZE 和 WM_CREATE的处理消息:
void CMapxSampleView::OnCreate(UINT nType, int cx, int cy)
{
m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this,IDC_MAP);
}
void CMapxSampleView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
m_ctrlMapX.MoveWindow(0,0,cx,cy,TRUE);
}
第六步:在类向导中为CMapXSampleView创建WM_SETFOCUS的处理消息,以确保当窗口处于活动状态时得到焦点。
void CMapxSampleView::OnSetFocus(CWnd* pOldWnd)
{
CView::OnSetFocus(pOldWnd);
m_ctrlMapX.SetFocus();
}
然后编译运行。看到了吗?这个就是一个最基本的MapX程序了,我把它称为“MapX的基石”,因为以后的程序都是在这个程序的基础上“缝缝补补”而来的。
用VC++进行MapX二次开发
之三------使用MapX工具
Writer:Bluedy er-huang@163.com
对于一个“标准”的Windows应用程序,一般都有一个工具栏。如果你用过某个GIS系统,一定用过工具栏上的工具。工具栏上的工具为我们提供了一个快速调用某个功能的捷径。我们这就来创建一个MapX的工具栏。
先来实现什么功能呢?我们来个模仿Mapinfo: 放大工具、 缩小工具。
要对图象进行放大缩小,该用什么算法呢?不必你操心!我们是进行二次开发,这些算法的实现,MapX都有了,我们只需要调用它的功能就行了。更绝的是,MapX已经内建了常用的“工具”。放大工具就是miZoomInTool,缩小工具就是miZoomOutTool。怎么使用能?好说,CmapX类有个CurrentTool函数,“属性和函数的名字一样”------当前工具,调用之即可。还记得前面的吧------Get和Set,现在不需要“获得”,而要“设置”,那么,该调用的函数为:
m_ctrlMapX.SetCurrentTool(miZoomInTool);//放大工具
m_ctrlMapX.SetCurrentTool(miZoomOutTool);//缩小工具
至于程序的实现,就是为工具栏的按钮添加消息处理函数,在函数体内添加上面的代码就可以了。调式运行,看看效果吧。
简单吧?就这么简单。别人都说vb进行MapX二次开发简单,你说呢?
MapX内建的工具有:
miArrowTool;
miPanTool ;
miCenterTool ;
miZoomInTool ;
miZoomOutTool ;
miSymbolTool ;
miTextTool ;
miSelectTool ;
miRadiusSelectTool;
miRectSelectTool ;
miPolygonSelectTool ;
miLabelTool ;
miAddLineTool ;
miAddPolylineTool ;
miAddRegionTool ;
miAddPointTool;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangjie_xiaoke/archive/2008/03/05/2151345.aspx