C#开发MapInfo教程1-_第1页
C#开发MapInfo教程1-_第2页
C#开发MapInfo教程1-_第3页
C#开发MapInfo教程1-_第4页
C#开发MapInfo教程1-_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C#开发GIS应用简明教程2009-11-15 来自:CSDN Blog 字体大小:【大中小】摘要:这篇是C#开发GIS应用简明教程,从工具开始将其,包括设计窗体、创建永久图层等等。希望本文能对大家有所帮助。 C#开发GIS,这里将介绍MapX为开发人员提供一系列的工具,包括C#对MAPX图元的编程技术。这些工具的使用,可以通过MapX的帮助文档中查到。1.工具(ToolConstantsMapX为开发人员提供一系列的工具,这些工具的作用各有不同,我们通过开发一个应用程序来了解这些工具的作用,至于这些工具的具体说明,可以在MapX的帮助文档中,通过查找Available Standard To

2、ols 看到相应的解释.一些MapX的相关资料也有介绍.在.NET编程环境中新建一个C#的WindeosApplication(Windows应用程序项目,然后在菜单中选择”项目/添加引用”,打开如下图的窗口,在窗口中选择COM标签,在组件名称列表中双击MapInfo MapX V5.单击确认按钮,将Map5控件加入到.Net的工具箱中.接着,将MapInfo MapX V5 控件画到窗体上,再在窗体上画一个ComboBox控件comboBo x1.如下图:双击设计窗体,编写Form1_Load代码如下:1.private void Form1_Load(object sender, Syst

