Arcgis Engine二次开发实验报告

更新时间:2024-04-04 22:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

GIS

二次开发实验报告学号:201420310115 姓名:李梦南 班级:1423101 专业:地理信息系统

任课老师:李小龙

二零一七年六月十二日

目录

1

实验一:AOI书签开发 .................................................................................................... 1 1.1 1.2 1.3 2.1 2.2 2.3 2

实验目的 .................................................................................................................... 1 实验内容 .................................................................................................................... 1 实验步骤与结果 ........................................................................................................ 1 实验目的 .................................................................................................................... 5 实验内容 .................................................................................................................... 5 实验步骤与结果 ........................................................................................................ 5

实验三:地图渲染 ........................................................................................................... 9 3.1 3.2 3.3

实验目的 .................................................................................................................... 9 实验内容 .................................................................................................................... 9 实验步骤结果 ............................................................................................................ 9

3 实验四:空间数据处理 ................................................................................................. 16 4.1 4.2 4.3

实验目的 .................................................................................................................. 16 实验内容 .................................................................................................................. 16 实验步骤与结果 ...................................................................................................... 16

4 实验五:GIS分析 ........................................................................................................... 25 5.1 5.2 5.3

实验目的 .................................................................................................................. 25 实验内容 .................................................................................................................. 25 实验步骤与结果 ...................................................................................................... 25

5 实验六:栅格数据处理 ................................................................................................. 33 6.1 6.2 6.3

实验目的 .................................................................................................................. 33 实验内容 .................................................................................................................. 33 实验步骤与结果 ...................................................................................................... 33

6 实验总结 ......................................................................................................................... 43

1 实验一:AOI书签开发

1.1 实验目的

? 掌握AOI书签程序开发

1.2 实验内容

? 实现AOI书签的创建 ? 实现AOI书签的调用

1.3 实验步骤与结果

实验思路、关键代码(全面注释)、运行结果截图 实验思路:

空间书签是用户定义创建的标志某个特定地理位置的快捷方式,创建好书签后能够很方便的找到某个地理位置。在本实验中我们需要创建的是AOI书签,即用户所关心的一个范围,通过调用该书签,用户可以马上找到书签所指范围。

实现本实验主要包括以下几个方面:

1. 添加控件和类库引用:添加创建书签控件、保存和调用书签控件,添加

Geometry类库

2. 添加“创建书签”函数:创建书签,保存当前感兴趣范围,将书签名加入

组合框,以便调用

3. 添加“书签名称设置”窗体:获取书签名,传递给主窗体

4. 添加两个事件响应函数:“创建书签”菜单项的点击事件,作用是打开“书

签名称设置”窗体;“确认”按钮的点击事件,作用是调用创建书签函数 5. 实现与调用书签:添加组合框的事件响应函数,作用是当组合框中选项

改变时,地图将刷新显示出书签所记录的范围。

实现创建书签的流程图如下:

添加引用、控件、函数运行项目加载地图文档任意改变当前视图范围输入书签名,点击确认选中感兴趣范围,点击确认书签菜单项选中组合框某一书签关键代码:

1. 添加控件和类库引用

usingESRI.ArcGIS.Geometry;

当前地图视图缩放至书签范围

2. 添加“创建书签”函数

publicvoidCreateBookmark(stringsBookmarkName) //参数名为书签名

{

//通过IAOIBookmark接口创建一个变量,用于保存当前地图的范围 IAOIBookmarkaoiBookmark = newAOIBookmarkClass();

//判断如果变量不为空的话,将当前地图的属性赋给变量,变量名为书签名 if (aoiBookmark != null) {

aoiBookmark.Location = axMapControl1.ActiveView.Extent; aoiBookmark.Name = sBookmarkName; }

//通过IMapBookmarks接口访问当前地图,在地图中加入新建书签 IMapBookmarks bookmarks = axMapControl1.Map asIMapBookmarks; if (bookmarks != null) {

bookmarks.AddBookmark(aoiBookmark); }

//将新建书签名加入组合框,以便调用

cbBookmarkList.Items.Add(aoiBookmark.Name); }

3. 添加“书签名称设置”窗体

//定义一个主窗体变量,用于保存主窗体对象

publicMainFormm_frmMain; //用于传入主窗体对象

publicAdmitBookmarkName(MainFormfrm) {

InitializeComponent(); if (frm != null) { m_frmMain = frm; } }

//“确认”按钮的“点击”事件响应函数,用于创建书签

privatevoidbtAdmit_Click(object sender, EventArgs e) {

if (m_frmMain != null || tbBookmarName.Text == \) {

m_frmMain.CreateBookmark(tbBookmarName.Text); } this.Close();

}

4. 实现与调用书签

//“创建书签”按钮的“点击”事件响应函数

privatevoidmiCreateBookmark_Click(object sender, EventArgs e) {

AdmitBookmarkNamefrmABN = newAdmitBookmarkName(this); frmABN.Show(); }

//组合框的事件响应函数,选择不同书签,显示不同范围

