ArcGIS Engine入门教程_第五章_添加数据

2
分享 2016-03-11
1.添加数据

1.1加载地图文档

刚刚在第四章生成了一个地图浏览小程序,下面我们使用代码的方式添加数据,首先学习如何加载地图文档(mxd)。

1. 在VS2013的工具箱中,展开Menus & Toolbars,双击MenuStrip控件,这样就在窗体上添加了一个菜单栏。



2. 在菜单上点击,输入“File”作为菜单的名称,在其下拉框中点击,输入“Open”菜单项和“Add Data”菜单项。



3. 选中“Open”菜单项,在属性框中点击“Events”按钮,在事件列表中双击“Click”事件或者直接双击该菜单项。



4. 自动生成的事件处理方法如下图所示,我们将在方法内输入处理代码。



5. 有多种方法将地图文档添加到地图控件中,本示例通过打开对话框形式加载。在Click事件处理方法中添加如下代码。
OpenFileDialog pOpenFileDialog = new OpenFileDialog();            
pOpenFileDialog.Filter = "Map Documents (*.mxd)|*.mxd";
pOpenFileDialog.InitialDirectory = @"D:\GIS-Data";
pOpenFileDialog.Multiselect = false;
pOpenFileDialog.Title = "Open Map Document";
if (pOpenFileDialog.ShowDialog() == DialogResult.OK)
{
string docName = pOpenFileDialog.FileName;
if (axMapControl1.CheckMxFile(docName))
{
axMapControl1.LoadMxFile(docName);
}
}


6. 由于ArcGIS Engine 10.3.1仍是32位应用程序,所以需要将程序的目标平台设为x86。在工程处右键选择“Properties”,弹出页面中,左侧选择“Build”,右侧界面“Platform target”项设置为“x86”。





7. 运行Engine程序,选择菜单项File->Open,弹出Open Map Document对话框,选择相应的地图文档,点击“Open”。



1.2添加要素类(从数据源角度)

刚刚在上部分学习了如何打开地图文档,下面我们使用代码从数据源角度添加数据(这里以添加shp数据为例)。

1. 选中“Add Data”菜单项,直接双击该菜单项,添加Click事件。



2. 下面开始使用ArcGIS Engine进行编码,首先需要添加ArcGIS的引用,在解决方案管理器中右键点击“Reference”,选择“Add Reference”。



3. 在Reference Manager对话框中,左侧选择Extensions,右侧选择ESRI.ArcGIS.DataSourcesFile和ESRI.ArcGIS.Geodatabase类库,勾上其前面的可选框,点击“OK”。



4. 这里需要注意,从.NET Framework 4.0平台开始,Reference属性中新增加了Embed Interop Types(嵌入互操作类型)选项,需要把ArcGIS相关的引用的Embed Interop Types设为“False”,否则会报错。



5. Form1.cs源代码文件中,在源代码的最顶部,导入命名空间,如下:
using System.IO;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Controls;


6. 在Click事件处理方法中添加代码。有多种方法将shapefile文件添加到地图控件中,本示例的步骤如下:

· 创建工作空间工厂。
· 打开shapefile工作空间。
· 打开要素类。
· 创建要素图层。
· 将图层关联到要素类。
· 添加图层到地图控件中并刷新。
private void addDataToolStripMenuItem_Click(object sender, EventArgs e)
{
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(@"D:\GIS-Data", 0);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass("continent.shp"); IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pFeatureClass.AliasName;
ILayer pLayer = pFeatureLayer as ILayer;
IMap pMap = axMapControl1.Map;
pMap.AddLayer(pLayer);
axMapControl1.ActiveView.Refresh();
}


注释:上面的代码pWorkspaceFactory.OpenFromFile(@"D:\GIS-Data", 0) 中的@符号作用使转意字符“\”作为一般字符对待。

7. 在键盘上按F5,启动调试,点击“Add Data”菜单项,就可以把continent.shp添加到地图控件中了。目前的这个功能只能添加D:\GIS-Data文件夹下面的continent.shp文件。下面我们使用更简便的方法将shp数据加载到地图中并且可以让用户浏览磁盘目录加载指定的shp文件。下面做一些改进。

8. 把原来的Click事件处理代码更新为如下代码:
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "shapefile文件(*.shp)|*.shp";
openFileDialog.InitialDirectory = @"D:\GIS-Data";
openFileDialog.Multiselect = false;
DialogResult pDialogResult = openFileDialog.ShowDialog();
if (pDialogResult != DialogResult.OK)
return;
string pPath = openFileDialog.FileName;
string pFolder = Path.GetDirectoryName(pPath);
string pFileName = Path.GetFileName(pPath);
axMapControl1.AddShapeFile(pFolder,pFileName);
axMapControl1.ActiveView.Refresh();


