GIS软件工程实习报告最短路径分析.docx
《GIS软件工程实习报告最短路径分析.docx》由会员分享,可在线阅读,更多相关《GIS软件工程实习报告最短路径分析.docx(15页珍藏版)》请在冰豆网上搜索。
GIS软件工程实习报告最短路径分析
AE开发之基于几网络的最短路径分析
1、实习目的
本次实习目的在于熟练掌握ArcGISEngine开发工具并能够通过C#语言在VS2010开发环境中完成查询几网络的最短路径分析的功能。
2、实习时间
2015年5月23日星期六
3、实习容
3.1实验环境
操作系统:
Windows2007
二次开发平台:
VS2010开发环境、ArcGISDesktoplO.O、AE开发组件
3.2实验任务
完成基于几网络分析的最短路径查询功能,即实现通过在几网络地图中指定起始点,能够查询经过起始点的最短路线,并能够通过缩放功能在地图窗口居中显示。
3.3实验步骤
331新建项目
选择文件新建项目,如图选择项目类型中VisualC#,再选择Windows
Application,记为“FindShortPath”点击确定。
.h£TFmgwmk4*|丰击适肓
百林N:
皿U-
覚巨]
甫手丘宙却碎左|
Tr
用&»建&舟Windows亦理户界龜
诟3Ct
WP丄庖冃世*
VirWjaiC#
str.-ftE?
忻fu刑Cf
ayr
CL*7if»'.Slf-
WuiJC<
Mr■如g无主
i'jF-冃户担-4J;
畑jHCt
押殳•MM住匚丄
VsuhJIC*
d■-docun-wril!
?
'wisiual"tud-3201iT,Prcije!
rt3
Fi『£旺卑詁
332添加控件
333控件绑定
因为添加的控件只是单独存在,但是程序需要各控件间协同工作,因此要进
行控件绑定
334创建几网络
1在ArcCataLog中新建个人地理数据库一“甘地的个人地理数据库”,然后新建要素数据集“road”,接着,鼠标右键选择要素数据集“road”,选择“导入要素类”,导入需要创建几网络的要素类“主要公路”,输出要素类的名字改为
road”,如下图所示:
'I旨it出益査
t:
Mfeenlhbini皿生tan炖惘:
謬、Lmtcrtlj^中国析竝3昊§
辰7
2.鼠标右键选择要素数据集“road”,选择新建“几网络”,贝U出现“新建几
网络”对话框,作如下图所示的一系列设置,最终得到几网络“road_Net
至此,得到几网络“road_Net”,如下图所示:
335代码实现最短路径分析
①设置ToolStripl
甘地一实习
②添加代码
privatelActiveViewm」pActiveView;
privateIMapm_ipMap;〃地图控件中地图
privateIGraphicsContainerpGC;〃图形对象
privateboolclicked=false;
intclickedcount=0;
privatedoublem_dblPathCost=0;
privateIGeometricNetworkm_ipGeometricNetwork;
privateIPointCollectionm」pPoints;〃输入点集合
privateIPointToEIDm_ipPointToEID;
privatelEnumNetEIDm_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=new
LineElementClass();
ILineSymbollinesymbol=new
SimpleLineSymbolClass();
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(IFeatureDataset
FeatureDataset)
{
IFeatureClassContaineripFeatureClassContainer;
IFeatureClassipFeatureClass;
IGeoDatasetipGeoDataset;
ILayeripLayer;
IFeatureLayeripFeatureLayer;
IEnvelopeipEnvelope,ipMaxEnvelope;
doubledblSearchTol;
INetworkCollectionipNetworkCollection=FeatureDataset
asINetworkCollection;
intcount=ipNetworkCollection.GeometricNetworkCount;
//获取第一个几网络工作空间
m_ipGeometricNetwork=
ipNetworkCollection.get_GeometricNetwork(0);
INetworkipNetwork=m_ipGeometricNetwork.Network;
if(m_ipMap!
=null)
ipFeatureClassContainer=m_ipGeometricNetworkas
IFeatureClassContainer;
count=ipFeatureClassContainer.ClassCount;for(inti=0;i