private void cbBookmarkList_SelectedIndexChanged(object sender, EventArgs e) {

//访问地图所包含的书签,获取书签序列

IMapBookmarks bookmarks = axMapControl1.Map as IMapBookmarks; IEnumSpatialBookmarkenumSpatialBookmark = bookmarks.Bookmarks; //对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签 enumSpatialBookmark.Reset();

ISpatialBookmarkspatialBookmark = enumSpatialBookmark.Next(); while (spatialBookmark != null) {

if (cbBookmarkList.SelectedItem.ToString() == spatialBookmark.Name) {

spatialBookmark.ZoomTo((IMap)axMapControl1.ActiveView); axMapControl1.ActiveView.Refresh(); break;

2 实验三:地图渲染

3.1 实验目的

? 了解地图符号的分类与可视化过程 ? 掌握地图符号的渲染方法

3.2 实验内容

? 编写“地图编制”类,添加成员函数 ? 实现获取地图渲染器信息功能 ? 实现地图的简单符号渲染

3.3 实验步骤结果

实验思路:

地图渲染是指用不同的颜色和符号对地图进行可视化。特征渲染器有八类,本实验是采用简单渲染器,即对整个图层要素用同一种方式进行渲染,操作对象是“World Cities”图层。由于要用到数据操作类函数,所以实验在实验二的基础上进行。

实验分为以下几个部分:

1. 添加主窗体控件和导入类库:地图表现菜单项和两个下拉菜单项简单渲染器和获取渲染器信息。

2. 添加地图编制类并为其导入部分类库:该类用于管理当前项目中涉及地图整饰、修改和展示的相关功能

3. 添加类成员函数:包括三个,分别是获取指定图层的渲染器类型信息函数、获取指定图层的符号信息函数、统一设置指定图层渲染参数函数 4. 添加事件响应函数:简单渲染图层菜单项的点击事件响应函数、获取渲染器信息点击事件响应函数

实现流程如下:

添加主窗体控件和类库添加地图编制类添加类成员函数图层被渲染并刷新视图运行程序点击简单渲染图层添加事件响应函数点击获取渲染器信息关键代码: 1.添加控件

usingESRI.ArcGIS.Display;

出现渲染器类型文本框

2.添加地图编制类

usingESRI.ArcGIS.Carto;

usingESRI.ArcGIS.Geodatabase; usingESRI.ArcGIS.Geometry; usingESRI.ArcGIS.Display;

3.完善类的功能

//添加成员函数,获取指定图层的渲染器类型信息

publicstaticStringGetRenderTypeByLayer(ILayer layer) {

//判断图层是否获取成功 if (layer == null) {

return\图层获取失败\; }

//使用IFeatureLayer接口访问指定图层,并获取其渲染器 IFeatureLayerfeatureLayer = layer asIFeatureLayer;

IGeoFeatureLayergeoFeatureLayer = layer asIGeoFeatureLayer; IFeatureRendererfeatureRenderer = geoFeatureLayer.Renderer;

//判断该图层渲染器是否为备选渲染器类型之一,匹配成功则返回类型信息 if (featureRendererisISimpleRenderer)

{

return\; }

elseif (featureRendererisIUniqueValueRenderer) {

return\; }

elseif (featureRendererisIDotDensityRenderer) {

return\; }

elseif (featureRendererisIChartRenderer) {

return\; }

elseif (featureRendererisIProportionalSymbolRenderer) {

return\; }

elseif (featureRendererisIRepresentationRenderer) {

return\; }

elseif (featureRendererisIClassBreaksRenderer) {

return\; }

elseif (featureRendererisIBivariateRenderer) {

return\; }

//如果匹配失败,返回提示

return\未知或渲染器获取失败\; }

//添加静态成员函数,获取指定图层的符号信息

publicstaticISymbolGetSymbolFromLayer(ILayer layer) {

//判断图层是否获取成功 if (layer == null) { returnnull; }

//访问图层,获取图层中的第一个要素,判断是否成功 IFeatureLayerfeatureLayer = layer asIFeatureLayer;

IFeatureCursorfeatureCursor = featureLayer.Search(null, false); IFeature feature = featureCursor.NextFeature(); if (feature == null) { returnnull; }

//访问指定图层,获取其渲染器,判断是否成功

IGeoFeatureLayergeoFeatureLayer = featureLayerasIGeoFeatureLayer; IFeatureRendererfeatureRenderer = geoFeatureLayer.Renderer; if (featureRenderer == null) { returnnull; }

//访问图层要素对应的符号信息,作为函数信息返回

ISymbol symbol = featureRenderer.get_SymbolByFeature(feature); return symbol; }

//添加静态成员函数,设置指定图层符号的颜色,并进行简单渲染 publicstaticboolRenderSimply(ILayer layer, IColor color) {

//判断图层和颜色是否获取成功

if (layer == null || color == null) { returnfalse; }

//调用成员函数,获取指定图层的符号,判断是否成功 ISymbol symbol = GetSymbolFromLayer(layer); if (symbol == null) { returnfalse; }

//获取指定图层的要素类,判断是否成功

IFeatureLayerfeatureLayer = layer asIFeatureLayer; IFeatureClassfeatureClass = featureLayer.FeatureClass; if (featureClass == null) { returnfalse; }

//获取指定图层要素类的几何形状信息,并匹配,设置不同类型符号的颜色 esriGeometryTypegeoType = featureClass.ShapeType; switch (geoType) {

caseesriGeometryType.esriGeometryPoint: {

IMarkerSymbolmarkerSymbol = symbol asIMarkerSymbol; markerSymbol.Color = color; break;

}

caseesriGeometryType.esriGeometryMultipoint: {

IMarkerSymbolmarkerSymbol = symbol asIMarkerSymbol; markerSymbol.Color = color; break;

}

caseesriGeometryType.esriGeometryPolyline: {

ISimpleLineSymbolsimplelinesymbol = symbol asISimpleLineSymbol; simplelinesymbol.Color = color; break;

}

caseesriGeometryType.esriGeometryPolygon: {

IFillSymbolfillSymbol = symbol asIFillSymbol; fillSymbol.Color = color; break;

} default: returnfalse; }

//新建简单渲染器对象,设置符号,通过接口访问,判断是否成功 ISimpleRenderersimpleRenderer = newSimpleRendererClass(); simpleRenderer.Symbol = symbol;

IFeatureRendererfeatureRenderer = simpleRendererasIFeatureRenderer; if (featureRenderer == null) { returnfalse; }

//通过接口访问指定图层,设置其渲染器

IGeoFeatureLayergeoFeatureLayer = featureLayerasIGeoFeatureLayer; geoFeatureLayer.Renderer = featureRenderer; returntrue; }

