Arcgis Engine二次开发实验报告.docx
- 文档编号:20967900
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:57
- 大小:1.58MB
Arcgis Engine二次开发实验报告.docx
《Arcgis Engine二次开发实验报告.docx》由会员分享,可在线阅读,更多相关《Arcgis Engine二次开发实验报告.docx(57页珍藏版)》请在冰豆网上搜索。
ArcgisEngine二次开发实验报告
GIS二次开发实验报告
学号:
************
******
班级:
1423101
专业:
地理信息系统
任课老师:
李小龙
二零一七年六月十二日
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接口访问当前地图,在地图中加入新建书签
IMapBookmarksbookmarks=axMapControl1.MapasIMapBookmarks;
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(objectsender,EventArgse)
{
if(m_frmMain!
=null||tbBookmarName.Text=="")
{
m_frmMain.CreateBookmark(tbBookmarName.Text);
}
this.Close();
}
4.实现与调用书签
//“创建书签”按钮的“点击”事件响应函数
privatevoidmiCreateBookmark_Click(objectsender,EventArgse)
{
AdmitBookmarkNamefrmABN=newAdmitBookmarkName(this);
frmABN.Show();
}
//组合框的事件响应函数,选择不同书签,显示不同范围
privatevoidcbBookmarkList_SelectedIndexChanged(objectsender,EventArgse)
{
//访问地图所包含的书签,获取书签序列
IMapBookmarksbookmarks=axMapControl1.MapasIMapBookmarks;
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;
}
spatialBookmark=enumSpatialBookmark.Next();
}
5.运行结果
实验二:
地图数据组织与访问
2.1实验目的
✧了解ArcGISEngine中地图数据的组织结构
✧掌握ArcGISEngine地图数据访问方法
2.2实验内容
✧编写“数据操作”类
✧利用DataGridView控件展示Continents图层的序号和名称字段
2.3实验步骤与结果
实验思路:
本实验要实现的功能是地理数据列表显示,是用.NETFramework提供的数据格网视图控件显示指定图层的属性数据,操作对象为“Continents”图层中各个洲的名称数据。
实验包含以下几部分:
1.添加控件:
“空间数据”菜单项和“访问图层数据”下拉菜单项
2.添加“数据展示台”窗体:
用于显示访问图层的名称数据
3.添加数据操作类,为该类导入相关引用和类库:
用于管理当前项目中涉及数据操作的相关功能
4.为数据操作类添加相应函数:
主要是两个获取函数,一个是获取图层函数,目的是获取各图层;一个是获取“Continents”图层,并读取该图层中各个洲的名称,以DataTable类型返回
5.添加事件响应函数:
添加“访问图层数据”菜单项点击函数,显示数据展示台窗体
实验实现的流程图如下:
关键代码:
1.添加“数据展示台”窗体
publicDataBoard(StringsDataName,DataTabledataTable)
{
//初始化窗体及控件
InitializeComponent();
//设置文本框中的文本和数据格网视图的数据源
tbDataName.Text=sDataName;
dataGridView1.DataSource=dataTable;
}
2.添加数据操作类
usingSystem.Data;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.DataSourcesFile;
//定义一个变量保存当前地图对象
publicIMapm_map;
//用于传入当前地图对象
publicDataOperator(IMapmap)
{
m_map=map;
}
3.获取地图图层
//添加成员函数,获取地图中各大洲名称,用表的形式返回
publicDataTableGetContinentsNames()
{
//获取"Continents"图层,并进行访问,判断是否成功
ILayerlayer=GetLayerByName("Continents");
IFeatureLayerfeatureLayer=layerasIFeatureLayer;
if(featureLayer==null)
{
returnnull;
}
//调用IfeatureLayer的Search方法,用于遍历图层中的要素,判断是否成功
IFeaturefeature;
IFeatureCursorfeatureCursor=featureLayer.Search(null,false);
feature=featureCursor.NextFeature();
if(feature==null)
{
returnnull;
}
//新建DataTable类型对象
DataTabledataTable=newDataTable();
//新建DataColumn对象,保存各个州的序号和名称,并将其加入DataTable中
DataColumndataColumn=newDataColumn();
dataColumn.ColumnName="序号";
dataColumn.DataType=System.Type.GetType("System.Int32");
dataTable.Columns.Add(dataColumn);
dataColumn=newDataColumn();
dataColumn.ColumnName="名称";
dataColumn.DataType=System.Type.GetType("System.String");
dataTable.Columns.Add(dataColumn);
//遍历图层中的所有要素,关联数据表中的下一行
//将要素的序号和名称赋给数据表中
DataRowdataRow;
while(feature!
=null)
{
dataRow=dataTable.NewRow();
dataRow[0]=feature.get_Value(0);
dataRow[1]=feature.get_Value
(2);
dataTable.Rows.Add(dataRow);
feature=featureCursor.NextFeature();
}
//返回数据表
returndataTable;
}
4.实现创建数据列表功能
//生成菜单项点击事件响应函数,并在数据展示台显示数据表
privatevoidmiAccessData_Click(objectsender,EventArgse)
{
DataOperatordataOperator=newDataOperator(axMapControl1.Map);
DataBoarddataBoard=newDataBoard("各大洲洲名",dataOperator.GetContinentsNames());
dataBoard.Show();
}
实验结果:
2实验三:
地图渲染
3.1实验目的
✧了解地图符号的分类与可视化过程
✧掌握地图符号的渲染方法
3.2实验内容
✧编写“地图编制”类,添加成员函数
✧实现获取地图渲染器信息功能
✧实现地图的简单符号渲染
3.3实验步骤结果
实验思路:
地图渲染是指用不同的颜色和符号对地图进行可视化。
特征渲染器有八类,本实验是采用简单渲染器,即对整个图层要素用同一种方式进行渲染,操作对象是“WorldCities”图层。
由于要用到数据操作类函数,所以实验在实验二的基础上进行。
实验分为以下几个部分:
1.添加主窗体控件和导入类库:
地图表现菜单项和两个下拉菜单项简单渲染器和获取渲染器信息。
2.添加地图编制类并为其导入部分类库:
该类用于管理当前项目中涉及地图整饰、修改和展示的相关功能
3.添加类成员函数:
包括三个,分别是获取指定图层的渲染器类型信息函数、获取指定图层的符号信息函数、统一设置指定图层渲染参数函数
4.添加事件响应函数:
简单渲染图层菜单项的点击事件响应函数、获取渲染器信息点击事件响应函数
实现流程如下:
关键代码:
1.添加控件
usingESRI.ArcGIS.Display;
2.添加地图编制类
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.Geometry;
usingESRI.ArcGIS.Display;
3.完善类的功能
//添加成员函数,获取指定图层的渲染器类型信息
publicstaticStringGetRenderTypeByLayer(ILayerlayer)
{
//判断图层是否获取成功
if(layer==null)
{
return"图层获取失败";
}
//使用IFeatureLayer接口访问指定图层,并获取其渲染器
IFeatureLayerfeatureLayer=layerasIFeatureLayer;
IGeoFeatureLayergeoFeatureLayer=layerasIGeoFeatureLayer;
IFeatureRendererfeatureRenderer=geoFeatureLayer.Renderer;
//判断该图层渲染器是否为备选渲染器类型之一,匹配成功则返回类型信息
if(featureRendererisISimpleRenderer)
{
return"SimpleRenderer";
}
elseif(featureRendererisIUniqueValueRenderer)
{
return"UniqueValueRenderer";
}
elseif(featureRendererisIDotDensityRenderer)
{
return"DotDensityRenderer";
}
elseif(featureRendererisIChartRenderer)
{
return"ChartRenderer";
}
elseif(featureRendererisIProportionalSymbolRenderer)
{
return"ProportionalSymbolRenderer";
}
elseif(featureRendererisIRepresentationRenderer)
{
return"RepresentationRenderer";
}
elseif(featureRendererisIClassBreaksRenderer)
{
return"ClassBreaksRenderer";
}
elseif(featureRendererisIBivariateRenderer)
{
return"BivariateRenderer";
}
//如果匹配失败,返回提示
return"未知或渲染器获取失败";
}
//添加静态成员函数,获取指定图层的符号信息
publicstaticISymbolGetSymbolFromLayer(ILayerlayer)
{
//判断图层是否获取成功
if(layer==null)
{
returnnull;
}
//访问图层,获取图层中的第一个要素,判断是否成功
IFeatureLayerfeatureLayer=layerasIFeatureLayer;
IFeatureCursorfeatureCursor=featureLayer.Search(null,false);
IFeaturefeature=featureCursor.NextFeature();
if(feature==null)
{
returnnull;
}
//访问指定图层,获取其渲染器,判断是否成功
IGeoFeatureLayergeoFeatureLayer=featureLayerasIGeoFeatureLayer;
IFeatureRendererfeatureRenderer=geoFeatureLayer.Renderer;
if(featureRenderer==null)
{
returnnull;
}
//访问图层要素对应的符号信息,作为函数信息返回
ISymbolsymbol=featureRenderer.get_SymbolByFeature(feature);
returnsymbol;
}
//添加静态成员函数,设置指定图层符号的颜色,并进行简单渲染
publicstaticboolRenderSimply(ILayerlayer,IColorcolor)
{
//判断图层和颜色是否获取成功
if(layer==null||color==null)
{
returnfalse;
}
//调用成员函数,获取指定图层的符号,判断是否成功
ISymbolsymbol=GetSymbolFromLayer(layer);
if(symbol==null)
{
returnfalse;
}
//获取指定图层的要素类,判断是否成功
IFeatureLayerfeatureLayer=layerasIFeatureLayer;
IFeatureClassfeatureClass=featureLayer.FeatureClass;
if(featureClass==null)
{
returnfalse;
}
//获取指定图层要素类的几何形状信息,并匹配,设置不同类型符号的颜色
esriGeometryTypegeoType=featureClass.ShapeType;
switch(geoType)
{
caseesriGeometryType.esriGeometryPoint:
{
IMarkerSymbolmarkerSymbol=symbolasIMarkerSymbol;
markerSymbol.Color=color;
break;
}
caseesriGeometryType.esriGeometryMultipoint:
{
IMarkerSymbolmarkerSymbol=symbolasIMarkerSymbol;
markerSymbol.Color=color;
break;
}
caseesriGeometryType.esriGeometryPolyline:
{
ISimpleLineSymbolsimplelinesymbol=symbolasISimpleLineSymbol;
simplelinesymbol.Color=color;
break;
}
caseesriGeometryType.esriGeometryPolygon:
{
IFillSymbolfillSymbol=symbolasIFillSymbol;
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(objectsender,EventArgse)
{
//获取"WorldCities"图层
DataOperatordataOperator=newDataOperator(axMapControl1.Map);
ILayerlayer=dataOperator.GetLayerByName("WorldCities");
//设置颜色为红色
IRgbColorrgbColor=newRgbColorClass();
rgbColor.Red=255;
rgbColor.Green=0;
rgbColor.Blue=0;
//获取"WorldCities"图层的符号信息,并通过接口访问设置好的颜色对象
ISymbolsymbol=MapComposer.GetSymbolFromLayer(layer);
IColorcolor=rgbColorasIColor;
//实现该图层的简单渲染,判断是否成功,若成功,则刷新视图,显示渲染效果
boolbRes=MapComposer.RenderSimply(layer,color);
if(bRes)
{
axTOCControl1.ActiveView.ContentsChanged();
axMapControl1.ActiveView.R
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Arcgis Engine二次开发实验报告 Engine 二次开发 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)