Arcgis Engine二次开发实验报告Word格式文档下载.docx
《Arcgis Engine二次开发实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Arcgis Engine二次开发实验报告Word格式文档下载.docx(57页珍藏版)》请在冰点文库上搜索。
创建书签,保存当前感兴趣范围,将书签名加入组合框,以便调用
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!
bookmarks.AddBookmark(aoiBookmark);
//将新建书签名加入组合框,以便调用
cbBookmarkList.Items.Add(aoiBookmark.Name);
3.添加“书签名称设置”窗体
//定义一个主窗体变量,用于保存主窗体对象
publicMainFormm_frmMain;
//用于传入主窗体对象
publicAdmitBookmarkName(MainFormfrm)
InitializeComponent();
if(frm!
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)
//访问地图所包含的书签,获取书签序列
IEnumSpatialBookmarkenumSpatialBookmark=bookmarks.Bookmarks;
//对地图所包含的书签进行遍历,获取与组合框所选项名称相符的书签
enumSpatialBookmark.Reset();
ISpatialBookmarkspatialBookmark=enumSpatialBookmark.Next();
while(spatialBookmark!
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)
//初始化窗体及控件
//设置文本框中的文本和数据格网视图的数据源
tbDataName.Text=sDataName;
dataGridView1.DataSource=dataTable;
2.添加数据操作类
usingSystem.Data;
usingESRI.ArcGIS.Carto;
usingESRI.ArcGIS.Geodatabase;
usingESRI.ArcGIS.DataSourcesFile;
//定义一个变量保存当前地图对象
publicIMapm_map;
//用于传入当前地图对象
publicDataOperator(IMapmap)
m_map=map;
3.获取地图图层
//添加成员函数,获取地图中各大洲名称,用表的形式返回
publicDataTableGetContinentsNames()
//获取"
Continents"
图层,并进行访问,判断是否成功
ILayerlayer=GetLayerByName("
);
IFeatureLayerfeatureLayer=layerasIFeatureLayer;
if(featureLayer==null)
returnnull;
//调用IfeatureLayer的Search方法,用于遍历图层中的要素,判断是否成功
IFeaturefeature;
IFeatureCursorfeatureCursor=featureLayer.Search(null,false);
feature=featureCursor.NextFeature();
if(feature==null)
//新建DataTable类型对象
DataTabledataTable=newDataTable();
//新建DataColumn对象,保存各个州的序号和名称,并将其加入DataTable中
DataColumndataColumn=newDataColumn();
dataColumn.ColumnName="
序号"
;
dataColumn.DataType=System.Type.GetType("
System.Int32"
dataTable.Columns.Add(dataColumn);
dataColumn=newDataColumn();
名称"
System.String"
//遍历图层中的所有要素,关联数据表中的下一行
//将要素的序号和名称赋给数据表中
DataRowdataRow;
while(feature!
dataRow=dataTable.NewRow();
dataRow[0]=feature.get_Value(0);
dataRow[1]=feature.get_Value
(2);
dataTable.Rows.Add(dataRow);
//返回数据表
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.添加地图编制类
3.完善类的功能
//添加成员函数,获取指定图层的渲染器类型信息
publicstaticStringGetRenderTypeByLayer(ILayerlayer)
//判断图层是否获取成功
if(layer==null)
return"
图层获取失败"
//使用IFeatureLayer接口访问指定图层,并获取其渲染器
IGeoFeatureLayergeoFeatureLayer=layerasIGeoFeatureLayer;
IFeatureRendererfeatureRenderer=geoFeatureLayer.Renderer;
//判断该图层渲染器是否为备选渲染器类型之一,匹配成功则返回类型信息
if(featureRendererisISimpleRenderer)
SimpleRenderer"
elseif(featureRendererisIUniqueValueRenderer)
UniqueValueRenderer"
elseif(featureRendererisIDotDensityRenderer)
DotDensityRenderer"
elseif(featureRendererisIChartRenderer)
ChartRenderer"
elseif(featureRendererisIProportionalSymbolRenderer)
ProportionalSymbolRenderer"
elseif(featureRendererisIRepresentationRenderer)
RepresentationRenderer"
elseif(featureRendererisIClassBreaksRenderer)
ClassBreaksRenderer"
elseif(featureRendererisIBivariateRenderer)
BivariateRenderer"
//如果匹配失败,返回提示
未知或渲染器获取失败"
//添加静态成员函数,获取指定图层的符号信息
publicstaticISymbolGetSymbolFromLayer(ILayerlayer)
//访问图层,获取图层中的第一个要素,判断是否成功
IFeaturefeature=featureCursor.NextFeature();
//访问指定图层,获取其渲染器,判断是否成功
IGeoFeatureLayergeoFeatureLayer=featureLayerasIGeoFeatureLayer;
if(featureRenderer==null)
//访问图层要素对应的符号信息,作为函数信息返回
ISymbolsymbol=featureRenderer.get_SymbolByFeature(feature);
returnsymbol;
//添加静态成员函数,设置指定图层符号的颜色,并进行简单渲染
publicstaticboolRenderSimply(ILayerlayer,IColorcolor)
//判断图层和颜色是否获取成功
if(layer==null||color==null)
returnfalse;
//调用成员函数,获取指定图层的符号,判断是否成功
ISymbolsymbol=GetSymbolFromLayer(layer);
if(symbol==null)
//获取指定图层的要素类,判断是否成功
IFeatureClassfeatureClass=featureLayer.FeatureClass;
if(featureClass==null)
//获取指定图层要素类的几何形状信息,并匹配,设置不同类型符号的颜色
esriGeometryTypegeoType=featureClass.ShapeType;
switch(geoType)
caseesriGeometryType.esriGeometryPoint:
IMarkerSymbolmarkerSymbol=symbolasIMarkerSymbol;
markerSymbol.Color=color;
caseesriGeometryType.esriGeometryMultipoint:
caseesriGeometryType.esriGeometryPolyline:
ISimpleLineSymbolsimplelinesymbol=symbolasISimpleLineSymbol;
simplelinesymbol.Color=color;
caseesriGeometryType.esriGeometryPolygon:
IFillSymbolfillSymbol=symbolasIFillSymbol;
fillSymbol.Color=color;
default:
//新建简单渲染器对象,设置符号,通过接口访问,判断是否成功
ISimpleRenderersimpleRenderer=newSimpleRendererClass();
simpleRenderer.Symbol=symbol;
IFeatureRendererfeatureRenderer=simpleRendererasIFeatureRenderer;
//通过接口访问指定图层,设置其渲染器
geoFeatureLayer.Renderer=featureRenderer;
returntrue;
4.实现图层简单渲染
//实现图层简单渲染
privatevoidmiRenderSimply_Click(objectsender,EventArgse)
WorldCities"
图层
ILayerlayer=dataOperator.GetLayerByName("
//设置颜色为红色
IRgbColorrgbColor=newRgbColorClass();
rgbColor.Red=255;
rgbColor.Green=0;
rgbColor.Blue=0;
图层的符号信息,并通过接口访问设置好的颜色对象
ISymbolsymbol=MapComposer.GetSymbolFromLayer(layer);
IColorcolor=rgbColorasIColor;
//实现该图层的简单渲染,判断是否成功,若成功,则刷新视图,显示渲染效果
boolbRes=MapComposer.RenderSimply(layer,color);
if(bRes)
axTOCControl1.ActiveView.ContentsChanged();
axMapControl1.ActiveView.R