还剩91页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
目录目录用MapX与C#开发地理信息系统TOC\o1-3\h\z第四章MapX与C#实例
54.1MapX图层建立
54.
1.1MapX数据与地图的组织结构
54.
1.2实例1建立/添加一个用户自定义图层
54.
1.3在MapX中使用栅格图层
74.
1.4实例2栅格图层的建立
84.2图元自动标注
94.
2.1实例3给图层加上自动标注功能
94.3MapX地图集
94.
3.1什么是MapX地图集Geoset
94.
3.2实例4打开已存在的地图集文件
104.
3.3实例5保存地图集
104.4内置工具的使用
114.
4.1使用标准工具
114.
4.3实例6内置标准工具的使用
114.5自定义工具
124.
5.1创建自定义工具
124.
5.2实例7创建测量长度和面积自定义工具
134.6MapX地图符号样式的定制
144.7在图层上添加自定义图元
154.
7.1实例8鼠标点击向图层上添加图元
154.
7.2实例9给定坐标向图层上自动添加图元
174.8获得图元属性
204.
8.1实例10获取选定图元的属性
204.9图元的选取
214.
9.1实例11实现InfoTip功能
214.10图元属性的修改
224.
10.1实例12修改图元属性
224.11实例13图元的查询
234.12实例14鹰眼图的实现
244.13数据绑定
264.14GPS在GIS系统中的应用
274.
14.1定位信息的接收
274.
14.2定位信息的提取
274.
14.3定位信息在MapX中的显示
284.
14.4实例15GPS定位系统的应用
284.15多媒体信息在GIS系统中的应用
334.
15.1GIS中嵌入多媒体的方法
334.
15.2实例16在MapX系统中嵌入多媒体数据33第五章MapX与Oracle结合
355.1Oracle数据库对GIS的支持
355.
1.1面向对象的数据库支持
355.
1.
2.Oraclespatial组件的引入
355.2循序渐进学习OracleSpatial在MapX中的应用
365.
2.1oralce服务器的安装
365.
2.2准备由OracleSpatial存储的图层文件
365.
2.3Easyloader上载工具
365.
2.4图层信息在Oracle中的存储结构
385.
2.5用程序实现MapX图元到oracle数据库的上载
425.
2.6用程序实现oracle数据表数据下载至MapX中显示
445.
2.7图元样式的还原
465.3在网络环境下实现图层信息共享47第六章MapCtrl控件的开发方法
576.1主要功能
576.2开发步骤
576.3程序实现58第七章分发基于.net平台的MapX应用程序
917.
1.NETFramework概述
917.
2.NETFramework的主要组件和功能
927.
2.1公共语言运行库
927.
2.
2.NETFramework类库
927.3安装.NETFramework
937.4Map客户安装
937.5制作安装程序93第四章MapX与C#实例这一章我们通过若干专题来介绍用C#如何开发MapX应用程序
4.1MapX图层建立
4.
1.1MapX数据与地图的组织结构MapX地图是由一个一个图层合成而来MapX将其所有基础信息以MapInfo表的形式组织起来;每一表都是一组MapInfo文件,用来在地图中建立一个图层这一组MapInfo文件包括.Somefile.tab图层属性结构定义文件,该文件描述MapInfo表的结构它是描述包含数据文件格式的小文本文件.Somefile.dat(.mdb、.aid或.dbf)图层属性记录文件,这些文件包含表格数据.可用记事本或相应的数据库管理软件打开浏览数据.Somefile.map图层空间记录文件,该文件描述空间图形对象(如果该表没有任何地图对象,则该文件将不存在).Somefile.id图层索引文件,该文件是将数据与空间对象相链接的交叉引用文件(如果该表没有任何地图对象,则该文件将不存在).Somefile.ind它是索引文件.通过该索引文件,您可以使用Find对象搜索地图对象要创建图层就要了解这些内部机理,方能思路清晰下面是一个创建自定义层的例子
4.
1.2实例1建立/添加一个用户自定义图层
4.
1.
2.1程序功能在地图上建立一个用户自定义的图层,该图层上的每个图元包括图元编号、图元名称、图元描述、图元坐标等属性,并且生成一个数据集与该图层绑定
4.
1.
2.2程序实现publicboolNewUserLayerstringlayerName//新建自定义图层,若存在则添加到图层集中{MapXLib.Layerlayer;MapXLib.Fieldsflds=newMapXLib.FieldsClass;flds.AddStringFieldsource,50,false;flds.AddStringFieldname,50,false;flds.AddStringFieldidentity,50,false;flds.AddStringFielddescription,50,false;flds.AddStringFieldfoundTime,50,false;flds.AddFloatFieldobjX,false;flds.AddFloatFieldobjY,false;MapXLib.LayerInfolayerInfo;layerInfo=newMapXLib.LayerInfoClass;layerInfo.AddParameterFileSpec,@appDirectory+\\+layerName+.tab;layerInfo.AddParameterName,layerName;layerInfo.AddParameterFields,flds;layerInfo.AddParameterAutoCreateDataset,1;layerInfo.AddParameterDatasetName,ds+layerName;if!File.Exists@appDirectory+\\+layerName+.tab{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable;}else{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;}try{layer=axMap
1.Layers.AddlayerInfo,1;axMap
1.Refresh;returntrue;}catch{returnfalse;}}
4.
1.
2.3程序说明1flds是MapXLib.Fields对象,即图层的属性字段集,将来会出现在.tab文件中用newMapXLib.FieldsClass来实例化一个新的Fields对象在对任何对象进行引用前,必须先实例化该对象AddStringField,AddFloatField是Fields字段集对象的两个方法,分别用来定义字符串字段及浮点型字段,并添加到Fields字段集对象中有关AddStringField,AddFloatField的语法请参考MapX文档2MapXLib.LayerInfo对象是用来增加新层的一个非常好的方法,在layerInfo中具体定义该层的一些参数layerInfo.AddParameterFileSpec,@appDirectory+\\userDrawLayer.tab指定该层的存放路径@为转义字符,appDirectory为应用程序目录变量,可用Directory.GetCurrentDirectory来得到userDrawLayer.tab为该层的.tab文件名layerInfo.AddParameterName,userDrawLayer指定该层的名字”userDrawLayer”,名字将会出现在图层控制对话框中layerInfo.AddParameterFields,flds指定该图层的属性字段集对象,即上面新定义的MapXLib.Fields对象layerInfo.AddParameterAutoCreateDataset,1指定是否自动产生数据集,1自动产生,0不产生有关数据集的概念,在后续部分再重点作介绍layerInfo.AddParameterDatasetName,dsUserLayer;指定数据集的名字“dsUserLayer”layerInfo.Type属性指定新层的类型MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable指定产生一新层MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab指定一存在的图层axMap
2.Layers.AddlayerInfo,1语句增加layerInfo所定义的新层,其中“1”代表增加至图层最上面这样就得到一个名为userdrawlayer的图层,并且得到一个名为dsUserLayer的数据集与该图层自动绑定利用这种方法建立数据集非常方便,也非常好用在一般情况下都可满足系统的需求该数据集可理解为一张表格,该表格的结构即为上面定义的flds字段集对象,该表格中的每一个记录对应图层上每一个图元的属性记录编号名称描述经度纬度01北京市中华人民共和国国首都....……………3LabelProperties用来说明如何用数据集中的数据标注图层上每一个图元layer.LabelProperties.Dataset指定数据集对象layer.LabelProperties.DataField指定用数据集中哪个字段值标注图元layer.LabelProperties.Position指定标注位置layer.LabelProperties.Style.TextFont.Size指定标注的字体及大小等layer.LabelProperties.Offset指定标注离图元中心的距离下面我们就可以在刚建立好的图层上描绘自己的内容了
4.
1.3在MapX中使用栅格图层
4.
1.
3.1什么是栅格图象栅格图象是由多行微小的点(象素)组成的一种计算机化的图象如果手头有扫描仪及扫描软件,可以通过扫描一幅纸张地图来创建栅格图象完成地图扫描并将其保存于文件中后,即可在MapInfo中显示该文件有多种不同的栅格图象文件格式MapInfo能够处理以下格式的栅格图象文件JPEG、GIF、TIFF、PCX、BMP、TGA(Targa)和BIL(SPOT卫星图片)
4.
1.
3.2什么是配准栅格图象配准一幅栅格图象时,要输入地图坐标(如经度/纬度),并指定栅格图象上与该坐标对应的点因为栅格图象文件不包含地理坐标信息,所以要在MapInfoProfessional中显示栅格图象前必须进行配准,以使MapInfoProfessional在显示图象时能够完成地理计算,如计算距离和面积等在MapInfoProfessional中首次打开一幅栅格图象时,MapInfoProfessional显示“配准栅格图象”对话框填写该对话框以告知MapInfoProfessional如何配准图象MapInfoProfessional将栅格图象配准信息保存在表文件中以供以后使用下一次打开该栅格图象表时就不必再进行配准了这样,只须对栅格图象进行一次配准栅格图层的应用在地理信息系统中也有重要作用一般作为背景使用,特别是可作为鹰眼图的背景使用,可防止在改变视图时引起的刷新
4.
1.
3.3配准栅格图像若还没有在MapInfoProfessional中显示过某个栅格图象,执行下述步骤配准该图象1选择“文件”>“打开”,“打开”对话框出现2从“文件类型”下拉列表中选择“栅格图象”MapInfoProfessional显示栅格图象文件清单3选择要打开的栅格图象文件并选择“打开”弹出一个MapInfoProfessional对话框,点击“配准”按钮MapInfoProfessional显示“图象配准”对话框该栅格图象的一个预览出现在对话框的下半段4通过选择“投影”按钮并完成“选择投影”对话框来设定该图象的地图投影配准栅格文件时,初始的投影方式就是表的缺省投影如果通过扫描纸张地图创建栅格图象,该纸张地图应包含所用的地图投影信息如果不能确定地图投影,使用缺省地图投影(经/纬度)缺省地图投影方式是由“地图窗口参数设置”中的“缺省投影”设置的如果不清楚的话,可以使用经纬度5把鼠标光标移到对话框下半段的预览图象上,并移到一个已知地图坐标(例如经/纬度)的点,再单击鼠标按钮MapInfoProfessional显示“增加控制点”对话框6通过输入对应于在地图图象上单击位置的地图坐标,完成“增加控制点”对话框记住,本初子午线以西的任何位置有负的经度,赤道以南的任何位置有负的纬度因此,西经73度对应于X值-73如果以度为单位输入坐标,必须输入小数度而不是度/分/秒7重复步骤5和6,直到输入最少三个控制点要保证精确结果,输入五或六个控制点所增加的每个控制点有助于MapInfoProfessional把地球坐标同栅格图象上的位置联系起来理想地,在图象的每个角至少有一个控制点所需的控制点数依赖于栅格图象的性质如果不能确定地图投影或正在使用没有实际地图投影的图象,例如航空照片,也许要输入二十或更多控制点8完成增加控制点后选择“确定”MapInfoProfessional把该栅格图象显示在地图窗口中完成“图象配准”对话框后,MapInfoProfessional把配准信息保存到一个表文件(.tab)中这样我们就可以象利用普通Mapinfo表文件一样来用这个栅格图层了
4.
1.4实例2栅格图层的建立
4.
1.
4.1程序功能装载一栅格图层到图层集合的最低层
4.
1.
4.2程序实现publicboolLoadRasterLayerstringlayerName{intlayerNumber=axMap
1.Layers.Count;try{axMap
1.Layers.AddlayerName+.tab,layerNumber+1;returntrue;}catch{returnfalse;}}
4.
1.
4.3程序说明装载栅格图层与载载普通图层一样,用同样的语法结构Layers.Add
4.2图元自动标注对一个图元加上标注可直观的给用户识别地图上的每一个地理对象,在MapX中可设置自动标注图元和手工标注图元
4.
2.1实例3给图层加上自动标注功能
4.
2.
1.1程序实现privatevoidautoLabelstringlayerName{MapXLib.Layerlayer=axMap
1.Layers._ItemlayerName;MapXLib.Datasetds=axMap
1.DataSets._Item“ds”+layerName;layer.LabelProperties.Dataset=ds;layer.LabelProperties.DataField=ds.Fields._Item“name”;layer.LabelProperties.Position=MapXLib.PositionConstants.miPositionBC;layer.LabelProperties.Style.TextFont.Size=10;layer.LabelProperties.Offset=4;layer.AutoLabel=true;}
4.
2.
1.2程序说明1程序中假定layer层在生成时已生成与之绑定的数据集,其名称为”ds”+layerName具体作法请参见实例新建自定义图层2用LabelProperties对象来定义标注的内容,字体,位置等例子中用数据集的name字段的内容来标注图元,标注位置在图元下方偏移4个单位,字体大小为103layer.AutoLabel=true打开自动标注功能,若要关闭所有标注可简单地置标注的visible属性为false
4.3MapX地图集
4.
3.1什么是MapX地图集Geoset地图集即图层的的集合,MapX控件的Geoset属性即为要打开的地图集对象地图集对象的扩展名为.gst它可由MapX所带的工具GeosetManager来生成,请读者自己一试Geoset保留地图图层及其设置的集合,以便于您使用Geoset是由同一地理区域的标准MapInfo格式地图文件.tab组成的数据集,因此命名为GeosetGeoset可以帮助您避免在每次要作为示例地图处理图层时要分别打开和显示这些图层的耗时的工作.gst是包含若干元数据关键字的文本文件,告诉MapX显示哪些表以及如何显示它们在打开一个Geoset时,它自动默认显示打开在Geoset中包括的所有文件开发人员可以更改该默认显示以满足自身的要求Geoset的设置包括投影、默认缩放、对象的自动加标签、缩放图层以及在打开时表是否可见MapX也将打开开发人员指定的任何单个.tab地图文件Geoset是出于方便目的提供的,不是MapX行使功能所必需的
4.
3.2实例4打开已存在的地图集文件
4.
3.
3.1程序功能在硬盘中选择一个地图集文件.gst,然后在MapX中打开,并保存地图的初始属性如初始时的缩放比例及中心位置等
4.
3.
3.2程序实现openFileDialog
1.DefaultExt=*.gst;openFileDialog
1.Filter=geosetfile*.gst|*.gst;openFileDialog
1.ShowDialog;ifopenFileDialog
1.FileName==return;axMap
1.GeoSet=openFileDialog
1.FileName;mapZoom=axMap
1.Zoom;//缩放值定义为横跨地图的宽度mapCenterX=axMap
1.CenterX;mapCenterY=axMap
1.CenterY;
4.
3.
2.3程序说明例程中由openFileDialog可在运行中任意打开所需的地图集对象,然后把该地图集文件名赋给地图的GeoSet属性即可后面三行是用于保存地图集的初始缩放比例及中心位置,以便能够在运行过程中随时恢复到起始视图状态下
4.
3.3实例5保存地图集
4.
3.
3.1程序功能在新建或添加一个图层后,地图集改变,在此时应保存改变后的地图集,以方便下次一次性打开所有图层,发挥geoset的作用下面的程序实现这一功能
4.
3.
3.2程序实现stringgeosetFileName=;saveFileDialog
1.InitialDirectory=@appDirectory;saveFileDialog
1.Filter=geosetfiles*.gst|*.gst;ifsaveFileDialog
1.ShowDialog==DialogResult.OKgeosetFileName=saveFileDialog
2.FileName;elsereturn;axMap
1.SaveMapAsGeosetaxMap
1.Title.ToString,@geosetFileName;
4.
3.
3.3程序说明1appDirectory为应用程序目录变量,可用Directory.GetCurrentDirectory来得到;2saveFileDialog对话框来得到地图集的文件名及路径;3saveMapAsGeoset方法来保存地图集,其语法为voidSaveMapAsGeosetSystem.Stringname,System.StringfileSpec
4.4内置工具的使用大多数地图绘制应用程序提供各种工具来协助完成常见的绘图任务(例如在地图上绘制线条)和导航任务(例如放大)MapX提供若干常见地图绘制工具,并且您还可以创建自己的定制工具
4.
4.1使用标准工具使用MapX,您可以很容易地将常见工具栏按钮并入应用程序中MapX提供对若干常见地图绘制工具的内置支持,可实现大部分地图功能,包括•令用户更改地图的比例和/或位置的导航工具(放大、缩小、平移、居中)•让用户单击地图图元以给它加标签的加标签工具•为用户提供各种方法来选择地图图元的一组选择工具•对象创建工具,用于创建新的地图图元提供对修改键(SHIFT键、CTRL键)的内置支持的选择工具使用选择工具的同时按住SHIFT键;该工具将取消选择图元;使用选择工具的同时按住CTRL,该工具会将图元添加到选择中只要按下修改键MapX就会自动显示不同的光标(加号或减号出现在该光标旁),以便用户可以理解该键的用途下面列出内置工具常量miArrowTool=1000单击标题或注释此外,在可编辑图层中移动选定图元或调整选定图元的大小miPanTool=1001漫游工具miCenterTool=1002使…成为中心工具miZoomInTool=1003地图放大工具miZoomOutTool=1004地图缩小工具miSymbolTool=1005符号注释工具miTextTool=1006文本注释工具miSelectTool=1007图元选择工具miRadiusSelectTool=1008扇形选择工具miRectSelectTool=1009矩形选择工具miPolygonSelectTool=1010多边形选择工具miLabelTool=1011标注工具miAddLineTool=1012画线工具miAddPolylineTool=1013画折线工具miAddRegionTool=1014画区域工具miAddPointTool=1015画点图元工具
4.
4.3实例6内置标准工具的使用
4.
4.
3.1程序功能实现地理信息系统中常见的工具栏按钮功能,并入应用程序中
4.
4.
3.2程序实现//放大按钮axMap
2.CurrentTool=ToolConstants.miZoomInTool;//恢复到初始视图按钮axMap
2.ZoomTothis.mapZoom,this.mapCenterX,this.mapCenterY;//漫游按钮axMap
2.CurrentTool=MapXLib.ToolConstants.miPanTool;//增加点图元按钮MapXLib.Stylestyle=newMapXLib.StyleClass;style.PickSymbol;axMap
2.DefaultStyle=style;layerInsertion.Editable=true;axMap
2.Layers.InsertionLayer=layerInsertion;axMap
2.CurrentTool=MapXLib.ToolConstants.miAddPointTool;//增加折线图元按钮MapXLib.StylestylePolyLine=newMapXLib.StyleClass;stylePolyLine.PickLine;axMap
2.DefaultStyle=stylePolyLine;layerInsertion.Editable=true;axMap
2.Layers.InsertionLayer=layerInsertion;axMap
2.CurrentTool=MapXLib.ToolConstants.miAddPolylineTool;//增加区域图元按钮MapXLib.StylestyleRegion=newMapXLib.StyleClass;styleRegion.PickRegion;axMap
2.DefaultStyle=styleRegion;layerInsertion.Editable=true;axMap
2.Layers.InsertionLayer=layerInsertion;axMap
2.CurrentTool=MapXLib.ToolConstants.miAddRegionTool;
4.
4.
2.3程序说明1currentTool属性用来选择当前工具;2在上面增加图元的例程中,style.PickSymbol方法用来取得新图元的样式,包括大小.线型.颜色.填充方案等,以增加程序的灵活性;3特别注意在增加图元时,不仅要设置当前图层为可编辑,而且要把当前层指定为图层集合的可插入层,即要指定图层集的insertionLayer属性
4.5自定义工具MapX内置工具给我们编程提供了很大的方便,但在一些情况下还远远不能满足用户需求,在这种情况下,我们就要进行自定义工具了
4.
5.1创建自定义工具在您为任何应用程序创建一个定制工具时,通常要执行三步1创建工具2编写工具处理程序(工具实际执行功能的代码)3使用该工具(令用户开始使用工具)
4.
5.2实例7创建测量长度和面积自定义工具在GIS系统中,长度及面积的测量是一项重要功能,它也是典型的自定义工具的使用的例子,各种书中都有相应介绍,在这里就在c#下创建自定义长度测量及面积测量工具的例程介绍如下
4.
5.
3.1程序功能创建两个自定义工具测量长度及测量面积
4.
5.
3.2程序实现//首先声明长度测量及面积测量工具常量privateconstintmiGetLength=100;//自定义用户工具测量长度privateconstintmiGetArea=101;//自定义用户工具测量面积//然后创建长度测量及面积测量工具axMap
2.CreateCustomToolmiGetLength,MapXLib.ToolTypeConstants.miToolTypePoly,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,false;axMap
2.CreateCustomToolmiGetArea,MapXLib.ToolTypeConstants.miToolTypePolygon,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,false;//最后在PolyToolUsed实现两个工具privatevoidaxMap1_PolyToolUsedobjectsender,AxMapXLib.CMapXEvents_PolyToolUsedEvente{ife.toolNum==miGetLength{MapXLib.Pointspts=MapXLib.Pointse.points;MapXLib.Pointpt1,pt2;doubled=
0.0;forinti=1;ipts.Count;i++{pt1=pts._Itemi;pt2=pts._Itemi+1;d+=axMap
2.Distancept
1.X,pt
1.Y,pt
2.X,pt
2.Y;}statusBarPanel
2.Text=距离+d.ToString;}elseife.toolNum==miGetArea{MapXLib.Pointspts=MapXLib.Pointse.points;MapXLib.FeatureFactorydd=axMap
2.FeatureFactory;MapXLib.Stylestyle=axMap
2.DefaultStyle;statusBarPanel
2.Text=面积+dd.CreateRegionpts,style.Area.ToString;}}
4.
5.
2.3程序说明注意这些代码一定要在polytoolused事件中实现,因为每种工具使用都要在多点下才能完成这里用了Distance及Area来获得其长度和面积,其它代码请读者自己仔细品味,相信读者会读懂它,不再做解释
4.6MapX地图符号样式的定制在mapinfo中,图元分为点线面三种,每种图元都有自己的样式库我们用内置工作miAddLine,miAddPoint,miAddRegion时,都是使用各自的默认样式画出相应的点线面图元我们可以在画之前更改其样式,以达到自己所需要的样式这就是我们前面画图元时首先调用style.pickSymbol,style.pickLine,style.pickRegion的原因,也可以在图层对话框中更改其样式,图层对话框的调用方法为layerDialog;然而,mapinfo所带样式库还是非常有局限,不可能提供所有的符号和样式,来满足各行各业的应用如果能够对符号库进行扩充那么就非常完美了可喜的是mapinfoprofessinal自带的mapbasic程序symbol.mbx可以帮助我们完成这一工作下面给出点符号样式的扩充方法如图在mapinfo中运行mapbasic程序,选择symbol.mbx工具菜单下将会出现“创建新符号”,单击子菜单“新建一个”,出现符号编辑器,对新符号创建完成后按保存出现保存成功对话框注意本人用的是mapinfoprofessional
7.0,若为以前的版本,可能会有所不同,具体请参考相关资料Mapinfo也支持位图形式的点符号,位图作为一个点显示在图层某个位置上位图存放在"ProgramFiles\CommonFiles\MapInfoShared\MapXCommon\CUSTSYMB"子目录下MapX存放在”ProgramFiles\MapInfo\MapX
5.0\CUSTSYMB”子目录下我们只需要得到符号的位图文件然后存在CUSTSYMB下就可完成位图号的扩充这样,我们基本可以达到需要什么就能画什么的程度
4.7在图层上添加自定义图元下面我们实现这样一个功能,在例程1新建的图层上画一个位图形式的点符号分两种情况(1)给出点的位置坐标,自动出现在图层上;(2)未给出位置坐标,由用户在图层上用鼠标点击出现Form上有若干文本输入框,用于输入图元各信息number图元编号,caption图元名称,descr图元描述,下面一确定按钮点击出现
4.
7.1实例8鼠标点击向图层上添加图元
4.
7.
1.1程序功能
4.
7.
1.2程序实现privateconstintmiAddSymbol=106;//自定义用户工具添加用户图元到图层,在类的变量声明部分定义axMap
2.CreateCustomToolmiAddSymbol,MapXLib.ToolTypeConstants.miToolTypePoint,MapXLib.CursorConstants.miSizeAllCursor,MapXLib.CursorConstants.miSizeAllCursor,MapXLib.CursorConstants.miSizeAllCursor,false;//创建该自定义工具,在formload事件中定义privatevoidaxMap1_ToolUsedobjectsender,AxMapXLib.CMapXEvents_ToolUsedEvente//在toolUsed实现该添加点图元自定义工具{ife.toolNum==miAddSymbol{//取得点击外的位置坐标x=e.x1;y=e.y1;MapXLib.Pointpnt=newMapXLib.PointClass;MapXLib.RowValuerv=newMapXLib.RowValueClass;MapXLib.RowValuesrvs=newMapXLib.RowValuesClass;MapXLib.Featureftr;MapXLib.FeatureFactoryfeaFac;MapXLib.StylenewStyle=newMapXLib.StyleClass;feaFac=axMap
2.FeatureFactory;//定义点图元的样式newStyle.SymbolType=MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;//指定为位图样式newStyle.SymbolBitmapSize=20;//指定图元大小newStyle.SymbolBitmapName=bitmapfilename;//指定位图文件名newStyle.SymbolBitmapTransparent=true;//指定位图透明,和图层融为一体axMap
2.AutoRedraw=false;userLayer.Editable=true;pnt.Setx,y;ftr=feaFac.CreateSymbolpnt,newStyle;//用featuerFactory生成该位图图元//******************************************************//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性//******************************************************dsUserLayer=axMap
2.Layers._Item
1.DataSets._Item1;//例程1中自动生成的dataset.fldsUserLayer=dsUserLayer.Fields;rv.Dataset=dsUserLayer;forintj=1;j=fldsUserLayer.Count;j++{ifj==1{rv.Field=fldsUserLayer._Itemj;rv.Value=number.ToString;}ifj==2{rv.Field=fldsUserLayer._Itemj;rv.Value=caption;}ifj==3{rv.Field=fldsUserLayer._Itemj;rv.Value=descr;}ifj==4{rv.Field=fldsUserLayer._Itemj;rv.Value=x;}ifj==5{rv.Field=fldsUserLayer._Itemj;rv.Value=y;}rvs.Addrv;}userLayer.AddFeatureftr,rvs;//向图层增加该图元userLayer.Refresh;}//下面是对确认按钮的编程,调用刚才实现的miAddSybol用户自定义工具publicvoidaddUserSymbolstringinfoBitmapname,stringinfoNumber,stringinfoCaption,stringinfoDescr//{ bitmapfilename=infoBitmapname;number=infoNumber;caption=infoCaption;descr=infoDescr;axMap
2.CurrentTool=MapXLib.ToolConstantsmiAddSymbol;}另外一种不需自定义用内置的miAddTool添加
4.
7.2实例9给定坐标向图层上自动添加图元
4.
7.
3.1程序功能
4.
7.
3.2程序实现这种情况下不需要自定义miAddSymbol工具,直接编程实现,代码大致相同,示例如下publicvoidAddUserSymbolrefFeatureInfofeatureInfo,stringlayerName//增加到userlayer后插入oracle表中,userName必须为工作层{try{MapXLib.Pointpnt=newMapXLib.PointClass;MapXLib.RowValuerv=newMapXLib.RowValueClass;MapXLib.RowValuesrvs=newMapXLib.RowValuesClass;MapXLib.Featureftr;MapXLib.FeatureFactoryfeaFac;MapXLib.Layerlayer=axMap
1.Layers._ItemlayerName;MapXLib.StylenewStyle=newMapXLib.StyleClass;feaFac=axMap
1.FeatureFactory;newStyle.SymbolType=MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;newStyle.SymbolBitmapSize=20;iffeatureInfo.identity==1{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorBlue;newStyle.SymbolBitmapOverrideColor=true;}elseiffeatureInfo.identity==2{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorGreen;newStyle.SymbolBitmapOverrideColor=true;}else{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorRed;newStyle.SymbolBitmapOverrideColor=true;}newStyle.SymbolBitmapName=featureInfo.symbolFileName;newStyle.SymbolBitmapTransparent=true;axMap
1.AutoRedraw=false;//禁止图层自动刷新layer.Editable=true;pnt.SetfeatureInfo.point_x,featureInfo.point_y;ftr=feaFac.CreateSymbolpnt,newStyle;//******************************************************//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性//******************************************************MapXLib.DatasetdsUserLayer;MapXLib.FieldsfldsUserLayer;dsUserLayer=axMap
1.DataSets._Itemds+layerName;fldsUserLayer=dsUserLayer.Fields;rv.Dataset=dsUserLayer;//MI_PRINX索引构成规则number前2位加yymmddhhmmssDateTimemyDataTime=DateTime.Now;iffeatureInfo.source==nullfeatureInfo.source=6;stringrownumber=featureInfo.source.PadLeft2,0+myDataTime.Year.ToString+myDataTime.Month.ToString+myDataTime.Day.ToString+myDataTime.Hour.ToString+myDataTime.Minute.ToString+myDataTime.Second.ToString;forintj=1;j=fldsUserLayer.Count;j++{iffldsUserLayer._Itemj.Name.ToUpper==MAINID{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.featureID;}iffldsUserLayer._Itemj.Name.ToUpper==SOURCE{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.source;}iffldsUserLayer._Itemj.Name.ToUpper==NAME{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.name;}iffldsUserLayer._Itemj.Name.ToUpper==IDENTITY{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.identity;}iffldsUserLayer._Itemj.Name.ToUpper==DESCRIPTION{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.description;}iffldsUserLayer._Itemj.Name.ToUpper==FOUNDTIME{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.foundTime;}iffldsUserLayer._Itemj.Name.ToUpper==MEDIA{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.media;}iffldsUserLayer._Itemj.Name.ToUpper==X{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.point_x;}iffldsUserLayer._Itemj.Name.ToUpper==Y{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.point_y;}rvs.Addrv;}layer.AddFeatureftr,rvs;layer.Refresh;this.InsertIntoOraclefeatureInfo,rownumber,ftr.Style,symbol,ftr,layerName;DeleteAllfeaturesuserLayerName;}catch{}axMap
1.AutoRedraw=true;}
4.
7.
2.3程序说明
1.位图必须放在custSymb子目录下,且位图不支持24位以上真彩色,大小最大48点
2.本例程不仅画出了位图图元,还给出了设置图元属性的方法1指定rowvaluer数据集rv.dataset=dsUserLayer;2通过rowvalue.field指定要修改的字段rv.Field=fldsUserLayer._Itemj;3通过rowvalue.value指定该字段的值rv.Value=caption;4把每个rowvalue增加到rowvalues集合中去,该rowvalues代表该图元的所用属性;5利用图层的addfeaturefeature,rowvalues方法增加新的图元这样我们可以用记事打开相应图层的.dat文件查看我们增加的新图元的所有属性
4.8获得图元属性在地理信息系统获取某个图元的属性是最基本的功能之一,实现起来也比较简单
4.
8.1实例10获取选定图元的属性
4.
8.
1.1程序功能用内置选择工具选择某一图元,然后返回该图元的所有属性
4.
8.
1.2程序实现publicstring[]GetSymbolPropertystringlayerName{MapXLib.Layerlayer=null;MapXLib.Datasetds=null;MapXLib.Fieldsfields=null;try{layer=axMap
1.Layers._ItemlayerName;ds=axMap
1.DataSets._Itemds+layerName;fields=ds.Fields;symbolInfo=newstring[fields.Count];}catch{returnnull;}foreachMapXLib.Featureftrinlayer.Selection{forinti=1;i=fields.Count;i++{layer.KeyField=fields._Itemi.Name;symbolInfo[i-1]=ftr.KeyValue.ToString;}}returnsymbolInfo;
4.
8.
1.3程序说明
1.属性值的获得首先设置图层的KeyField关键字段属性layer.KeyField=ds.Fields._Itemj.Name;然后利用图元的keyvalue即可得到图元该字段的值ftr.KeyValue
2.循环所有字段就取得图元的所有属性forinti=1;i=fields.Count;i++
3.在本例中将所有属性全转化为string类型存于字符串数组symbolInfo[]中
4.9图元的选取图元选取利用MapX内置的各种选取工具即可,我们对地图的操作往往都是针对地图上所选取的图元进行的,所以许多操作都要在这个选取上作文章了图元的选取利用selection集合,非常方便,同selectionchanaged事件结合可以做很多令人兴奋的效果下面举得例子是利用selection集合及selectionchanged事件实现类似infoTip的功能,即当鼠标指在当前选中图元上时,会自动出现该图元的所有提示.这个功能当然可以用图层的labelproperty属性和数据集绑定实现,但我觉得下面的方法会更好
4.
9.1实例11实现InfoTip功能//too1tip属性定义,在formload事件中toolTip1.AutoPopDelay=5000;toolTip1.InitialDelay=1000;toolTip1.ReshowDelay=500;toolTip1.ShowAlways=true;//SelectionChanged事件中实现提示功能privatevoidaxMap1_SelectionChangedobjectsender,System.EventArgse{MapXLib.Layerlayer=axMap
2.Layers._Item1;MapXLib.Datasetds=axMap
2.DataSets._Item1;foreachMapXLib.Featureftrinlayer.Selection{selectedFea=ftr;stringmsg=;forintj=1;j=ds.Fields.Count;j++{layer.KeyField=ds.Fields._Itemj.Name;symbolProperty[j-1]=ftr.KeyValue.ToString;msg+=layer.KeyField+""+symbolProperty[j-1]+"\n";}toolTip
1.SetToolTipthis.axMap1,msg;}}注1symbolProperty[]为一字符串数组,存储图元所有属性2例子中用了c#工具箱中的toolTip对象,巧妙的实现了信息提示.关于tooltip对象详细说明建议读者查帮助
4.10图元属性的修改
4.
10.1实例12修改图元属性
4.
10.
1.1程序功能 修改已知图元的属性
4.
10.
1.2程序实现publicvoidmodiUserSymbolMapXLib.Featureftr,stringinfoNumber,stringinfoCaption,stringinfoDescr,doublexIn,doubleyIn{ifftr==nullreturn;number=infoNumber;caption=infoCaption;descr=infoDescr;x=xIn;y=yIn;MapXLib.RowValuesrvs=newMapXLib.RowValuesClass;MapXLib.Layerlayer=axMap
2.Layers._Item1;MapXLib.Datasetds=axMap
2.DataSets._ItemdsUserLayer;forintj=1;j=ds.Fields.Count;j++{layer.KeyField=ds.Fields._Itemj.Name;ifj==1ftr.KeyValue=number;ifj==2ftr.KeyValue=caption;ifj==4ftr.KeyValue=descr;ifj==6ftr.KeyValue=x.ToString;ifj==7ftr.KeyValue=y.ToString;ftr.Updatetrue,rvs;}MessageBox.Show目标属性修改成功!;}图元属性修改用图元的update方法
4.11实例13图元的查询图层的searchstrWhere,,[Variables]方法中以方便的实现图元的查询,具有类似SQL查询的强大能力其中参数strWhere为检索图元的条件表达式,相当于sql的where子句该语句执行结果返回查找到的图元集合下面的例程实现一个万能模糊查询,即给定一个查找关键字keyStr,然后可查出图元属性中包含有有关键字keyStr的图元,而不管是哪个属性字段publicvoidsearchSymbolsstringkeyStr{MapXLib.Featuresftrs;MapXLib.Featuresftrs1;MapXLib.Layerlayer=axMap
2.Layers._Item1;layer.Selection.ClearSelection;//清空selection集合MapXLib.Variablesvs=newMapXLib.VariablesClass;ftrs=layer.SearchobjNameLIKE++\%+keyStr+%\,vs;//查找名称属性中包含keyStr的的图元,并存于ftrs集合中ftrs1=layer.SearchobjNumberLIKE++\%+keyStr+%\,vs;//查找编号属性中包含keyStr的的图元,并存于ftrs1集合中ftrs.Addftrs1;//把ftrs1集合合并到ftrs集合中MessageBox.Show共有满足条件的图元+ftrs.Count.ToString+个!;layer.Selection.Addftrs;//把查找到的所有图元存到selection集合中,以便使其高亮显示,处于选中状态}
4.12实例14鹰眼图的实现鹰眼图的实现能使电子地图在功能及界面上锦上添花,各种媒体上都有一些介绍,下面介绍用C#实现的鹰眼图功能
4.
12.1程序实现//初始时,产生鹰眼图矩形框绘画层privatevoidmapsmall{if!File.Exists@appDirectory+\\mapSmall.tabm_Layer=mapSmall.Layers.CreateLayerRectLayer,@appDirectory+\\mapSmall.tab,1,32,mapSmall.NumericCoordSys;elsem_Layer=mapSmall.Layers.Add@appDirectory+\\mapSmall.tab,1;m_Layer.Editable=true;mapSmall.Layers.InsertionLayer=m_Layer;}privatevoidaxMap1_MapViewChangedobjectsender,System.EventArgse{ifmapSmall==nullreturn;MapXLib.FeaturetempFea;MapXLib.Featurem_Fea;MapXLib.FeatureFactoryfeaFact;feaFact=mapSmall.FeatureFactory;MapXLib.PointstempPnts=newMapXLib.PointsClass;MapXLib.StyletempStyle=newMapXLib.StyleClass;MapXLib.Featuresftrs;ftrs=m_Layer.AllFeatures;doubleMapX=0,mapY=0,mapWidth=0,mapHeight=0,MapX1=0,mapY1=0;floatscreenX,screenY,screenWidth,screenHeight,screenX1,screenY1;screenX=axMap
2.Bounds.X;screenY=axMap
2.Bounds.Y;screenWidth=axMap
2.Bounds.Width;screenHeight=axMap
2.Bounds.Height;screenX1=screenX+screenWidth;screenY1=screenY+screenHeight;axMap
2.ConvertCoordrefscreenX,refscreenY,refMapX,refmapY,MapXLib.ConversionConstants.miScreenToMap;axMap
2.ConvertCoordrefscreenX1,refscreenY1,refMapX1,refmapY1,MapXLib.ConversionConstants.miScreenToMap;mapWidth=MapX1-MapX;mapHeight=mapY1-mapY;ifftrs.Count==0{tempStyle.RegionPattern=MapXLib.FillPatternConstants.miPatternNoFill;tempStyle.RegionColor=uintMapXLib.ColorConstants.miColorRed;tempStyle.RegionBorderColor=255;MapXLib.Pointspts=newMapXLib.PointsClass;pts.AddXYMapX,mapY,1;pts.AddXYMapX+mapWidth,mapY,2;pts.AddXYMapX+mapWidth,mapY+mapHeight,3;pts.AddXYMapX,mapY+mapHeight,4;tempFea=feaFact.CreateRegionpts,tempStyle;m_Fea=m_Layer.AddFeaturetempFea,newMapXLib.RowValuesClass;m_Layer.Refresh;mapSmall.AutoRedraw=true;}else{m_Fea=ftrs._Item1;m_Fea.Parts._Item
1.RemoveAll;m_Fea.Parts._Item
1.AddXYMapX,mapY,1;m_Fea.Parts._Item
1.AddXYMapX+mapWidth,mapY,2;m_Fea.Parts._Item
1.AddXYMapX+mapWidth,mapY+mapHeight,3;m_Fea.Parts._Item
1.AddXYMapX,mapY+mapHeight,4;m_Fea.Updatetrue,newMapXLib.RowValuesClass;m_Layer.Refresh;mapSmall.AutoRedraw=true;}}voidaxMap2_MouseDownEventobjectsender,AxMapXLib.CMapXEvents_MouseDownEvente{ifmapLarge==nullreturn;doubleMapX=0;doubleMapY=0;axMap
2.ConvertCoordrefe.x,refe.y,refMapX,refMapY,MapXLib.ConversionConstants.miScreenToMap;mapLarge.CenterX=MapX;mapLarge.CenterY=MapY;}
4.
12.3程序说明1由主图视图改变影响鹰眼图矩形框的重绘,代码实现在主图的viewchanged事件中2在鹰眼图中单击鼠标,把单击处的位置点作为主图的中心点重绘主图代码实现在鹰眼图的mousedownevent事件中3M_layer为鹰眼图中绘制矩形框的图层4mapSmall代表鹰眼图控件,mapLarge代表主图控件5主图与鹰眼图同步的关键是主图的可视区域地理范围与鹰眼图的矩形框所包含的地理范围一样首先得到主图的Boundsr的各个顶点的屏幕坐标用函数axMap
1.ConvertCoord将bounds的各顶点屏幕坐标转化为地理坐标最后在鹰眼图中根据主图中各顶点的地理坐标画出矩形区域6注意convertCoord函数的用法,请参考相关资料,注意其中第五个参数的用法请读者仔细领会其中的机理本例子只给了视图范围同步问题,没有给出编辑同步问题,即在主图中增加一个图元,在鹰眼图中同步增加一个点留给读者自己练习,相信一定不会难住聪明的读者
4.13数据绑定数据绑定的问题是MapX很重要的一个内容,是MapX具有生命力的重要体现有了数据绑定,我们可以给地图赋予意义,可以给基于地理位置的空间对象以各种意义,满足各行各业的需要然而,就是这个数据绑定,在C#下用得确不尽人意,这再一次体现了MapX对.net的支持不力但是我们可以避过对我们不利的地方,来解决这个问题下面就本人成功实现的一些数据绑定的例子,介绍如下1用layerinfo对象增加层时自动产生与之绑定的数据集其中相应语句为layerInfo.AddParameterAutoCreateDataset,1;layerInfo.AddParameterDatasetName,dsUserLayer;具体参见例程1部分利用这种方法简单也非常方便,可以满足大部分应用2利用axMap
1.DataSets.Add方法建立数据绑定程序代码摘要如下//定义Fields字段集MapXLib.Fieldsflds=newMapXLib.FieldsClass;flds.AddobjNumber,objNumber,MapXLib.AggregationFunctionConstants.miAggregationIndividual,MapXLib.FieldTypeConstants.miTypeString;flds.AddobjName,objName,MapXLib.AggregationFunctionConstants.miAggregationIndividual,MapXLib.FieldTypeConstants.miTypeString;flds.AddobjDscr,objDscr,MapXLib.AggregationFunctionConstants.miAggregationIndividual,MapXLib.FieldTypeConstants.miTypeString;flds.AddobjX,objX,MapXLib.AggregationFunctionConstants.miAggregationIndividual,MapXLib.FieldTypeConstants.miTypeFloat;flds.AddobjY,objY,MapXLib.AggregationFunctionConstants.miAggregationIndividual,MapXLib.FieldTypeConstants.miTypeFloat;//数据绑定与自动标识userLayer=axMap
1.Layers._Item1;dsUserLayer=axMap
1.DataSets.AddMapXLib.DatasetTypeConstants.miDataSetLayer,userLayer,userdrawlayer,0,0,0,flds,false;userLayer.LabelProperties.Dataset=dsUserLayer;userLayer.LabelProperties.DataField=dsUserLayer.Fields._Item2;userLayer.AutoLabel=true;上面代码的关键部分是dsUserLayer=axMap
1.DataSets.AddMapXLib.DatasetTypeConstants.miDataSetLayer,userLayer,userdrawlayer,0,0,0,flds1,false;其中MapXLib.DatasetTypeConstants.miDataSetLayer为绑定层类型;第二个参数为要绑定的层名,第三个参数为数据集名称,其它参数在vb,Delphi,powerBuilder中是可选的,然而在于c#中参数必须写全,我们如上面处理,flds为该层的字段集对象3与外部数据库绑定与外部数据库绑定的的方法根据数据源的不同有很多种方法,请参看MapX帮助文档下面以与oracle数据库绑定为例为介绍,希望能起到抛砖引玉的效果,具体绑定办法见下一章节”MapX与oracle的结合”
4.14GPS在GIS系统中的应用 近年来,卫星定位技术的飞速发展,卫星定位系统已普遍运用于物理勘探、电离层测量和航天器导航等诸多民用高新技术领域,并日益在人们的日常生活中得到普及,如移动手机定位,车载导航等在军事领域,弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术卫星导航技术对国民经济的发展具有极其重要意义,2000年10月31日和12月21日我国先后成功发射了两颗导航定位试验卫星并建立了我国第一代卫星导航定位系统—“北斗导航系统”GPS与GIS结合主要需解决两个问题1GPS定位信息的获取2GPS定位信息在GIS中的显示
4.
14.1定位信息的接收GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成GPS定位信息一般用RS-232串口将定位信息从GPS接收机传送到计算机中进行信息提取处理GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取
4.
14.2定位信息的提取本文以GARMINGPS天线板为例来介绍GPS帧结构GARMINGPS接收到的数据帧主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有$GPGGA、$GPGSA、$GPGSV以及$GPRMC等这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从$GPRMC帧中获取得到,该帧的结构及各字段释义如下$GPRMC,1,2,3,4,5,6,7,8,9,10,11*hh1当前位置的格林尼治时间,格式为hhmmss2状态,A为有效位置,V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗3纬度,格式为ddmm.mmmm4标明南北半球,N为北半球、S为南半球5经度,格式为dddmm.mmmm6标明东西半球,E为东半球、W为西半球7地面上的速度,范围为
0.0到
999.98方位角,范围为
000.0到
359.9度9日期,格式为ddmmyy10地磁变化,从
000.0到
180.0度11地磁变化方向,为E或W至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对$GPRMC帧进行数据的提取处理如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码$来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理
4.
14.3定位信息在MapX中的显示在MapX应用程序中我们只需把接收到的经纬度值赋给所定位图元的位置属性,即可观察到图元的移动轨迹
4.
14.4实例15GPS定位系统的应用
4.
14.
4.1程序功能演示GPS定位信息的接收提取
4.
14.
4.2程序实现在Form上添加串口通信控件及若干按钮和输入框,如下图然后编写各功能代码,代码如下namespaceGPS{publicstructGPSInfo{publicdoublelatitude;//纬度分)publiccharsouthornorth;//北纬true或南纬falsepublicdoublelongitude;//经度分)publicchareastorwest;//东经true或西经falsepublicstringheight;//高度米publicDateTimeacceptTime;//接收时间publicstringspeed;//车辆的速度publicboolvalid;//是否可信}publicclassForm1System.Windows.Forms.Form{privateSystem.Windows.Forms.TextBoxtextBox4;privateSystem.Windows.Forms.TextBoxtextBox3;privateSystem.Windows.Forms.TextBoxtextBox2;privateSystem.Windows.Forms.TextBoxtextBox1;privateSystem.Windows.Forms.Labellabel4;privateSystem.Windows.Forms.Labellabel3;privateSystem.Windows.Forms.Labellabel2;privateSystem.Windows.Forms.Labellabel5;privateAxMSCommLib.AxMSCommaxMSComm1;privateSystem.Windows.Forms.ButtonstartRecieve;privateSystem.Windows.Forms.ButtonstopRecieve;GPSInfogif=newGPSInfo;privateSystem.Windows.Forms.RichTextBoxrichTextBox1;privateSystem.Windows.Forms.Labellabel1;privateSystem.Windows.Forms.TextBoxtextBox5;privateSystem.ComponentModel.Containercomponents=null;publicGPSInfoGetGPSInfo{returngif;}//开始接收privatevoidstartRecieve_Clickobjectsender,System.EventArgse{if!axMSComm
1.PortOpenaxMSComm
1.PortOpen=true;axMSComm
1.Update;}////停止接收privatevoidstopRecieve_Clickobjectsender,System.EventArgse{ifaxMSComm
1.PortOpenaxMSComm
1.PortOpen=false;axMSComm
1.Update;}//对接收到的GPS信息进行提取,并显示在表单中privatevoidaxMSComm1_OnCommobjectsender,System.EventArgse{stringm_comdata=;m_comdata=stringaxMSComm
1.Input;intlength,i;byte[]data=newbyte
[1024];length=m_comdata.Length;stringm_zjz;m_zjz=m_comdata;//寻找GPS信号的头标志ints;s=m_zjz.IndexOf$GPRMC,;stringm_gps;//NUM为所提取GPS信号的长度m_gps=m_zjz.Substrings,m_zjz.Length-s;intx;x=m_gps.Length;stringm_sTime=,m_sPositionY=,m_sPositionX=,m_sDate=;charns=,ew=;stringspd=;boolvalid=false;intindex=0;fori=0;index11m_gps[i]!=10;i++//帧尾{ifm_gps[i]==,//逗号计数index++;else{ switchindex{ case1//提取出时间 m_sTime+=m_gps[i]; break; case2//判断数据是否可信当GPS天线能接收到有3颗GPS卫星时为A,可信 ifm_gps[i]==A {valid=true;}elsevalid=false; break; case3//提取出纬度 m_sPositionY+=m_gps[i]; break;case4//南北纬ns=m_gps[i];break; case5//提取出经度 m_sPositionX+=m_gps[i]; break;case6//东西经ew=m_gps[i];break;case7spd+=m_gps[i];break;case9//提取出日期 m_sDate+=m_gps[i]; break; default break; }}}//时间intday=Int
32.Parsem_sDate.Substring0,2;intmonth=Int
32.Parsem_sDate.Substring2,2;intyear=Int
32.Parsem_sDate.Substring4,2+2000;inthour1=Int
32.Parsem_sTime.Substring0,2;intminute1=Int
32.Parsem_sTime.Substring2,2;intsecond1=Int
32.Parsem_sTime.Substring4,2;inthour=23-hour1;intminute=59-minute1;intsecond=60-second1;gif.acceptTime=newDateTimeyear,month,day,hour,minute,second;gif.acceptTime.AddHours8;//有效性gif.valid=valid;if!gif.valid{MessageBox.Show接收卫星太少,不能定位!;}//南北纬gif.southornorth=ns;gif.speed=spd;//东西经gif.eastorwest=ew;//纬度gif.latitude=Int
32.Parsem_sPositionY.Substring0,2+double.Parsem_sPositionY.Substring2,7/60;//前面是度,后面是分//经度ifm_sPositionX.Length==10//超过九十度{gif.longitude=Int
32.Parsem_sPositionX.Substring0,3+double.Parsem_sPositionX.Substring3,7/60;}ifm_sPositionX.Length==9//小于九十度{gif.longitude=Int
32.Parsem_sPositionX.Substring0,2+double.Parsem_sPositionX.Substring2,7/60;}textBox
2.Text=gif.latitude.ToString.Substring0,7++gif.southornorth.ToString;textBox
1.Text=gif.longitude.ToString.Substring0,8++gif.eastorwest.ToString;textBox
3.Text=gif.acceptTime.ToString;textBox
4.Text=gif.speed.ToString;ints2;s2=m_zjz.IndexOf$GPGGA,;stringm_gpsheigth=m_zjz.Substrings2,m_zjz.Length-s2;intindex1=0;intl=0;stringgps_height=;forl=0;index111m_gps[l]!=10;l++//帧尾{ifm_gps[l]==,index1++;else{switchindex1{case1break;case2break;case3break;case4break;case5break;case6break;case7break;case8break;case11gps_height+=m_gps[l];break;}}}gif.height=gps_height;textBox
5.Text=gif.height.ToString;}//串口配置初始化privatevoidForm1_Loadobjectsender,System.EventArgse{axMSComm
1.CommPort=1;axMSComm
1.Settings=4800,N,8,1;axMSComm
1.InputLen=0;axMSComm
1.RThreshold=100;}}}
4.15多媒体信息在GIS系统中的应用将多媒体数据嵌入GIS系统,必将大大提升GIS系统的功能,同时提高了用户的音视觉效果
4.
15.1GIS中嵌入多媒体的方法在电子地图系统体中嵌入多媒体信息的方法有两种1.在数据库中存储多媒体数据所对应文件的路径和文件名,在需要时检索出该多媒体文件,然后用内置功能或外挂程序来播放2.直接存储多媒体数据的二进制格式到数据库,在需要时将该数据读出进行处理下面我们利用比较简便的第一种方法,将地图上的图元同多媒体数据文件关联起来,多媒体信息限定为文字、图片、视频和声音四种
4.
15.2实例16在MapX系统中嵌入多媒体数据
4.
15.
2.1实现思路在新建图层时增加一字段,专门存储多媒体数据的路径,在访问图元时,读取该多媒体字段内容,根据文件类型,启动相应的打开程序来打开多媒体文件
4.
15.
2.2程序实现usingSystem.Diagnostics;//建立多媒体功能的图层MapXLib.Fieldsflds=newMapXLib.FieldsClass;flds.AddStringFieldname,50,false;……flds.AddStringFieldmedia,50,false;//存储多媒体文件路径……layerInfo.AddParameterFields,flds;layer=axMap
1.Layers.AddlayerInfo,1;//读取多媒体文件并用相应程序打开……layer.KeyField=fields._Item“media”.Name;stringmediaFileName=ftr.KeyValue;intstartindex=symbol.IndexOf.+1;ifsubstringmediaFileName,startindex,3==”txt”//读取多媒体文件扩展名Process.Start“notepad.exe”,mediaFileName;elseifsubstringmediaFileName,startindex,3==”.jpg”Process.Start“mspaint.exe”,mediaFileName;elseProcess.Start“msplayer
2.exe”,mediaFileName;
4.
15.
2.3程序说明
1.substringmediaFileName,startindex,3用来判断多媒体文件的类型,根据不同类型,用不同的应用程序打开
2.ProcessStartStringfileName,Stringarguments通过指定应用程序的名称和一组命令行参数来启动进程资源,并将该资源与新的System.Diagnostics.Process组件关联注意在使用该组件时一定要添加对System.Diagnostics的引用第五章MapX与Oracle结合把MapX与oracle的结合作为单独一章节,因为笔者觉得它非常重要Oracle作为数据库界的泰斗,其强大面向对象的数据库功能如果能和MapX结合起来,将起到珠联璧合的作用我们知道,地理信息系统处理的数据包括包括两部分,一是与该图元所占据的空间位置相关的空间数据,另一个是该图元的属性数据一般作法是将两部分分开处理空间数据以文件形式存储,如mapinfo的.map文件;属性数据以关系数据库形式存储或以文本文件形式存储,如mapinfo的.dat文件这种方式在单用户的情况下,基本上可以满足要求,然而对于多用户下,在分布式网络平台上使用的GIS系统,就难以满足地理信息共享,并发控制及安全性的要求如果能找到一种数据库,把空间数据和属性数据统一存储管理,将会对GIS系统的应用提高到一个更加高的水平上来我们称具有这种功能的数据库为空间数据库而Oracle数据库就有这样一种能力来实现空间数据的存储
5.1Oracle数据库对GIS的支持为什么要在MapX用Oracle,避开其卓越性能及缜密的安全性不谈,我认为它只少有两点非常适合mapinfo产品
5.
1.1面向对象的数据库支持Oracle数据库支持面向对象的功能,即其中表的一个单元格可存储一个对象,打破了数据库表中字段不可再分的传统理论恰好地图上的每个图元它是一个空间对象oracle具有GEO数据类型支持,为存储图元空间点线面属性提供了支持
5.
1.
2.Oraclespatial组件的引入OracleSpatial是部署企业范围的空间信息系统和基于web以及基于位置的无线应用程序的基础它为位置信息提供数据管理,允许用户直接在他们的应用程序和服务中轻松插入位置信息,操作地理和位置数据的语法与应用于CHAR、DATE或INTEGER类型的相同Oracle9i和OracleSpatial的具体特性包括摘自oracle官方网站针对所有函数和操作的开放、标准的SQL访问空间对象类型存储,可容纳几何类型和线性引用空间操作和函数,包括层限制和集合(例如,并集和用户定义的集合)快速参考树和四叉树索引综合存储、管理和使用测量数据空间索引分区支持强大的线性引用系统支持异种数据无缝集成(融合)的工具,包括投影管理和坐标转换与Oracle9iApplicationServer无线版本集成本章将分几个专辑完整介绍MapX与oracle如何连接、MapX数据如何存入oracle以及oracle数据如何显示到MapX中等一系列应用,并通过由浅入深的方法,一步一步引领大家进入MapX与oracle联合后产生的神奇境界,希望能给读者有所帮助
5.2循序渐进学习OracleSpatial在MapX中的应用Oracle8是面向对象的关系型数据库管理系统,作为一个对象可以放在表的一格中,OracleSpatial提供了对空间几何对象的存储机制面向对象的数据库应用以及空间几何对象的存储对于未接触过的读者都感觉非常陌生,不知从何入手,本章节将通过一个实例带领大家一步一步走进这个世界,由表入里,由浅入深,从实践到理论,再从理论到实践,使大家把握问题的本质,掌握解决问题的方法
5.
2.1oralce服务器的安装安装oralce服务器,注意选择oraclespatial组件,默认为选择本人安装的是oracle8ienterpriseedition
8.
2.
7.
0.0,建立一用户全局数据库caiqin,system帐户口令manager
5.
2.2准备由OracleSpatial存储的图层文件以第四章例程1的方法建立一新层,并在新层上加入一些图元,并输入其属性数据这样会得到.tab,.dat,.map等文件打开.tab文件可看到自定义的图层属性字段结构定义,打开.dat文件可看到图层上各图元的属性信息按先后顺序存放
5.
2.3Easyloader上载工具在网上下载一个与oracle版本相对应的图层数据上载软件Easyloader,下载地址www.mapinfo.comMapinfoProfessional中也会自带Easyloader是用来实现把Mapinfo地图数据一次性向oracle数据库上载的软件,建议读者在命令行带参数运行该程序,如下所示C\easyload\easyloader/y为什么带参数y运行后面再做解释运行后界面如下要上载地图数据需要采取以下步骤
5.
2.
3.1连接服务器连接服务器有种方式ODBC和Oracle8i在这里我们选择用Oracle8i来连接OracleSpatial服务器,单击Oracle8ibutton,将会提示输入Oracle8i连接信息如下图若为客户机,机器上一定要有Oracle8i客户端程序UserID systemPasswordmanagerServer caiqin确认输入正确后,单击okbutton,连接信息将会填充到DBMS,Database及user域
5.
2.
3.2选择要上载的mapinfo表文件单击Tablesbutton,选择例程1创建的新图层的userdrawlayer.tab文件,该文件将会出现在MapInfo列表框中,server域为该文件上载到Oralce数据库后的表名,默认与.tab文件名一样
5.
2.
3.3选择上载参数1AppendtoTable/ReplaceCreateTable追加到已有表还是新建表或替代已有表选择第二项新建或替代表2AppendAlltoOne把所有mapinfo表追加到数据库中的一个表中,前提是所有的表结构要一致,默认3GrantPublicAccess对服务器数据表授予公开访问权限,默认4ExclusiveUseofTables加速表的上载时间,默认5CreateUniqueIndex为上载后的表创建唯一索引,该索引列的字段名为mi_prinx;选择该选项6CreateSpatialIndex创建空间索引,加速空间对象的查找,默认7AddtoMapcatlog Mapcatlog是位于服务器中的一个表,它为上载后的各个表创建了一个目录,上载后的各个表均在此表中注册如果该目录表不存在, Easyloader将会自动产生一个
5.
2.
3.4上载表单击Uploadbutton开始上载过程,并显示上载进度,若完成,显示完成信息
5.
2.4图层信息在Oracle中的存储结构上载成功后,Oracle数据库将会新增一个MAPCATALOG表和一个图层数据表
5.
2.
4.1MAPINFO_MAPCATALOG表Oracle数据库新增了MAPINFO表空间,该空间中多了一个MAPINFO_MAPCATALOG表该表的结构如下SPATIALTYPEFLOAT126空间对象类型TABLENAMECHAR32oracle表名OWNERNAMECHAR32表的属主SPATIALCOLUMNCHAR32表中存储空间对象的那一列的列名DB_X_LLFLOAT126图层边界左下x坐标DB_Y_LLFLOAT126图层边界左下y坐标DB_X_URFLOAT126图层边界右上x坐标DB_Y_URFLOAT126图层边界右上y坐标COORDINATESYSTEMCHAR254指定图层使用的坐标系统SYMBOLCHAR254描述图元的样式子句XCOLUMNNAMECHAR32包含X坐标的列名YCOLUMNNAMECHAR32包含Y坐标的列名该表部分部分关键内容为TYPETABLENAMEOWNERSPATIALCOLUMN…COORSYMBOL…
13.3ASIACAPSSYSTEMGEOLOC……Pen1,2,0…
13.3USERDRAWLAYERSYSTEMGEOLOC……Symbolzhs.bmp,0,20,0…其中第一行为笔者先前用easyloader作实验时上载的一个表,在此作了注册第二行即上一章节例程1所建的userdrawlayer层上载后的表在此自动注册symbol列存储了空间对象的样式,关于symbol列的语法以后再详细介绍我们以后会知道,这个表是必须的,因为这个表包含了每一个要地图化的oracle数据表中空间对象如何显示的信息我们再看一下第二个变化即我们上载了userdrawlayer层后的所得到的userdrawlayer表
5.
2.
4.2图层数据表在SYSTEM表空间新增了userdrawlayer图层数据表打开SYSTEM表空间,找到userdrawlayer数据表,该表的结构为OBJNUMBERVARCHAR26OBJNAMEVARCHAR212OBJDSCRVARCHAR250OBJXNUMBEROBJYNUMBERMI_RENDITIONVARCHAR2254MI_PRINXVARCHAR220GEOLOCMDSYS.SDO_GEOMETRY该表的部分内容如下OBJNUMBEROBJNAMEOBJDSCR…MI_RENDITIONMI_PRINXGEOLOC01001市中心医院大型中西医结合医院……symbolhospial.bmp,0,20,1101002解放路全长4公里,西起……pen1,1,0201003西湖著名旅游胜地,总面积……Pen1,2,0Brush2,16777215,167772153…………由该表结构我们一眼就可以看出,前五个字段就是我们在新建层时自定义的图元编号、图元名称、图元描述及图元位置,上载时把它们全部搬移过来另外又增加了三个字段MI_RENDITION,MI_PRINX,GEOLOC下面较详细解释这三个字段1.MI_PRINX索引字段,为每个图元产生一唯一索引,这是我们用easyloader上载时指定参数createuniqueindex的结果2.MI_RENDITION从表数据可以看出,它是用来描述图元的样式的表中是三个代表性图元的样式,分别是医院(点图元),街道(线样式)和水域(面样式)下面就点线面样式定义语法介绍如下 1点符号样式点符号样式用symbol子句来指定,symbol子句有三种形式一种是指为MapInfo
3.0-style符号;一种是指定为TrueType字体符号;一种是指定为采用位图的符号其语法列于下表符号类型语法例子MapInfo
3.0-styleSymbolshape,color,sizeSymbol35,0,12TrueTypefontSymbolshape,color,size,font,fontstyle,rotationSymbol64,255,12,MapInfoWeather,17,0bitmapSymbolbitmapname,color,size,customstyleSymbolsign.bmp,255,18,02线符号样式线符号样式采用pen子句,其语法为Penthickness,pattern,color,例如Pen1,2,03区域样式区域样式用brush子句指定闭合区域的填充方案,其语法为Brushpattern,color,backgroundcolor,例如Brush2,255,65535注意如果要绘制一个区域图元时,要把pen子句和brush子句结合起来使用,用pen子句指定区域边界样式,用brush子句指定区域内的填充样式至于各子句中用到的样式常量,颜色常量请参见MapX
5.0帮助文档中“MapXreferenceinformation”-“appendixD constants”中的ColorConstants,FillPatternConstants,PenStyleConstants等
3.GEOLOC存储图元的空间信息,关于GEOLOC字段请看下一节“空间对象类型SDO_GEOMETRY”专题从上面SYSTEM.USERDRAWLAYER数据表的内容可以看出,每一行的前面几个字段代表图元的属性数据,后面的MI_RENDITION字段及GEOLOC字段代表图元的空间对象数据,Oracle数据库完美地把两者统一了起来,用一致的方式来管理,这就是Oracle提供的对象关系模型
5.
2.
4.3空间对象类型SDO_GEOMETRY在上一节我们用表数据编辑器打开图层数据表后,大家并没有看到上面表格中画出的GEOLOC列,这是因为该列是SDO_GEOMETRY空间对象类型,是真正存储图元空间数据的部分,在表中隐藏我们可以通过sql语句观察每个图元的空间数据的值倒底是什么样子在sqlplus中用sql语句查看GEOLOC字段的值SQLselectGEOLOCfromUSERDRAWLAYER;回车后将会显示图层中每一个图元的空间数据,下面选出的是点、线、面三种典型图元的GEOLOC值点图元GEOLOCSDO_GTYPE,SDO_SRID,SDO_POINTX,Y,Z,SDO_ELEM_INFO,SDO_ORDINATES-----------------------------------------------------------------------------SDO_GEOMETRY2001,NULL,SDO_POINT_TYPE-
137.5192,
32.969427,NULL,NULL,NULL线图元GEOLOCSDO_GTYPE,SDO_SRID,SDO_POINTX,Y,Z,SDO_ELEM_INFO,SDO_ORDINATES-----------------------------------------------------------------------------SDO_GEOMETRY2002,NULL,SDO_POINT_TYPE0,0,NULL,SDO_ELEM_INFO_ARRAY1,2,1,SDO_ORDINATE_ARRAY-
114.9666,.61627203,-
114.9666,.61627203面图元GEOLOCSDO_GTYPE,SDO_SRID,SDO_POINTX,Y,Z,SDO_ELEM_INFO,SDO_ORDINATES-----------------------------------------------------------------------------SDO_GEOMETRY2003,NULL,SDO_POINT_TYPE
56.7574949,
3.18633104,NULL,SDO_ELEM_INFO_ARRAY1,1003,1,SDO_ORDINATE_ARRAY
35.8301621,
16.007866,
67.6552619,-
14.205263,
77.6848291,
16.577925,
35.8301621,
16.007866可以看出,空间实体的空间信息是存储在一个字段名为GEOLOC的列中,该列的类型为SDO_GEOMETRY下面对这种存储空间对象的列的类型定义作出语法解释GEOLOC空间对象的结构定义为GEOLOCSDO_GTYPE,SDO_SRID,SDO_POINTX,Y,Z,SDO_ELEM_INFO,SDO_ORDINATES即该对象类型字段由SDO_GTYPE,SDO_SRID,SDO_POINTX,Y,Z,SDO_ELEM_INFO,SDO_ORDINATES五个子属性构成,下面分别作一解释SDO_GTYPE:指定该空间实体的类型,数值型,长度4位第一位表示维数2-2维空间3-3维空间,第二位指定线性参考度量维指定权值的维数,缺省为0,第三四位表示图元类型00-未定义,01-点,02-直线或曲线,03-多边形,04-多种形状集合,05-多点,06-多线,07-多个多边形,例如:2001表示二维空间中的点SDO_SRID:指定坐标系统代码数值型如8307代表Longitude/LatitudeWGS84坐标系统null值表示没有指定坐标系统SDO_POINTXYZ:以三维组元指定点图元的空间位置对于线图元和面图元该属性被忽略SDO_ELEM_INFO:可变长数组,用来表明如何解释存储在SDO_ORDINATES中的数据若为点图元,赋值为NULL;直线图元赋值为SDO_ELEM_INFO_ARRAY121;矩形图元赋值为SDO_ELEM_INFO_ARRAY110031SDO_ORDINATES:可变长数组,用来存储空间实体边界顶点的坐标如直线SDO_ORDINATE_ARRAY-
114.
9666.61627203-
114.
9666.61627203;三角区域SDO_ORDINATE_ARRAY
35.
830162116.
00786667.6552619-
14.
20526377.
684829116.
57792535.
830162116.007866;若为点图元赋值为NULL通过上面的解释,大家就不难看懂每个图元的GEOLOC字段的值的含义了,同时我们也可以通过编程实现空间对象向Oracle数据库的存储了还有,上面提到建议读者带参数/y运行Easyloader工具,原因是带了参数/y后,该工具在上载时,能够自动提取出每个图元的样式,即会提取出图元symbol子句,pen子句,brush子句,表现为上载完毕后得到的Oracle数据表中增加了MI_RENDITION列,该列存储了每个图元的样式,相信大家一看就明白
5.
2.
4.4手工创建MapCataLog表及在OracleSpatial下的图层表上面我们用上载工具Easyloader,很方便得到了必须的MAPINFO_MAPCATALOG目录表以及图层MapInfo表在Oracle中存储的表结构而这两个表,在我们以后的编程以及应用程序的运行中都离不开,所以Easyloader给我们提供了很大的方便,但是我们最终要放弃它,我们用它的目的,正如大家所看到的,是由它引出一系列关于空间对象数据在Oracle中存储必须掌握的一些概念因为这些概念比较抽象,我们没有先讲这些抽象概念,而是先让读者看到结果,得到感性认识,然后再上升至理性认识,我想这样的方式应该更符合我们的认知习惯,更容易理解如果没有Easyloader这个工具,我们就要手工方式来创建这两个表了,表结构同上面所讲,然后用sql语句创建,并做必要的权限控制以下为创建脚本//mapinfo.sql//创建用户mapinfoCREATEUSERMAPINFOPROFILEDEFAULTIDENTIFIEDBY********DEFAULTTABLESPACESYSTEMTEMPORARYTABLESPACESYSTEMACCOUNTUNLOCK;//创建mapinfo.mapinfo_mapcatalog表CREATETABLEMAPINFO.MAPINFO_MAPCATALOGSPATIALTYPEFLOAT126,TABLENAMECHAR32,OWNERNAMECHAR32,SPATIALCOLUMNCHAR32,DB_X_LLFLOAT126,DB_Y_LLFLOAT126,DB_X_URFLOAT126,DB_Y_URFLOAT126,COORDINATESYSTEMCHAR254,SYMBOLCHAR254,XCOLUMNNAMECHAR32,YCOLUMNNAMECHAR32TABLESPACESYSTEMPCTFREE10PCTUSED40INITRANS1MAXTRANS255STORAGEINITIAL64KNEXT64KMINEXTENTS1MAXEXTENTS2147483645PCTINCREASE50FREELISTS1FREELISTGROUPS1LOGGING;//创建索引CREATEUNIQUEINDEXMAPINFO.MAPCATALOG_IDXONMAPINFO.MAPINFO_MAPCATALOGTABLENAME,OWNERNAMETABLESPACESYSTEMPCTFREE10INITRANS2MAXTRANS255STORAGEINITIAL64KNEXT64KMINEXTENTS1MAXEXTENTS2147483645PCTINCREASE50FREELISTS1LOGGING;//授权访问mapinfo.mapinfo_mapcatalog表grantselect,insert,updateonmapinfo.mapinfo_mapcatalogtopublic;CREATETABLESYSTEM.USERLAYERSOURCEVARCHAR250,NAMEVARCHAR250,IDENTITYVARCHAR250,DESCRIPTIONVARCHAR250,FOUNDTIMEVARCHAR250,OBJXNUMBER,OBJYNUMBER,MI_RENDITIONVARCHAR2254,MI_PRINXNUMBER,GEOLOCMDSYS.SDO_GEOMETRY,MEDIAVARCHAR2100TABLESPACETOOLSPCTFREE10PCTUSED40INITRANS1MAXTRANS255STORAGEINITIAL32KNEXT32KMINEXTENTS1MAXEXTENTS4096PCTINCREASE0FREELISTS1FREELISTGROUPS1LOGGING;
5.
2.5用程序实现MapX图元到oracle数据库的上载上面大家已经看出,用Easyloader工具可以一次性把MapX图元上载至数据库保存,非常方便然而,我们在应用程序的运行中,不可能调用Easyloader工具上载所有数据,往往是在运行过程中只上载那些刚增加的新的图元因为图层在Oracle中的数据表的字段定义我们已经知道,我们只需要按照字段定义把图元的相应值插入到Oracle数据表中即可,下面这个函数就以这种思路实现
5.
2.
5.1程序功能程序实现将图元的所有信息上载至Oracle图层数据表
5.
2.
5.2程序实现publicvoidinsertIntoOraclestringnumber,stringname,stringdscr,doublex,doubley,stringprinx,MapXLib.Stylestyle,stringfeatureType,MapXLib.Featureftr{stringrendition=;stringgeoloc=;iffeatureType==symbol{rendition=symbol+\+style.SymbolBitmapName+\+,+style.SymbolBitmapColor.GetHashCode+,+style.SymbolBitmapSize+,+style.SymbolType.GetHashCode+;//geoloc=MDSYS.SDO_GEOMETRY2001,NULL,MDSYS.SDO_POINT_TYPE+x.ToString+,+y.ToString+,+NULL,+NULL,NULL;}iffeatureType==pen{rendition=pen+style.LineWidth+,+style.LineStyle.GetHashCode+,+style.LineColor+;geoloc=MDSYS.SDO_GEOMETRY2002,NULL,MDSYS.SDO_POINT_TYPE0,0,NULL,MDSYS.SDO_ELEM_INFO_ARRAY1,2,1,MDSYS.SDO_ORDINATE_ARRAY;forinti=1;i=ftr.Parts._Item
1.Count;i++geoloc+=ftr.Parts._Item
1._Itemi.X.ToString+,+ftr.Parts._Item
1._Itemi.Y.ToString+,;geoloc=geoloc.Substring0,geoloc.Length-1;geoloc+=;}iffeatureType==region{rendition=Pen1,2,0Brush2,16777215,16777215;geoloc=MDSYS.SDO_GEOMETRY2002,NULL,MDSYS.SDO_POINT_TYPE+x.ToString+,+y.ToString+,+NULL,+MDSYS.SDO_ELEM_INFO_ARRAY1,2,1,+MDSYS.SDO_ORDINATE_ARRAY;forintj=1;j=ftr.Parts._Item
1.Count;j++geoloc+=ftr.Parts._Item
1._Itemj.X.ToString+,+ftr.Parts._Item
1._Itemj.Y.ToString+,;geoloc=geoloc.Substring1,geoloc.Length-1;geoloc+=;}OracleConnectionmyConn=newOracleConnectionmyConnString;stringmyInsertQuery=INSERTINTOUSERDRAWLAYEROBJNUMBER,OBJNAME,OBJRELATION,OBJDSCR,OBJTIME,OBJX,OBJY,MI_RENDITION,MI_PRINX,GEOLOCValues+number+,+name+,+relation+,+dscr+,+time+,+x.ToString+,+y.ToString+,+rendition+,+prinx+,+geoloc+;OracleCommandmyOracleCommand=newOracleCommandmyInsertQuery;myOracleCommand.Connection=myConn;myConn.Open;myOracleCommand.ExecuteNonQuery;myConn.Close;}
5.
2.
5.3程序说明1函数传入参数stringnumber,stringname,stringdscr,doublex,doubley为图元的属性数据传入;stringprinx为图元的唯一索引,这里由用户按照某种方式编程得到,将会赋给表的MI_PRINX字段;MapXLib.Stylestyle为图元的类型,是点用symbol表示,线用pen表示,还是区域用region表示;MapXLib.Featureftr为欲插入的图元2局部变量stringrendition存储图元的样式,将会赋给表的MI_RENDITION字段;stringgeoloc存储图元的空间对象数据,将会赋给表的GEOLOC字段3图元的rendition及geoloc变量的计算根据我们前面对字段MI_RENDITION及GEOLOC的语法定义得到ftr.Parts._Item1是为计算折线及区域图元的顶点个数请读者对照语法仔细研读以上代码,相信不难看懂4Oracle数据库的连接用OracleConnection来连接Oracle服务器,注意使用该方式连接时一定要引用命名空间System.Data.OracleClient,如果没有请在“项目”菜单中点击“添加引用”,然后在NET选项卡中单击System.Data.OracleClient.dll,单击选择按钮后确定即可;
5.
2.6用程序实现oracle数据表数据下载至MapX中显示
5.
2.
6.1程序功能在MapX中生成一新的图层,该图层的所有图元信息均来自Oracle图层数据表
5.
2.
6.2程序实现//*********************************************//从OracleSpatial加载空间数据以生成新的图层//*********************************************privatevoidoracleToLayer{MapXLib.Layerlayer;stringconn=UID=system;PWD=manager;srvr=caiqin;stringquerystr=select*fromSYSTEM.USERDRAWLAYER;MapXLib.LayerInfoLayerInfoObject=newMapXLib.LayerInfoClass;LayerInfoObject.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeServer;LayerInfoObject.AddParametername,DrawLayerFromDB;LayerInfoObject.AddParameterConnectString,conn;LayerInfoObject.AddParameterQuery,querystr;LayerInfoObject.AddParametertoolkit,ORAINET;LayerInfoObject.AddParameterAutoCreateDataset,1;LayerInfoObject.AddParameterDatasetName,DrawLayerFromDB;layer=axMap
2.Layers.AddLayerInfoObject,1;userLayer=layer;axMap
2.Refresh;axMap
2.AutoRedraw=true;userLayer.Editable=true;//this.getSymbolStyle;layer.LabelProperties.Dataset=layer.DataSets._Item1;layer.LabelProperties.DataField=layer.DataSets._Item
1.Fields._Item2;layer.LabelProperties.Position=MapXLib.PositionConstants.miPositionBC;layer.LabelProperties.Style.TextFont.Size=10;layer.LabelProperties.Offset=4;layer.AutoLabel=true;}
5.
2.
6.3程序说明1Layerinfo对象这里我们再次利用Layerinfo对象来实现从MapX访问oracle数据,并进行显示下面针对Layerinfo对象作一简单介绍Layerinfo对象描述了将要被添加层的一些信息,Layerinfo将被作为layers.add的第一个参数应用,以实现把新层增加到layers集合中它有一个type属性,定义新层的类型,取值为LayerTypeConstants常量,其含义如下Layerinfo.typeValuedescriptionmiLayerInfoTypeTab0已存在的mapinfotab表miLayerInfoTypeUserDraw1用户绘制图层miLayerInfoTypeRaster2栅格图层miLayerInfoTypeShape3Shape文件.shpmiLayerInfoTypeServer4数据库服务器miLayerInfoTypeGeodictUserName5由geodictionaty管理的图层miLayerInfoTypeTemp6创建临时图层miLayerInfoTypeNewTable7创建新的mapinfo图层另外,Layerinfo对象有许多参数来具体描述欲添加的图层,这些参数随type取值的不同而不同,具体请参见MapX
5.0帮助文档本例是访问Oracle数据库中的地理信息,所以type取值应为miLayerInfoTypeServer,在这种方式下,layerinfo应包含如下参数参数名称必填参数说明NameYes新增图层的名称ConnectStringYesDBMS连接字符串QueryYesSql查询语句ToolKitYes工具包名称,取值ODBC或ORAINETCacheNo是否启用缓存管理MBRSearchNo是否利用最小外接矩形查找AutoCreateDatasetNo是否自动产生数据集实现数据绑定DatasetNameNo数据集的名称VisibleNo新层是否可见,默认可见这些参数的添加方法为LayerInfoObject.AddParameter参数名称,参数取值;针对oracle数据库,参数ConnectString=UID=system;PWD=manager;SRVR=caiqin,其中UID,PWD,SRVR为必须的连接关键字,针对其它ODBC数据源,连接关键字请使用DSN,DRIVER,UID,PWD格式均为“key=value”,它们之间以“;”号隔开其它参数请参见示例代码2本例程中使用了AutoCreateDataset参数取值为1,自动产生一数据集DrawLayerFromDB,实现新层与Oracle数据库的数据绑定3例程最后一段代码实现自动标注功能
5.
2.7图元样式的还原大家可能会发现,利用上面的方法,当MapX把上载表读入显示时,所有图元都变成了同一样式,原本各式各样的图元其本来面目都被丢失这是因为,我们上面提到的目录表MAPINFO_MAPCATALOGG,它只为每个上载表图层保存了一种样式作为其缺省样式,保存在其symbol字段所以当将上载表再次读入显示时,该表中每一个图元便恢复成这种缺省样式了明白了机理,我们就可以用其它方法把丢失的样式找回来前面在上载图元时,我们已经把每个图元的样式保存在了表的MI_RENDITION字段中,所以读出时我们就可利用这个字段把每个图元的样式还原出来下面的函数就是还原图元样式的代码
5.
2.
7.1程序功能实现把丢失的图元样式找回来
5.
2.
7.2程序实现privatevoidgetSymbolStyle{MapXLib.DatasetdsUserLayer=axMap
2.DataSets._ItemDrawLayerFromDB;MapXLib.FieldsfldsUserLayer=dsUserLayer.Fields;MapXLib.RowValuesrvs;MapXLib.RowValuerv;foreachMapXLib.FeaturefeainaxMap
2.Layers._ItemDrawLayerFromDB.AllFeatures{rvs=dsUserLayer.get_RowValuesfea;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;ifsymbol.Substring0,3==sym{intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;fea.Style.SymbolBitmapName=bitmapfile;fea.Updatetrue,rvs;}ifsymbol.Substring0,3==pen{intstartindex1=symbol.IndexOf,;intlastindex1=symbol.LastIndexOf,;intlen1=lastindex1-startindex1-1;intstartindexkh=symbol.IndexOf;intlastindexkh=symbol.LastIndexOf;intlen2=lastindexkh-lastindex1-1;fea.Style.LineStyle=MapXLib.PenStyleConstantsConvert.ToInt16symbol.Substringstartindex1+1,len1;fea.Style.LineWidth=Convert.ToInt16symbol.Substringstartindexkh+1,1;fea.Style.LineColor=uintConvert.ToInt16symbol.Substringlastindex1+1,len2;fea.Updatetrue,rvs;}}}
5.
2.
7.3程序说明1DrawLayerFromDB为从OracleSpatial加载空间数据以生成新的图层的数据集,见上一例;2foreachMapXLib.FeaturefeainaxMap
2.Layers._ItemDrawLayerFromDB.AllFeatures为穷举图层中的每一个图元;3rvs=dsUserLayer.get_RowValuesfea得到每个图元的所有字段信息rowvalues;rv=rvs._ItemMI_RENDITION得到每个图元的样式;4用字符串运算函数提取出样式SymbolBitmapName,LineStyle,linewidth,lineColor等5用提取出的值修改图元的样式fea.style;6样式修改后,用feature.update更新图元;
5.3在网络环境下实现图层信息共享在网络环境下,能够实现地理信息的共享将会在某些特殊场合发挥重大作用,比如,多人在不同的地域只标绘本区域内的地理信息,而大家可互相看到他人标绘的地理信息,即实现地理信息的共享,这种方法可称作协同标绘如前所述,我们可以利用MapX同OracleSpatial结合来解决这一问题然而我们在实践中发现,这种方法有一些不太令人满意的地方,主要有两点一是样式丢失,需要手工还原,二是当数据集刷新时,大大增加数据库的负担,运行效率低为此我们想绕过OracleSpatial的机制,通过另一种方法来解决下面我们以位图符号图元为例来介绍这种协同标绘的实现方法
5.
3.1实现思路1.建一数据表,存储图元的属性,其结构如下IDsource…filenamexyC1C2C3C4…1C1…Home.bmp……oldnewnewnew…2C1…Hospital.bmp...…oldnewoldold…3C1…Home.bmp……oldmodifiedmodifiedmodified…4C1…Hospital.bmp……olddeleteddeleteddeleted…各字段意义如下ID图元的featureIDSource图元的来源即标绘方,表示该图元是由哪个标绘方标绘的表中第一行表示该图元是由C1标绘的字段ID就是由标绘方生产出该图元后提供的FeatureIDFilename位图符号图元的文件名该文件必须存于MapX应用程序的CustSymbol目录下x,y符号图元的经纬度Ci表示各标绘方(客户端)对于该图元的访问状态访问状态有以下四种——old表示标绘方Ci已处理该图元;new表示该图元为新加图元,标绘方Ci还未在本地添加该新图元;modified表示该图元被修改,标绘方Ci还未在本地作相应修改;deleted表示该图元已被删除,该标绘方还未在本地作相应删除表中第一行表示该图元是由C1标绘的,其featureID为1,C2,C3,C4等各标绘方还未在其本地添加该图元2.本地编辑图元在本地标绘出图元并输入图元各属性信息,在数据表中按上表结构插入该图元各属性信息,并置本方访问标志为old,其它各方访问标志为new在本地修改图元属性信息后,同时在数据表中修改该图元相应信息,并置本方访问标志为old,其它各方访问标志为modified在本地删除图元后,同时在数据表中查找到该图元,并置本方访问标志为old,其它各方访问标志为deleted3.图元信息异地同步各标绘方定时在数据表中查找该标绘方访问标志字段为new的图元,读取该图元的各种信息,在本地添加该图元;查找该标绘方访问标志字段为modified的图元,读取该图元的各种信息,并在本地作相应修改;查找该标绘方访问标志字段为deleted的图元,并在本地删除该图元;这样定时刷新时只读取新添加的或已修改的图元,不仅实现了网络环境下异地信息的共享,而且大大提高了系统运行速度
5.
3.3程序实现publicboolNewUserLayerstringlayerName//新建自定义图层,若存在则添加到图层集中{MapXLib.Layerlayer;MapXLib.Fieldsflds=newMapXLib.FieldsClass;flds.AddIntegerFieldmainID,false;//该图元在生产方图层中的ID,如由本机产生则为featureID//否则由数据库的ID字段得到flds.AddStringFieldsource,50,false;flds.AddStringFieldname,50,false;flds.AddStringFieldidentity,50,false;flds.AddStringFielddescription,50,false;flds.AddStringFieldfoundTime,50,false;flds.AddStringFieldmedia,100,false;flds.AddFloatFieldX,false;flds.AddFloatFieldY,false;MapXLib.LayerInfolayerInfo;layerInfo=newMapXLib.LayerInfoClass;layerInfo.AddParameterFileSpec,@appDirectory+\\+layerName+.tab;layerInfo.AddParameterName,layerName;layerInfo.AddParameterFields,flds;layerInfo.AddParameterAutoCreateDataset,1;layerInfo.AddParameterDatasetName,ds+layerName;if!File.Exists@appDirectory+\\+layerName+.tab{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable;}else{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;}try{layer=axMap
1.Layers.AddlayerInfo,1;axMap
1.Refresh;axMap
1.AutoRedraw=true;returntrue;}catch{returnfalse;}}publicvoidInsertIntoOracleFeatureInfofeatureInfo{stringc1=new,c2=new,c3=new,c4=new,c5=new,c6=new;iflocate==1{c1=old;}iflocate==2{c2=old;}iflocate==3{c3=old;}iflocate==4{c4=old;}iflocate==5{c5=old;}iflocate==6{c6=old;}stringstr=INSERTINTOSYSTEM.INFOID,SOURCE,NAME,IDENTITY,DESCRIPTION,FOUNDTIME,MEDIA,X,Y,BMP,C1,C2,C3,C4,C5,C6;str+=Values;str+=featureInfo.featureID.ToString+,+featureInfo.source+,+featureInfo.name+,+featureInfo.identity+,+featureInfo.description+,+featureInfo.foundTime+,+featureInfo.media+,+featureInfo.point_x.ToString+,+featureInfo.point_y.ToString+,+featureInfo.symbolFileName+,+c1+,+c2+,+c3+,+c4+,+c5+,+c6++;//OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;//myConn.Open;myOracleCommand.ExecuteNonQuery;//myConn.Close;}publicvoidModifyUserSymbolFeatureInfofeatureInfo,stringselectedFeatureKey,stringlayerName//layerName为viewlayer层的name{stringc1=modified,c2=modified,c3=modified,c4=modified,c5=modified,c6=modified;iflocate==1{c1=old;}iflocate==2{c2=old;}iflocate==3{c3=old;}iflocate==4{c4=old;}iflocate==5{c5=old;}iflocate==6{c6=old;}MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}MapXLib.FeatureselectedFeature=layer.GetFeatureByKeyselectedFeatureKey;ifselectedFeature==nullreturn;MapXLib.RowValuesrvs=newMapXLib.RowValuesClass;MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.FieldsfldsUserLayer=ds.Fields;MapXLib.Stylestyle=selectedFeature.Style;iffeatureInfo.identity==1{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorBlue;style.SymbolBitmapOverrideColor=true;}elseiffeatureInfo.identity==2{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorGreen;style.SymbolBitmapOverrideColor=true;}else{style.SymbolBitmapColor=0;style.SymbolBitmapOverrideColor=false;}selectedFeature.Style=style;forintj=1;j=ds.Fields.Count;j++{layer.KeyField=fldsUserLayer._Itemj.Name;iffldsUserLayer._Itemj.Name.ToUpper==SOURCEselectedFeature.KeyValue=featureInfo.source;iffldsUserLayer._Itemj.Name.ToUpper==NAMEselectedFeature.KeyValue=featureInfo.name;iffldsUserLayer._Itemj.Name.ToUpper==IDENTITYselectedFeature.KeyValue=featureInfo.identity;iffldsUserLayer._Itemj.Name.ToUpper==DESCRIPTIONselectedFeature.KeyValue=featureInfo.description;iffldsUserLayer._Itemj.Name.ToUpper==FOUNDTIMEselectedFeature.KeyValue=featureInfo.foundTime;iffldsUserLayer._Itemj.Name.ToUpper==MEDIAselectedFeature.KeyValue=featureInfo.media;iffldsUserLayer._Itemj.Name.ToUpper==XselectedFeature.KeyValue=featureInfo.point_x.ToString;iffldsUserLayer._Itemj.Name.ToUpper==YselectedFeature.KeyValue=featureInfo.point_y.ToString;selectedFeature.Updatetrue,rvs;}//selectedFeature.Updatetrue,rvs;axMap
1.AutoRedraw=true;//stringstr=UPDATESYSTEM.INFOSET;str+=NAME=+featureInfo.name+;str+=,IDENTITY=+featureInfo.identity+;str+=,DESCRIPTION=+featureInfo.description+;str+=,FOUNDTIME=+featureInfo.foundTime+;str+=,MEDIA=+featureInfo.media+;str+=,X=+featureInfo.point_x.ToString;str+=,Y=+featureInfo.point_y.ToString;str+=,C1=+c1+;str+=,C2=+c2+;str+=,C3=+c3+;str+=,C4=+c4+;str+=,C5=+c5+;str+=,C6=+c6+;str+=WHEREID=+selectedFeature.FeatureID.ToString+ANDSOURCE=+locate.ToString+;//OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;//myConn.Open;myOracleCommand.ExecuteNonQuery;//myConn.Close;MessageBox.Showmodifiedsuccessfully;}publicvoidDeleteUserSymbolstringlayerName,stringselectedFeatureKey//删除viewlayer层图元,layerName为viewLayer图层的name{stringc1=deleted,c2=deleted,c3=deleted,c4=deleted,c5=deleted,c6=deleted;iflocate==1{c1=old;}iflocate==2{c2=old;}iflocate==3{c3=old;}iflocate==4{c4=old;}iflocate==5{c5=old;}iflocate==6{c6=old;}MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}MapXLib.FeatureselectedFeature=layer.GetFeatureByKeyselectedFeatureKey;ifselectedFeature==nullreturn;//stringstr=UPDATESYSTEM.INFOSET;str+=C1=+c1+,C2=+c2+,C3=+c3+,C4=+c4+,C5=+c5+,C6=+c6+;str+=WHEREID=+selectedFeature.FeatureID.ToString+ANDSOURCE=+locate.ToString;//OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;//myConn.Open;myOracleCommand.ExecuteNonQuery;//myConn.Close;layer.DeleteFeatureselectedFeature;}privatevoidtimer1_Tickobjectsender,System.EventArgse{FeatureInfofeatureInfo=newFeatureInfo;MapXLib.Variablesvs=newMapXLib.VariablesClass;MapXLib.Featuresfeatures;MapXLib.Featurefeature=null;stringwhereCondition,colStr=,type;//查询数据库中新增加的图元加到本地图层中locate=4;switchlocate{case1{whereCondition=C1=neworC1=modifiedorC1=deleted;colStr=C1;break;}case2{whereCondition=C2=neworC2=modifiedorC2=deleted;colStr=C2;break;}case3{whereCondition=C3=neworC3=modifiedorC3=deleted;colStr=C3;break;}case4{whereCondition=C4=neworC4=modifiedorC4=deleted;colStr=C4;break;}case5{whereCondition=C5=neworC5=modifiedorC5=deleted;colStr=C5;break;}case6{whereCondition=C6=neworC6=modifiedorC6=deleted;colStr=C6;break;}default whereCondition=C6=;break;}stringstr=SELECTID,SOURCE,NAME,IDENTITY,DESCRIPTION,FOUNDTIME,MEDIA,X,Y,BMP,+colStr+FROMSYSTEM.INFO;str+=WHERE+whereCondition;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;OracleDataReadermyReader=myOracleCommand.ExecuteReader;whilemyReader.Read{featureInfo.featureID=myReader.GetInt320;featureInfo.source=myReader.GetValue
1.ToString;try{featureInfo.name=myReader.GetString2;}catch{featureInfo.name=;}featureInfo.identity=myReader.GetString3;try{featureInfo.description=myReader.GetString4;}catch{featureInfo.description=;}try{featureInfo.foundTime=myReader.GetString5;}catch{featureInfo.foundTime=;}try{featureInfo.media=myReader.GetString6;}catch{featureInfo.media=;}featureInfo.point_x=myReader.GetDouble7;featureInfo.point_y=myReader.GetDouble8;featureInfo.symbolFileName=myReader.GetString9;type=myReader.GetString10;stringstr1;iftype==new{this.AddUserSymbolOnLayerfeatureInfo,userLayer;}iftype==modified{stringsearchStr=mainID=+featureInfo.featureID.ToString+andsourcelike+\%+featureInfo.source+%\;features=axMap
1.Layers._ItemuserLayer.SearchsearchStr,vs;iffeatures.Count0{feature=features._Item1;this.ModifyUserSymbolfeatureInfo,feature.FeatureKey,userLayer;}}iftype==deleted{stringsearchStr=mainID=+featureInfo.featureID.ToString+andsourcelike+\%+featureInfo.source+%\;features=axMap
1.Layers._ItemuserLayer.SearchsearchStr,vs;iffeatures.Count0{feature=features._Item1;this.DeleteUserSymboluserLayer,feature.FeatureKey;}}//修改对应列的标志为old,表示新增的或新修改的或新删除的图元在本机已做同步更改str1=UPDATESYSTEM.INFOSET+colStr+=old;OracleCommandmyOracleCommand1=newOracleCommandstr1;myOracleCommand
1.Connection=myConn;myOracleCommand
1.ExecuteNonQuery;}myReader.Close;//MessageBox.ShowaxMap
1.Layers._Item
1.AllFeatures.Count.ToString;}
5.
3.3程序说明略第六章MapCtrl控件的开发方法在这一章节我们对MapX进行二次封装,实现地理信息系统的大部分功能,从而从整体上把握地理信息系统的开发方法
6.1主要功能1.地图基本功能放大、缩小、居中、漫游、测量2.新建图层、删除图层、图层控制3.增加图元、修改图元、删除图元、查找图元4.利用OracleSpatial把图元存于空间数据库中以便网络共享5.鹰眼图功能
6.2开发步骤1.选择“菜单文件”—“新建项目”,打开新建项目对话框2.在项目类型中选择“visualC#”类型,在模板中选择“windows控件库”,输入控件库名称“mapCtrl”,单击“确定”,出现用户控件设计窗体3.在设计窗体中添加MapX
5.0控件,StatusBar控件,ToolTip控件,TooBar控件等,设计效果如下图4.打开代码编辑器,定义各种控件接口,添加各种变量定义,功能函数,自定义事件及事件处理程序等,完成以上所需的各种功能5.设计完成后,另存为mapCtrl.cs6.选择菜单“生成”—“生成mapCtrl”,生成mapCtrl控件库
6.3程序实现整个控件的原代码摘要如下usingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Data;usingSystem.Data.OracleClient;usingSystem.Windows.Forms;usingMapXLib;usingSystem.IO;namespacemapCtrl{publicdelegatevoidAddSymbolDelegate;publicdelegatevoidChangeMapDelegate;publicdelegatevoidMeasureDelegateintmode,string[]value1;publicdelegatevoidMapRefreshDelegate;publicstructFeatureInfo{//数据属性publicintfeatureID;//图元的唯一标示符(只读)publicstringsource;//图元来源提供者publicstringname;//图元名称publicstringdescription;//图元描述publicstringmedia;//与图元关联的多媒体信息publicstringidentity;//图元身份类型publicstringfoundTime;//时间//符号属性publicstringsymbolFileName;//图元符号bmp文件名//几何属性publicintfeatureType;//图元类型0点图元,1线图元,2面图元publicdoublepoint_x;//点图元的经度publicdoublepoint_y;//点图元的纬度publicdouble[]line_xy;//线图元的顶点坐标序列x1,y1,x2,y
2....publicdouble[]polygon_xy;//面图元的顶点坐标序列//扩展属性publicstringproperty1;publicstringproperty2;publicstringproperty3;publicstringproperty4;publicstringproperty5;}publicstructfeatureRefreshProp{publicstringfeatureKey;publicstringsymbol;}publicclassmapCtrl System.Windows.Forms.UserControl{publicAxMapXLib.AxMapaxMap1;privateAxMapXLib.AxMapmapSmall;//对鹰眼图控件的引用privateMapXLib.Layerm_Layer;privatedoublemapZoom,mapCenterX,mapCenterY;//保存初始缩放比例、中心点坐标privateconstintmiGetLength=100;//自定义用户工具测量长度privateconstintmiGetArea=101;//自定义用户工具测量面积privateconstintmiAddSymbol=102;//privatestringgeoset;privatestringappDirectory;//应用程序目录privatestringconnectString;//数据库连接字符串privatestringconnStringForLayerInfo;//layerinfo对象对数据库的连接参数privatestring[]symbolProperty;//privatestringselectedFeatureKey;//当前具有焦点的图元privatestringuserLayerName;privateSystem.Windows.Forms.ToolTiptoolTip1;privateSystem.Windows.Forms.OpenFileDialogopenFileDialog1;privateSystem.Windows.Forms.ContextMenumapMenu;privateSystem.Windows.Forms.MenuItemmenuItemChangeGST;privateSystem.Windows.Forms.MenuItemmenuItemSaveGST;privateSystem.Windows.Forms.MenuItemmenuItemLayerCTL;privateSystem.ComponentModel.IContainercomponents;publicRunInforif=newRunInfo;publiceventAddSymbolDelegateaddSymbolDelegate;publiceventChangeMapDelegatechangeMapDelegate;publiceventMeasureDelegatemeasureDelegate;publiceventMapRefreshDelegatemapRefreshDelegate;publicfeatureRefreshProp[]frp=newfeatureRefreshProp
[1];publicFeatureInfocurrentFeatureInfo=newFeatureInfo;publicmapCtrl{//该调用是Windows.Forms窗体设计器所必需的.InitializeComponent;//TODO在InitComponent调用后添加任何初始化}///summary///清理所有正在使用的资源.////summaryprotectedoverridevoidDisposebooldisposing{ifdisposing{ifcomponents!=nullcomponents.Dispose;}base.Disposedisposing;}#region组件设计器生成的代码///summary///设计器支持所需的方法-不要使用代码编辑器///修改此方法的内容.////summaryprivatevoidInitializeComponent{this.components=newSystem.ComponentModel.Container;System.Resources.ResourceManagerresources=newSystem.Resources.ResourceManagertypeofmapCtrl;this.axMap1=newAxMapXLib.AxMap;this.toolTip1=newSystem.Windows.Forms.ToolTipthis.components;this.openFileDialog1=newSystem.Windows.Forms.OpenFileDialog;this.mapMenu=newSystem.Windows.Forms.ContextMenu;this.menuItemChangeGST=newSystem.Windows.Forms.MenuItem;this.menuItemSaveGST=newSystem.Windows.Forms.MenuItem;this.menuItemLayerCTL=newSystem.Windows.Forms.MenuItem;System.ComponentModel.ISupportInitializethis.axMap
1.BeginInit;this.SuspendLayout;this.axMap
1.Dock=System.Windows.Forms.DockStyle.Fill;this.axMap
1.Enabled=true;this.axMap
1.Location=newSystem.Drawing.Point0,0;this.axMap
1.Name=axMap1;this.axMap
1.OcxState=System.Windows.Forms.AxHost.Stateresources.GetObjectaxMap
1.OcxState;this.axMap
1.Size=newSystem.Drawing.Size360,296;this.axMap
1.TabIndex=0;this.axMap
1.PolyToolUsed+=newAxMapXLib.CMapXEvents_PolyToolUsedEventHandlerthis.axMap1_PolyToolUsed;this.axMap
1.SelectionChanged+=newSystem.EventHandlerthis.axMap1_SelectionChanged;this.axMap
1.ToolUsed+=newAxMapXLib.CMapXEvents_ToolUsedEventHandlerthis.axMap1_ToolUsed;this.axMap
1.MouseUpEvent+=newAxMapXLib.CMapXEvents_MouseUpEventHandlerthis.axMap1_MouseUpEvent;this.axMap
1.MouseDownEvent+=newAxMapXLib.CMapXEvents_MouseDownEventHandlerthis.axMap1_MouseDownEvent;this.axMap
1.MouseMoveEvent+=newAxMapXLib.CMapXEvents_MouseMoveEventHandlerthis.axMap1_MouseMoveEvent;this.axMap
1.MapViewChanged+=newSystem.EventHandlerthis.axMap1_MapViewChanged;////mapMenu//this.mapMenu.MenuItems.AddRangenewSystem.Windows.Forms.MenuItem[]{this.menuItemChangeGST,this.menuItemSaveGST,this.menuItemLayerCTL};////menuItemChangeGST//this.menuItemChangeGST.Index=0;this.menuItemChangeGST.ShowShortcut=false;this.menuItemChangeGST.Text=更换地图;this.menuItemChangeGST.Click+=newSystem.EventHandlerthis.menuItemChangeGST_Click;////menuItemSaveGST//this.menuItemSaveGST.Index=1;this.menuItemSaveGST.ShowShortcut=false;this.menuItemSaveGST.Text=保存地图设置;this.menuItemSaveGST.Click+=newSystem.EventHandlerthis.menuItemSaveGST_Click;////menuItemLayerCTL//this.menuItemLayerCTL.Index=2;this.menuItemLayerCTL.ShowShortcut=false;this.menuItemLayerCTL.Text=地图图层控制;this.menuItemLayerCTL.Click+=newSystem.EventHandlerthis.menuItemLayerCTL_Click;////mapCtrl//this.Controls.Addthis.axMap1;this.Name=mapCtrl;this.Size=newSystem.Drawing.Size360,296;this.Load+=newSystem.EventHandlerthis.mapCtrl_Load;System.ComponentModel.ISupportInitializethis.axMap
1.EndInit;this.ResumeLayoutfalse;}#endregion//属性获取publicstringSelectedFeatureKey{get{returnselectedFeatureKey;}}publicstringGeoset{get{returngeoset;}set{geoset=value;}}publicstringConnectString{get{returnconnectString;}set{connectString=value;}}publicstringUserLayerName{get{returnuserLayerName;}set{userLayerName=value;}}publicstringConnStringForLayerInfo{get{returnconnStringForLayerInfo;}set{connStringForLayerInfo=value;}}publicstringAppDirectory{get{returnappDirectory;}set{appDirectory=value;}}//电子地图基本操作放大、缩小、漫游、恢复publicvoidMapZoomIn{axMap
1.CurrentTool=ToolConstants.miZoomInTool;}publicvoidMapZoomOut{axMap
1.CurrentTool=ToolConstants.miZoomOutTool;}publicvoidMapPan{axMap
1.CurrentTool=ToolConstants.miPanTool;}publicvoidMapCenter{axMap
1.CurrentTool=ToolConstants.miCenterTool;}publicvoidMapArrow{axMap
1.CurrentTool=ToolConstants.miArrowTool;}publicvoidMapReset{axMap
1.ZoomTothis.mapZoom,this.mapCenterX,this.mapCenterY;}//图元选择publicvoidFeaturePointSelect{axMap
1.CurrentTool=ToolConstants.miSelectTool;axMap
1.AutoRedraw=true;}publicvoidFeaturePolygonSelect{axMap
1.CurrentTool=ToolConstants.miPolygonSelectTool;axMap
1.AutoRedraw=true;}publicvoidFeatureRadiusSelect{axMap
1.CurrentTool=ToolConstants.miRadiusSelectTool;axMap
1.AutoRedraw=true;}publicvoidFeatureRectSelect{axMap
1.AutoRedraw=false;axMap
1.CurrentTool=ToolConstants.miRectSelectTool;//axMap
1.CurrentTool=ToolConstants.miRadiusSelectTool;}//地图测量publicvoidGetLength{axMap
1.CurrentTool=MapXLib.ToolConstantsmiGetLength;}publicvoidGetArea{axMap
1.CurrentTool=MapXLib.ToolConstantsmiGetArea;}privatevoidmapCtrl_Loadobjectsender,System.EventArgse{//每个图元有7个属性symbolProperty=newstring
[7];//仅用于selectionchanged事件中显示tooltip//保存应用程序目录appDirectory=Directory.GetCurrentDirectory;//保存地图初始值mapZoom=axMap
1.Zoom;mapCenterX=axMap
1.CenterX;mapCenterY=axMap
1.CenterY;//产生自定义地图测量工具axMap
1.CreateCustomToolmiGetArea,MapXLib.ToolTypeConstants.miToolTypePolygon,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,false;axMap
1.CreateCustomToolmiGetLength,MapXLib.ToolTypeConstants.miToolTypePoly,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,false;}privatevoidaxMap1_PolyToolUsedobjectsender,AxMapXLib.CMapXEvents_PolyToolUsedEvente{doublelength=0,area=0;string[]value1=newstring
[1];ife.toolNum==miGetLength//长度及面积为只读属性从控件的length和area属性中读取{MapXLib.Pointspts=MapXLib.Pointse.points;MapXLib.Pointpt1,pt2;forinti=1;ipts.Count;i++{pt1=pts._Itemi;pt2=pts._Itemi+1;length+=axMap
1.Distancept
1.X,pt
1.Y,pt
2.X,pt
2.Y;}value1
[0]=length.ToString;measureDelegate0,value1;}elseife.toolNum==miGetArea{MapXLib.Pointspts=MapXLib.Pointse.points;MapXLib.FeatureFactorydd=axMap
1.FeatureFactory;MapXLib.Stylestyle=axMap
1.DefaultStyle;area=dd.CreateRegionpts,style.Area;value1
[0]=area.ToString;measureDelegate1,value1;}}//地图控制publicboolOpenGeosetrefstringgeosetFileName//参数要带扩展名.gst{openFileDialog
1.DefaultExt=*.gst;openFileDialog
1.Filter=geosetfile*.gst|*.gst;openFileDialog
1.ShowDialog;geosetFileName=openFileDialog
1.FileName;if!File.ExistsgeosetFileNamereturnfalse;else{geoset=geosetFileName;axMap
1.GeoSet=openFileDialog
1.FileName;axMap
1.TitleText=;mapZoom=axMap
1.Zoom;mapCenterX=axMap
1.CenterX;mapCenterY=axMap
1.CenterY;returntrue;}}publicboolOpenGeosetstringgeosetFileName//参数要带扩展名.gst{if!File.ExistsgeosetFileNamereturnfalse;else{try{geoset=geosetFileName;axMap
1.GeoSet=geosetFileName;axMap
1.TitleText=;mapZoom=axMap
1.Zoom;mapCenterX=axMap
1.CenterX;mapCenterY=axMap
1.CenterY;returntrue;}catch{returnfalse;}}}publicvoidSaveGeosetstringgeosetFileName{try{axMap
1.SaveMapAsGeosetaxMap
1.Title.ToString,@geosetFileName;}catch{}}publicvoidLayerCtrl//图层控制{axMap
1.Layers.LayersDlg1,1;}publicboolNewUserLayerstringlayerName//新建自定义图层,若存在则添加到图层集中{MapXLib.Layerlayer;MapXLib.Fieldsflds=newMapXLib.FieldsClass;flds.AddStringFieldsource,50,false;flds.AddStringFieldname,50,false;flds.AddStringFieldidentity,50,false;flds.AddStringFielddescription,50,false;flds.AddStringFieldfoundTime,50,false;flds.AddFloatFieldobjX,false;flds.AddFloatFieldobjY,false;MapXLib.LayerInfolayerInfo;layerInfo=newMapXLib.LayerInfoClass;layerInfo.AddParameterFileSpec,@appDirectory+\\+layerName+.tab;layerInfo.AddParameterName,layerName;layerInfo.AddParameterFields,flds;layerInfo.AddParameterAutoCreateDataset,1;layerInfo.AddParameterDatasetName,ds+layerName;if!File.Exists@appDirectory+\\+layerName+.tab{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable;}else{layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;}try{layer=axMap
1.Layers.AddlayerInfo,1;axMap
1.Refresh;returntrue;}catch{returnfalse;}}publicboolLoadRasterLayerstringlayerName//装载栅格图层{intlayerNumber=axMap
1.Layers.Count;try{axMap
1.Layers.AddlayerName+.tab,layerNumber+1;returntrue;}catch{returnfalse;}}publicvoidDeleteLayerstringlayerName{intindex;forinti=1;i=axMap
1.Layers.Count;i++{ifaxMap
1.Layers._Itemi.Name==layerName{index=i;axMap
1.Layers.Removeindex;return;}}}privatevoidOpenDatabasestringconnectString//打开到数据库的连接{OracleConnectionmyConn=newOracleConnectionconnectString;myConn.Open;}publicboolNewLayerTablestringlayerName//在oracle中建立图层对应的表,表名等于层名,可由easyloader工具实现{MapXLib.Fieldsfields=newMapXLib.FieldsClass;MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{iflayer==nullreturnfalse;}fields=layer.DataSets._Itemds+layerName.Fields;intfieldCount=layer.DataSets._Itemds+layerName.Fields.Count;string[]fieldSet=newstring[fieldCount+3];//后面为图元空间属性字段forinti=1;i=fieldCount;i++{fieldSet[i]=fields._Itemi.Name;}stringstr=;forintj=1;j=fieldCount-2;j++{str+=fieldSet[j]+VARCHAR250NULL+,;}str+=OBJXNUMBER,OBJYNUMBER,;str+=MI_RENDITIONVARCHAR250NULL,MI_PRINXNUMBER,GEOLOCMDSYS.SDO_GEOMETRYNULL;stringcreatLayerTable=CREATETABLE+SYSTEM+.+layerName++str+;stringid=rif.dataBaseMap.id;stringpassword=rif.dataBaseMap.password;stringdataSource=rif.dataBaseMap.server;connectString=userid=+id+;datasource=+dataSource+;password=+password;OracleConnectionmyConn=newOracleConnectionconnectString;myConn.Open;OracleCommandmyOracleCommand=newOracleCommandcreatLayerTable;myOracleCommand.Connection=myConn;try{myOracleCommand.ExecuteNonQuery;myConn.Close;returntrue;}catch{myConn.Close;returnfalse;}returntrue;}publicvoidAddUserSymbolrefFeatureInfofeatureInfo,stringlayerName//增加到userlayer后插入oracle表中{try{MapXLib.Pointpnt=newMapXLib.PointClass;MapXLib.RowValuerv=newMapXLib.RowValueClass;MapXLib.RowValuesrvs=newMapXLib.RowValuesClass;MapXLib.Featureftr;MapXLib.FeatureFactoryfeaFac;MapXLib.Layerlayer=axMap
1.Layers._ItemlayerName;MapXLib.StylenewStyle=newMapXLib.StyleClass;feaFac=axMap
1.FeatureFactory;newStyle.SymbolType=MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;newStyle.SymbolBitmapSize=20;//根据图元身份不同图元用不同的颜色区分iffeatureInfo.identity==0{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorBlue;newStyle.SymbolBitmapOverrideColor=true;}elseiffeatureInfo.identity==1{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorGreen;newStyle.SymbolBitmapOverrideColor=true;}else{newStyle.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorRed;newStyle.SymbolBitmapOverrideColor=true;}newStyle.SymbolBitmapName=featureInfo.symbolFileName;newStyle.SymbolBitmapTransparent=true;axMap
1.AutoRedraw=false;//禁止图层自动刷新layer.Editable=true;pnt.SetfeatureInfo.point_x,featureInfo.point_y;ftr=feaFac.CreateSymbolpnt,newStyle;//******************************************************//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性//******************************************************MapXLib.DatasetdsUserLayer;MapXLib.FieldsfldsUserLayer;dsUserLayer=axMap
1.DataSets._Itemds+layerName;fldsUserLayer=dsUserLayer.Fields;rv.Dataset=dsUserLayer;//MI_PRINX索引构成规则number前2位加yymmddhhmmssDateTimemyDataTime=DateTime.Now;iffeatureInfo.source==nullfeatureInfo.source=6;stringrownumber=featureInfo.source.PadLeft2,0+myDataTime.Year.ToString+myDataTime.Month.ToString+myDataTime.Day.ToString+myDataTime.Hour.ToString+myDataTime.Minute.ToString+myDataTime.Second.ToString;forintj=1;j=fldsUserLayer.Count;j++{ifj==1{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.source;}ifj==2{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.name;}ifj==3{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.identity;}ifj==4{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.description;}ifj==5{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.foundTime;}ifj==6{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.point_x;}ifj==7{rv.Field=fldsUserLayer._Itemj;rv.Value=featureInfo.point_y;}rvs.Addrv;}layer.AddFeatureftr,rvs;layer.Refresh;this.InsertIntoOraclefeatureInfo,rownumber,ftr.Style,symbol,ftr,layerName;DeleteAllfeaturesuserLayerName;}catch{}axMap
1.AutoRedraw=true;}publicvoidModifyUserSymbolFeatureInfofeatureInfo,stringlayerName//修改图元属性,layerName为viewlayer层的name{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}MapXLib.FeatureselectedFeature=layer.GetFeatureByKeyfeatureInfo.featureKey;ifselectedFeature==nullreturn;MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.RowValuesrowValues=ds.get_RowValuesselectedFeature;MapXLib.RowValuerowValue=rowValues._ItemMI_PRINX;stringprinx=rowValue.Value.ToString;//取得该图元在数据库中行的索引值stringrendition=;stringgeoloc=;MapXLib.Stylestyle=selectedFeature.Style;iffeatureInfo.identity==0{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorBlue;style.SymbolBitmapOverrideColor=true;}elseiffeatureInfo.identity==1{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorGreen;style.SymbolBitmapOverrideColor=true;}else{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorRed;style.SymbolBitmapOverrideColor=true;}rendition=symbol+\+style.SymbolBitmapName+\+,+style.SymbolBitmapColor+,+style.SymbolBitmapSize+,+style.SymbolType+;geoloc=MDSYS.SDO_GEOMETRY2001,NULL,MDSYS.SDO_POINT_TYPE+featureInfo.point_x.ToString+,+featureInfo.point_y.ToString+,+NULL,+NULL,NULL;MapXLib.Fieldsfields=newMapXLib.FieldsClass;fields=axMap
1.DataSets._Itemds+layerName.Fields;intfieldCount=fields.Count;string[]fieldSet=newstring[fieldCount+1];forinti=1;i=fieldCount;i++{fieldSet[i-1]=fields._Itemi.Name;}fieldSet[fieldCount-1]=GEOLOC;stringtableName=layerName.Substring0,layerName.Length-6;stringstr=UPDATESYSTEM.+tableName+SET;str+=fieldSet
[0]+=+featureInfo.source+;str+=,+fieldSet
[1]+=+featureInfo.name+;str+=,+fieldSet
[2]+=+featureInfo.identity+;str+=,+fieldSet
[3]+=+featureInfo.description+;str+=,+fieldSet
[4]+=+featureInfo.foundTime+;str+=,+fieldSet
[5]+=+featureInfo.point_x.ToString;str+=,+fieldSet
[6]+=+featureInfo.point_y.ToString;str+=,+fieldSet
[7]+=+rendition+;str+=,+fieldSet
[8]+=+geoloc+;str+=WHEREMI_PRINX=+prinx;OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;myConn.Open;myOracleCommand.ExecuteNonQuery;myConn.Close;}publicvoidModifyUserSymbolstringfeatureKey,doubleX,doubleY,stringlayerName//修改图元属性,layerName为viewlayer层的name{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}FeatureInfofeatureInfo=newFeatureInfo;GetFeaturePropertyByFeatureKeylayerName,reffeatureInfo,featureKey;featureInfo.point_x=X;featureInfo.point_y=Y;MapXLib.FeatureselectedFeature=layer.GetFeatureByKeyfeatureInfo.featureKey;ifselectedFeature==nullreturn;MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.RowValuesrowValues=ds.get_RowValuesselectedFeature;MapXLib.RowValuerowValue=rowValues._ItemMI_PRINX;stringprinx=rowValue.Value.ToString;//取得该图元在数据库中行的索引值stringrendition=;stringgeoloc=;MapXLib.Stylestyle=selectedFeature.Style;iffeatureInfo.identity==0{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorBlue;style.SymbolBitmapOverrideColor=true;}elseiffeatureInfo.identity==1{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorGreen;style.SymbolBitmapOverrideColor=true;}else{style.SymbolBitmapColor=uintMapXLib.ColorConstants.miColorRed;style.SymbolBitmapOverrideColor=true;}rendition=symbol+\+featureInfo.symbolFileName+\+,+style.SymbolBitmapColor+,+style.SymbolBitmapSize+,+style.SymbolType+;geoloc=MDSYS.SDO_GEOMETRY2001,NULL,MDSYS.SDO_POINT_TYPE+featureInfo.point_x.ToString+,+featureInfo.point_y.ToString+,+NULL,+NULL,NULL;MapXLib.Fieldsfields=newMapXLib.FieldsClass;fields=axMap
1.DataSets._Itemds+layerName.Fields;intfieldCount=fields.Count;string[]fieldSet=newstring[fieldCount+1];forinti=1;i=fieldCount;i++{fieldSet[i-1]=fields._Itemi.Name;}fieldSet[fieldCount-1]=GEOLOC;stringtableName=layerName.Substring0,layerName.Length-6;stringstr=UPDATESYSTEM.+tableName+SET;str+=fieldSet
[0]+=+featureInfo.source+;str+=,+fieldSet
[1]+=+featureInfo.name+;str+=,+fieldSet
[2]+=+featureInfo.identity+;str+=,+fieldSet
[3]+=+featureInfo.description+;str+=,+fieldSet
[4]+=+featureInfo.foundTime+;str+=,+fieldSet
[5]+=+featureInfo.point_x.ToString;str+=,+fieldSet
[6]+=+featureInfo.point_y.ToString;str+=,+fieldSet
[7]+=+rendition+;str+=,+fieldSet
[8]+=+geoloc+;str+=WHEREMI_PRINX=+prinx;OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;myConn.Open;myOracleCommand.ExecuteNonQuery;myConn.Close;}publicvoidDataSetRefreshstringlayerName//与图层关联的数据集刷新{MapXLib.Layerlayer=axMap
1.Layers._ItemlayerName+FromDB;MapXLib.Datasetds;ds=layer.DataSets._Itemds+layerName+FromDB;ds.Refresh;}//将图元的各种属性插入Oracle数据表publicvoidInsertIntoOracleFeatureInfofeatureInfo,stringprinx,MapXLib.Stylestyle,stringfeatureType,MapXLib.Featureftr,stringlayerName{stringrendition=;stringgeoloc=;iffeatureType==symbol{rendition=symbol+\+featureInfo.symbolFileName+\+,+style.SymbolBitmapColor+,+style.SymbolBitmapSize+,+style.SymbolType+;geoloc=MDSYS.SDO_GEOMETRY2001,NULL,MDSYS.SDO_POINT_TYPE+featureInfo.point_x.ToString+,+featureInfo.point_y.ToString+,+NULL,+NULL,NULL;}MapXLib.Fieldsfields=newMapXLib.FieldsClass;fields=axMap
1.DataSets._Itemds+layerName.Fields;intfieldCount=fields.Count;string[]fieldSet=newstring[fieldCount+4];forinti=1;i=fieldCount;i++{fieldSet[i-1]=fields._Itemi.Name;}fieldSet[fieldCount+1]=MI_REDITION;fieldSet[fieldCount+2]=MI_PRINX;fieldSet[fieldCount+3]=GEOLOC;stringstr=INSERTINTO+layerName+;str+=fieldSet
[0];forintj=1;jfieldCount;j++{str+=,+fieldSet[j];}str+=,MI_RENDITION,MI_PRINX,GEOLOCValues;str+=+featureInfo.source+,+featureInfo.name+,+featureInfo.identity+,+featureInfo.description+,+featureInfo.foundTime+,+featureInfo.point_x.ToString+,+featureInfo.point_y.ToString+,+rendition+,+prinx+,+geoloc+;OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;myConn.Open;myOracleCommand.ExecuteNonQuery;myConn.Close;}//*********************************************//从OracleSpatial加载空间数据以生成新的图层//*********************************************publicvoidOracleToLayerstringtableName//tableName为oracle数据库表名与其对应的图层名一样{axMap
1.AutoRedraw=false;try{boolflag=false;forinti=1;i=axMap
1.DataSets.Count;i++{ifaxMap
1.DataSets._Itemi.Name==ds+tableName+FromDB{flag=true;break;}}MapXLib.Layerlayer;ifflag{DataSetRefreshtableName;axMap
1.Refresh;getSymbolStyletableName+FromDB;}else{stringquerystr=select*fromSYSTEM.+tableName.ToUpper;MapXLib.LayerInfoLayerInfoObject=newMapXLib.LayerInfoClass;LayerInfoObject.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeServer;LayerInfoObject.AddParametername,tableName+FromDB;LayerInfoObject.AddParameterConnectString,ConnStringForLayerInfo;LayerInfoObject.AddParameterQuery,querystr;LayerInfoObject.AddParametertoolkit,ORAINET;LayerInfoObject.AddParameterAutoCreateDataset,1;LayerInfoObject.AddParameterDatasetName,ds+tableName+FromDB;layer=axMap
1.Layers.AddLayerInfoObject,1;axMap
1.DataSets._Itemds+tableName+FromDB.Refresh;axMap
1.Refresh;layer.Editable=true;this.getSymbolStyletableName+FromDB;}}catch{}}publicvoidgetSymbolStylestringlayerName//恢复图元样式,层名与表名一致{MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.FieldsfldsUserLayer=ds.Fields;MapXLib.RowValuesrvs;MapXLib.RowValuerv;featureRefreshProp[]frptemp=newfeatureRefreshProp[axMap
1.Layers._ItemlayerName.AllFeatures.Count];foreachMapXLib.FeaturefeainaxMap
1.Layers._ItemlayerName.AllFeatures{try{rvs=ds.get_RowValuesfea;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;//判断相同featureKey是否有变化inti=0;ifsymbol.Substring0,3==sym{intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;startindex=symbol.IndexOf,+1;stringstr=;fori=startindex;symbol[i]!=,;i++{str+=symbol[i];}uintSymbolBitmapColor=uintConvert.ToInt32str;boolSymbolBitmapOverrideColor=true;ifstr!=0{SymbolBitmapColor=uintConvert.ToInt32str;SymbolBitmapOverrideColor=true;}else{SymbolBitmapOverrideColor=false;}stringSymbolBitmapName=bitmapfile;boolSymbolBitmapTransparent=true;fea.Style.SymbolBitmapName=SymbolBitmapName;fea.Style.SymbolBitmapTransparent=SymbolBitmapTransparent;fea.Style.SymbolBitmapOverrideColor=SymbolBitmapOverrideColor;fea.Style.SymbolBitmapColor=SymbolBitmapColor;fea.Updatetrue,rvs;}}catch{}}frp=frptemp;mapRefreshDelegate;//已经刷新}privatevoidgetSymbolStylestringlayerName,stringfeatureKey//层名与表名一致{MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.FieldsfldsUserLayer=ds.Fields;MapXLib.RowValuesrvs;MapXLib.RowValuerv;try{MapXLib.Featurefea=axMap
1.Layers._ItemlayerName.GetFeatureByKeyfeatureKey;rvs=ds.get_RowValuesfea;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;ifsymbol.Substring0,3==sym{intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;//startindex=symbol.IndexOf,+1;stringstr=;forinti=startindex;symbol[i]!=,;i++{str+=symbol[i];}uintSymbolBitmapColor=uintConvert.ToInt32str;boolSymbolBitmapOverrideColor=true;ifstr!=0{SymbolBitmapColor=uintConvert.ToInt32str;SymbolBitmapOverrideColor=true;}else{SymbolBitmapOverrideColor=false;}stringSymbolBitmapName=bitmapfile;boolSymbolBitmapTransparent=true;fea.Style.SymbolBitmapName=SymbolBitmapName;fea.Style.SymbolBitmapTransparent=SymbolBitmapTransparent;fea.Style.SymbolBitmapOverrideColor=SymbolBitmapOverrideColor;fea.Style.SymbolBitmapColor=SymbolBitmapColor;fea.Updatetrue,rvs;}}catch{}}publicvoidDeleteAllfeaturesstringlayerName//删除用户工作层userLayer中所有图元{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{iflayer==nullreturn;}foreachMapXLib.FeaturefeatureinaxMap
1.Layers._ItemlayerName.AllFeatures{axMap
1.Layers._ItemlayerName.DeleteFeaturefeature;}axMap
1.Layers._ItemlayerName.PackMapXLib.LayerPackConstant.miPackAll;}privatevoidaxMap1_SelectionChangedobjectsender,System.EventArgse//用于生成viewlayer图层图元InfoTip{stringlayerName=userLayer;MapXLib.Layerlayer=axMap
1.Layers._ItemlayerName+FromDB;MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName+FromDB;foreachMapXLib.Featureftrinlayer.Selection{selectedFeatureKey=ftr.FeatureKey;stringmsg=;forintj=1;j=ds.Fields.Count;j++{layer.KeyField=ds.Fields._Itemj.Name;msg+=ftr.KeyValue.ToString;}toolTip
1.SetToolTipthis.axMap1,msg;}}publicvoidGetSymbolPropertyOnUserLayerstringlayerName,refFeatureInfofeatureInfo//获取所有选中的图元的属性{MapXLib.Layerlayer=null;MapXLib.Datasetds=null;try{layer=axMap
1.Layers._ItemlayerName;ds=axMap
1.DataSets._Itemds+layerName;}catch{iflayer==nullreturn;}foreachMapXLib.Featureftrinlayer.AllFeatures{featureInfo.featureKey=ftr.FeatureKey;featureInfo.point_x=ftr.CenterX;featureInfo.point_y=ftr.CenterY;featureInfo.symbolFileName=currentFeatureInfo.symbolFileName;featureInfo.source=rif.netStatu.localNetIndex.ToString;featureInfo.name=点击操作点;featureInfo.identity=currentFeatureInfo.identity;featureInfo.foundTime=DateTime.Now.ToString;}}publicvoidGetSelectedFeaturePropertystringlayerName,refFeatureInfo[]featureInfo//获取和数据库关联的图层的所有选中图元的属性数据库相关{MapXLib.Layerlayer=null;MapXLib.Datasetds=null;MapXLib.Fieldsfields=null;MapXLib.RowValuesrvs;MapXLib.RowValuerv;try{layer=axMap
1.Layers._ItemlayerName;ds=axMap
1.DataSets._Itemds+layerName;fields=ds.Fields;}catch{iflayer==nullreturn;}try{intcount=layer.Selection.Count;ifcount==0featureInfo=null;elsefeatureInfo=newFeatureInfo[count];inti=0;foreachMapXLib.Featureftrinlayer.Selection{featureInfo[i].featureKey=ftr.FeatureKey;featureInfo[i].point_x=ftr.CenterX;featureInfo[i].point_y=ftr.CenterY;eatureInfo[i].symbolFileName=ftr.Style.SymbolBitmapName;layer.KeyField=fields._Item
1.Name;featureInfo[i].source=ftr.KeyValue.ToString;layer.KeyField=fields._Item
2.Name;featureInfo[i].name=ftr.KeyValue.ToString;layer.KeyField=fields._Item
3.Name;featureInfo[i].identity=ftr.KeyValue.ToString;layer.KeyField=fields._Item
4.Name;featureInfo[i].description=ftr.KeyValue.ToString;layer.KeyField=fields._Item
5.Name;featureInfo[i].foundTime=ftr.KeyValue.ToString;rvs=ds.get_RowValuesftr;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;featureInfo[i].symbolFileName=bitmapfile;i++;}}catch{}}publicvoidGetAllFeaturePropertystringlayerName,refFeatureInfo[]featureInfo//获取和数据库关联的图层的所有图元的属性(数据库相关){MapXLib.Layerlayer=null;MapXLib.Datasetds=null;MapXLib.Fieldsfields=null;MapXLib.RowValuesrvs;MapXLib.RowValuerv;try{layer=axMap
1.Layers._ItemlayerName;ds=axMap
1.DataSets._Itemds+layerName;fields=ds.Fields;}catch{iflayer==nullreturn;}try{intcount=layer.AllFeatures.Count;featureInfo=newFeatureInfo[count];inti=0;foreachMapXLib.Featureftrinlayer.AllFeatures{featureInfo[i].featureKey=ftr.FeatureKey;featureInfo[i].point_x=ftr.CenterX;featureInfo[i].point_y=ftr.CenterY;featureInfo[i].symbolFileName=ftr.Style.SymbolBitmapName;layer.KeyField=fields._Item
1.Name;featureInfo[i].source=ftr.KeyValue.ToString;layer.KeyField=fields._Item
2.Name;featureInfo[i].name=ftr.KeyValue.ToString;layer.KeyField=fields._Item
3.Name;featureInfo[i].identity=ftr.KeyValue.ToString;layer.KeyField=fields._Item
4.Name;featureInfo[i].description=ftr.KeyValue.ToString;layer.KeyField=fields._Item
5.Name;featureInfo[i].foundTime=ftr.KeyValue.ToString;rvs=ds.get_RowValuesftr;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;featureInfo[i].symbolFileName=bitmapfile;i++;}}catch{}}publicvoidGetFeaturePropertyByFeatureKeystringlayerName,refFeatureInfofeatureInfo,stringfeatureKey//获取确定featurekey的图元属性(数据库相关){MapXLib.Layerlayer=null;MapXLib.Datasetds=null;MapXLib.Fieldsfields=null;MapXLib.RowValuesrvs;MapXLib.RowValuerv;try{layer=axMap
1.Layers._ItemlayerName;ds=axMap
1.DataSets._Itemds+layerName;fields=ds.Fields;}catch{iflayer==nullreturn;}try{MapXLib.Featureftr=layer.GetFeatureByKeyfeatureKey;featureInfo.featureKey=ftr.FeatureKey;featureInfo.point_x=ftr.CenterX;featureInfo.point_y=ftr.CenterY;layer.KeyField=fields._Item
1.Name;featureInfo.source=ftr.KeyValue.ToString;layer.KeyField=fields._Item
2.Name;featureInfo.name=ftr.KeyValue.ToString;layer.KeyField=fields._Item
3.Name;featureInfo.identity=ftr.KeyValue.ToString;layer.KeyField=fields._Item
4.Name;featureInfo.description=ftr.KeyValue.ToString;layer.KeyField=fields._Item
5.Name;featureInfo.foundTime=ftr.KeyValue.ToString;rvs=ds.get_RowValuesftr;rv=rvs._ItemMI_RENDITION;stringsymbol=rv.Value.ToString;intstartindex=symbol.IndexOf\+1;intlastindex=symbol.LastIndexOf\;intlen=lastindex-startindex;stringbitmapfile=symbol.Substringstartindex,len;featureInfo.symbolFileName=bitmapfile;}catch{}}publicvoidDeleteUserSymbolstringlayerName,stringselectedFeatureKey//删除viewlayer层图元,layerName为viewLayer图层的name{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}MapXLib.FeatureselectedFeature=layer.GetFeatureByKeyselectedFeatureKey;ifselectedFeature==nullreturn;MapXLib.Datasetds=axMap
1.DataSets._Itemds+layerName;MapXLib.RowValuesrowValues=ds.get_RowValuesselectedFeature;MapXLib.RowValuerowValue=rowValues._ItemMI_PRINX;stringprinx=rowValue.Value.ToString;stringstr=deletefromsystem.+layerName.Substring0,layerName.Length-6;str+=whereMI_PRINX=+prinx;OracleConnectionmyConn=newOracleConnectionconnectString;OracleCommandmyOracleCommand=newOracleCommandstr;myOracleCommand.Connection=myConn;myConn.Open;myOracleCommand.ExecuteNonQuery;myConn.Close;}publicvoidDeleteDBLayerSelectedFeature//删除数据库关联的所有选中的图元{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemuserLayerName+FromDB;}catch{return;}try{foreachMapXLib.FeatureselectedFeatureinlayer.Selection{DeleteUserSymboluserLayerName+FromDB,selectedFeature.FeatureKey;}}catch{}}publicvoidDeleteDBLayerAllFeature//删除数据库关联的所有图元{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemuserLayerName+FromDB;}catch{return;}foreachMapXLib.FeatureselectedFeatureinlayer.AllFeatures{DeleteUserSymboluserLayerName+FromDB,selectedFeature.FeatureKey;}OracleToLayeruserLayerName;}publicvoidAddSymbolToolstringlayerName,stringbitmapFileName,stringIdentity//用mouse增加图元至工作图层上{axMap
1.AutoRedraw=false;MapXLib.Layerlayer=null;currentFeatureInfo.identity=Identity;currentFeatureInfo.symbolFileName=bitmapFileName;try{layer=axMap
1.Layers._ItemlayerName;}catch{iflayer==nullreturn;}MapXLib.Stylestyle=newMapXLib.StyleClass;style.SymbolType=MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;style.SymbolBitmapSize=20;style.SymbolBitmapName=bitmapFileName;style.SymbolBitmapTransparent=true;layer.OverrideStyle=true;layer.Style=style;layer.Editable=true;axMap
1.Layers.InsertionLayer=layer;axMap
1.CurrentTool=MapXLib.ToolConstants.miAddPointTool;}privatevoidmenuItemChangeGST_Clickobjectsender,System.EventArgse{stringgeoset1=;boolflag=OpenGeosetrefgeoset1;ifflag{geoset=geoset1;rif.mapInfoSet.GeoSet=geoset1;changeMapDelegate;mapSmall.GeoSet=geoset
1.Substring0,geoset
1.Length-4+eye.gst;mapSmall.TitleText=;SetEyeMapmapSmall;}}privatevoidmenuItemSaveGST_Clickobjectsender,System.EventArgse{SaveGeosetGeoset;}privatevoidmenuItemLayerCTL_Clickobjectsender,System.EventArgse{LayerCtrl;}privatevoidaxMap1_MouseDownEventobjectsender,AxMapXLib.CMapXEvents_MouseDownEvente{ife.button==2{System.Drawing.Pointpt=newSystem.Drawing.Pointinte.x,inte.y;mapMenu.Showthis,pt;}}privatevoidaxMap1_MouseUpEventobjectsenderAxMapXLib.CMapXEvents_MouseUpEvente{ife.button==1axMap
1.CurrentTool==MapXLib.ToolConstants.miAddPointTool{FeatureInfofeatureInfo=newFeatureInfo;GetSymbolPropertyOnUserLayeruserLayerName,reffeatureInfo;AddUserSymbolreffeatureInfo,userLayerName;OracleToLayeruserLayerName;addSymbolDelegate;}}//设置数据库关联层的可选状态,其他都不可选publicvoidSetDBLayerSelectable{foreachMapXLib.Layerlayer1inaxMap
1.Layers{layer
1.Selectable=false;}MapXLib.Layerlayer=axMap
1.Layers._ItemuserLayerName+FromDB;layer.Selectable=true;}//获取所有选中的图元privatevoidGetSelectedFeatureKeystringlayerName,refstring[]featureKey{MapXLib.Layerlayer=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}intcount=layer.Selection.Count;featureKey=newstring[layer.Selection.Count];inti=0;foreachMapXLib.FeatureselectedFeatureinlayer.Selection{featureKey[i]=selectedFeature.FeatureKey;i++;}}//设置图元的选中状态privatevoidSetSelectedFeatureKeystringlayerName,string[]featureKey{MapXLib.Layerlayer=null;MapXLib.Featurefeature=null;try{layer=axMap
1.Layers._ItemlayerName;}catch{return;}forinti=0;ifeatureKey.Length;i++{feature=layer.GetFeatureByKeyfeatureKey[i];intid=feature.FeatureID;layer.Selection.AddByID1;}}publicvoidSetEyeMapAxMapXLib.AxMapmapEye{try{m_Layer=mapSmall.Layers.CreateLayerRectLayer,@d\mapSmall,1,32,mapSmall.NumericCoordSys;mapSmall=mapEye;//初始时,产生鹰眼图矩形框绘画层if!File.ExistsApplication.StartupPath+\\mapSmall.tabm_Layer=mapSmall.Layers.CreateLayerRectLayer,Application.StartupPath+\\mapSmall.tab,1,32,mapSmall.NumericCoordSys;elsem_Layer=mapSmall.Layers.AddApplication.StartupPath+\\mapSmall.tab,1;m_Layer.Editable=true;}catch{}}privatevoidaxMap1_MapViewChangedobjectsender,System.EventArgse{ifmapSmall==nullreturn;mapSmall.AutoRedraw=false;MapXLib.Featuretempfea=newMapXLib.FeatureClass;MapXLib.Styletempsty=newMapXLib.StyleClass;MapXLib.FeatureFactoryfeaFact;MapXLib.Featurem_fea=newMapXLib.FeatureClass;feaFact=mapSmall.FeatureFactory;tempsty.RegionPattern=MapXLib.FillPatternConstants.miPatternNoFill;tempsty.RegionBorderColor=255;tempsty.RegionBorderWidth=2;MapXLib.Featuresftrs;ftrs=m_Layer.AllFeatures;MapXLib.PointsClassps=newMapXLib.PointsClass;MapXLib.PointClassp=newMapXLib.PointClass;ifftrs.Count==0//矩形边框还没有{floata=0;floatb=floataxMap
1.Width;floatc=0;floatd=floataxMap
1.Height;doublex=0,y=0;axMap
1.ConvertCoordrefa,refc,refx,refy,MapXLib.ConversionConstants.miScreenToMap;p.Setx,y;ps.Addp,1;axMap
1.ConvertCoordrefb,refc,refx,refy,MapXLib.ConversionConstants.miScreenToMap;p.Setx,y;ps.Addp,2;axMap
1.ConvertCoordrefb,refd,refx,refy,MapXLib.ConversionConstants.miScreenToMap;p.Setx,y;ps.Addp,3;axMap
1.ConvertCoordrefa,refd,refx,refy,MapXLib.ConversionConstants.miScreenToMap;p.Setx,y;ps.Addp,4;tempfea=feaFact.CreateRegionps,tempsty;m_fea=m_Layer.AddFeaturetempfea,newMapXLib.RowValuesClass;}else{m_fea=ftrs._Item1;m_fea.Parts._Item
1.RemoveAll;floata=0;floatb=floataxMap
1.Width;floatc=0;floatd=floataxMap
1.Height;doublex=0,y=0;axMap
1.ConvertCoordrefa,refc,refx,refy,MapXLib.ConversionConstants.miScreenToMap;m_fea.Parts._Item
1.AddXYx,y,1;axMap
1.ConvertCoordrefb,refc,refx,refy,MapXLib.ConversionConstants.miScreenToMap;m_fea.Parts._Item
1.AddXYx,y,2;axMap
1.ConvertCoordrefb,refd,refx,refy,MapXLib.ConversionConstants.miScreenToMap;m_fea.Parts._Item
1.AddXYx,y,3;axMap
1.ConvertCoordrefa,refd,refx,refy,MapXLib.ConversionConstants.miScreenToMap;m_fea.Parts._Item
1.AddXYx,y,4;m_fea.Updatetrue,newMapXLib.RowValuesClass;}}}}第七章分发基于.net平台的MapX应用程序
7.
1.NETFramework概述.NETFramework是一种新的计算平台,它简化了在高度分布式Internet环境中的应用程序开发.NETFramework旨在实现下列目标提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在Internet上分布,或者是在远程执行的提供一个将软件部署和版本控制冲突最小化的代码执行环境提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境提供一个可消除脚本环境或解释环境的性能问题的代码执行环境使开发人员的经验在面对类型大不相同的应用程序(如基于Windows的应用程序和基于Web的应用程序)时保持一致按照工业标准生成所有通信,以确保基于.NETFramework的代码可与任何其他代码集成.NETFramework具有两个主要组件公共语言运行库和.NETFramework类库公共语言运行库是.NETFramework的基础您可以将运行库看作一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性事实上,代码管理的概念是运行库的基本原则以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码.NETFramework的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面GUI应用程序,也包括基于ASP.NET所提供的最新创新的应用程序(如Web窗体和XMLWebservices).NETFramework可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境.NETFramework不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系该插图还显示托管代码如何在更大的结构内运行
7.
2.NETFramework的主要组件和功能
7.
2.1公共语言运行库公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务这些功能是在公共语言运行库上运行的托管代码所固有的至于安全性,取决于包括托管组件的来源(如Internet、企业网络或本地计算机)在内的一些因素,托管组件被赋予不同程度的信任这意味着即使用在同一活动应用程序中,托管组件既可能能够执行文件访问操作、注册表访问操作或其他须小心使用的功能,也可能不能够执行这些功能运行库强制实施代码访问安全例如,用户可以相信嵌入在Web页中的可执行文件能够在屏幕上播放动画或唱歌,但不能访问他们的个人数据、文件系统或网络这样,运行库的安全性功能就使通过Internet部署的合法软件能够具有特别丰富的功能运行库还通过实现称为通用类型系统CTS的严格类型验证和代码验证基础结构来加强代码可靠性CTS确保所有托管代码都是可以自我描述的各种Microsoft和第三方语言编译器生成符合CTS的托管代码这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例此外,运行库的托管环境还消除了许多常见的软件问题例如,运行库自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放这种自动内存管理解决了两个最常见的应用程序错误内存泄漏和无效内存引用运行库还提高了开发人员的工作效率例如,程序员可以用他们选择的开发语言编写应用程序,却仍能充分利用其他开发人员用其他语言编写的运行库、类库和组件任何选择以运行库为目标的编译器供应商都可以这样做以.NETFramework为目标的语言编译器使得用该语言编写的现有代码可以使用.NETFramework的功能,这大大减轻了现有应用程序的迁移过程的工作负担尽管运行库是为未来的软件设计的,但是它也支持现在和以前的软件托管和非托管代码之间的互操作性使开发人员能够继续使用所需的COM组件和DLL运行库旨在增强性能尽管公共语言运行库提供许多标准运行库服务,但是它从不解释托管代码一种称为实时JIT编译的功能使所有托管代码能够以它在其上执行的系统的本机语言运行同时,内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域以进一步提高性能最后,运行库可由高性能的服务器端应用程序(如Microsoft®SQLServer™和Internet信息服务IIS)承载此基础结构使您在享受支持运行库宿主的行业最佳企业服务器的优越性能的同时,能够使用托管代码编写业务逻辑
7.
2.
2.NETFramework类库.NETFramework类库是一个与公共语言运行库紧密集成的可重用的类型集合该类库是面向对象的,并提供您自己的托管代码可从中导出功能的类型这不但使.NETFramework类型易于使用,而且还减少了学习.NETFramework的新功能所需要的时间此外,第三方组件可与.NETFramework中的类无缝集成例如,.NETFramework集合类实现一组可用于开发您自己的集合类的接口您的集合类将与.NETFramework中的类无缝地混合正如您对面向对象的类库所希望的那样,.NETFramework类型使您能够完成一系列常见编程任务(包括诸如字符串管理、数据收集、数据库连接以及文件访问等任务)除这些常见任务之外,类库还包括支持多种专用开发方案的类型例如,可使用.NETFramework开发下列类型的应用程序和服务控制台应用程序.WindowsGUI应用程序(Windows窗体).ASP.NET应用程序.XMLWebservices.Windows服务例如,Windows窗体类是一组综合性的可重用的类型,它们大大简化了WindowsGUI的开发如果要编写ASP.NETWeb窗体应用程序,可使用Web窗体类
7.3安装.NETFramework为.NETFramework编写的应用程序和控件要求.NETFramework安装在运行它们的计算机上Microsoft提供了可再发行的安装程序Dotnetfx.exe,其中包含运行.NETFramework应用程序所必需的公共语言运行库和.NETFramework组件可以从MicrosoftMSDN下载中心或Microsoftwindowsupdateweb站点下载Dotnetfx.exe的最新版本如果您以前安装了.NETFrameworkSDK或MicrosoftVisualStudio.NET,则不需要安装Dotnetfx.exe尤其要注意的是,您无法在运行MicrosoftWindows95操作系统的计算机上安装.NETFramework如果达不到最低配置要求,Dotnetfx.exe安装程序将停止安装可再发行组件包
7.4Map客户安装要使MapX应用程序能够在客户机器上运行,必须安装MapX支撑文件,通常有以下两种方法在客户端安装1安装程序自动安装的文件运行MapX控件安装程序将在默认的MapX安装目录中安装以下内容C\ProgramFiles\MapInfo\MapX
5.0•MapX控件mapx
50.dll•它的支持的dll•光栅和网格dll以及处理程序•默认的数据集驱动程序这是最简单的分发方法,MapX开发人员只需进行非常少的工作,因为某些过程和任务已自动化2在用户端注册必须的文件将MapXDLL及其相关DLL数据集驱动程序(用于数据绑定)及其它所有支撑文件拷贝到用户机器上然后运行regsvr
32.exe实用程序进行注册
7.5制作安装程序创建windows安装项目,建立安装程序,请参照MSDN中windows应用程序安装部署一节2625。