4.实现图层简单渲染

//实现图层简单渲染

privatevoidmiRenderSimply_Click(object sender, EventArgs e) {

//获取\图层

DataOperatordataOperator = newDataOperator(axMapControl1.Map); ILayer layer = dataOperator.GetLayerByName(\); //设置颜色为红色

IRgbColorrgbColor = newRgbColorClass(); rgbColor.Red = 255; rgbColor.Green = 0; rgbColor.Blue = 0;

//获取\图层的符号信息,并通过接口访问设置好的颜色对象 ISymbol symbol = MapComposer.GetSymbolFromLayer(layer); IColor color = rgbColorasIColor;

//实现该图层的简单渲染,判断是否成功,若成功,则刷新视图,显示渲染效果 boolbRes = MapComposer.RenderSimply(layer, color); if (bRes) {

axTOCControl1.ActiveView.ContentsChanged(); axMapControl1.ActiveView.Refresh(); miRenderSimply.Enabled = false; } else

{

MessageBox.Show(\简单渲染图层失败!\); } }

//生成获取图层渲染器类型信息的获取

privatevoidmiGetRendererInfo_Click(object sender, EventArgs e) {

//获取\图层

DataOperatordataOperator=newDataOperator(axMapControl1.Map); ILayer layer=dataOperator.GetLayerByName(\); //消息框显示该图层的渲染器类型信息

MessageBox.Show(MapComposer.GetRenderTypeByLayer(layer)); }

5. 运行结果

3 实验四:空间数据处理

4.1 实验目的

? 了解创建空间数据的过程 ? 掌握创建空间数据的方法

4.2 实验内容

? 实现创建Shapefile文件的程序 ? 实现新增点要素程序

4.3 实验步骤与结果

实验思路:

本实验包含两个部分:在硬盘的指定路径下创建一个Shapefile文件;向创建的Shapefile文件中添加要素。实验仍然需要用到数据操作类,所以还是在实验二的基础上操作,对于该类的操作在之后不再赘述。

实验主要包含以下几个部分:

1.添加主窗体控件和类库引用:数据操作菜单项和下拉菜单项创建Shapefile菜单项。

2.在数据操作类中添加成员函数:包含两个,创建Shapefile文件函数、以图层形式添加要素类函数

3.添加事件响应函数:为创建Shapefile菜单项添加点击事件响应函数 实现流程图如下:

添加主窗体控件和类库在数据操作类中添加函数添加事件响应函数新增图层指定路径新增Shapefile文件运行,点击创建Shapefile

关键代码:

1.添加控件和类库引用

usingESRI.ArcGIS.Geodatabase; usingESRI.ArcGIS.DataSourcesFile;

2.添加功能函数

//添加创建shapefile文件功能函数 publicIFeatureClassCreateShapefile( StringsParentDirectory,//上级路径

StringsWorkspaceName, //包含文件的文件夹名 StringsFileName) {

//如果指定的路径和文件夹已经存在,则删除此文件夹

if(System.IO.Directory.Exists(sParentDirectory+sWorkspaceName)) {

System.IO.Directory.Delete(sParentDirectory+sWorkspaceName,true); }

//通过工作空间工厂接口创建针对Shape文件的工作空间工场对象 //并通过参数创建相关工作空间,用于包含Shape文件

IWorkspaceFactoryworkspaceFactory=newShapefileWorkspaceFactoryClass(); IWorkspaceName

workspaceName=workspaceFactory.Create(sParentDirectory,sWorkspaceName,null,0); ESRI.ArcGIS.esriSystem.IName name=workspaceNameasESRI.ArcGIS.esriSystem.IName; //打开新建的工作空间,并通过接口访问

IWorkspace workspace=(IWorkspace)name.Open();

IFeatureWorkspacefeatureWorkspace=workspace asIFeatureWorkspace; //Shape文件在概念层次上是一个要素类。创建并编辑该要素类所需的字段集 IFields fields=newFieldsClass();

IFieldsEditfieldsEdit=fields asIFieldsEdit; //创建并编辑“序号”字段

IFieldEditfieldEdit=newFieldClass(); fieldEdit.Name_2=\;

fieldEdit.AliasName_2=\序号\;

fieldEdit.Type_2=esriFieldType.esriFieldTypeOID; fieldsEdit.AddField((IField)fieldEdit); //创建并编辑“名称”字段 fieldEdit=newFieldClass();

fieldEdit.Name_2=\;

fieldEdit.AliasName_2=\名称\;

fieldEdit.Type_2=esriFieldType.esriFieldTypeString; fieldsEdit.AddField((IField)fieldEdit);

//创建地理定义,设置其空间参考和几何类型,为创建“形状”字段做准备 IGeometryDefEditgeoDefEdit=newGeometryDefClass();

ISpatialReferencespatialReference=m_map.SpatialReference; geoDefEdit.SpatialReference_2=spatialReference;

geoDefEdit.GeometryType_2=esriGeometryType.esriGeometryPoint; //创建并编辑“形状”字段 fieldEdit=newFieldClass(); StringsShapeFieldName=\;

fieldEdit.Name_2=sShapeFieldName; fieldEdit.AliasName_2=\形状\;

fieldEdit.Type_2=esriFieldType.esriFieldTypeGeometry; fieldEdit.GeometryDef_2=geoDefEdit; fieldsEdit.AddField((IField)fieldEdit);

//调用IFeatureWorkspce接口的CreateFeatureClass方法,创建要素类 //并判断是否创建成功 IFeatureClass

featureClass=featureWorkspace.CreateFeatureClass(sFileName,fields,null,null,esriFeatureType.esriFTSimple,\,\); if(featureClass==null) { returnnull; }

