物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 718|回复: 0

C#开发GIS应用简明教程[二]

[复制链接]
发表于 2013-3-15 18:06:18 | 显示全部楼层 |阅读模式
接着,双击comboBox1,并编写代码如下
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
    axMap1.CurrentTool=(MapXLib.ToolConstants)comboBox1.SelectedItem;
}
     应注意,在C#中必须要显式地把comboBox1的选择项目SelectedItem(数据类型为object)转换为MapXLib.ToolConstants.因为ToolConstants是MapX自己定义的一个枚举数据类型,C#不能自动完成这种枚举成员变量到object的数据转换.
    编译执行程序,从comboBox1中选择不同的工具,在地图上进行操作,你可以了解到MapX工具集的强大功能.
    实际上,MapX提供的工具集就好像Photoshop,AutoCAD的工具栏一样,为你提供了一些控制地图的工具.但是,在开发GIS的时候,这些工具是不能完全满足要求的.所以,还应该学会自定义工具.

下面,通过一个在地图上测距的例子,来介绍一下如何在C#下自定义MapX工具
    如前所述建立一个C#的Windows应用程序并将Mapinfo MapX V5 控件加到窗体上.并加入一个Button控件button1.将button1的Text属性改为"测距",再在窗口中放上两个Label控件label1,label2,将它们的Text属性设置为""空字符串,如下图:


    双击设计窗体,编写Form1_Load代码如下:
private void Form1_Load(object sender, System.EventArgs e)
{
axMap1.CreateCustomTool(100,MapXLib.ToolTypeConstants.miToolTypePoly,
MapXLib.CursorConstants.miCrossCursor,null,null,null);
}
    在加载窗口的时候,我们定义了一个工具.它的编号是100(不要和MapX本身的工具编号重复),它的类型是一个多义线,采用十字光标.
    关于此函数的用法,建议查看MapX的开发手册和相关资料.
    现在我们定义了一个编号为100的工具,可以在程序中使用它了.双击设计窗体中的button1,编写它的Click事件处理代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
    axMap1.CurrentTool=(MapXLib.ToolConstants)100;
}
    现在编译运行,单击button1,就可以在地图上使用这个工具了.但是还有一部分重要的代码没有完成:测距!
    完成测距功能的代码在C#使用MapX开发GIS中非常具有代表性,也比较有难度.我在首次使用C#+MapX开发GIS的时候,被这个问题困扰了很久.项目经理也来研究,过两天说有结果了,但他给出的例子根本就行不通.当然,会了就不难了.其实,也很简单.
    首先,在窗口类中声明两个私有全局变量以保存测出的距离和总距,注意声明代码的位置:
public class Form1 : System.Windows.Forms.Form
{
    private AxMapXLib.AxMap axMap1;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.Label label2;
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null;
    private double Dis=0,DisSum=0;
...
...
       现在来编写工具的事件.注意,在MapX画多义线的时候,它触发消息的方式和一般的工具是不同的,首先,它并不是用鼠标一点击就完成了的,还可以继续画下去,所以,不应该在MapX控件的ToolUsed事件中编写,而应该在PolyToolUsed事件中实现测距.代码如下:
private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
{  
    MapXLib.PointsClass pts=new MapXLib.PointsClass();  
    switch(e.flags)
    {
       case (int)MapXLib.ToolFlagConstants.miToolInProgress:
           pts=(MapXLib.PointsClass)e.points;
    Dis=axMap1.Distance(pts._Item(pts.Count-1).X,
pts._Item(pts.Count-1).Y,
pts._Item(pts.Count).X,
pts._Item(pts.Count).Y);
           DisSum+=Dis;
       break;
       default:
           Dis=0;
           DisSum=0;
       break;

    }
    label1.Text="距离:"+Dis.ToString("#.00");
    label2.Text="总距"+DisSum.ToString("#.00");
}

这段代码虽短.但要注意的地方很多.
首先,定义一个MapXLib.PointsClass类型的变量pts,注意,是PointsClass,不是PointClass.前者是点集,后者是点.为什么要增加那么一个变量呢?因为MapX的PolyToolUsed事件的返回参数e的成员points不是MapXLib.PointsClass类型,而是object.类型.所以需要这么一个变量来转换它,当然,你也可以在程序使用pts的地方直接使用(MapXLib.PointsClass)e.points,但那样一来程序就比较难懂了;
其次,要判断事件的标识e.flags的值,它指出工具当前的状态,是刚开始画多义线呢,还是正在画多义线,或者已经结束了,或者结束退出.我们只要在画的时候测距就可以了.其它时候将距离和总距都设置为0;
接着,还要注意的是e.points的点数据保存方式,e.points首先是一个object,当在画多义线的时候,它被初试化为一个MapXLib.PointsClass的变量,并以二维数组的方式保存点集.这个数组是从1开始的,而不是从0开始的.它保存了多义线上每个转折点的坐标,鼠标每点一下,就增加一个新的数据到点集,我们计算最后一条直线长度,应该从这个数组的末尾往前取.计算好距离以后再加入到总距中.许多测距的程序例子都要做一个循环,其实是不必要的.
最后,请注意数字转换到字符串的格式问题.在这个例子中我们保留两位小数.
补充一点,因为没有设置地图的地理坐标系统,所以测出来的距离单位是英里,如果要改为公里,把MapX控件的MapUnit属性改为miUnitKilometer就可以了.要提高测量精度,除了可以通过转换格式的时候增加小数位,还应该注意到地图的测绘精度.否则,再多的小数位也是没有意义的.

练习
1.建立一个应用程序,加入MapX控件和一个ComboBox控件,两个abel控件,在ComboBox中加入第一个例子中的所有工具和测距工具,在ComboBox中选择测距工具时实现测距功能.
2.将测距工具的光标改成箭头光标.并以米为单位显示测距数据.
2.图层和图元(Layers and Features)
有关图层和图元的概念,请参照相关资料.
图层的应用分为几个方面,我们分别加以介绍.
1)图层的创建:
创建永久图层:
在C#中,使用以下方法创建永久图层:
MapXLib.Layer lyr;
lyr=axMap1.Layers.CreateLayer("MyLayer","D:\\MapTest\\MyLayer.Tab",0,32,axMap1.DisplayCoordSys);

当执行这两句程序时,在指定的路径生成了一系列文件.它们是:
MyLayer.Dat:图层的数据文件,它保存的是图层的数据库数据;
MyLayer.ID:图层数据的唯一的,自动生成的编码,用以区分不同的图元;
MyLayer.IND:图层数据的索引文件,以实现图层上图元的快速查找;
MyLaer.MAP:图层上图元的图形数据;
MyLaer.TAB:这是一个文本文件,它的作用是将图层的有关信息保存起来,供GST地图文件或其它程序调用图层.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|物探论坛 ( 鄂ICP备12002012号 微信号:iwutan )

GMT+8, 2024-5-10 17:52 , Processed in 0.062446 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表