ArcGIS Engine二次开发 提高篇.docx

上传人:b****5 文档编号:7177484 上传时间:2023-01-21 格式:DOCX 页数:22 大小:26.95KB
下载 相关 举报
ArcGIS Engine二次开发 提高篇.docx_第1页
第1页 / 共22页
ArcGIS Engine二次开发 提高篇.docx_第2页
第2页 / 共22页
ArcGIS Engine二次开发 提高篇.docx_第3页
第3页 / 共22页
ArcGIS Engine二次开发 提高篇.docx_第4页
第4页 / 共22页
ArcGIS Engine二次开发 提高篇.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

ArcGIS Engine二次开发 提高篇.docx

《ArcGIS Engine二次开发 提高篇.docx》由会员分享,可在线阅读,更多相关《ArcGIS Engine二次开发 提高篇.docx(22页珍藏版)》请在冰豆网上搜索。

ArcGIS Engine二次开发 提高篇.docx

ArcGISEngine二次开发提高篇

ArcGISEngine二次开发

——提高篇

1缩略图(鹰眼)

鹰眼功能是GIS的主要功能之一,当地图范围很大时,它可以很好的为用户指明当前地图的范围。

在本小节中我们将学习如何制作这种鹰眼。

1.1添加控件

新建一个C#.Net项目,项目名称为OverView,将Form1的名字设置为MainForm,并添加ToolbarControl、两个MapControl和LicenceControl等四个控件。

布局如下图所示。

左边的axMapControl1用于地图数据显示和操作,右边axMapControl2用于鹰眼显示。

图1界面布局

在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示,并将ToolbarControl的伙伴控件设为axMapControl1。

图2添加按钮

1.2代码添加及解释

鹰眼用来显示主窗体当前视图范围在全景视图中的位置,在ArcMap中使用一个线框在鹰眼视图中标识。

当主视图中的视图范围改变时,鹰眼中的线框随之改变,当拖动鹰眼视图中的红线框时,主视图中的视图范围也随之改变。

下面开始实现鹰眼功能,添加、、

三个引用。

首先在axMapControl1中视图范围改变时鹰眼窗体要做出对应的响应,即绘制线框并显示,在OnExtentUpdated事件中添加代码如下:

privatevoidaxMapControl1_OnExtentUpdated(objectsender,e)

{

et项目,项目名称为Buffer,将Form1的名字设置为MainForm,并添加ToolbarControl、MapControl、TOCControl、LicenceControl和Button等五个控件。

并将ToolbarControl、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnBuffer,Text属性设定为“缓冲区分析”。

控件布局效果如下图所示。

图7控件布局效果

在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。

图8添加按钮

1.2.1代码添加及解释

首先添加如下四个命名空间的引用。

在使用Geoprocessor工具实现缓冲区分析时,需要首先定义一个Geoprocessor对象,因为命名空间“也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。

然后定义一个操作类Buffer,并设置参数,生成缓冲区的参数包含原始图层,缓冲半径和输出路径,最后使用已定义的Geoprocessor对象执行即可。

双击“生成缓存区”按钮,添加代码如下:

privatevoidbtnBuffer_Click(objectsender,EventArgse)

{

hp)|*.shp";

hp"!

={

("输出路径错误!

");

return;

}

et项目,项目名称为OverLay,将Form1的名字设置为MainForm,并添加ToolbarControl、MapControl、TOCControl、LicenceControl和Button等五个控件。

并将ToolbarControl、TOCControl的伙伴控件设为MapControl,Button控件的Name属性设定为btnIntersect,Text属性设定为“叠置求交”。

控件布局效果如下图所示。

图12控件布局效果

在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。

图13添加按钮

1.2.2代码添加及解释

首先添加如下引用:

using与缓冲区分析的实现类似,在使用Geoprocessor工具实现叠置分析时,需要首先定义一个Geoprocessor对象,因为命名空间“也包含Geoprocessor类,为了避免混淆,我们使用命名空间来定义Geoprocessor,然后设置Geoprocessor中的环境参数,这里我们使用默认参数。

然后定义一个操作类,这里为Intersect,然后设置其操作参数,这里我们仅设置输入的要素,最后使用已定义的Geoprocessor对象执行即可。

双击“生成缓存区”按钮,添加代码如下:

privatevoidbtnIntersect_Click(objectsender,EventArgse)

{

hp)|*.shp";

="选择第一个要素";

hp)|*.shp";

="选择第二个要素";

hp)|*.shp";

