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”,将几何网络地图加载到地图显示窗口中,如下图所示:
点击图标
添加起始点,效果如下图:
然后点击图标
,计算最短路径,效果如下图:
最后点击图标
得到最短路径的缩放,效果如下图:
这样就完成了最短路径的查询分析和显示的功能。
4、实习总结
在整个过程中所出现的问题较多,体现出个人基础的不足,程序的出错有时候出现在标点符号以及英文字母的大小写上面等等问题,这些都说明了不熟练的问题。
因此,二次开发的一个最重要的是勤于练习敲代码,能够对着书本的代码敲二不会出现一些不该犯的错误,然后进行下一步的提高,一步一个踏实的脚印,打下一个坚实的基础是非常重要。
另一个重要的体会就是学会自己去查询资料,尽可能的通过自己的能力解决问题,实在不能解决的在向老师请教,这是在