Mapx的VC开发实践

   摘  要  阐述了在VC环境下引入MapX控件的方法,以及在文档视图架构下如何使用MapX控件的问题,介绍了MapX数据绑定的方法及其与MapX专题图创建的关系,阐明了创建MapX专题图的一般方法,并给出了具体实例。
    关键词  MapX;VC程序设计;专题图制作

1 引言

MapInfo MapX是一个用来做地图化工作的OCX控件,它可以很容易地在您的应用程序中加入强大的制图功能。它可以把您的数据用地图的形式显示出来,更易于理解。地图形式可以比简单的图表、图形提供更多的信息,而且描述地图比描述数据表更加简单迅速。
专题图是按照特定专题渲染地图的过程,以图形的形式在地图上表示数据。通常使用数据集中的一组或多组数据,利用颜色渲染、填充图案、符号、直方和饼图等方式表示数据。根据数据中的特定值指派这些颜色、图案或符号,创建不同的专题地图。
微软的Visual C++6.0技术成熟、应用广泛、影响巨大,在应用软件的开发方面是首选的开发环境之一。而MapX编程的教程通常是以VB为基础的。利用VC编译MapX程序比利用VC编写MapX程序要相对复杂一些,兼容性也要差一点。因此利用VC编写MapX程序的可供参考的教程和示例代码相对较少。但因为大量的应用软件采用VC编写、大量的软件公司采用VC作为开发工具,因此在VC环境中引入MapX控件进行MapX功能开发就非常重要。本文的目的在于具体阐述VC环境下基于MapX控件创建专题地图的方法。

2 VC下MapX开发环境的建立

2.1 MapX控件的引入

要在VC下使用MapX的各个功能来编写程序,首先必须要确保MapX控件已经在系统中安装并注册。在 MapX Web 站点 <http://www.mapx.com> 上找到最新的示例应用程序。该示例应用程序的源代码文件夹中包含MapX.h和MapX.cpp两个文件,这两个文件实际上分别就是MapX控件的类层次定义文件和COM接口实现文件。把这两个文件拷贝到应用程序所在的文件夹。或者将MapX安装目录下“\MapInfo\MapX 5.0\Samples50\C++\Cpp”文件夹下的MAPX.H和MAPX.CPP文件,拷贝到VC应用程序的工程目录下。然后再在VC++6.0集成开发环境的“Project”菜单中点击“Add To Project”→“Files”,弹出“Insert File Into Project”对话框。在文件列表框中列出了项目中的文件。按住“Control”键的同时选中MapX.h和MapX.cpp两个文件,然后点击对话框中的“OK”按钮,完成MapX控件的插入。

2.2 Doc/View下MapX控件的使用

MAPX是一个窗口控件,要想在Doc/View中使用就必须动态创建,一般遵从这样的步骤:
(1)添加资源ID,需要在工程的资源视图下的String Table下增加一个ID。
(2) 添加MAPX控件头文件的引用,可以直接把MAPX头文件的引用添加到工程的StdAfx.h文件中,这样就不必在其他的很多文件中添加这个引用了。
(3)声明CMapX类型变量,在视图类中写入形如CMapX  m_ctrlMapX的声明。
(4)使用MAPX的Creat方法,在工程中视图类创建的时候创建MAPX控件,其代码为:
int C**View::OnCreate(LPCREATESTRUCT lpCreateStruct) // (视图类的WM_CREATE消息响应函数)
{
if (CView::OnCreate(lpCreateStruct) == -1)  
return -1;
RECT windRect; GetClientRect(&windRect);
//取得视图区域 
if (!m_ctrlMapX.Create(NULL, WS_VISIBLE, windRect, this,IDS_MAPX1))       return -1;
//以当前视图窗口为父窗口,以IDS_MAPX1为标识,创建一个可见的、无窗口名称的、
//覆盖整个视图区域的MAPX控件窗口。
return 0;
}
(5)设定控件的初始状态, 如果简单的创建了MAPX控件在显示的时候会显示美国的地图,这样就需要在视图出现前改变MAPX的基本设置,改变默认地图以及改变地图中心、缩放率、是否可编辑、是否可选择以及添加一些新图层等操作。
(6)添加MAPX控件的事件响应。给动态生成的MAPX控件添加事件需要槽事件处理宏来处理消息映射。首先要在视图类的头文件H文件中声明宏DECLARE_EVENTSINK_ MAP();然后在视图类的CPP文件中加入MapX事件处理函数映射宏
BEGIN_EVENTSINK_MAP(CHWDView, CView)
//CPP文件中消息映射
END_EVENTSINK_MAP()
其中BEGIN_EVENTSINK_MAP带有两个参数,第一个参数当前类、第二个参数是当前类的基类。BEGIN_ EVENTSINK_MAP和END_EVENTSINK_MAP()是一对定义事件映射的宏,其间可以插入自定义的MapX控件消息映射。