hp";

;

stringstrName=(index);

Unionet项目,项目名称为OverLay,将Form1的名字设置为MainForm,Text属性设为“地图编辑”,并添加ToolbarControl、MapControl、TOCControl、LicenceControl、四个Button、两个ComboBox、两个Label和一个GroupBox等控件。

将ToolbarControl、TOCControl的伙伴控件设为MapControl,ToolbarControl加载添加数据按钮和地图浏览的功能按钮。

控件布局效果如下图所示。

图39界面效果

控件属性设置如下:

表3控件属性设置

控件类型

Name属性

Text属性

控件说明

Label

选择图层:

Label

编辑任务:

ComboBox

cboLayers

MapControl中的图层

ComboBox

cboTasks

编辑的方式

Button

btnRefreshLayers

更新图层

cboLayers载入图层名称

Button

btnStartEditing

开始编辑

开始编辑状态

Button

btnSave

保存

保存编辑

Button

btnStopEditing

结束编辑

结束编辑状态

GroupBox

地图编辑

控件容器

1.3添加引用和代码

ArcEngine中的地图编辑使用IWorkspaceEdit接口来进行编辑状态的管理,在需要对指定的工作空间进行编辑时,首先使用IWorkspaceEdit获取该工作空间的数据,然后使用StartEditing方法开始编辑状态,StartEditOperation方法打开具体编辑的操作,编辑完成后,使用StopEditOperation方法关闭编辑操作,使用StopEditing方法关闭编辑状态,完成编辑。

在本例中,我们实现了新的点线面要素的创建和移动的功能,涉及到了比较复杂的鼠标与地图间的交互,这个功能的实现中,IDisplayFeedback是一个十分关键的接口,它具有涉及创建要素,移动要素、编辑节点等31个实现类,能够实现鼠标与地图交互中的事件的追踪,返回新的几何对象。

本例的实现,我们首先来添加一个编辑类,将涉及到的编辑的相关方法抽象到这个类中。

在项目中添加“Edit”类。

添加如下引用。

using定义如下成员变量。

privateboolmIsEditing;orkspace;

mWorkspaceEdit=pWorkspaceasIWorkspaceEdit;

if(mWorkspaceEdit==null)

return;

creenDisplay;

pNewLineFeedback=mDisplayFeedbackasINewLineFeedback;

creenDisplay;

pNewPolygonFeedback=mDisplayFeedbackasINewPolygonFeedback;

creenDisplay;

et项目,项目名称为MapRender,将Form1的名字设置为MainForm,并添加ToolbarControl、MapControl、TOCControl、LicenceControl和Button等五个控件。

并将ToolbarControl、TOCControl的伙伴控件设为MapControl。

控件布局效果如下图所示。

图42控件布局效果

在ToolbarControl加载添加数据按钮和地图浏览的功能按钮,如下图所示。

图43工具栏设置效果

添加Buttom按钮的属性设置如下:

表4控件属性设置

控件类型

Name属性

Text属性

控件说明

Button

btnSimpIeRenderer

简单着色

对图层简单着色

Button

btnCIassBreakRenderer

分级着色

对图层分级着色

Button

btnUniqueValueRenderer

唯一值着色

对图层唯一值着色

Button

btnSymbolRenderer

依比例符号着色

对图层依比例符号着色

Button

btnChartRenderer

质量图着色

对图层质量图着色

Button

btnDotDensityRenderer

点密度着色

对图层点密度着色

1.4代码添加及解释

该工程需要添加如下引用:

using

using

using

using

using

在axMapControl1控件中添加图层,如图所示:

图44添加初始化图层

1.简单着色代码添加

添加btnSimpIeRenderer按钮的Click事件代码:

privatevoidbtnSimpIeRenderer_Click(objectsender,EventArgse)

