爱情 (1) 安装 (2) 北斗 (1) 毕业 (1) 变量 (1) 测绘局 (1) 测量 (2) 插件 (1) 查询 (1) 常用 (1) 成果转化 (1) 词汇 (1) 慈善 (1) 答辩 (2) 代码 (2) 电台 (1) 发泄 (1) 感悟 (4) 高程 (1) 搞笑 (5) 共产党 (1) 古诗词 (1) 管理 (1) 函数 (3) 绘图 (1) 加密 (1) 交际 (1) 教程 (4) 教育 (2) 解决 (4) 解密 (1) 精度 (1) 酒桌 (2) 开源 (2) 科技 (1) 科学 (1) 刻录 (1) 老外 (1) 励志 (5) 连续剧 (1) 恋爱 (1) 列表 (1) 领导 (1) 美食 (2) 名人 (3) 命令 (4) 区别 (1) 日记 (2) 软件 (12) 商业 (3) 时政 (1) 视频 (1) 数据 (1) 算法 (1) 投影 (2) 图论 (1) 网络 (1) 网站 (1) 卫星 (3) 未成年 (1) 慰问 (1) 文本 (1) 文件 (2) 下载 (4) 笑话 (2) 学习 (9) 遥感 (1) 疑问 (5) 营销 (1) 娱乐 (3) 源代码 (2) 政策 (1) 指导 (3) 智慧 (5) 主成分分析 (2) 抓图 (1) 专家 (1) 资料 (5) 字符串 (1) 最短路径 (1) 坐标 (1) baidu (3) Bernese (1) blog (2) c# (9) China (3) Dijkstra (1) DNS (1) doris (1) dos (1) excel (1) firefox (3) GAMIT (8) gcc (1) GIS (3) GMT (1) GPS (5) ITRF (1) linux (5) mapx (1) matlab (6) movie (4) music (3) oracle (2) pic (1) PPT (3) PROJ.4 (2) python (2) QQ (2) rinex (1) shell (2) sql (1) teqc (3) tools (1) tps (1) ubuntu (5) USA (1) website (1)

博客归档

2010年5月7日星期五

C# mapx之一

C# mapx之一
http://blog.xdnice.com/space-25171-do-blog-id-21341.html

1.工具(ToolConstants)

在上一章里我们试着做了一个将地图放大的应用程序.在这章里,我们将接触到更多的工具,并介绍自定义工具.

MapX为开发人员提供一系列的工具,这些工具的作用各有不同, 我们通过开发一个应用程序来了解这些工具的作用,至于这些工具的具体说明,可以在MapX的帮助文档中,通过查找"Available Standard Tools" 看到相应的解释.一些MapX的相关资料也有介绍.

在.Net编程环境中新建一个C#的 WindeosApplication(Windows应用程序)项目,然后在菜单中选择”项目/添加引用”,打开如下图的窗口,在窗口中选择COM标签,在组件名称列表中双击MapInfo MapX V5.单击"确认"按钮,将Map5控件加入到.Net的工具箱中.

接着,将MapInfo MapX V5 控件画到窗体上,再在窗体上画一个ComboBox控件comboBox1.如下图:

双击设计窗体,编写Form1_Load 代码如下:



private void Form1_Load(object sender, System.EventArgs e)

{

ArrayList ToolsList=new ArrayList();



ToolsList.Add(MapXLib.ToolConstants.miArrowTool);

ToolsList.Add(MapXLib.ToolConstants.miCenterTool);

ToolsList.Add(MapXLib.ToolConstants.miLabelTool);

ToolsList.Add(MapXLib.ToolConstants.miPanTool);

ToolsList.Add(MapXLib.ToolConstants.miPolygonSelectTool);

ToolsList.Add(MapXLib.ToolConstants.miRadiusSelectTool);

ToolsList.Add(MapXLib.ToolConstants.miSymbolTool);

ToolsList.Add(MapXLib.ToolConstants.miTextTool);

ToolsList.Add(MapXLib.ToolConstants.miZoomInTool);

ToolsList.Add(MapXLib.ToolConstants.miZoomOutTool);



comboBox1.DataSource=ToolsList;

}



以上代码通过一个数组ToolsList,将MapXLib的工具加入到comboBox1中.MapX还有一些其它的工具,它们的作用是往地图上加上点,线,多边型和圆.因为这些工具要求有操作图层,一并在介绍图层的时候介绍.关于ArrayList的用法,请参考C#的有关资料.

接着,双击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;

///

/// 必需的设计器变量。

///


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;

没有评论:

发表评论

浏览统计