GIS软件工程实习报告最短路径分析.docx
- 文档编号:8534745
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:596.31KB
GIS软件工程实习报告最短路径分析.docx
《GIS软件工程实习报告最短路径分析.docx》由会员分享,可在线阅读,更多相关《GIS软件工程实习报告最短路径分析.docx(18页珍藏版)》请在冰豆网上搜索。
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”,将几何网络地图加载到地图显示窗口中,如下图所示: 点击图标 添加起始点,效果如下图: 然后点击图标 ,计算最短路径,效果如下图: 最后点击图标 得到最短路径的缩
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GIS 软件工程 实习 报告 路径 分析