{

IMappMap=;

分级着色代码添加

在前面代码的基础上添加如下引用:

using

using

然后添加btnCIassBreakRenderer按钮的Click事件代码:

privatevoidbtnCIassBreakRenderer_Click(objectsender,EventArgse)

{

IGeoFeatureLayerpGeoFeatureL;

ITablepTable;

IClassifyGENpClassify;

ITableHistogrampTableHistogram;

IBasicHistogrampHistogram;

objectdataFrequency;

objectdataValues;

double[]Classes;

intClassesCount;

IClassBreaksRendererpClassBreaksRenderer;

IHsvColorpFromColor;

IHsvColorpToColor;

IAlgorithmicColorRamppAlgorithmicCR;

IEnumColorspEnumColors;

boolok;

IColorpColor;

ISimpleFillSymbolpSimpleFillS;

intlbreakIndex;

stringstrPopField="POP1990";

intnumDesiredClasses=5;

IMappMap=;

=0;

pGeoFeatureL=(IGeoFeatureLayer)(0);

ET中必须使用IClassifyGEN这个借口定义的对象才能实现分级。

3.唯一值着色代码添加

添加btnUniqueValueRenderer按钮的Click事件代码:

privatevoidbtnUniqueValueRenderer_Click(objectsender,EventArgse)

{

IGeoFeatureLayerm_pGeoFeatureL;

IUniqueValueRendererpUniqueValueR;

IFillSymbolpFillSymbol;

IColorpNextUniqueColor;

IEnumColorspEnumRamp;

ITablepTable;

intlfieldNumber;

IRowpNextRow;

IRowBufferpNextRowBuffer;

ICursorpCursor;

IQueryFilterpQueryFilter;

stringcodeValue;

IRandomColorRamppColorRamp;

stringstrNameField="State_Name";

IMappMap=;

=0;

m_pGeoFeatureL=(IGeoFeatureLayer)(0);

pUniqueValueR=newUniqueValueRendererClass();

pTable=(ITable)m_pGeoFeatureL;

lfieldNumber=(strNameField);

if(lfieldNumber==-1)

{

("未能找到字段"+strNameField);

return;

}

唯一值着色代码添加

在前面代码的基础上添加引用

usingstdole;

然后添加btnSymbolRenderer按钮的Click事件代码:

privatevoidbtnSymbolRenderer_Click(objectsender,EventArgse)

{

IGeoFeatureLayerpGeoFeatureLayer;

IFeatureLayerpFeatureLayer;

IProportionalSymbolRendererpProportionalSymbolR;

ITablepTable;

IQueryFilterpQueryFilter;

ICursorpCursor;

IFillSymbolpFillSymbol;

ICharacterMarkerSymbolpCharaterMarkerS;

IDataStatisticspDataStatistics;

IStatisticsResultspStatisticsResult;

pFontDisp;

IRotationRendererpRotationRenderer;

IMappMap=;

=0;

pFeatureLayer=(IGeoFeatureLayer)(0);

pGeoFeatureLayer=(IGeoFeatureLayer)pFeatureLayer;

pTable=(ITable)pGeoFeatureLayer;

pQueryFilter=newQueryFilterClass();

("");

pCursor=(pQueryFilter,true);

质量图着色代码添加

这里以柱状图为例,先添加引用如下:

然后添加btnChartRenderer按钮的Click事件代码:

privatevoidbtnChartRenderer_Click(objectsender,EventArgse)

{

IGeoFeatureLayerpGeoFeatureL;

IFeatureLayerpFeatureLayer;

ITablepTable;

ICursorpCursor;

IQueryFilterpQueryFilter;

IRowBufferpRowBuffer;

intnumFields=2;

int[]fieldIndecies=newint[numFields];

intlfieldIndex;

doubledmaxValue;

boolfirstValue;

doubledfieldValue;

IChartRendererpChartRenderer;

IRendererFieldspRendererFields;

IFillSymbolpFillSymbol;

IMarkerSymbolpMarkerSymbol;

ISymbolArraypSymbolArray;

IChartSymbolpChartSymbol;

简单着色代码添加

添加btnDotDensityRenderer按钮的Click事件代码:

privatevoidbtnDotDensityRenderer_Click(objectsender,EventArgse)

{

IGeoFeatureLayerpGeoFeatureL;

IDotDensityRendererpDotDensityRenderer;

IDotDensityFillSymbolpDotDensityFillS;

IRendererFieldspRendererFields;

ISymbolArraypSymbolArray;

ISimpleMarkerSymbolpSimpleMarkerS;

stringstrPopField="POP1990";

IMappMap=;

pGeoFeatureL=(IGeoFeatureLayer)(0);

pDotDensityRenderer=newDotDensityRendererClass();

pRendererFields=(IRendererFields)pDotDensityRenderer;

//添加点密度着色的字段名

(strPopField,strPopField);

pDotDensityFillS=newDotDensityFillSymbolClass();

//设置着色符号的大小和颜色

=4;

IRgbColorcolor=newRgbColorClass();

=0;

=0;

=0;

=color;

//设置着色符号的背景颜色

=239;

=228;

=190;

=color;

pSymbolArray=(ISymbolArray)pDotDensityFillS;

//设置点符号样式

pSimpleMarkerS=newSimpleMarkerSymbolClass();

=;

=4;

=128;

=128;

=255;

=color;

((ISymbol)pSimpleMarkerS);

=pDotDensityFillS;

//设置一个点代表的值

=200000;

//创建图例

();

=(IFeatureRenderer)pDotDensityRenderer;

null,null);

}

着色的效果如下图所示:

图49根据POP1990字段的点密度着色图效果

1.5小结

地图专题图制作是GIS中数据显示和分析的重要环节,涉及到的对象和接口也比较多,上面实例只是简单的实现了五种专题图的显示。

读者也可以尝试在当前工程中添加TOCControl控件,然后在每次专题图生成代码的最后添加如下代码:

);();

看看TOCControl控件中会有什么样的变化,如果读者对二次开发感兴趣,可以自己试着阅读GIS二次开发相关书籍,了解与编辑相关的接口和方法,自己实现丰富的着色效果。

2网络分析

在ArcGIS中,网络是由一组边和接点按照一定的拓扑关系彼此连接而成的,边是具有一定长度和物流的网络要素,接点是两条或两条以上边的交汇处,实现两条边之间的物流的转换,边与接点是网络的两类基本组成要素。

ArcGIS所涉及的网络,是由一系列要素类别组成的,可以度量并能够用图形形式表达的网络,所以又称为几何网络(GeometricNetwork)。

组成几何网络的各要素被限制存在于网络中,作为网络要素(NetworkFeature)。

ArcGIS自动维护几何网络要素之间的基于几何的一致性拓扑关系。

本节中的网络分析包括两个模块,网络生成和进行网络分析。

本小节中的网络分析是针对网络生成中的数据进行操作的。

路径与权重的设置注意文档中的”注意”。

2.1生成几何网络

在进行网络分析功能实现之前,我们需要使用ArcGIS来创建一个几何网络文件。

1)创建Geodatabase。

打开ArcCatalog,在“\GIS设计与开发\例子数据\Network”文件夹下单击右键,选择“New”,“PersonalGeodatabase”,名称设为“USA_Highway_Network_GDB”。

2)创建FeatureDataset。

右键单击“USA_Highway_Network_GDB”,选择“New”,“FeatureDataset”。

在弹出窗口设置要素数据集的名字为“high”。

在弹出的坐标系统设置界面单击“Import”按钮,选择文件“”,即将该文件的坐标系统导入到数据集中,如图所示。

然后单击“Next”,直到Finish,完成要素数据集的创建。

图50创建FeatureDataset

图51坐标系统设置

3)添加FeatureClass。

右键单击要素数据集“high”,选择“Import”,“FeatureClass(Single)”,在弹出对话框中设置“InputFeatures”为“”,输出要素名称为“high”,输出路径为默认。

单击“OK”,完成添加。

图52添加FeatureClass

图53输出设置

4)创建几何网络。

右击“high”数据集,选择“New”,“GeometricNetwork”,准备开始生成网络。

图54创建几何网络

进入几何网络生成向导。

图55几何网络生成向导

选择几何网络生成方式,这里选择根据已存在要素创建。

图56选择几何网络生成方式

选择生成几何网络的要素,并设置名称,这里保留默认名称不做修改。

图57选择生成几何网络的要素

选择几何网络中是否保留原要素的属性值,这里选择“Yes”。

图58选择几何网络属性值

选择网络中的边的类型为复杂边(complexed

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 研究生入学考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1