//将创建好的要素类作为结果返回 returnfeatureClass; }

publicboolAddFeatureClassToMap(IFeatureClassfeatureClass, StringsLayerName)//要素类,图层名 {

//判断要素类、图层名和地图对象是否为空,为空返回false

if (featureClass == null || sLayerName == \ || m_map == null) { returnfalse; }

//通过接口创建要素图层对象,将要素类以层的形式进行操作 IFeatureLayerfeatureLayer = newFeatureLayerClass(); featureLayer.FeatureClass = featureClass; featureLayer.Name = sLayerName;

//将要素图层转换为一般图层,并判断是否成功 ILayer layer = featureLayerasILayer; if (layer == null) { returnfalse; }

//将创建好的图层添加至地图对象,将地图对象转化为活动视图,并判断是否成功 m_map.AddLayer(layer);

IActiveViewactiveView = m_mapasIActiveView; if (activeView == null) { returnfalse; }

//活动视图进行刷新,新添加的图层将被展开在控件中 activeView.Refresh(); returntrue; }

3. 实现创建shape文件

//创建文件菜单项点击函数

privatevoidmiCreateShapefile_Click(object sender, EventArgs e) {

//创建文件,将其以要素类形式获取,判断是否成功

DataOperatordataOperator = newDataOperator(axMapControl1.Map); IFeatureClassfeatureClass = dataOperator.CreateShapefile(\, \, \); if (featureClass == null) {

MessageBox.Show(\创建Shape文件失败!\); return;

}

//将要素类添加到地图中,设置图层名为\,记录结果 boolbRes = dataOperator.AddFeatureClassToMap(featureClass, \Stations\); if (bRes)

{

miCreateShapefile.Enabled = false; return;

} else

{

MessageBox.Show(\将新建Shape文件加入地图失败!\); return;

} }

4.运行结果

添加要素实验主要包以下部分:

1. 添加主窗体控件:创建数据操作菜单项的下拉菜单项“添加要素” 2. 添加类成员函数:在数据操作类中添加“添加要素至图层”函数

3. 添加事件响应函数:包括两个,添加要素菜单项的点击事件响应函数和鼠标按下事件响应函数 流程图如下:

添加主窗体控件添加类成员函数添加事件响应函数运行,创建文件,点击添加要素鼠标在地图中按下,创建点要素

关键代码:

1. 添加“新增要素”函数

//添加要素函数

publicboolAddFeatureToLayer(StringsLayerName, StringsFeatureName, IPoint point) {

//判断图层名、要素名、要素坐标和地图对象是否为空

if (sLayerName == \ || sFeatureName == \ || point == null || m_map == null) { returnfalse; }

//对地图对象中的图层进行遍历,寻找指定图层 ILayer layer = null;

for (inti = 0; i

layer = m_map.get_Layer(i); if (layer.Name == sLayerName) { break;

} layer = null; }

//判断图层是否获取成功 if (layer == null) { returnfalse; }

//通过接口访问访问获取到的图层,并进一步获取其要素类 IFeatureLayerfeatureLayer = layer asIFeatureLayer;

IFeatureClassfeatureClass = featureLayer.FeatureClass; //通过接口访问访问要素类新创建的要素,并判断是否成功 IFeature feature = featureClass.CreateFeature(); if (feature == null) { returnfalse; }

//对新创建的要素进行编辑,设置坐标、属性值,并保存 //判断是否成功

feature.Shape = point;

int index = feature.Fields.FindField(\); feature.set_Value(index, sFeatureName); feature.Store(); if (feature == null) { returnfalse; }

//将地图对象转化为活动视图,并判断是否成功 IActiveViewactiveView = m_mapasIActiveView; if (activeView == null) { returnfalse; }

//活动视图进行刷新 activeView.Refresh(); returntrue; }

2. 添加事件响应函数

//生成菜单项点击事件,按下鼠标添加要素

privatevoidmiAddFeature_Click(object sender, EventArgs e) {

if (miAddFeature.Checked == false) {

miAddFeature.Checked = true; } else

{

miAddFeature.Checked = false; } }

//鼠标按下事件响应函数

privatevoid axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)

{

if (miAddFeature.Checked == true) {

//新建点类对象,保存点位置信息 IPoint point = newPointClass(); point.PutCoords(e.mapX, e.mapY);

//在新建图层中添加要素,要素的名称统一设置为“观测站\

DataOperatordataOperator = newDataOperator(axMapControl1.Map);

dataOperator.AddFeatureToLayer(\, \观测站\, point); return;

} }

3.运行成果

4 实验五:GIS分析

5.1 实验目的

? 了解GIS空间分析的内容 ? 掌握空间关系查询方法 ? 掌握空间拓扑分析方法 ? 掌握空间数据统计方法

5.2 实验内容

? 实现空间关系查询程序 ? 实现缓冲区分析程序 ? 实现要素统计程序

5.3 实验步骤与结果

实现空间关系查询程序实验思路:

ArcGis Engine组件库提供了数据查询的相关组件,如QueryDef,查询结果包含在cursor游标内,进行要素选择核心的是查询过滤器。实验是对给定图层按熟悉进行查询,搜索亚洲境内人口等级等于5的所有城市列表。实验主要包含几下几个部分:

1. 添加控件和类库引用:在主窗体上添加“空间分析”菜单项和下拉菜单

项“空间查询”

2. 新增地图分析类并导入部分类库:该类用于管理当前项目中涉及的地图

分析相关功能

3. 添加类成员函数:在“地图分析”类中添加成员函数“空间查询”实现

对给定图层的空间交叉查询

4. 添加事件响应函数:为菜单项“空间查询”生成“点击”事件响应函数,

