GIS软件工程实习报告最短路径分析.docx

上传人:b****6 文档编号:8534745 上传时间:2023-01-31 格式:DOCX 页数:18 大小:596.31KB
下载 相关 举报
GIS软件工程实习报告最短路径分析.docx_第1页
第1页 / 共18页
GIS软件工程实习报告最短路径分析.docx_第2页
第2页 / 共18页
GIS软件工程实习报告最短路径分析.docx_第3页
第3页 / 共18页
GIS软件工程实习报告最短路径分析.docx_第4页
第4页 / 共18页
GIS软件工程实习报告最短路径分析.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

GIS软件工程实习报告最短路径分析.docx

《GIS软件工程实习报告最短路径分析.docx》由会员分享,可在线阅读,更多相关《GIS软件工程实习报告最短路径分析.docx(18页珍藏版)》请在冰豆网上搜索。

GIS软件工程实习报告最短路径分析.docx

GIS软件工程实习报告最短路径分析

AE开发之基于几何网络的最短路径分析

1、实习目的

本次实习目的在于熟练掌握ArcGISEngine开发工具并能够通过C#语言在VS2010开发环境中完成查询几何网络的最短路径分析的功能。

2、实习时间

2015年5月23日星期六

3、实习内容

3.1实验环境

操作系统:

Windows2007

二次开发平台:

VS2010开发环境、ArcGISDesktop10.0、AE开发组件

3.2实验任务

完成基于几何网络分析的最短路径查询功能,即实现通过在几何网络地图中指定起始点,能够查询经过起始点的最短路线,并能够通过缩放功能在地图窗口居中显示。

3.3实验步骤

3.3.1新建项目

选择\文件\新建项目,如图选择项目类型中VisualC#,再选择WindowsApplication,记为“FindShortPath”,点击确定。

3.3.2添加控件

3.3.3控件绑定

因为添加的控件只是单独存在,但是程序需要各控件间协同工作,因此要进行控件绑定。

3.3.4创建几何网络

1.在ArcCataLog中新建个人地理数据库—“甘地的个人地理数据库”,然后新建要素数据集“road”,接着,鼠标右键选择要素数据集“road”,选择“导入要素类”,导入需要创建几何网络的要素类“主要公路”,输出要素类的名字改为“road”,如下图所示:

2.鼠标右键选择要素数据集“road”,选择新建“几何网络”,则出现“新建几何网络”对话框,作如下图所示的一系列设置,最终得到几何网络“road_Net”。

至此,得到几何网络“road_Net”,如下图所示:

3.3.5代码实现最短路径分析

1 设置ToolStrip1

2 添加代码

privateIActiveViewm_ipActiveView;

privateIMapm_ipMap;//地图控件中地图

privateIGraphicsContainerpGC;//图形对象

privateboolclicked=false;

intclickedcount=0;

privatedoublem_dblPathCost=0;

privateIGeometricNetworkm_ipGeometricNetwork;

privateIPointCollectionm_ipPoints;//输入点集合

privateIPointToEIDm_ipPointToEID;

privateIEnumNetEIDm_ipEnumNetEID_Junctions;

privateIEnumNetEIDm_ipEnumNetEID_Edges;

privateIPolylinem_ipPolyline;

privateIMapControl3mapctrlMainMap=null;

privatevoidForm1_Load(objectsender,EventArgse)

{

//对象初始化

mapctrlMainMap=(IMapControl3)this.axMapControl1.Object;

m_ipActiveView=axMapControl1.ActiveView;

m_ipMap=m_ipActiveView.FocusMap;

clicked=false;

pGC=m_ipMapasIGraphicsContainer;

}

privatevoidFindpath_Click(objectsender,EventArgse)