在键盘上按F5键,运行程序,点击“Add Data”菜单项,在弹出的对话框中,选择任意一个shp文件,点击“Open”,即可把shp文件加载到地图控件中。



本例以加载shp文件为例,如果想加载其它数据源的要素类,只需要在新建工作空间工厂时指定相应的类型,如:FileGDBWorkspaceFactoryClass(); /AccessWorkspaceFactoryClass(); / SdeWorkspaceFactoryClass(); 指定Workspace的路径,最后根据要素类名称打开即可。

1.3 矢量图层渲染
上节中,我们学习了如何添加矢量图层,但发现图层显示的颜色有些单一,如果我们想将continent.shp图层中的要素按照各大洲的名称不同而用不同颜色显示,该如何操作呢?下面我们就练习对该图层进行唯一值渲染。

1. 在窗体中添加“唯一值渲染”菜单项,双击该菜单项,添加Click事件。



2. 在Click事件中添加如下代码。该事件主要是构建一个IUniqueValueRenderer渲染器赋值给IGeoFeaturelayer.Renderer属性。
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
//通过地图控件获得索引为i的图层
IFeatureLayer pFtLayer = axMapControl1.get_Layer(0) as IFeatureLayer;
//指定要获得的唯一值字段名称
string pFieldName = "CONTINENT";
IGeoFeatureLayer pGeoFeaturelayer = pFtLayer as IGeoFeatureLayer;
//新建唯一值渲染器
IUniqueValueRenderer pUniqueValueRenderer = new UniqueValueRendererClass();
//渲染所用的字段个数为1
pUniqueValueRenderer.FieldCount = 1;
//用哪个字段进行渲染
pUniqueValueRenderer.set_Field(0, pFieldName);
//获取该要素类的所有要素
IFeatureCursor pFeatureCursor = pFtLayer.FeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
//将符合设为面要素的填充颜色
IFillSymbol pFillSymbol;
//设置随机颜色带
IRandomColorRamp pColorRamp = new RandomColorRampClass();
pColorRamp.Size = 20;//色带中有20种颜色
bool ok = true;
pColorRamp.CreateRamp(out ok);
IEnumColors pEnumRamp = pColorRamp.Colors;
int fieldIndex = pFeature.Fields.FindField(pFieldName);
//遍历所有要素
while (pFeature != null)
{
//获得该要素的字段值
string classValue = pFeature.get_Value(fieldIndex) as string;
//查找之前有无此字段值与面渲染符号相绑定,如果有则不进行符号绑定了
bool ValFound = false;
for (int i = 0; i < pUniqueValueRenderer.ValueCount; i++)
{
if (pUniqueValueRenderer.get_Value(i) == classValue)
{
ValFound = true;
break;
}
}
//如果之前没有绑定,将符号和字段值绑定
if (ValFound == false)
{
IColor pColor = pEnumRamp.Next();
pFillSymbol = new SimpleFillSymbolClass();
pFillSymbol.Color = pColor;
pUniqueValueRenderer.AddValue(classValue, pFieldName, pFillSymbol as ISymbol);
}
pFeature = pFeatureCursor.NextFeature();
}
//设置图层的渲染效果
pGeoFeaturelayer.Renderer = pUniqueValueRenderer as IFeatureRenderer;
//更新TOC列表和地图
axTOCControl1.Update();
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriView Geography, null, null);
}


3. 首先使用“Add Data”加载continent.shp矢量数据,然后点击“唯一值渲染”菜单项,即完成了对该矢量图层的唯一值渲染。



本教程各章节连接:
ArcGIS Engine入门教程_第一章_引言: http://zhihu.esrichina.com.cn/?/article/532
ArcGIS Engine入门教程_第二章_类库介绍: http://zhihu.esrichina.com.cn/?/article/533
ArcGIS Engine入门教程_第三章_软件安装: http://zhihu.esrichina.com.cn/?/article/534
ArcGIS Engine入门教程_第四章_创建Engine应用程序: http://zhihu.esrichina.com.cn/?/article/535
ArcGIS Engine入门教程_第五章_添加数据: http://zhihu.esrichina.com.cn/?/article/536
ArcGIS Engine入门教程_第六章_实现右键菜单: http://zhihu.esrichina.com.cn/?/article/537
 

5 个评论

讲的很明白,其中程序会报错的地方都指明了原因,帮助很大。
有个小问题,添加要素类的第8步,改进那个代码,第一句创建的pWorkspaceFactory在第八步中没有用到啊??
恩 确实没有用到。
请问一下入门教程只有1到6章吗?
目前是
请问下当我敲接口或者是类后, 怎么做才能快速的打出这个系统默认的名字呀,麻烦知道的告诉我一下嘛,比如说当我敲出IWorkspaceFactory 时,pworkspaceFactory是怎么快速打出来的,我记得好像是有快捷键的

要回复文章请先登录注册