3 基于MapX创建专题图

3.1 数据绑定与专题地图

数据绑定是将数据源中的数据导入 MapX 的过程。为了增强GIS系统数据处理的灵活性,系统分开存储涉及的图形矢量数据及空间属性数据。MapX通过数据集集合(Datasets)对象,可以将用户的属性数据与地图的空间数据连接起来,属性数据与几何数据的关联是通过数据绑定实现的。数据绑定的数据源可以是ODBC数据源、MapInfo Table文件、安全数组等。要绑定一个数据源,首先要指定所绑定的图层,然后需要指定与图层中地图对象相匹配的关键字段。将自己的数据绑定到地图上主要有以下两个优点:一是可以将数据作为地图上的图元查看;二是可以将属性数据绑定到地图上,然后使用该绑定创建基于数据的专题地图。
数据绑定的实现是通过Datasets.Add方法实现的。DataSets.add方法原型为DataSets.Add (Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic])。对大多数数据绑定类型, SourceData其实是一种OLE接口。MapX通过这个接口直接从数据源中访问数据,数据并没有真正传递给DataSets.Add。
当绑定时数据包含经度和纬度,且要在新的图层相应的位置上创建这些点时需使用BindLayer 对象。通过数据绑定,可以将BindLayer对象作为一个参数,使用Datasets.Add方法将自己的数据转变为一个DataSet。
在 MapX中有Field对象和Fields对象。在数据绑定时,MapX 对绑定的每个数据列均需要开销,通过Field对象和Fields对象只绑定地图中需要的数据。使用Datasets.Add 的Fields 参数建立要绑定到地图上的字段。字段集合对象的Add方法的原型为[Field=]OBJECT.Add (DataSourceCol, [Name], [AggregateFunction], [Type])  // DataSourceCol取值为数据源中字段名或索引值。
数据绑定事件:一旦数据源的某列被定义为地理列,并且确定了绑定数据的图层,则绑定就开始进行。数据源的每一行都和一个图元相匹配且数据将会带入地图。如果某行有不匹配发生,则DataMismatch事件被激活。当数据源发生变化时,MapX通过调用DataSet.Refresh来刷新数据。但数据源有新行时,此方法并不添加新图元。

3.2 专题地图的制作

MapX中使用Themes集合与Theme对象来实现对专题图的支持,每个Themes集合中可以包含多个Theme对象,也就是说,针对一个Dataset,可以创建多幅不同的专题地图。每个Dataset都拥有一个Themes集合,并以其属性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制专题的添加和删除。
在创建专题图的过程中,有几个关键因素,包括专题图变量的确定、属性数据的获取以及专题图层的显示与控制。
在进行专题图规划时,首先要确定专题图变量。在专题图中显示的数据就是专题图变量。一个专题变量可以是一个字段或表达式。取决于专题图的类型,在一张地图上可以显示一个或多个专题图变量。范围值、等级符号、点密度和独立值地图都只检查一个变量。可以利用饼图或直方图一次显示多个专题变量。也可以创建双变量专题地图,其中一个地图对象可代表两个不同的数据,用符号的颜色代表一个专题变量,符号的大小代表另一个专题变量。
在创建专题地图之前,必须确定需要显示何种信息,信息存储在什么位置。它可以在创建地图时所基于的表中,也可以在ODBC支持的外部数据库中。数据来源于Field对象或Field集合,在Themes.Add方法中通过Fields参数传递。
具体在创建专题图时,首先应将某个产生专题图数据的dataset通过数据绑定引入地图中,之后使用Themes.Add方法创建一个Theme对象。代码为:curmap.Datasets(1).Themes. Add(miThemeRanges,‘TotPop’,‘’),函数的语法为Themes. Add([Type], [Field], [Name])。Type用于定义要创建的专题图的类型,它的取值范围是ThemeTypeConstants,该参数可选,如果没有定义或者定义为 miThemeAuto,MapX会根据字段数以及已经存在的专题图类型自动在ThemeTypeConstants中选择一个。如果MapX无法自行确定专题类型,就会产生一个错误。Field(s)定义在专题图中使用的一个或多个字段,可以通过字段名、字段索引或字段对象来引用。当创建多变量专题图时,可以使用数组表示。该字段是可选的,若不特意指定,MapX会使用DataSet中的第一个数字型字段。Name,即专题图的名称,String类型参数,若不指定,MapX会自动生成一个名字。
专题图创建好后,有两种方法可以控制专题地图。一是使用Theme.ThemeDlg方法。该方法显示一个对话框,用户可以直接修改专题图特性。语句如下为curmap.Datasets(1).Themes(1).ThemeDlg;这种方法虽然简单,但是很难与自己的程序风格相一致,用户界面不友好,而且在这个默认的对话框中,用户可以随意改变任何设置,使得程序的控制难度加大。二是改变ThemeProperties对象属性。通过设置ThemeProperties对象属性,可以使用自己定制的界面,给用户有限的修改能力,实现起来也非常简单,而且对用户的操作有全部的控制权。ThemeProperties对象是Themes集合中的一员,主要用于定义专题地图的显示,包括颜色、符号等。ThemeProperties对象的属性中有许多又属于其他对象,如RangeCategory、Individualvalue、Style等,可进行更深层次的设定。