{

mapctrlMainMap.CurrentTool=null;

//设置鼠标样式

axMapControl1.MousePointer=esriControlsMousePointer.esriPointerCrosshair;

if(axMapControl1.LayerCount==0)

{

MessageBox.Show("请先加载几何网络数据!

");

return;

}

m_ipActiveView=axMapControl1.ActiveView;

m_ipMap=m_ipActiveView.FocusMap;

clicked=false;

pGC=m_ipMapasIGraphicsContainer;

ILayeripLayer=m_ipMap.get_Layer(0);

IFeatureLayeripFeatureLayer=ipLayerasIFeatureLayer;

IFeatureDatasetipFDS=ipFeatureLayer.FeatureClass.FeatureDataset;

OpenFeatureDatasetNetwork(ipFDS);

clicked=true;

clickedcount=0;

pGC.DeleteAllElements();

}

privatevoidSolvePath_Click(objectsender,EventArgse)

{

axMapControl1.MousePointer=esriControlsMousePointer.esriPointerDefault;

if(SolvePathGan("Weight"))//先解析路径

{

IPolylineipPolyResult=PathPolyLine();//最后返回最短路径

clicked=false;

if(ipPolyResult.IsEmpty)

{

MessageBox.Show("没有路径可到!

!

");

}

else

{

IRgbColorcolor=newRgbColorClass();

color.Red=255;

color.Blue=64;

color.Green=128;

LineElementClasselement=newLineElementClass();

ILineSymbollinesymbol=newSimpleLineSymbolClass();

linesymbol.Color=colorasIColor;

linesymbol.Width=3;

element.Geometry=m_ipPolyline;

element.Symbol=linesymbol;

pGC.AddElement(element,0);

m_ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);

axMapControl1.FlashShape(element.Geometry);

MessageBox.Show("路径经过"+m_ipEnumNetEID_Edges.Count+"条线"+"\r\n"+"经过节点数为"+m_ipEnumNetEID_Junctions.Count+"\r\n"+"路线长度为"+m_ipPolyline.Length.ToString("#######.##")+"\r\n","几何路径信息");

}

}

}

//路径缩放功能

privatevoidSuoFang_Click(objectsender,EventArgse)

{

if(m_ipPolyline==null)

{

MessageBox.Show("当前没有执行路径查询!

请确认!

");

}

else

{

this.axMapControl1.Extent=m_ipPolyline.Envelope;

}

}

#region自定义路径查询函数

publicvoidOpenFeatureDatasetNetwork(IFeatureDatasetFeatureDataset)

{

CloseWorkspace();

if(!

InitializeNetworkAndMap(FeatureDataset))

Console.WriteLine("打开network出错");

}

//关闭工作空间

privatevoidCloseWorkspace()

{

m_ipGeometricNetwork=null;

m_ipPoints=null;

m_ipPointToEID=null;

m_ipEnumNetEID_Junctions=null;

m_ipEnumNetEID_Edges=null;

m_ipPolyline=null;

}

//初始化几何网络和地图

privateboolInitializeNetworkAndMap(IFeatureDatasetFeatureDataset)

{

IFeatureClassContaineripFeatureClassContainer;

IFeatureClassipFeatureClass;

IGeoDatasetipGeoDataset;

ILayeripLayer;

IFeatureLayeripFeatureLayer;

IEnvelopeipEnvelope,ipMaxEnvelope;

doubledblSearchTol;

INetworkCollectionipNetworkCollection=FeatureDatasetasINetworkCollection;

intcount=ipNetworkCollection.GeometricNetworkCount;

//获取第一个几何网络工作空间

m_ipGeometricNetwork=ipNetworkCollection.get_GeometricNetwork(0);

INetworkipNetwork=m_ipGeometricNetwork.Network;

if(m_ipMap!

=null)

{

ipFeatureClassContainer=m_ipGeometricNetworkasIFeatureClassContainer;

count=ipFeatureClassContainer.ClassCount;

for(inti=0;i

{

ipFeatureClass=ipFeatureClassContainer.get_Class(i);

ipFeatureLayer=newFeatureLayerClass();

ipFeatureLayer.FeatureClass=ipFeatureClass;

for(intj=0;j

{

if(m_ipMap.get_Layer(j).Name.ToUpper()==ipFeatureLayer.Name.ToUpper())

{

continue;

}

}

}

}

count=m_ipMap.LayerCount;

ipMaxEnvelope=newEnvelopeClass();

for(inti=0;i

{

ipLayer=m_ipMap.get_Layer(i);

ipFeatureLayer=ipLayerasIFeatureLayer;

ipGeoDataset=ipFeatureLayerasIGeoDataset;

ipEnvelope=ipGeoDataset.Extent;

ipMaxEnvelope.Union(ipEnvelope);

}

m_ipPointToEID=newPointToEIDClass();

m_ipPointToEID.SourceMap=m_ipMap;

m_ipPointToEID.GeometricNetwork=m_ipGeometricNetwork;

doubledblWidth=ipMaxEnvelope.Width;

doubledblHeight=ipMaxEnvelope.Height;

if(dblWidth>dblHeight)

dblSearchTol=dblWidth/100;

else

dblSearchTol=dblHeight/100;

m_ipPointToEID.SnapTolerance=dblSearchTol;

returntrue;

}

//返回路径的几何体

publicIPolylinePathPolyLine()

{

IEIDInfoipEIDInfo;

IGeometryipGeometry;

if(m_ipPolyline!

=null)returnm_ipPolyline;

m_ipPolyline=newPolylineClass();

IGeometryCollectionipNewGeometryColl=m_ipPolylineasIGeometryCollection;//引用传递

ISpatialReferenceipSpatialReference=m_ipMap.SpatialReference;

IEIDHelperipEIDHelper=newEIDHelper();

ipEIDHelper.GeometricNetwork=m_ipGeometricNetwork;

ipEIDHelper.OutputSpatialReference=ipSpatialReference;

ipEIDHelper.ReturnGeometries=true;

IEnumEIDInfoipEnumEIDInfo=ipEIDHelper.CreateEnumEIDInfo(m_ipEnumNetEID_Edges);

intcount=ipEnumEIDInfo.Count;

ipEnumEIDInfo.Reset();

for(inti=0;i

{

string[]info;

info=newstring[count];

ipEIDInfo=ipEnumEIDInfo.Next();

ipGeometry=ipEIDInfo.Geometry;

ipNewGeometryColl.AddGeometryCollection(ipGeometryasIGeometryCollection);

info[i]=m_ipPolyline.Length.ToString();

}

returnm_ipPolyline;

}

 

publicboolSolvePathGan(stringWeightName)

{

try

{

intintJunctionUserClassID;

intintJunctionUserID;

intintJunctionUserSubID;

intintJunctionID;

IPointipFoundJunctionPoint;

ITraceFlowSolverGENipTraceFlowSolver=newTraceFlowSolver()asITraceFlowSolverGEN;

INetSolveripNetSolver=ipTraceFlowSolverasINetSolver;

if(m_ipGeometricNetwork==null)

{

returnfalse;

}

INetworkipNetwork=m_ipGeometricNetwork.Network;

ipNetSolver.SourceNetwork=ipNetwork;

INetElementsipNetElements=ipNetworkasINetElements;

if(m_ipPoints==null)

{MessageBox.Show("请选择点!

!

");returnfalse;}

intintCount=m_ipPoints.PointCount;//这里的points有值吗?

////定义一个边线旗数组

//*********最近点***************//////////

IJunctionFlag[]pJunctionFlagList=newJunctionFlag[intCount];

for(inti=0;i

{

INetFlagipNetFlag=newJunctionFlag()asINetFlag;

IPointipJunctionPoint=m_ipPoints.get_Point(i);

//查找输入点的最近的网络点

m_ipPointToEID.GetNearestJunction(ipJunctionPoint,outintJunctionID,outipFoundJunctionPoint);

ipNetElements.QueryIDs(intJunctionID,esriElementType.esriETJunction,outintJunctionUserClassID,outintJunctionUserID,outintJunctionUserSubID);

ipNetFlag.UserClassID=intJunctionUserClassID;

ipNetFlag.UserID=intJunctionUserID;

ipNetFlag.UserSubID=intJunctionUserSubID;

IJunctionFlagpTemp=(IJunctionFlag)(ipNetFlagasIJunctionFlag);

pJunctionFlagList[i]=pTemp;

}

ipTraceFlowSolver.PutJunctionOrigins(refpJunctionFlagList);

INetSchemaipNetSchema=ipNetworkasINetSchema;

INetWeightipNetWeight=ipNetSchema.get_WeightByName(WeightName);

INetSolverWeightsipNetSolverWeights=ipTraceFlowSolverasINetSolverWeights;

ipNetSolverWeights.FromToEdgeWeight=ipNetWeight;//开始边线的权重

ipNetSolverWeights.ToFromEdgeWeight=ipNetWeight;//终止边线的权重

object[]vaRes=newobject[intCount-1];

//通过findpath得到边线和交汇点的集合

ipTraceFlowSolver.FindPath(esriFlowMethod.esriFMConnected,

esriShortestPathObjFn.esriSPObjFnMinSum,outm_ipEnumNetEID_Junctions,outm_ipEnumNetEID_Edges,intCount-1,refvaRes);

m_dblPathCost=0;

for(inti=0;i

{

doublem_Va=(double)vaRes[i];

m_dblPathCost=m_dblPathCost+m_Va;

}

m_ipPolyline=null;

returntrue;

}

catch(Exceptionex)

{

Console.WriteLine(ex.Message);returnfalse;

}

#endregion

 

}

privatevoidaxMapControl1_OnMouseDown(objectsender,IMapControlEvents2_OnMouseDownEvente)

{

if(clicked!

=true)

return;

IPointipNew;

if(m_ipPoints==null)

{

m_ipPoints=newMultipoint();

}

ipNew=m_ipActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);

objecto=Type.Missing;

m_ipPoints.AddPoint(ipNew,refo,refo);

IElementelement;

ITextElementtextelement=newTextElementClass();

element=textelementasIElement;

clickedcount++;

textelement.Text=clickedcount.ToString();

element.Geometry=m_ipActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);

pGC.AddElement(element,0);

m_ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);

}

 

3.4实验结果

在得到的窗口中加载“甘地的个人地理数据库”(在压缩包中有)中的几何网络“road_Net”,将几何网络地图加载到地图显示窗口中,如下图所示:

点击图标

添加起始点,效果如下图:

然后点击图标

,计算最短路径,效果如下图:

 

最后点击图标

得到最短路径的缩

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

当前位置:首页 > 高等教育 > 工学

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

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