3、em.EventArgs e2.3.ArrayList ToolsList=new ArrayList(;4.ToolsList.Add(MapXLib.ToolConstants.miArrowTool;5.ToolsList.Add(MapXLib.ToolConstants.miCenterTool;6.ToolsList.Add(MapXLib.ToolConstants.miLabelTool;7.ToolsList.Add(MapXLib.ToolConstants.miPanTool;8.ToolsList.Add(MapXLib.ToolConstants.miPolygonS

4、electTool;9.ToolsList.Add(MapXLib.ToolConstants.miRadiusSelectTool;10.ToolsList.Add(MapXLib.ToolConstants.miSymbolTool;11.ToolsList.Add(MapXLib.ToolConstants.miTextTool;12.ToolsList.Add(MapXLib.ToolConstants.miZoomInTool;13.ToolsList.Add(MapXLib.ToolConstants.miZoomOutTool;boBox1.DataSource=ToolsLis

5、t;15.以上代码通过一个数组ToolsList,将MapXLib的工具加入到comboBox1中.MapX还有一些其它的工具,它们的作用是往地图上加上点,线,多边型和圆.因为这些工具要求有操作图层,一并在介绍图层的时候介绍.关于ArrayList的用法,请参考C#的有关资料.接着,双击comboBox1,并编写代码如下1.private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e2.3.axMap1.CurrentTool=(MapXLib.ToolConstantscomboBox1.Selec

6、tedItem;4.应注意,在C#中必须要显式地把comboBox1的选择项目SelectedItem(数据类型为obje ct转换为MapXLib.ToolConstants.因为ToolConstants是MapX自己定义的一个枚举数据类型,C#不能自动完成这种枚举成员变量到object的数据转换.编译执行程序,从comboBox1中选择不同的工具,在地图上进行操作,你可以了解到MapX 工具集的强大功能.实际上,MapX提供的工具集就好像Photoshop,AutoCAD的工具栏一样,为你提供了一些控制地图的工具.但是,在开发GIS的时候,这些工具是不能完全满足要求的.所以,还应该学会自

7、定义工具.下面,通过一个在地图上测距的例子,来介绍一下如何在C#下自定义MapX工具如前所述建立一个C#的Windows应用程序并将Mapinfo MapX V5 控件加到窗体上.并加入一个Button控件button1.将button1的Text属性改为测距,再在窗口中放上两个Lab el控件label1,label2,将它们的Text属性设置为空字符串,如下图:双击设计窗体,编写Form1_Load代码如下:1.private void Form1_Load(object sender, System.EventArgs e2.3.axMap1.CreateCustomTool(100,M

8、apXLib.ToolTypeConstants.miToolTypePoly,4.MapXLib.CursorConstants.miCrossCursor,null,null,null;5.在加载窗口的时候,我们定义了一个工具.它的编号是100(不要和MapX本身的工具编号重复,它的类型是一个多义线,采用十字光标.关于此函数的用法,建议查看MapX的开发手册和相关资料.现在我们定义了一个编号为100的工具,可以在程序中使用它了.双击设计窗体中的but ton1,编写它的Click事件处理代码如下:1.private void button1_Click(object sender, Sys

9、tem.EventArgs e2.3.axMap1.CurrentTool=(MapXLib.ToolConstants100;4.现在编译运行,单击button1,就可以在地图上使用这个工具了.但是还有一部分重要的代码没有完成:测距!完成测距功能的代码在C#使用MapX开发GIS中非常具有代表性,也比较有难度.我在首次使用C#+MapX开发GIS的时候,被这个问题困扰了很久.项目经理也来研究,过两天说有结果了,但他给出的例子根本就行不通.当然,会了就不难了.其实,也很简单.首先,在窗口类中声明两个私有全局变量以保存测出的距离和总距,注意声明代码的位置:1.public class Form1

10、 : System.Windows.Forms.Form2.3.private AxMapXLib.AxMap axMap1;4.private System.Windows.Forms.Button button1;5.private System.Windows.Forms.Label label1;6.private System.Windows.Forms.Label label2;7./8./ 必需的设计器变量。9./10.private System.ComponentModel.Container components = null;11.private double Dis=0

11、,DisSum=0;12.13.现在来编写工具的事件.注意,在MapX画多义线的时候,它触发消息的方式和一般的工具是不同的,首先,它并不是用鼠标一点击就完成了的,还可以继续画下去,所以,不应该在M apX控件的ToolUsed事件中编写,而应该在PolyToolUsed事件中实现测距.代码如下:1.private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e2.3.MapXLib.PointsClass pts=new MapXLib.PointsClass(;4.switch

12、(e.flags5.6.case (intMapXLib.ToolFlagConstants.miToolInProgress:7. pts=(MapXLib.PointsClasse.points;8.Dis=axMap1.Distance(pts._Item(pts.Count-1.X,9.pts._Item(pts.Count-1.Y,10.pts._Item(pts.Count.X,11.pts._Item(pts.Count.Y;12. DisSum+=Dis;13.break;14.default:15. Dis=0;16. DisSum=0;17.break;18.19.labe

13、l1.Text=距离:+Dis.ToString(#.00;20.label2.Text=总距+DisSum.ToString(#.00;21.这段代码虽短.但要注意的地方很多.首先,定义一个MapXLib.PointsClass类型的变量pts,注意,是PointsClass,不是Poin tClass.前者是点集,后者是点.为什么要增加那么一个变量呢?因为MapX的PolyToolUsed 事件的返回参数e的成员points不是MapXLib.PointsClass类型,而是object.类型.所以需要这么一个变量来转换它,当然,你也可以在程序使用pts的地方直接使用(MapXLib.Po

14、in tsClasse.points,但那样一来程序就比较难懂了;其次,要判断事件的标识e.flags的值,它指出工具当前的状态,是刚开始画多义线呢,还是正在画多义线,或者已经结束了,或者结束退出.我们只要在画的时候测距就可以了.其它时候将距离和总距都设置为0;接着,还要注意的是e.points的点数据保存方式,e.points首先是一个object,当在画多义线的时候,它被初试化为一个MapXLib.PointsClass的变量,并以二维数组的方式保存点集.这个数组是从1开始的,而不是从0开始的.它保存了多义线上每个转折点的坐标,鼠标每点一下,就增加一个新的数据到点集,我们计算最后一条直线长

15、度,应该从这个数组的末尾往前取.计算好距离以后再加入到总距中.许多测距的程序例子都要做一个循环,其实是不必要的.最后,请注意数字转换到字符串的格式问题.在这个例子中我们保留两位小数.补充一点,因为没有设置地图的地理坐标系统,所以测出来的距离单位是英里,如果要改为公里,把MapX控件的MapUnit属性改为miUnitKilometer就可以了.要提高测量精度,除了可以通过转换格式的时候增加小数位,还应该注意到地图的测绘精度.否则,再多的小数位也是没有意义的.1.建立一个应用程序,加入MapX控件和一个ComboBox控件,两个:Label控件,在ComboBox 中加入第一个例子中的所有工具和

16、测距工具,在ComboBox中选择测距工具时实现测距功能.2.将测距工具的光标改成箭头光标.并以米为单位显示测距数据.3.图层和图元(Layers and Features有关图层和图元的概念,请参照相关资料.图层的应用分为几个方面,我们分别加以介绍.1图层的创建:创建永久图层:在C#中,使用以下方法创建永久图层:1.MapXLib.Layer lyr;2.lyr=axMap1.Layers.CreateLayer(MyLayer,D:MapTestMyLayer.Tab,0,32,axMap1.DisplayCoordSys;当执行这两句程序时,在指定的路径生成了一系列文件.它们是:MyLa

17、yer.Dat:图层的数据文件,它保存的是图层的数据库数据;MyLayer.ID:图层数据的唯一的,自动生成的编码,用以区分不同的图元;MyLayer.IND:图层数据的索引文件,以实现图层上图元的快速查找;MyLaer.MAP:图层上图元的图形数据;MyLaer.TAB:这是一个文本文件,它的作用是将图层的有关信息保存起来,供GST地图文件或其它程序调用图层.用记事本打开MyLayer.TAB文件,看到如下内容:1.!table2.!version 4503.!charset WindowsSimpChinese4.Definition Table5.Description MyLayer6

18、.Type Native charset WindowsSimpChinese7.Fields 18.GEONAME char (32 Index 1 ;第一行总是!table,说明这是一个图层表的文件;第二行指出图层文件的版本号,MapInfo MapX 5.0生成的图层版本号是450;第三行指出生成图层的操作系统;接着是对图层的定义段:首先指出图层的描述,就是我们上面程序代码中的Mylayer.接着说明了字符集类型是简体中文;然后指出表格中只有一个字段,这个字段的名称是GEONAME,是长度为32的字符类型字段,在表中的列索引为1.2添加现有的图层:添加现有图层的方法和一般的程序语言没有很

19、大的区别,我们在当前图层上添加刚才创建的永久图层,程序代码如下:1.MapXLib.LayerInfo li;2.li=new MapXLib.LayerInfoClass(;3.li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;4.li.AddParameter(FileSpec,D:MapTestMyLayer.tab;5.li.AddParameter(Visible,false;6.li.AddParameter(AutoCreateDataset,true;7.li.AddParameter(DatasetName,M

20、yLayer;8.axMap1.Layers.Add(li,0;9.axMap1.Layers.LayersDlg(,;10.axMap1.SaveMapAsGeoset(测试,D:MapTestMyMap.GST;在程序的最后,我们显示了图层信息对话框,以观察图层是否已经添加到当前的地图中.可以看到,地图中添加了我们创建的图层MyLayer.放在第0层.然后,将地图保存在一个MyMap.GST的地图文件中,这个地图的标题是测试.3移除图层:好,接着我们上面做的工作,将工程的axMap1的GeoSet属性设置为刚刚生成的地图文件: D:MapTestMyMap.GST.现在我们将MyLayer

21、从地图中移除.添加一个按钮,在按钮的Click事件中编写如下代码:1.axMap1.Layers.LayersDlg(,;2.axMap1.Layers.Remove(1;3.axMap1.Layers.LayersDlg(,;我们使用两次显示图层对话框的方式查看程序的效果,应该注意的是在Remove第0层的时候使用的是Remove(1,如果不清楚图层的位置,就要作一个循环,将图层的位置取出来再移除,如下:1.int lyrind=0;2.axMap1.Layers.LayersDlg(,;3.for( int i=1;i4.5.if (axMap1.Layersi._Name.Trim(=M

22、yLayer6.7. lyrind=i;8.break;9.10.11.axMap1.Layers.Remove(lyrind;12.axMap1.Layers.LayersDlg(,;移除操作只在内存中进行,也就是说,程序并不删除任何文件,也没有将图层真正地从地图集合中去掉,当程序重新启动的时候,MyLayer图层仍然在地图中.3移除所有图层:使用axMap1.Layers.RemoveAll(;就可以移除所有图层,用法和Remove相似.4图层定位:和其它编程语言一样,使用axMap1.Move(1,2函数就可以将图层的位置改变.5创建临时图层临时图层和永久图层不同,它只存放在内存中,当关

23、闭程序以后该图层将不存在.在这里我们将使用LayerInfo对象来创建临时图层,这和传统的MAPX程序相近,但是引入了C#编程的一些特色:1.MapXLib.LayerInfoClass li=new MapXLib.LayerInfoClass(;2.MapXLib.Features ftrs=null;3.MapXLib.FieldsClass flds=new MapXLib.FieldsClass(;4.MapXLib.Fields Myflds=null;5.MapXLib.Dataset dts=null;6.flds.Add(State,State_Name,7.MapXLib.

24、AggregationFunctionConstants.miAggregationSum,8.MapXLib.FieldTypeConstants.miTypeString;9.dts=axMap1.DataSets.Add(MapXLib.DatasetTypeConstants.miDataSetLayer,10.axMap1.Layers._Item(1,MyLayer,0,0,0,flds,false;11.Myflds=dts.Fields;12.ftrs=axMap1.Layers._Item(USA.Selection.Clone(;13.li.Type=MapXLib.Lay

25、erInfoTypeConstants.miLayerInfoTypeTemp;14.li.AddParameter(Name,USA Temp Layer;15.li.AddParameter(Fields,Myflds;16.li.AddParameter(Features,ftrs;17.axMap1.Layers.Add(li,1;18.axMap1.Layers.LayersDlg(,;这段程序有两个关键的地方:一个是在C#中DataSets.Add的用法,在许多编程语言中,都可以使用空的参数或者干脆不用参数来调用这个函数,但是在C#中是不行的,必须8个参数全部指定.而且,还应该事先

26、初始化Fields参数.这个函数的使用涉及到许多方面的知识,包括对MAPX相关概念的理解和C#编程的认识,是一个很重要,也比较难掌握的技术.后面的章节中我们还会作进一步的探讨.另一个是li.AddParameter和li.Type的配合使用问题,这在许多的MAPX书籍中都有论述,此处不再重复.以上程序最好能自己多琢磨琢磨.才能更好地掌握C#开发GIS的要领.6缩放图层:所谓的缩放图层,并不是指将单个图层缩放.而是指定图层的可见范围比例,例如,设置一个图层在缩小显示大于5英里的时候隐藏.小于5英里的时候显示.和其它编程语言一样,只要设置Layer的ZoomMin和ZoomMax就可以了.7显示整

27、个图层:这里要提及的一个技巧是在C#下面怎样显示整个图层.众所周知,在VB下面只要:Map1.Bounds = Map1.Layers(USA.Bounds一句程序就可以轻松实现.但是要是在C#中这样写的话,百分百会出错.其实,这里有一个小小的技巧,聪明的你一定能看出来:axMap1.CtlBounds=axMap1.Layers._Item(USA.Bounds;8在图层上绘制永久图形:我们在介绍工具的时候,有一些工具没有介绍,这些工具其实是用来在图层上创建永久图形对象的(图元.当在图层上绘制了图形以后,这些图形将以数据记录的形式保存在图层表中,也就是创建了一个图元.如果不想保存图元,可以在

28、临时图层里绘制.1.axMap1.Layers._Item(USA Temp Layer.Editable=true;2.axMap1.Layers.InsertionLayer=axMap1.Layers._Item(USA Temp Layer;3.axMap1.CurrentTool=MapXLib.ToolConstants.miAddLineTool;上面的程序使用了画线的工具,在地图上拖动鼠标就可以在临时图层上画线了.这些工具使用的前提是必须指定axMap1的插入图层(InsertionLayer.才能在图层表中插入数据.关于图层的关键技术就介绍到这里,掌握了这些技术以后,在作进一

29、步的研究时,例如动画图层和绘制图层的开发,遇到的困难应该不大.下面我们介绍C#对MAPX图元的编程技术.9在图层上创建图元:根据MAP Info提供的MapX 5.0开发手册,创建图元有两种方法,用两段代码说明这两种代码在C#的实现方法:第一种实现方法:直接使用Feature类创建图元1.MapXLib.Style sty=new MapXLib.StyleClass(;2.MapXLib.Feature ftr=new MapXLib.FeatureClass(;3.ftr.Attach(axMap1.GetOcx(;4.ftr.Type=MapXLib.FeatureTypeConstan

30、ts.miFeatureTypeText;5.sty.TextFontColor=255;6.sty.TextFont.Size=12;7.ftr.Style=sty;8.ftr.Caption=New Feature;9.ftr.Point.Set(axMap1.CenterX,axMap1.CenterY;10.axMap1.Layers._Item(US Top 20 Cities.Style=sty;11.ftr=axMap1.Layers._Item(US Top 20 Cities.AddFeature(ftr,new MapXLib.RowValuesClass(;12.ftr.

31、Update(ftr,new MapXLib.RowValuesClass(;有几个要注意的地方:ftr.Attach(axMap1.GetOcx(;如果在VB6下,这句程序应该是这样的:ftr.Attach Map1从这里可以看到在C#中因为严格的类型管理所带来的一些变化.如果不进行GetOcx(的转换,即使在VB.Net下也是错误的.ftr=axMap1.Layers._Item(US Top 20 Cities.AddFeature(ftr,new MapXLib.RowV aluesClass(;我们在这个程序中加入了一行空的数据,这也就代表着我们加入的图元不包含任何数据信息.这是为了

32、在介绍图元的时候方便大家掌握,并不意味着这样增加图元就不能将数据保存进去,实际上,通过设置一个新的RowValues变量,是可以将数据信息保存到图元中的.我们将在后面的章节中介绍如何将数据保存在图元中.ftr.Update(ftr,new MapXLib.RowValuesClass(;这句程序的作用是将创建的图元保存到图层表中,这种保存是永久保存的.除非是在临时图层上增加的图元,否则下次打开地图文件的时候,将看到创建的图元仍然保留在地图上.因此,在对图元操作之前请备份好地图文件,避免不必要的损失.另外,关于图元的类型(Type和风格(Style,应该和其所在的图层相对应,比如上面程序中关于T

33、ype和Style的设置,都是和US Top 20 Cities 图层的类型对应的.有关类型和风格的设置,请查阅相关手册.第二种实现方法:使用FeatureFactory创建图元1.MapXLib.Feature ftr=new MapXLib.FeatureClass(;2.MapXLib.Point p=new MapXLib.PointClass(;3.p.Set(axMap1.CenterX,axMap1.CenterY;4. 5. 6. 7. 8. ftr=axMap1.Layers._Item(US Top 20 Cities .AddFeature(axMap1.FeatureFactory.CreateText (p,New Feature,MapXLib.PositionConstants.miPositionCC, new MapXLib.StyleClass(, new MapXLib.RowValuesClass(; 这段代码和上面和第一种实现方法类似,我们在这里不再设置图元的 Type 和 Style. FeatureFactory 类似于设计模式中的 Factory 模式,从它可以产生各种类型的图元,这 个过程相当于设置了图元的 Type. 10查找图元: 查找图元是很简单的,可以用下边的代码实现: 1. MapXLib

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论