3.3 专题图实例

图1是以中国各省(区、市)的人口密度为专题图变量绘制的范围专题图。从图1中可以看出,我国西北地区人口密度最小,东南区域人口密度相对较大;江苏、台湾、河南、山东人口密度较大,西藏人口密度最小。

图1 中国各省(区、市)人口密度专题图

4 结束语

使用专题渲染在地图上显示数据时,可以清晰地展现在数据列表中几乎无法显现的样式和趋势,为用户的决策支持提供依据。本文实现了VC环境下基于MapX控件创建专题图,为在VC环境下开发MapX程序做了初步探索和有益启示。

转载于:https://www.cnblogs.com/kenter/archive/2010/12/28/1919150.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php的特殊类型

资源 PHP引用的外部数据称为资源&#xff0c;所以资源只能读取&#xff0c;不能创建 <?phpheader(content-type:text/html;charsetutf-8);$mysql_linkmysql_connect(localhost,root,123456);var_dump($mysql_link);echo <br>;$filefopen(./1.txt,r);var_dump($file…

php中自动转换、强制转换、其他数据类型和bool转换

0x01 自动转换 运算过程需要的数据类型和提供的数据类型不一致&#xff0c;将数据类型转为自己需要的类型 <?phpheader(content-type:text/html;charsetutf-8);echo 1aa7c;echo <br>; ?>加号做数字运算&#xff0c;会将字符串转为数字 0x02 强制转换 强制将…

php字符串连接符、三元运算符

字符串连接符&#xff1a;. <?phpheader(content-type:text/html;charsetutf-8);echo my name is. .DL_one; ?>三元运算符 形式&#xff1a;表达式&#xff1f;值1&#xff1a;值2 表达式为true&#xff0c;返回值1&#xff0c;为false&#xff0c;返回值2 <?ph…

java多线程知识_学习知库丨Java多线程知识大全

进程&#xff1a;每个进程都有独立的代码和数据空间(进程上下文)&#xff0c;进程间的切换会有较大的开销&#xff0c;一个进程包含1--n个线程。线程&#xff1a;同一类线程共享代码和数据空间&#xff0c;每个线程有独立的运行栈和程序计数器(PC)&#xff0c;线程切换开销小。…

螺旋遍历_螺旋形式的水平阶遍历

螺旋遍历Problem statement: 问题陈述&#xff1a; Write a program to print Level Order Traversal in spiral form of a binary tree. 编写一个程序以二叉树的螺旋形式打印Level Level Traversal 。 Example: 例&#xff1a; For the above tree:Basic level order trave…

SharePoint2007安装图文详解二:安装AD(活动目录)及DNS

在上一篇SharePoint2007安装图文详解一&#xff1a;安装IIS及相关组件中已经介绍了IIS及相关组件的安装&#xff0c;本篇将详细介绍AD&#xff08;活动目录&#xff09;的安装。 打开“管理您的服务器”&#xff0c;点击“添加或删除角色” 点击“添加或删除角色”后弹出“配置…

php的foreach

作用&#xff1a;遍历数组 索引数组 形式&#xff1a;foreach(数组 as 值){ //操作 } <?phpheader(content-type:text/html;charsetutf-8);$personarray(DL_one,18,man);foreach($person as $chara){echo $chara,<br>;} ?>2. 关联数组 形式&#xff1a;foreach…

ExtJs实践(3)——xtype名称与控件对应

