物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 671|回复: 0

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

[复制链接]
发表于 2013-3-15 18:06:49 | 显示全部楼层 |阅读模式
用记事本打开MyLayer.TAB文件,看到如下内容:
!table
!version 450
!charset WindowsSimpChinese

Definition Table
  Description "MyLayer"
  Type Native charset "WindowsSimpChinese"
  Fields 1
    GEONAME char (32) Index 1 ;
第一行总是"!table",说明这是一个图层表的文件;
第二行指出图层文件的版本号,MapInfo MapX 5.0生成的图层版本号是450;
第三行指出生成图层的操作系统;
接着是对图层的定义段:
首先指出图层的描述,就是我们上面程序代码中的"Mylayer".
接着说明了字符集类型是简体中文;
然后指出表格中只有一个字段,这个字段的名称是"GEONAME",是长度为32的字符类型字段,在表中的列索引为1.
2)添加现有的图层:
添加现有图层的方法和一般的程序语言没有很大的区别,我们在当前图层上添加刚才创建的永久图层,程序代码如下:
MapXLib.LayerInfo li;
li=new MapXLib.LayerInfoClass();
li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
li.AddParameter("FileSpec","D:\\MapTest\\MyLayer.tab");
li.AddParameter("Visible",false);
li.AddParameter("AutoCreateDataset",true);
li.AddParameter("DatasetName","MyLayer");
axMap1.Layers.Add(li,0);
axMap1.Layers.LayersDlg("","");
axMap1.SaveMapAsGeoset("测试","D:\\MapTest\\MyMap.GST");

在程序的最后,我们显示了图层信息对话框,以观察图层是否已经添加到当前的地图中.可以看到,地图中添加了我们创建的图层"MyLayer".放在第0层.
然后,将地图保存在一个MyMap.GST的地图文件中,这个地图的标题是"测试".
3)移除图层:
好,接着我们上面做的工作,将工程的axMap1的GeoSet属性设置为刚刚生成的地图文件: "D:\MapTest\MyMap.GST".现在我们将MyLayer从地图中移除.
添加一个按钮,在按钮的Click事件中编写如下代码:
axMap1.Layers.LayersDlg("","");
axMap1.Layers.Remove(1);
axMap1.Layers.LayersDlg("","");

我们使用两次显示图层对话框的方式查看程序的效果,应该注意的是在Remove第0层的时候使用的是Remove(1),如果不清楚图层的位置,就要作一个循环,将图层的位置取出来再移除,如下:
int lyrind=0;
axMap1.Layers.LayersDlg("","");
for( int i=1;i<axMap1.Layers.Count;i++)
{
    if (axMap1.Layers[i]._Name.Trim()=="MyLayer")
    {
       lyrind=i;
       break;
    }
}
axMap1.Layers.Remove(lyrind);
axMap1.Layers.LayersDlg("","");
移除操作只在内存中进行,也就是说,程序并不删除任何文件,也没有将图层真正地从地图集合中去掉,当程序重新启动的时候,MyLayer图层仍然在地图中.
3)移除所有图层:
使用axMap1.Layers.RemoveAll();就可以移除所有图层,用法和Remove相似.
4)图层定位:
和其它编程语言一样,使用axMap1.Move(1,2)函数就可以将图层的位置改变.
5)创建临时图层
临时图层和永久图层不同,它只存放在内存中,当关闭程序以后该图层将不存在.
在这里我们将使用LayerInfo对象来创建临时图层,这和传统的MAPX程序相近,但是引入了C#编程的一些特色:
MapXLib.LayerInfoClass li=new MapXLib.LayerInfoClass();
MapXLib.Features ftrs=null;
MapXLib.FieldsClass flds=new MapXLib.FieldsClass();
MapXLib.Fields Myflds=null;
MapXLib.Dataset dts=null;

flds.Add("State","State_Name",
MapXLib.AggregationFunctionConstants.miAggregationSum,
MapXLib.FieldTypeConstants.miTypeString);
dts=axMap1.DataSets.Add(MapXLib.DatasetTypeConstants.miDataSetLayer,
    axMap1.Layers._Item(1),"MyLayer",0,0,0,flds,false);

Myflds=dts.Fields;
ftrs=axMap1.Layers._Item("USA").Selection.Clone();

li.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTemp;
li.AddParameter("Name","USA Temp Layer");
li.AddParameter("Fields",Myflds);
li.AddParameter("Features",ftrs);
axMap1.Layers.Add(li,1);
axMap1.Layers.LayersDlg("","");

这段程序有两个关键的地方:
一个是在C#中DataSets.Add的用法,在许多编程语言中,都可以使用空的参数或者干脆不用参数来调用这个函数,但是在C#中是不行的,必须8个参数全部指定.而且,还应该事先初始化Fields参数.这个函数的使用涉及到许多方面的知识,包括对MAPX相关概念的理解和C#编程的认识,是一个很重要,也比较难掌握的技术.后面的章节中我们还会作进一步的探讨.
另一个是li.AddParameter和li.Type的配合使用问题,这在许多的MAPX书籍中都有论述,此处不再重复.
以上程序最好能自己多琢磨琢磨.才能更好地掌握C#开发GIS的要领.

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 05:15 , Processed in 0.152031 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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