实现要素的空间交叉选择,并在地图上明显标识。

程序实现流程如下:

添加主窗体控件添加地图分析类和类库添加类成员函数满足条件的要素在图上高亮显示运行,点击“空间查询”添加事件响应函数

关键代码:

1.在类中增加空间查询函数,对图层进行空间交叉查询

publicboolQueryIntersect(stringsrcLayerName, stringtgtLayerName, IMapimap, esriSpatialRelationEnumspatialRel) {

DataOperatordataOperator = newDataOperator(imap); //定义并根据图层名称获取图层对象 IFeatureLayeriSrcLayer =

(IFeatureLayer)dataOperator.GetLayerByName(srcLayerName); IFeatureLayeriTgtLayer =

(IFeatureLayer)dataOperator.GetLayerByName(tgtLayerName); //通过查询过滤获取continents层中亚洲的几何 IGeometrygeom; IFeature feature;

IFeatureCursorfeatCursor; IFeatureClasssrcFeatClass;

IQueryFilterqueryFilter = newQueryFilter();

queryFilter.WhereClause = \; //设置查询条件 featCursor = iTgtLayer.FeatureClass.Search(queryFilter, false); feature = featCursor.NextFeature();

geom = feature.Shape; //获取亚洲图形几何

//根据所选择的几何对城市图层进行属性与空间过滤 srcFeatClass = iSrcLayer.FeatureClass;

ISpatialFilterspatialFilter = newSpatialFilter(); spatialFilter.Geometry = geom;

spatialFilter.WhereClause = \;//人口等级等于5的城市 spatialFilter.SpatialRel =

(ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum)spatialRel; //定义要素选择对象,以要素搜索图层进行实例化

IFeatureSelectionfeatSelect = (IFeatureSelection)iSrcLayer; //以空间过滤器对要素进行选择,并建立新选择集 featSelect.SelectFeatures(spatialFilter,

esriSelectionResultEnum.esriSelectionResultNew, false); returntrue; }

2.添加菜单项点击事件

privatevoidmiSpatialFilterToolStripMenuItem(object sender, EventArgs e) {

MapAnalysismapAnalysis=newMapAnalysis(); mapAnalysis.QueryIntersect(\

Cities\,\,axMapControl1.Map,esriSpatialRelationEnum.esriSpatialRelationIntersection); IActiveViewactiveView;

activeView=axMapControl1.ActiveView;

activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection,0,axMapControl1.Extent); }

运行结果

实现缓冲区分析程序

实验思路:

本实验是用的缓冲区分析功能,是根据数据库的点、线、面实体,建立实体周围一定范围内的缓冲区域。实验中是查询世界城市中距离北京经纬度1度范围之内的所有城市。实验主要包含以下几个部分:

1. 添加主菜单菜单项:在主窗体的“GIS分析”的下拉菜单中新建一个“缓

冲区分析”菜单项

2. 添加类成员函数:向地图分析类中添加缓冲区分析函数,创立缓冲区,

利用过滤条件进行查询。

3. 添加点击事件响应函数:实现要素的缓冲区分析,交叉选择城市并在地

图中明显标识

实现流程如下:

添加主窗体菜单项添加类成员函数添加事件响应函数符合条件的要素在图中高亮显示运行,点击缓冲区分析

关键代码:

1.增加缓冲区分析函数

publicbool Buffer(stringlayerName, stringsWhere, intiSize, IMapiMap) {

//根据过滤条件获取城市名称为北京的城市要素的几何 IFeatureClassfeatClass; IFeature feature; IGeometryiGeom;

DataOperatordataOperator = newDataOperator(iMap); IFeatureLayerfeatLayer =

(IFeatureLayer)dataOperator.GetLayerByName(layerName);

featClass = featLayer.FeatureClass;

IQueryFilterqueryFilter = newQueryFilter();

queryFilter.WhereClause = sWhere;//设置过滤条件 IFeatureCursorfeatCursor;

featCursor = (IFeatureCursor)featClass.Search(queryFilter, false); int count = featClass.FeatureCount(queryFilter);

feature = featCursor.NextFeature(); iGeom = feature.Shape;

//设置空间的缓冲区作为空间查询的几何范围

ITopologicalOperatoripTO = (ITopologicalOperator)iGeom; IGeometryiGeomBuffer = ipTO.Buffer(iSize); //根据缓冲区几何对城市图层进行空间过滤

ISpatialFilterspatialFilter = newSpatialFilter(); spatialFilter.Geometry = iGeomBuffer; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIndexIntersects; //定义要素选择对象,以要素搜索图层进行实例化

IFeatureSelectionfeatSelect = (IFeatureSelection)featLayer; //以空间过滤器对要素进行选择,并建立新选择集 featSelect.SelectFeatures(spatialFilter,

esriSelectionResultEnum.esriSelectionResultNew, false); returntrue; }

4. 添加菜单项点击事件

privatevoidmiBuffer_Click(object sender, EventArgs e) {

MapAnalysismapAnalysis = newMapAnalysis();

mapAnalysis.Buffer(\, \, 1, axMapControl1.Map); IActiveViewactiveView;

activeView = axMapControl1.ActiveView;

activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, 0, axMapControl1.Extent); }

5. 运行结果

实现要素统计程序 实验思路:

本实验是以世界各大洲的面积统计为例,通过调用统计相关组件获取最小面积、最大面积和平均面积。数据统计组件通过DataStatistics统计并返回结果,再以游标形式传入,实验主要包括以下几个部分:

1. 添加菜单项:在程序主窗体的“GIS分析”菜单项的下拉菜单中,添加一个菜单项“要素统计”

2. 添加类成员函数:向地图分析类中添加要素统计函数,对图层进行要素统计 3. 添加事件响应函数:为菜单项“要素统计”生成点击事件响应函数,实现要素面积统计分析,将结果以对话框的形式输出。 实现流程如下:

添加要素统计菜单项添加类成员函数添加事件响应函数出现统计结果对话框运行,点击要素统计菜单项

关键代码:

1.增加要素统计函数

publicstring Statistic(stringlayerName, stringfieldName, IMapiMap) {

//根据给定图层名称获取图层对象

DataOperatordataOperator = newDataOperator(iMap);

IFeatureLayerfeatLayer = (IFeatureLayer)dataOperator.GetLayerByName(layerName);

//获取图层数据统计对象

IFeatureClassfeatClass = featLayer.FeatureClass; IDataStatisticsdataStatistic = newDataStatistics(); IFeatureCursorfeatCursor;

featCursor = featClass.Search(null, false); ICursor cursor = (ICursor)featCursor; dataStatistic.Cursor = cursor;

//指定统计字段为面积字段,统计出最小面积、最大面积及平均面积 dataStatistic.Field = fieldName;

IStatisticsResultsstatResult;//using ESRI.ArcGIS.esriSystem; statResult = dataStatistic.Statistics; doubledMax; doubledMin; doubledMean;

dMax = statResult.Maximum; dMin = statResult.Minimum; dMean = statResult.Mean; stringsResult;

sResult = \最大面积为\ + dMax.ToString() + \最小面积为\ + dMin.ToString() + \平均面积为\ + dMean.ToString(); returnsResult; }

4. 添加要素统计事件

privatevoidmiStatistic_Click(object sender, EventArgs e) {

MapAnalysismapAnalysis = newMapAnalysis(); stringsMsg;

sMsg = mapAnalysis.Statistic(\, \, axMapControl1.Map); MessageBox.Show(sMsg); }

4.运行结果

5 实验六:栅格数据处理

6.1 实验目的

? 了解栅格数据的结构 ? 掌握创建栅格数据集的方法 ? 掌握栅格数据格式转换与镶嵌的方法 ? 掌握栅格数据的统计方法

6.2 实验内容

? 实现创建栅格数据集程序 ? 实现栅格数据格式转换程序 ? 实现栅格数据镶嵌程序 ? 实现栅格数据统计程序

6.3 实验步骤与结果

实现创建栅格数据集程序 实验思路:

获取栅格数据集主要有两个途径,一是通过接口调用已有的数据集,二是创建新的栅格数据集。本节将以在文件数据库中创建一个栅格数据集为例,展示栅格工作空间的相关组件使用。首先,需要在ArcCatalog在指定目录下创建一个文件数据库,接着再利用二次开发创建栅格数据集。实验主要包括以下几个部分:

1. 在ArcCatalog中创建一个文件地理数据库

2. 在主窗体添加控件和类库引用:在程序主窗体上添加一个菜单项“栅格

管理”,在下拉菜单中添加菜单项“创建栅格数据集”,添加引用using ESRI.ArcGIS.DataSourcesRaster

3.添加栅格工具类:该类用于管理当前项目中涉及栅格数据操作的相关功能。同时为该类导入:

using System;

usingESRI.ArcGIS.DataSourcesRaster; usingSystem.Collections.Generic; usingESRI.ArcGIS.Geodatabase; usingESRI.ArcGIS.DataSourcesGDB;

4.添加类成员函数:包括两个,一是打开一个给定文件夹的栅格工作空间函数,二是创建栅格数据集函数。

5.添加事件响应函数:为主窗体的“创建栅格数据集”菜单项生成点击事件响应函数,实现在文件数据库下创建栅格数据集。

实现流程如下:

创建文件地理数据库添加主窗体菜单项添加栅格工具类运行,创建栅格数据集添加点击事件响应函数在栅格工具类中添加函数

关键代码: 1.添加类成员函数

//打开栅格工作空间

publicIRasterWorkspaceExOpenRasterWorkspaceFromFileGDB(stringfilePath) {

IWorkspaceFactorywsFactory = newFileGDBWorkspaceFactoryClass();

IRasterWorkspaceExws = (IRasterWorkspaceEx)wsFactory.OpenFromFile(filePath,0); returnws; }

//创建栅格数据集函数

publicboolCreateRaster(stringfilePath, stringrasterName) {

IRasterWorkspaceExrasterWorksapceEx;

//打开工作空间

rasterWorksapceEx = OpenRasterWorkspaceFromFileGDB(filePath); //设置存储参数

IRasterStorageDefstorageDef = newRasterStorageDef(); storageDef.CompressionType =

esriRasterCompressionType.esriRasterCompressionJPEG; //设置栅格列属性

IRasterDefrasterDef = newRasterDef(); //定义空间参考

ISpatialReferenceFactory2srFactotry = newSpatialReferenceEnvironmentClass(); intgcsType = (int)esriSRGeoCSType.esriSRGeoCS_WGS1984; IGeographicCoordinateSystemgeoCoordSystem =

srFactotry.CreateGeographicCoordinateSystem(gcsType);

ISpatialReferencespatialRef = (ISpatialReference)geoCoordSystem; rasterDef.SpatialReference = spatialRef; //创建栅格数据集

IRasterDatasetrasterDataset;

rasterDataset = rasterWorksapceEx.CreateRasterDataset(rasterName, 3, rstPixelType.PT_FLOAT, storageDef, null,rasterDef,null);

returntrue; }

2.添加事件响应函数

privatevoidmiCreateRaster_Click(object sender, EventArgs e) {

RasterUtilrastUtil = newRasterUtil();

rastUtil.CreateRaster(\, \); }

3.运行结果

栅格数据格式转换实验 实验思路:

栅格数据集组件提供了IRasterBandCollectin接口,利用IRasterBand- Collection的SaveAs 可以实现栅格数据的格式转换。该方法是利用已有栅格的波段创建一个新的栅格数据集,本实验是将原数据集转换成TIFF格式。要实现该操作,主要包含以下几个部分:

1.添加控件和类库:在主菜单项“栅格管理”下增加菜单项“格式转换” 2.添加类成员函数:在栅格工具类中添加“栅格数据格式转换”函数,实现数据格式转换功能

3.添加点击事件响应函数:为“格式转换”菜单项添加点击事件,传入需转换的栅格数据集名称、路径、新的数据集的名称。 实验流程如下:

添加主窗体控件添加类成员函数添加事件响应函数生成tif文件,加载至地图运行,点击“格式转换”

关键代码: 1.添加类成员函数

publicboolRasterConvert(stringfileGDB, stringoldRasterName, stringfilePath, stringnewRasterName) {

IWorkspace workspace;

IRasterWorkspaceExrasterWorkspaceEx; //打开输入工作空间

rasterWorkspaceEx = OpenRasterWorkspaceFromFileGDB(fileGDB); //打开栅格数据集

IRasterDatasetrasterDataset =

rasterWorkspaceEx.OpenRasterDataset(oldRasterName); //得到栅格波段

IRasterBandCollectionrasterBands = (IRasterBandCollection)rasterDataset; //打开输出工作空间

workspace = OpenRasterWorkspaceFromFile(filePath) asIWorkspace; //另存为给定文件名的图像文件

rasterBands.SaveAs(newRasterName, workspace, \); returntrue; }

2.添加事件响应函数

privatevoidmiRasterConvert_Click(object sender, EventArgs e) {

RasterUtilrastUtil = newRasterUtil();

rastUtil.RasterConvert(\, \, \, \); }

3.运行结果

栅格影像镶嵌实验 实验思路;

影像镶嵌是指两幅或多幅影像的融合,要完成镶嵌,需要创建一个单个栅格数据集,然后根据空间位置和影像特征信息融合影像。在本实验中,我们先建一个个人地理数据库,用来存放镶嵌影像,再新建一个栅格目录,加载用来镶嵌的两幅图C00000000.png和C00000001.png。接着在VS中添加栅格影像镶嵌的程序。实现栅格影像镶嵌可以概括为以下几部分:

1.栅格影像镶嵌前准备:创建个人地理数据库和栅格目录,加载用来镶嵌的两幅栅格影像。

2.添加控件和类库引用:在“栅格管理”菜单项的下拉菜单中添加“影像镶嵌”菜单项,并添加部分类库引用。

3.在类中添加“影像镶嵌”函数

4.添加事件响应函数:为“影像镶嵌”菜单项生成点击事件响应函数 实现流程如下:

创建个人地理数据库创建栅格目录引入两幅被镶嵌影像添加控件和类库运行,加载镶嵌好的影像添加事件响应函数添加类成员函数

关键代码: 1.添加类成员函数

publicvoid Mosaic(stringGDBName, stringcatalogName, stringoutputFolder, stringoutputName) {

//打开个人数据库

IWorkspaceFactoryworkspaceGDBFactory = newAccessWorkspaceFactoryClass(); IWorkspaceGDBworkspace = workspaceGDBFactory.OpenFromFile(GDBName, 0); //打开要被镶嵌的影像所在的栅格目录

IRasterWorkspaceExrasterWorkspaceEx = (IRasterWorkspaceEx)GDBworkspace; IRasterCatalograsterCatalog;

rasterCatalog = rasterWorkspaceEx.OpenRasterCatalog(catalogName); //定义一个影像镶嵌对象

IMosaicRastermosaicRaster = newMosaicRasterClass(); //镶嵌栅格目录中的所有影像到一个输出栅格数据集 mosaicRaster.RasterCatalog = rasterCatalog;

//设置镶嵌选项

mosaicRaster.MosaicColormapMode = rstMosaicColormapMode.MM_MATCH; mosaicRaster.MosaicOperatorType = rstMosaicOperatorType.MT_LAST; //打开输出栅格数据集所在的工作空间

IWorkspaceFactoryworkspaceFactory = newRasterWorkspaceFactoryClass(); IWorkspace workspace = workspaceFactory.OpenFromFile(outputFolder, 0); //保存到目标栅格数据集,数据格式可以是tiff,img,gid... ISaveAssaveas = (ISaveAs)mosaicRaster;

saveas.SaveAs(outputName, workspace, \); }

2.添加事件响应函数

privatevoidmiRasterMosaic_Click(object sender, EventArgs e) {

RasterUtilrastUtil = newRasterUtil();

rastUtil.Mosaic(\, \, \, \); }

3.运行结果

实现栅格统计程序 实验思路:

本实验是要实现统计融合后的MosaicRaster.tif影像的均值和标准差。ArcGIS Engine为栅格统计提供了相关组件,RasterStatistics组件实现了IRasterStatistics接口。实现实验包括以下几个部分:

1.添加控件:在程序主菜单项“栅格管理”的下拉菜单中新增菜单项“栅格统计”

2.添加类成员函数:向栅格工具类添加“栅格统计”函数,统计栅格影像的均值和标准差。

3.添加事件响应函数:为菜单项“栅格统计”菜单项添加点击事件响应函数,完成栅格统计,并将结果以对话框形式展示出来。

关键代码:

1.添加栅格统计函数