xtype可作为Ext控件的简写&#xff0c;都会对应一个Ext控件。当然这里你也可以自定义这个xtype&#xff0c;通过自定义的Ext控件来绑定&#xff0c;主要由Ext.reg方法去注册xtype。Ext.all.js里面包含的xtype包含&#xff1a; xtype Class ------------- -------…

Linux 2440 LCD 控制器

嵌入式Linux之我行&#xff0c;主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验&#xff0c;二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处&#xff0c;谢请指正。共享资源&#xff0c;欢迎转载&#xff1a;http://hbhuanggang.cublog.cn 一、开…

php的create_function、function_exists判断函数是否存在

create_function 格式&#xff1a;create_function(‘参数’,‘函数体代码’) 作用&#xff1a;创建匿名函数 <?phpheader(content-type:text/html;charsetutf-8);$func create_function($a,$b, return ($a$b););echo $func(10,20); ?>function_exists 返回值为boo…

php的传值与传址

默认情况下&#xff0c;函数的参数都表示是值传递&#xff0c;但是&#xff0c;如果在定义函数的参数前面加上取地址符&#xff0c;表示传递的是地址值 传值&#xff1a; <?phpheader(content-type:text/html;charsetutf-8);function changeValue($num){$num10;}$value5;c…

php中函数的默认值,参数的顺序

形式参数可以在定义时候给参数赋一个默认值&#xff0c;默认值不能是一个变量&#xff0c;可以是常量&#xff0c;当调用函数时&#xff0c;如果没有参数&#xff0c;函数就会按照默认值处理&#xff0c;如果传递了参数&#xff0c;就按照传递的参数处理 <?phpheader(cont…

10款精选的用于构建良好易用性网站的jQuery插件

这篇随笔收集了10款非常给力的jquery 插件&#xff0c;帮助你构建易用性良好的网站&#xff0c;希望对你有用&#xff01; Embedded help system 看过该插件demo后&#xff0c;感叹道&#xff0c;真是太棒了&#xff01; 点demo里的How to下面的几个链接看看效果:) Embedded …

常见的Java审计代码函数关键字_转载:Java代码审计汇总系列(一)——SQL注入

原文链接&#xff1a;https://cloud.tencent.com/developer/article/1534109一、代码审计相比黑盒渗透的漏洞挖掘方式&#xff0c;代码审计具有更高的可靠性和针对性&#xff0c;更多的是依靠对代码、架构的理解&#xff1b;使用的审计工具一般选择Eclipse或IDEA&#xff1b;审…

php中函数参数个数问题

形参大于实参 <?phpheader(content-type:text/html;charsetutf-8);function fun($name,$sex,$age){echo 名字是.$name,<br>;echo 性别是.$sex,<br>;echo 年龄是.$age,<br>;}fun(DL_one,21); ?>可以看出&#xff0c;能执行但报错 实参个数大于形参个…

php的静态变量static在函数内部

静态变量放在函数内 <?phpheader(content-type:text/html;charsetutf-8);function fun(){static $num1;$num;echo $num,<br>;}fun();fun(); ?>静态变量放在函数内&#xff0c;作用域没变&#xff0c;生命周期变了&#xff0c;页面执行完毕才销毁&#xff0c;静态…

java json帮助类_java 写一个JSON解析的工具类

上面是一个标准的json的响应内容截图&#xff0c;第一个红圈”per_page”是一个json对象&#xff0c;我们可以根据”per_page”来找到对应值是3&#xff0c;而第二个红圈“data”是一个JSON数组&#xff0c;而不是对象&#xff0c;不能直接去拿到里面值&#xff0c;需要遍历数组…

php函数的预加载

php代码的执行过程&#xff1a;词法分析-------语法分析------------编译-----------加载编译的代码--------执行 函数的预加载就是在加载编译的代码过程中&#xff0c;会把函数的代码加载到内存中去&#xff0c;搜易我们在执行代码的时候&#xff0c;函数已经在内存中了 <…

php中的__FUNCTION__

__FUNCTION__:魔术常量&#xff0c;获取函数名 <?phpheader(content-type:text/html;charsetutf-8);function fun(){echo __FUNCTION__;}fun(); ?>

数字图像的大小、所需比特数(二维)

二维数字图像所需的比特数根据公式&#xff1a; 其中&#xff1a; b&#xff1a;数字图像所需的比特数 MN&#xff1a;数字图像的行和列 k&#xff1a;由灰度级算出&#xff0c;公式如下&#xff1a; L&#xff1a;图像的灰度级 比如&#xff1a; 存储一幅大小为 1024x1024&a…