AE中各种数据类型打开代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AE开发把影像或者加载到图层
1.创建一个类工厂
2.使用类工厂创建一个要使用的工作区
3.使用工作区打开并得到图层的dataset
4.把dataset装入到新建的图层实例
5.把图层加载到MapControl控件
引用ArcGIS Engine中的8种数据访问
2009-09-26 13:37:40| 分类:GIS |字号订阅
数据是GIS的基础,访问数据也是进行任何复杂的空间分析及空间可视化表达的前提。
ArcGIS 支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异。
本文主要介绍一下以下八种数据格式在ArcGIS Engine中如何访问。
对ArcGIS桌面应用有一定了解的读者更适合阅读本文。
本文的示例代码是用C#编写。
1. Shapefile
2.Coverage
3.Personal Geodatabase
4.Enterprise Geodatabase
5. Tin
6. Raster
7. CAD
8. RDBMS
在通过ArcGIS访问数据之前,需要首先明确一下什么是"工作空间"。
在ArcGIS中工作空间指存放数据的位置,ArcGIS访问数据的机制是先打开数据对应的工作空间,然后用工作空间访问数据。
对于不同的数据格式,工作空间的具体情况也是不一样的,下面分别进行阐述。
1.Shapefile
Shapefile是文件型的空间数据格式,以文件的形式在磁盘上进行存储空间数据和属性数据。
对于Shapefile来说工作空间就是它所在的文件夹,打开工作空间需要使用对应的工作空间
工厂,即ShapefileWorkspaceFactoryClass,然后再调用IWorkspaceFactory的OpenFromFile 方法就可以得到一个工作空间了,这也是设计模式中工厂方法的体现。
工作空间工厂的打开方法返回的是一般意义的工作空间,根据具体数据还需要进行接口转换,因为Shapefile是矢量数据,所以把工作空间接口跳转到IFeatureWorkspace,从而读取其中的要素类,这一点对于接下来的几个数据格式也是同样的打开方式。
private void button1_Click(object sender, EventArgs e)
{
//1)创建工作空间工厂
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory(); // 1
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "(*.shp)|*.shp";
openFileDialog1.InitialDirectory = @"D:\";
openFileDialog1.Multiselect = false;
DialogResult pDialogResult = openFileDialog1.ShowDialog();
if (pDialogResult != DialogResult.OK)
return;
string pPath = openFileDialog1.FileName;
string pFolder = Path.GetDirectoryName(pPath);
string pFileName = Path.GetFileName(pPath);
//2)打开shapefile工作空间
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(pFolder, 0); // 2
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
//3)打开要素类
IFeatureClass pFC = pFeatureWorkspace.OpenFeatureClass(pFileName); //3
//4)创建要素图层
IFeatureLayer pFLayer = new FeatureLayerClass(); // 4
pFLayer.FeatureClass = pFC;
//5)关联图层和要素类
= pFC.AliasName; // 5
ILayer pLayer = pFLayer as ILayer;
IMap pMap = axMapControl1.Map;
//6)添加到地图空间
pMap.AddLayer(pLayer); // 6
axMapControl1.ActiveView.Refresh();
2.Coverage
Coverage是ArcInfo workstation的原生数据格式。
该格式是基于文件夹存储的,是因为在windows资源管理器下,它的空间信息和属性信息是分别存放在两个文件夹里。
coverage是一个非常成功的早期地理数据模型,二十多年来深受用户欢迎,很多早期的数据都是coverage格式的。
ESRI不公开coverage的数据格式,但是提供了coverage格式转换的一个交换文件(interchange file,即E00),并公开数据格式。
但是ESRI为推广其第三代数据模型geodatabase,从ArcGIS 8.3版本开始,屏蔽了对coverage的编辑功能。
如果需要使用coverage 格式的数据,可以安装ArcInfo workstation,或者将coverage数据转换为其他可编辑的数据
格式。
Coverage是一个集合,它可以包含一个或多个要素类。
Coverage数据的工作空间也是它所在的文件夹;由于Coverage可以包含多个要素类,得到工作空间后在打开具体的要素类时可以用"Coverage名称:要素类名称",例如下面代码中的"basin:polygon"。
IWorkspaceFactory pFactory = new ArcInfoWorkspaceFactoryClass();IWorkspace pWorkspace = pFactory.OpenFromFile(@"D:\ArcTutor\TopologyData", 0);
IFeatureWorkspace pFeatWorkspace = pWorkspace as IFeatureWorkspace;IFeatureClass pFeatureClass = pFeatWorkspace.OpenFeatureClass("basin:polygon");
3.Personal Geodatabase
Geodatabase作为ArcGIS的原生数据格式,体现了很多第三代地理数据模型的优势。
Personal Geodatabase基于Microsoft Access一体化存储空间数据和属性数据。
Enterprise Geodatabase 通过大型关系数据库+ArcSDE实现,ArcSDE作为中间件把关系数据库中的普通表转化为空间对象。
Personal Geodatabase数据的工作空间指的是扩展名为mdb的文件。
以下是打开位于Monto.mdb中的Water要素类的代码。
private void button1_Click_1(object sender.EventArgs e)
{
IWorkspaceFactory pWorkspace=new AccessWorkspaceFactoryClass();
OpenFileDialog openFileDialog=new OpenFileDialog();
openFileDialog1.Filter="*.mdb|(*.mdb)";
openFileDialog1.InitialDirectory=@"E:\";
openFileDialog1.Multiselect=false;
DialogResult pDialogResult=openFileDialog1.ShowDialog();
if(pDialogRestult!=DialogResult.OK)
return;
string pPath=openFileDialog1.FileName;
string pFolder=Path.GetDirectoryName(pPath);
string pFileName=Path.GetFileName(pPath);
//打开mdb工作空间
IWorkspace pWorkspace=pFactory.OpenFromFile(pPath,0);
//打开要素集
IFeatureWorkspace pFeatureWorkspace=pWorkspace as IFeatureWorkspace;
IFeatureClass pFC=pFeatureWorkspace.OpenFeatureClass("sd");//特定的文件;
//创建要素图层
IFeatureLayer pFLayer=new FeatureLayerClass();
pFLayer.FeatureClass=pFC;
//关联图层和要素层
=pFC.AliasName;
ILayer pLayer=pFLayer as ILayer;
IMap aMap=axMapControl1.Map;
//添加到地图控件
pMap.AddLayer(pLayer);
}
4.Enterprise Geodatabase
ArcSDE(Enterprise Geodatabase)对应的工作空间为数据库连接,关系数据库是Oracle时连接参数需要五个,分别是SERVER、INSTANCE、USER、PASSWORD、VERSION。
SERVER指服务器的主机名,INSTANCE指服务名或端口号,USER是数据库的用户名,PASSWORD数据库对应用户的密码,VERSION指Enterprise Geodatabase多版本机制中的某个版本,默认的一个版本是"SDE.DEFAULT",如果关系数据库是SQL Server,那么连接参数还需要Database参数。
下面是打开Enterprise Geodatabase中ControlPoint点要素类的代码,关系数据库为Oracle9i。
IWorkspaceFactory pWorkspaceFactory = new SdeWorkspaceFactoryClass();
IPropertySet propSet = new PropertySetClass();
propSet.SetProperty("SERVER", "actc");propSet.SetProperty("INSTANCE", "5151");
propSet.SetProperty("USER", "apdm");propSet.SetProperty("PASSWORD", "apdm");
propSet.SetProperty("VERSION", "SDE.DEFAULT");
IWorkspace pWorkspace = pWorkspaceFactory.Open(propSet, 0);
IFeatureWorkspace pFeatWS = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass= pFeatWS.OpenFeatureClass("ControlPoint");
5.TIN
TIN全称不规则三角网,也叫不规则三角表面,采用一系列不规则的三角点来建立表面。
例如,每一个采样点有一对x,y坐标和一个表面值(z值),这些点被一组互不重叠的三角形的边所连接,从而构成一个表面。
TIN数据是空间分析和三维分析重要的数据格式,以文件的形式在磁盘上存储。
TIN的工作空间是所在的文件夹,下面代码是打开D:\ArcTutor\3DAnalyst文件夹下名称为mal的TIN。
IWorkspaceFactory pWSFact = new TinWorkspaceFactoryClass();IWorkspace pWS = pWSFact.OpenFromFile(@"D:\ArcTutor\3DAnalyst\", 0);ITinWorkspace pTinWS = pWS as ITinWorkspace;ITin pTin = pTinWS.OpenTin("mal");
6.Raster
栅格数据也是GIS数据中很重要的一部分,ArcGIS中最常用的文件型有GRID、TIFF、ERDAS
IMAGE等,这几种栅格数据的工作空间也是所在的文件夹。
打开栅格数据时需要使用栅格工作空间工厂(RasterWorkspaceFactory),然后再使用IRasterWorkspace接口的打开栅格数据集方法即可打开一个栅格数据集。
在打开栅格数据集时,如果数据格式为是ESRI GRID,那么OpenRasterDataset()方法的参数为栅格要素集的名称,如果数据格式为TIFF格式,那么该方法的参数为完整的文件名,即要加上.tif扩展名,例如OpenRasterDataset("hillshade.tif")。
下面代码为打开GRID格式的栅格数据。
IWorkspaceFactory rasterWorkspaceFactory = new RasterWorkspaceFactoryClass();IRasterWorkspace rasterWorkspace = rasterWorkspaceFactory.OpenFromFile(@"D:\data\grid", 0) as IRasterWorkspace;IRasterDataset rasterDataset= rasterWorkspace.OpenRasterDataset("ca_hillshade");
7.CAD
CAD数据也可以通过AO直接访问,访问CAD数据的方式与Coverage类似,但是注意要使用CAD的工作空间工厂,以下是打开一个dxf的CAD数据,在打开要素类时使用"cad文件名:要素类名称",注意cad文件名要包含扩展名,否则会报错。
以下代码是打开位于D:\ArcTutor\Editor\ExerciseData\EditingFeatures文件夹下的buildings.dxf中的多边形要素类。
IWorkspaceFactory pCadwf = new CadWorkspaceFactoryClass();IWorkspace pWS = pCadwf.OpenFromFile(@"D:\ArcTutor\Editor\ExerciseData\EditingFeatures",
0);IFeatureWorkspace pCadFWS = pWS as IFeatureWorkspace;IFeatureClass pFeatClass = pCadFWS.OpenFeatureClass("buildings.dxf:polygon");
8.RDBMS
一般关系表中的数据也可以通过ArcGIS直接读取,这为数据的共享提供了极大的便利,对于一些业务上的非空间数据,通过使用OLE方式可以很方便的实现数据访问,业务数据可以位于各种关系数据库中,以下代码是访问位于Microsoft Access中的Custom表,当然也可以访问Oralce或SQL Server中的数据,只要变化以下连接字符串(CONNECTSTRING)就可以了。
//创建一个连接IPropertySet pPropset;
pPropset = new PropertySetClass();
pPropset.SetProperty("CONNECTSTRING", @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Company.mdb;Persist Security Info=False");//创建一个新的OleDB工作空间并打开IWorkspaceFactory pWorkspaceFact;IFeatureWorkspace pFeatWorkspace;pWorkspaceFact = new OLEDBWorkspaceFactoryClass();pFeatWorkspace = pWorkspaceFact.Open(pPropset, 0) as IFeatureWorkspace;ITable pTTable = pFeatWorkspace.OpenTable("Custom");
以上为ArcGIS最常用的几种数据的访问方法,访问数据进行GIS分析、数据处理和空间可视化的,在获取到数据以后可以把数据加到图层里,也可以对数据进行检索或维护等工作。
1.public string OpenMxd()
{
string MxdPath="";
OpenFileDialog OpenMXD = new OpenFileDialog();
OpenMXD.Title = "打开地图";
OpenMXD.InitialDirectory = "E:";
OpenMXD.Filter ="Map Documents (*.mxd)|*.mxd";
if (OpenMXD.ShowDialog() == DialogResult.OK)
{
MxdPath=OpenMXD.FileName;
}
return MxdPath;
}
2.AddShapeFile
public string []OpenShapeFile()
{
string []ShpFile=new string[2];
OpenFileDialog OpenShpFile=new OpenFileDialog();
OpenShpFile.Title="打开Shape文件";
OpenShpFile.InitialDirectory="E:";
OpenShpFile.Filter="Shape 文件(*.shp)|*.shp";
if(OpenShpFile.ShowDialog()==DialogResult.OK)
{
string ShapPath=OpenShpFile.FileName;
int Position=stIndexOf("\\");
string FilePath =ShapPath.Substring(0,Position);
string ShpName=ShapPath.Substring(Position+1);
ShpFile[0]=FilePath;
ShpFile[1]=ShpName;
}
return ShpFile;
}
3
DBF
. [代码][C#]代码跳至[2] [全屏预览]
view source
print?
01 using System;
02 using System.Collections.Generic;
03 using ponentModel;
04 using System.Data;
05 using System.Drawing;
06 using System.Text;
07 using System.Windows.Forms;
08 using System.IO;
09 using System.Data.OleDb;
10 using System.Reflection;
11
12 namespace GenerateMapLayersConfigApplication
13 {
14 public partial class Form1 : Form
15 {
16 public Form1()
17 {
18 InitializeComponent();
19 }
20
21
22 //打开DBF文件操作
23 private void InFilebtn_Click(object sender, EventArgs e)//打开按钮
24 {
25 OpenFileDialog ofdDBF = new OpenFileDialog();
26 ofdDBF.Filter = "属性表文件(*.dbf)|*.dbf";//只打开DBF类型
27 if (ofdDBF.ShowDialog() == DialogResult.OK)
28 {
29 string OpenFileName = ofdDBF.FileName.Trim();
30 string dbfFilePath = Path.GetDirectoryName(OpenFileName);
31 string dbfFileName = Path.GetFileName(OpenFileName);
32 this.textBox1.Text =OpenFileName;
33 try
34 {
35 //利用oledb方式打开DBF
36 string connstr = "";
37 connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;Data Source=" + dbfFilePath + ";User ID=;Password=;";
38 string sel = "select * from " + dbfFileName;
39 OleDbConnection conn = new OleDbConnection(connstr);
40 OleDbCommand olecmd = new OleDbCommand(sel, new OleDbConnection(connstr));
41 OleDbDataAdapter olesda = new OleDbDataAdapter(olecmd);
42 DataSet ds = new DataSet();
43 olesda.Fill(ds);
44 this.dataGridView1.DataSource = ds.Tables[0];//显示在界面表格
45 ds.Dispose();
46
47 }
48 catch (Exception ex)
49 {
50 MessageBox.Show(ex.Message.ToString(), "错误提示", MessageBoxButtons.OK, rmation);
51 return;
52 }
53 }
54
55
56 }
57
58 private void OutFilebtn_Click(object sender, EventArgs e)
59 {
60 try
61 {
62 this.saveFileDialog1.FileName = DateTime.Now.ToString("yyMMddhhmmss");
63 this.saveFileDialog1.Filter = "XML文件(*.xml)|*.xml";
64 if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
65 {
66 DataTable dt = (DataTable)this.dataGridView1.DataSource;
67 DataSet ds = new DataSet();
68 if (dt.DataSet != null)
69 {
70 dt.DataSet.Tables.Remove(dt);
71 }
72 ds.Tables.Add(dt);
73 ds.WriteXml(this.saveFileDialog1.FileName);
74 MessageBox.Show("数据成功保存到" + this.saveFileDialog1.FileName, "系统提示", MessageBoxButtons.OK, rmation);
75 }
76
77 }
78 catch (Exception ex)
79 {
80 MessageBox.Show(ex.Message.ToString(), "错误提示", MessageBoxButtons.OK, rmation);
81 return;
82
83 }
84
85
86
87
88 }
89
90
91
92
93 }
94 }
利用C#进行AO开发--实现地图文件的打开、保存和另存为功能(2007-10-27 08:51:26)转载▼标签:学习公社分类:GIS知识
呵呵,今天终于调试成功了地图文件的打开、保存和另存为功能,对我高手来说it's so easy!但是对我这个菜鸟来说还是有点兴奋的,每当调试成功程序的时候就会有一种莫名的幸福感(即使是从书上抄写的代码),慢慢来吧,希望有一天可以调试完全自己的代码,好了,言归正传,利用C#进行AO开发--实现地图文件的打开、保存和另存为功能。
由于C#继承了VB界面开发的友好性,所以完全可以利用C#提供的友好界面开发功能来实现winform的程序开发,在安装好了ArcEngine以后就可以利用其提供的控件进行GIS的二次开发,在form窗体上添加MapControl控件,MenuStrip控件(File(Open、Save、SaveAs、Exit)),saveFileDialog控件之后就可以进行编写代码,调试后的代码如下:
using System;
using System.Collections.Generic;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
namespace openDocu
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IMapDocument m_MapDcument;
//openFileDialog
private void LoadMapDocument()
{
m_MapDcument = new MapDocumentClass();
try
{
//打开文件对话框选取MXD文件
OpenFileDialog openFileDialog2;
openFileDialog2 = new OpenFileDialog();
openFileDialog2.Title = "Open Map Document";
openFileDialog2.Filter = "Map Documents(*.mxd)|*.mxd"; openFileDialog2.ShowDialog();
string sFilePath = openFileDialog2.FileName;
//将数据载入pMapDocument并与map控件联系起来
m_MapDcument.Open(sFilePath, "");
int i;
for (i = 0; i <= m_MapDcument.MapCount - 1; i++)
{
//一个IMapDocument对象中可能有多个Map对象,遍历每个map 对象
axMapControl1.Map = m_MapDcument.get_Map(i);
}
//刷新地图
axMapControl1.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
//save map
private void SaveDocument()
{
//check that the document is not read only
if (m_MapDcument.get_IsReadOnly(m_MapDcument.DocumentFilename) == true)
{
MessageBox.Show("The map document is read only!");
return;
}
//save with the current relative path setting
m_MapDcument.Save(m_esRelativePaths,true); MessageBox.Show("Change saved successfully!");
}
//saveas
private void SaveAsDocument()
{
//open a file dialog for saving map document
saveFileDialog1.Title = "Sava Map Document As";
saveFileDialog1.Filter = "Map Documents(*.mxd)|*.mxd";
saveFileDialog1.ShowDialog();
//Exit if no map document is select
string sFilePath = saveFileDialog1.FileName;
if (sFilePath == "")
{
return;
}
if (sFilePath == m_MapDcument.DocumentFilename)
{
//Save change to the current document SaveDocument();
}
else
{
//SaveAs a new docuemnt with relative paths
m_MapDcument.SaveAs(sFilePath, true, true);
//open document
MessageBox.Show("Documnet saved successfully!");
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e) {
LoadMapDocument();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
this.Close();
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
SaveDocument();
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) {
SaveAsDocument();
}
}
}
枚举
首页学院源码字体下载软件电脑书| 素材素材模板PSDPPT壁纸图片矢量酷站图标设计笔刷纹理美图|小游戏博客QQ表情投票计数器
动态网站制作指南
首页|网络编程|站长之家|网页制作|图形图象|操作系统|冲浪宝典|软件教学|网络办公|手机学院|邮件系统|网络安全|认证考试
ASP源码| .Net源码| PHP源码| JSP源码| JAVA源码| CGI源码| VB源码| C++源码| Delphi源码| PB源码| VF源码| 汇编| 服务器
迅雷| 电驴| Win7 | QQ空间| 输入法| Ghost | Word | Excel | asp | php | Sql | Dreamweaver | Javascript | css | photoshop | fireworks | Flash
当前位置>网站建设学院>网络编程> C#应用Rss
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
c# enmu 枚举小结(1)
发表日期:2009-12-23
新浪微博QQ空间QQ微博百度搜藏腾讯朋友QQ收藏百度空间人人网开心网
枚举
枚举类型声明为一组相关的符号常数定义了一个类型名称。
枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定。
枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。
例如,假设您必须定义一个变量,该变量的值表示一周中的一天。
该变量只能存储七个有意义的值。
若要定义这些值,可以使用枚举类型。
枚举类型是使用enum 关键字声明的。
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
默认情况下,枚举中每个元素的基础类型是int。
可以使用冒号指定另一种整数值类型。
如果不为枚举数列表中的元素指定值,则它们的值将以1 为增量自动递增。
在前面的示例中,Days.Sunday 的值为0,Days.Monday 的值为1,依此类推。
创建新的Days 对象时,如果不显式为其赋值,则它将具有默认值Days.Sunday (0)。
创建枚举时,应选择最合理的默认值并赋给它一个零值。
这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
枚举中大小写敏感,但是建议不要这样。
枚举的优点:
<1>枚举可以使代码更易于维护,有助于确保给变量指定合法的、期望的值。
<2>枚举使代码更清晰,允许用描述性的名称表示整数值,而不是用含义模糊的数来表示。
<3>枚举使代码更易于键入。
在给枚举类型的实例赋值时, IDE会通过IntelliSense弹出一个包含可接受值的列表框,减少了按键次数,并能够让我们回忆起可能的值
枚举实例
声明:
public enum TimeOfDay
{
Moning = 0,
Afternoon = 1,
Evening = 2,
};
使用:
public string getTimeOfDay(TimeOfDay time)
{
string result = string.Empty;
switch (time)
{
case TimeOfDay.Moning:
result = "上午";
break;
case TimeOfDay.Afternoon:
result = "下午";
break;
case TimeOfDay.Evening:
result = "晚上";
break;
default:
result = "未知";
break;
}
return result;
}
枚举方法
<1>获取枚举字符串
TimeOfDay time = TimeOfDay.Afternoon;
Console.WriteLine(time.ToString());//输出:Afternoon
<2>Enum.Parse()方法。
这个方法带3个参数,第一个参数是要使用的枚举类型。
其语法是关键字typeof后跟放在括号中的枚举类名。
typeof运算符将在第5章详细论述。
第二个参数是要转换的字符串,第三个参数是一个bool,指定在进行转换时是否忽略大小写。
最后,注意Enum.Parse()方法实际上返回一个对象引用——我们需要把这个字符串显式转换为需要的枚举类型(这是一个取消装箱操作的例子)。
对于上面的代码,将返回1,作为一个对象,对应于TimeOfDay.Afternoon的枚举值。
在显式转换为int时,会再次生成1。
TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine((int)time2);//输出1
<3>得到枚举的某一值对应的名称
lbOne.Text = Enum.GetName(typeof(TimeOfDay), 0);
<4>得到枚举的所有的值
foreach (int i in Enum.GetValues(typeof(TimeOfDay)))
lbValues.Text += i.ToString();
<5>枚举所有的名称
foreach(string temp in Enum.GetNames(typeof(TimeOfDay)))
lbNames.Text+=temp;
枚举和常量
优先考虑枚举。
在C#中,枚举的真正强大之处是它们在后台会实例化为派生于基类System.Enum的结构。
这表示可以对它们调用方法,执行有用的任务。
注意因为.NET Framework的执行方式,在语法上把枚举当做结构是不会有性能损失的。
实际上,一旦代码编译好,枚举就成为基本类型,与int和float类似。
但是在实际应用中,你也许会发现,我们经常用英语定义枚举类型,因为开发工具本来就是英文开发的,美国人用起来,就直接能够明白枚举类型的含义。
其实,我们在开发的时候就多了一步操作,需要对枚举类型进行翻译。
没办法,谁让编程语言是英语写的,如果是汉语写的,那我们也就不用翻译了,用起枚举变得很方便了。
举个简单的例子,TimeOfDay.Morning一看到Morning,美国人就知道是上午,但是对于中国的使用者来说,可能有很多人就看不懂,这就需要我们进行翻译、解释,就向上面的getTimeOfDay()的方法,其实就是做了翻译工作。
所以,在使用枚举的时候,感觉到并不是很方便,有的时候我们还是比较乐意创建常量,然后在类中,声明一个集合来容纳常量和其意义。
使用常量定义:这种方法固然可行,但是不能保证传入的参数day就是实际限定的。
using System;
using System.Collections.Generic;
public class TimesOfDay
{
public const int Morning = 0;
public const int Afternoon = 1;
public const int Evening = 2;
public static Dictionary<int, string> list;
/// <summary>
/// 获得星期几
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
public static string getTimeNameOfDay(int time)
{
if (list == null || list.Count <= 0)
{
list = new Dictionary<int, string>();
list.Add(Morning, "上午");
list.Add(Afternoon, "下午");
list.Add(Evening, "晚上");
}
return list[time];
}
}
希望能够找到一种比较好的方法,将枚举转为我们想要的集合。
搜寻了半天终于找到了一些线索。
通过反射,得到针对某一枚举类型的描述。
枚举的定义中加入描述
using System;
using ponentModel;
public enum TimeOfDay
{
[Description("上午")]
Moning,
[Description("下午")]
Afternoon,
[Description("晚上")]
Evening,
};
获得值和表述的键值对
/// <summary>
/// 从枚举类型和它的特性读出并返回一个键值对
/// </summary>
/// <param name="enumType">Type,该参数的格式为typeof(需要读的枚举类型)</param>
/// <returns>键值对</returns>
public static NameValueCollection GetNVCFromEnumValue(Type enumType)
{
NameValueCollection nvc = new NameValueCollection();
Type typeDescription = typeof(DescriptionAttribute);
System.Reflection.FieldInfo[] fields = enumType.GetFields();
string strText = string.Empty;
string strValue = string.Empty;
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsEnum)
{
strValue = ((int)enumType.InvokeMember(, BindingFlags.GetField, null, null, null)).ToString();
object[] arr = field.GetCustomAttributes(typeDescription, true);
if (arr.Length > 0)
{
DescriptionAttribute aa = (DescriptionAttribute)arr[0];
strText = aa.Description;
}
else
{
strText = ;
}
nvc.Add(strText, strValue);
}
}
return nvc;
}
.NET中Flags枚举的使用
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天;还
有就是用来表示多种复合的状态。
这个时候一般需要为枚举加上[Flags]特性标记为位域,例如:
[Flags]
enum Styles{
ShowBorder = 1, //是否显示边框
ShowCaption = 2, //是否显示标题
ShowToolbox = 4 //是否显示工具箱
}
这样我们就可以用"或"运算符组合多个状态,例如:
myControl.Style = Styles.ShowBorder | Styles.ShowCaption;
这时myControl.Style枚举的值将变成1+2=3,它的ToString()将变成"Styles.ShowBorder , Styles.ShowCaption"
这里我们可以解释为什么第三个值ShowToolbox可以为4,5..而不能为3。
也就是说它的值不应该是前几项值的复合值。
有一个比较简单的方法就是用2的n次方来依次为每一项赋值,例如1,2,4,8,16,32,64.....
现在举个常见的Flags应用例子。
例如一个简单的权限系统,有"Admin"和"User"两种角色,我们可以在表中放一个varchar()字段,以文本形式存放权限字"Admin,User"。
但是用Flags 型枚举的话,我们就可以直接将Roles.Admin | er 的值放在一个int字段里。
以下是关于枚举的一些常见操作:
将枚举的值变回枚举对象:
Styles style = (Styles) Enum.Parse(typeof(Styles), 4 ); // -> style = Styles.Toolbox;
检查枚举是否包含某个元素:
bool hasFlag = ((style & Styles.ShowBorder) != 0);
其实我们还会碰到一种情况,就是需要从组合状态中去掉一个元素。
用"^"运算符可以做到:
Styles style = Styles.ShowBorder | Styles.ShowCaption;
style = style ^ Styles.ShowBorder;
这个时候style的值就会变成Styles.ShowCaption
但这里有一个很严重的问题(偶现在才发现)
我们这个时候再执行一次
style = style ^ Styles.ShowBorder;
按照我们的设想,这个时候style 的值是Styles.ShowCaption,不包含Styles.ShowBorder,所以我们就算去掉这个元素,style应该还是不会变。
但实际的style 的值却又变成了Styles.ShowBorder | Styles.ShowCaption !!再执行一遍,又会去掉这个元素,周而复始。
当然我们可以在去掉某个元素前做一番检查,如果枚举包含这个元素,再去掉它:
if ((style & Styles.ShowBorder) != 0){
style = style ^ Styles.ShowBorder;
}
不知道有没有其它方法可以方便地从Flags枚举状态中去掉一个元素。
Thanks to mobilebilly:
style = style & (~Styles.ShowBorder) 可以方便去掉一个元素。
好好利用枚举
这段时间手里有个有关订单的项目,订单一般有个状态的,以前很多要时候都会想到订单的
状态就那几个种,就把它写死吧,不用一个数据库表了,太浪费资源了,但写死了用一个数字来代表一种订单状态,这样在编码时还要记得什么数字代码什么状态,如果不小心把它写错了,会导致数据出错。
后来想到.NET有个枚举,这么好的东西为何不用上来呢,这不但可以方便以后的代码维护,也方便编码。
public enum OrderState
{
/// <summary>
/// 无效状态
/// </summary>
Invalid = 0,
/// <summary>
/// 客户询价
/// </summary>
CustomerQuery = 1,
/// <summary>
/// 客户落单
/// </summary>
CustomerOrdered = 2,
/// <summary>
/// 客户付款
/// </summary>
ReceiverCustomerPayment = 4,
/// <summary>
/// 向供货商订货
/// </summary>
SupplierOrdered = 8,
/// <summary>
/// 供货商确认货期
/// </summary>
SupplierOrderTerm = 16,
/// <summary>
/// 收到货品
/// </summary>
RecieverGoods = 32,
/// <summary>
/// 客户取消订单
/// </summary>
CustomerCanceled = 64,
/// <summary>
/// 供货商取消订单
/// </summary>
SupplierCancelded = 128
但要从UI层看这些状态怎么处理呢?
利用switch case
public static string GetOrderStateString(OrderState state)
{
switch (state)
{
case OrderState.Invalid:
return "无效值";
case OrderState.CustomerOrdered:
return "客户下单";
case OrderState.CustomerCanceled:
return "客户取消订单";
case OrderState.CustomerQuery:
return "客户询价";
case OrderState.ReceiverCustomerPayment:
return "客户已付款";
case OrderState.RecieverGoods:
return "订单到货";
case OrderState.SupplierCancelded:
return "供货商取消";
case OrderState.SupplierOrdered:
return "已向供货商订货";
case OrderState.SupplierOrderTerm:
return "供货商确认货期";
}
return "";
}
如果以后还有更多的订单状态就修改这个枚举和一个方法就行了,这么方便的东西为何就不用到我的程序中呢,我们在编码中,要想尽方法使代码简单、易用、易维护。
枚举中有两个很实用的方法
1、GetHashCode() //返回该实例的值的哈希代码
2、ToString() //将此实例的值转换为其等效的字符串表示
这两个方法在编码的时候会用到,GetHashCode()这个方法使用机会会更多。
有前枚举的使用,我得出以上一点心得,与大家共享一下。
FolderBrowserDialog
这个是选择文件夹
OpenFileDialog
是选择文件
1.MapControl封装了Map对象,用于管理空间的外观、显示属性和地图属性,管理、添加数据图层、装载地图文档,显示、绘制跟踪图层。
接口有IMapControlDefault(地图缺省接口)
{
使用方法:
IMapControlDefault mapControlDefault;
MapControl mapControl;
MapControl=axMapControl1.Object as IMapControlDefault;
}、
IMapControl2(提供属性和方法)、IMapcontrol3、IMapControlEvents2(定义了MapControl能处理的全部事件)等
2.PageLayoutControl控件主要用于页面布局与制图,封装了PageLayout类,主要实现IPageLayoutControlDefault、IPageLayoutControl、IPageLayoutControl2、IPageLayoutControlevents 等接口。
PageLayoutControl控件不能添加地图图层或地理数据,必须用MXD文件加载
3.TOCControl(图层树控件)需要一个伙伴控件。
其每个伙伴控件都实现了ITOCBuddy接口。
TOCControl控件的主要接口有两个一个是ITOCControl,一个是ITOCControlEvents。
4.工具栏控件ToolbarControl,主要有六个对象及相关接口:ToolbarControl、ToolbarItem、ToolbarMenu、CommandPool、CustomizeDialog、MissingCommand。
ToolbarControl主要的接口有:IToolbarControl(出发点)、IToolbarControlDefault、IToolbarControlEvents(事件接口,能处理全部事件)
分享到一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多...百度分享
相册广场游戏superneverbaby退出关注此空间感触
学习的记忆、工作的记载
2011-11-29 10:07 ArcEngine中打开各种数据源(WorkSpace)的连接ArcEngine中打开各种数据源(WorkSpace)的连接
(SDE、personal/File、ShapeFile、CAD数据、影像图、影像数据集)
ArcEngine 可以接受多种数据源。
在开发过程中我们使用了如下几种数据源
1.企业数据库(SDE)
企业数据库需要使用SDE来管理,所以需要使用SDE的Workspace来表示连接。
在AE接口中,Workspace是由Factory打开的。
代码如下:// //准备连接参数
ESRI.ArcGIS.esriSystem.IPropertySet pPropSet=new PropertySetClass();
pPropSet.SetProperty("server","服务器机器名" );
pPropSet.SetProperty("instance","SDE运行的端口号");
pPropSet.SetProperty("user","用户名");
pPropSet.SetProperty("password","口令" );
pPropSet.SetProperty("version","版本");
SdeWorkspaceFactory sdeWkspFact=new SdeWorkspaceFactoryClass();
IFeatureWorkspace pFeaWksp=(IFeatureWorkspace)sdeWkspFact.Open(pPropSet,0);
其中唯一需要解释的可能就是版本(version).对于没有使用版本或者第一次连接(没有建立空间数据库,当然没有版本了). 该处使用sde.DEFAULT这个版本。
这是默认的版本。
iPropertySet:: setProperty
public void setProperty(string name,object value)
2.个人数据库(PersonalGeodatabase、FileGeodatabase)
ArcEngine中个人数据库为Access。
string filePath="E:\\tt.mdb";
AccessWorkspaceFactory fac=new AccessWorkspaceFactoryClass();
IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(filePath,0); 这是用的最多的一种方式.
如果是FileGeodatabasse,则将
FileGDBWorkspaceFactory pWSF = New FileGDBWorkspaceFactory;
IFeatureWorkspace pWS1= pWSF.OpenFromFile(sPath, 0);
如果用IPropertySet。
如下:
//Personal Geodatabase e.g., database = "C:\\myData\\mypGDB.mdb"
public IWorkspace open_pGDB_Workspace(string database)
{
IPropertySet propertySet = new PropertySetClass();
propertySet.SetProperty("DATABASE", database);
IWorkspaceFactory workspaceFactory = new AccessWorkspaceFactoryClass(); return workspaceFactory.Open(propertySet, 0);
}
3.Shapefile文件
Shapefile和Access的打开方式有一点相同。
也有差异。
//这是Shape所在的目录(注意:是目录)
string spacePath="E:\\shapefile";
IShapefileWorkspaceFactory fac=new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace space=(IFeatureWorkspace)fac.OpenFromFile(spacePath,0);
IFeatureClass fc=space.openFeatureClass(“china”);
4.AutoCAD dwg文件
AutoCAD文件和一般的ESRI格式不同。
所以代码会有一点点奇怪。
假设有一个dwg文件为E:\\cad\\107.dwg 下面是打开的代码:
CadWorkspaceFactoryClass fac=new CadWorkspaceFactoryClass ();
String filePath="E:\\cad";
IFeatureWorkspace space=fac.OpenFromFile(filePath,0) as IFeatureWorkspace ;
下面是打开FeatureClass的代码:
//线
IFeatureClass polyline =space.OpenFeatureClass("107.dwg:Polyline");
IFeatureLayer layer=new CadFeatureLayerClass ();
layer.FeatureClass =polyline;
//点
IFeatureClass point=space.OpenFeatureClass ("107.dwg:Point");
layer=new CadFeatureLayerClass ();
layer.FeatureClass =point;
//面
IFeatureClass polygon=space.OpenFeatureClass ("107.dwg:Polygon");
layer=new CadFeatureLayerClass();
layer.FeatureClass =polygon;
//注记
IFeatureClass anno=space.OpenFeatureClass ("107.dwg:Annotation"); layer=new CadAnnotationLayerClass();
layer.FeatureClass =anno;
5.影像图文件
//文件路径
string filePath="E:\\image\\117.tif";
IRasterLayer rasterLayer=new RasterLayerClass();
rasterLayer.CreateFromFilePath(filePath );
6.数据库中的影像数据集。
//数据库连接
IWorkspace space=OpenSpace();
//打开数据库的方式
IRasterWorkspaceEx rasterSpace=(IRasterWorkspaceEx)space;
IRasterDataset rasterDataset=rasterSpace.OpenRasterDataset ( ); IRasterLayer rasLayer=new RasterLayerClass();
rasLayer.CreateFromDataset(rasterDataset);
terWorkspaceEx:提供创建和打开栅格目录或栅格数据集的方法。
但是IRasterWorkspaceEx,IRasterWorkspace, IRasterWorkspace2都有OpenRasterDataset。
IRasterWorkspace经常也可用于打开栅格数据,如:pWorkspaceFactory = new RasterWorkspaceFactoryClass();
pRasterWorkspace = (IRasterWorkspace)pWorkspaceFactory.OpenFromFile(filePath, 0);
IRasterDataset pRasterDataset = (IRasterDataset)pRasterWorkspace.OpenRasterDataset(fileName);
IRasterLayer pRasterLayer = new RasterLayerClass();
pRasterLayer.CreateFromDataset(pRasterDataset);。