publicstringRasterStistics(stringfilePath, stringrasterName) {

IWorkspace workspace;

IRasterWorkspacerasterWorksapce; //打开工作空间

rasterWorksapce = OpenRasterWorkspaceFromFile(filePath); workspace = (IWorkspace)rasterWorksapce; //打开栅格数据集

IRasterDatasetrasterDataset = rasterWorksapce.OpenRasterDataset(rasterName); //得到栅格波段

IRasterBandCollectionrasterBands = (IRasterBandCollection)rasterDataset; IEnumRasterBandenumRasterBand = rasterBands.Bands; //定义一个字符串统计结果

stringsRasterStisticsResult = \栅格统计结果:\\n\; //逐个波段统计,每个波段的均值和标准差

IRasterBandrasterBand = enumRasterBand.Next(); while (rasterBand != null) {

//调用获取栅格统计信息函数 boolbRes = false;

rasterBand.HasStatistics(outbRes); if (!bRes)

{

rasterBand.ComputeStatsAndHist(); }

sRasterStisticsResult += GetRasterStistics(rasterBand); rasterBand = enumRasterBand.Next(); }

returnsRasterStisticsResult; }

//功能:根据给定栅格波段,统计其均值和均方差,并以字符串形式返回 privatestringGetRasterStistics(IRasterBandrasterBand) {

IRasterStatisticsrasterStatistics = rasterBand.Statistics; stringstatisticsResult;

statisticsResult = \均值为:\ + rasterStatistics.Mean.ToString() + \标准差为:\ +rasterStatistics.StandardDeviation.ToString();

returnstatisticsResult; }

2.添加事件响应函数

privatevoidmiRasterstatistic_Click(object sender, EventArgs e) {

stringrasterStatistics;

RasterUtilrastUtil = newRasterUtil(); rasterStatistics =rastUtil.RasterStistics(\, \); MessageBox.Show(rasterStatistics); }

3.运行成果

6 实验总结

比起以往的编程实习,这次的实习确实收获良多。从一开始的一头雾水,到后面终于看出点名堂,从知其然到知其所以然,其中的感受只有自己能体会。都说搞开发很枯燥,原先自己也这么觉得,但是通过这一学期的学习:二次开发和网络gis,让我重拾了对编程的兴趣。

实习最大的收获并不是成功运行了每个实验,而是对二次开发有了一个系统的理解,是对ArcEngine提供的类库和其接口的了解,是在实习过程中学会了自己调试,是从只知道照着代码敲到也能看懂网上朋友发的程序并帮助找出错误,是从完成任务到真正求知的过程。

其实真正的实习的开始可以说是在答辩前一天,因为要准备答辩,所以在课余时间才仔细的将书和程序都看了一遍,将注释打了一遍并琢磨,才开始拨云见日。之后,是为了写实习报告,别人都很快写完了,照着同学的、百度的、学长的,只有我慢慢吞吞,现在才写完。虽然可能也并不是很好,但至少对每个实习的实验有了清楚的脉络,对其中函数的调用、参数的传递、结果的显示等等都了解了,比如说事件响应函数里,将结果添加至图层,在之前敲代码的时候是完全没有注意这个事的,也没有想过为什么成功运行后会被显示,而现在我知道了,有的是将图层添加到地图,有的是在原有地图上刷新,有的是通过对话框显示,这在代码中都有迹可循;再比如最简单的一个实验:创建AOI书签。它有三个事件响应函数,但一开始我并没有注意它们各自的功能,如果您问我是“创建书签”的点击事件有什么用时,我肯定会想当然:调用创建书签函数。但其实调用创建书签函数是通过“确认”控件的点击事件响应函数,而“创建书签”的点击事件的作用是打开一个“书签名称设置窗体”。二次开发里的函数并不像以前学的写程序的调用,比如说通过主函数调用,在实习中的这些实验函数,都是通过事件响应函数来调用的,每个函数都具有一定的功能,通过事件响应函数去调用并采用一定的方法将结果显示。

不得不说,实习学到了很多,但我明白这不过是冰山一角,需要学的还有很多,也需要通过实际的例子来锻炼。比如要用到哪个接口,什么类库包含了这个接口,这还只能通过猜测,昨天找了很久也没发现哪里可以查,书上也写的不全。

还有就是效率问题,我们现在实现的功能在ArcMap中能够更精确更好的实现,效率更高,但是通过二次开发实现的功能处理小数据还可以,如果是大数据,处理时间比较长,比如说一份站点文件.txt,用ArcMap加载很快就可以导成一个点图层,但是写出来的二次开发程序却要跑几个小时。虽然知道问题所在,却不知如何改进,这也是我还要学的。还有比如涉及到了投影和参考坐标系的数据,又该怎么处理,怎样进行坐标系之间的转换,这些都是需要学的。

另外一个就是高级实验,其实网上有很多的程序,许多还是拿过来就能用的,虽然明白它里面的每条代码的含义,但如果要自己完整的写一个程序出来,还是很困难。总而言之,最大的不足就是连问题都不知道,本次实习真的收获很多,可惜大学的课都修完了,真觉得从前光阴虚度。今后一定要像这次实习一样,迎难而上,学习更多的知识和技能,提高自己解决问题的能力!

还有就是效率问题,我们现在实现的功能在ArcMap中能够更精确更好的实现,效率更高,但是通过二次开发实现的功能处理小数据还可以,如果是大数据,处理时间比较长,比如说一份站点文件.txt,用ArcMap加载很快就可以导成一个点图层,但是写出来的二次开发程序却要跑几个小时。虽然知道问题所在,却不知如何改进,这也是我还要学的。还有比如涉及到了投影和参考坐标系的数据,又该怎么处理,怎样进行坐标系之间的转换,这些都是需要学的。

另外一个就是高级实验,其实网上有很多的程序,许多还是拿过来就能用的,虽然明白它里面的每条代码的含义,但如果要自己完整的写一个程序出来,还是很困难。总而言之,最大的不足就是连问题都不知道,本次实习真的收获很多,可惜大学的课都修完了,真觉得从前光阴虚度。今后一定要像这次实习一样,迎难而上,学习更多的知识和技能,提高自己解决问题的能力!

本文来源:https://www.bwwdw.com/article/c45r.html

Top