ArcGIS中最短路径的实现.docx
- 文档编号:6059319
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:9
- 大小:268.91KB
ArcGIS中最短路径的实现.docx
《ArcGIS中最短路径的实现.docx》由会员分享,可在线阅读,更多相关《ArcGIS中最短路径的实现.docx(9页珍藏版)》请在冰豆网上搜索。
ArcGIS中最短路径的实现
最短路径分析属于ArcGIS的网络分析范畴。
而ArcGIS的网络分析分为两类,分别是基于几何网络和网络数据集的网络分析。
它们都可以实现最短路径功能。
下面先介绍基于几何网络的最短路径分析的实现。
以后会陆续介绍基于网络数据集的最短路径分析以及这两种方法的区别。
几何网络是一种特殊的特征要素类,由一系列不同类别的点要素和线要素(可以度量并能图形表达)组成的,可在FeatureDataset下面创建,可进行图形与属性的编辑。
包括流向分析和追踪分析两大功能。
主要接口是ITraceFlowSolver。
我们先在一幅地图上做出一个几何网络才能进行最短路径分析。
下面是主要的一些步骤(ArcMap帮助中琐碎的说明有三四十项,被我省略很多):
1、打开ArcCatalog,连接到包含地图的文件夹。
2、在空白处,右键新建一个“PersonalGeoDatabase”。
3、在生成的PersonalGeoDatabase上右键新建一个featuredataset。
4、双击PersonalGeoDatabase进去,找到刚才new出的featuredataset,右键Import导入FeatureClass(Single),选择要建立几何网络的图层或者shape文件。
5、然后再右键新建一个GeometricNetwork,选择从已存在的图元中建立几何网络。
6、打开ArcMap,把刚才建立的“PersonalGeoDatabaseFeatureClass”添加到地图中,这样几何网络就建立好了。
这样我们就建立好一个几何网络了。
我们现在要通过编程来实现最短路径,用到的接口主要有INetworkCollection,IGeometricNetwork,IPointToEID,ITraceFlowSolverGEN(它实现了ITraceFlowSolver的接口),INetSchema,IEIDHelper等。
主要步骤如下:
1、获取几何网络工作空间
2、定义一个边线旗数组,把离点串最近的网络元素添加进数组
3、设置开始和结束边线的权重
4、进行路径分析
5、得到路径分析的结果
上次介绍了用几何网络实现的“最短路径”,这次用网络数据集实现真正的最短路径功能,跟上次一样,先处理下数据。
1、先打开ArcCatalog,连接到目标文件夹,假定该文件下有一个名为road的道路图层。
2、在road图层上右键新建一个网络数据集,并按照其默认设置直至完成。
3、打开该地图的工作空间,把刚才新建的网络数据集添加工作空间中。
4、在网络分析菜单中选择新建最近设施点。
这时在工作空间里,可以看到多了一个名为“ClosestFacility”的图层。
它下面还有4个子图层,名字分别为“Facilities”,“Incidents”,“Barriers”,“Routes”。
“Facilities”就是设施点图层,也就是目的点,“Incidents”的意思就是出发点,“Barriers”是障碍点,意思就是地图某条道路附近有一个障碍点,如果障碍点与道路距离在容限范围内,则表示此道路不通,“Routes”就是最终的结果。
这样我们编程实现最短路径的思路就出现了:
1、添加出发点。
2、添加目的点。
3、生成最优路径,获取结果。
图片看不清楚?
请点击这里查看原图(大图)。
这里的添加出发点或者目的点,是往“Facilities”或“Incidents”图层上添加元素。
获取结果也是从“Routes”中获取Polyline。
往“Facilities”或“Incidents”图层上添加元素用到的主要方法是INALocator的QueryLocationByPoint函数,生成路径主要接口是INASolver和它的Solve方法。
获取结果是按属性查找,因为“Routes”类其实就是一个图层类,只不过只是存在于内存。
1 CMapControlDefault m_map;
2 IPointCollectionPtrm_ipPointCollection;
3
4 ILayerPtripLayer=m_map.GetLayer(0); //网络数据集
5 INALayerPtripNaLayer=ipLayer;
6 if(NULL==ipNaLayer)
7 {
8 return;
9 }
10
11 INAContextPtripNaContext;
12 HRESULThr=ipNaLayer->get_Context(&ipNaContext);
13 INAClassLoaderPtripNAClassLoader(CLSID_NAClassLoader);
14 INALocatorPtripNALocator=NULL;
15 hr=ipNaContext->get_Locator(&ipNALocator);
16 ipNALocator->put_SnapToleranceUnits(esriMeters);
17 ipNALocator->put_SnapTolerance(200);
18 ipNaContext;
19 hr=ipNAClassLoader->putref_Locator(ipNALocator);
20
21 INamedSetPtripNamedSet=NULL;
22 ipNaContext->get_NAClasses(&ipNamedSet);
23
24 CStringszName="Facilities";
25 BSTRbstrName=szName.AllocSysString();
26 INAClassPtripNAFacilitiesClass=NULL;
27 hr=ipNamedSet->get_ItemByName(bstrName,(IUnknown**)&ipNAFacilitiesClass);
28 szName="Incidents";
29 bstrName=szName.AllocSysString();
30 INAClassPtripNAIncidentsClass=NULL;
31 hr=ipNamedSet->get_ItemByName(bstrName,(IUnknown**)&ipNAIncidentsClass);
32 szName="CFRoutes";
33 bstrName=szName.AllocSysString();
34 INAClassPtripNARoutesClass=NULL;
35 hr=ipNamedSet->get_ItemByName(bstrName,(IUnknown**)&ipNARoutesClass);
36
37 INALocationPtripNALocation1(CLSID_NALocation);
38 INALocationPtripNALocation2(CLSID_NALocation);
39 ipNAClassLoader->get_Locator(&ipNALocator);
40 IPointPtripBeginPoint(CLSID_Point);
41 m_ipPointCollection->get_Point(0,&ipBeginPoint);
42 IPointPtripEndPoint(CLSID_Point);
43 m_ipPointCollection->get_Point(1,&ipEndPoint);
44 IPointPtripPoint1(CLSID_Point);
45 IPointPtripPoint2(CLSID_Point);
46 doubledbLVal=0.0;
47 ipNALocator->QueryLocationByPoint(ipBeginPoint,&ipNALocation1,&ipPoint1,&dbLVal);
48 ipNALocator->QueryLocationByPoint(ipEndPoint,&ipNALocation2,&ipPoint2,&dbLVal);
49
50 INALocationObjectPtripNALocationObject=NULL;
51 IFeatureClassPtripFeatureClass=ipNAIncidentsClass;
52 IFeaturePtripFeature=NULL;
53 ipFeatureClass->CreateFeature(&ipFeature);
54 IRowSubtypesPtripRowSubtypes=ipFeature;
55 ipRowSubtypes->InitDefaultValues();
56 ipFeature->putref_Shape(ipBeginPoint);
57 ITablePtripTable=NULL;
58 ipFeature->get_Table(&ipTable);
59 longnIndex=0;
60 szName="Sequence";
61 bstrName=szName.AllocSysString();
62 ipTable->FindField(bstrName,&nIndex);
63 VARIANTvar_int;
64 var_int.intVal=1;
65 var_int.vt=VT_INT;
66 ipFeature->put_Value(nIndex,var_int);
67 szName="Name";
68 bstrName=szName.AllocSysString();
69 ipTable->FindField(bstrName,&nIndex);
70ipFeature->put_Value(nIndex,COleVariant("StartPoint"));
71 ipNALocationObject=ipFeature;
72 ipNALocationObject->put_NALocation(ipNALocation1);
73 ipFeature->Store();
74 IFieldsPtripFields(CLSID_Fields);
75 hr=ipTable->get_Fields(&ipFields);
76 longnFieldCount=0;
77 hr=ipFields->get_FieldCount(&nFieldCount);
78 for(intk=0;k 79 { 80 IFieldPtripField(CLSID_Field); 81 ipFields->get_Field(k,&ipField); 82 BSTRbstrFieldName; 83 ipField->get_Name(&bstrFieldName); 84 CStringszFieldName=bstrFieldName; 85 } 86 87 ipFeatureClass=ipNAFacilitiesClass; 88 ipFeatureClass->CreateFeature(&ipFeature); 89 ipRowSubtypes=ipFeature; 90 ipRowSubtypes->InitDefaultValues(); 91 ipFeature->putref_Shape(ipEndPoint); 92 ipTable=NULL; 93 ipFeature->get_Table(&ipTable); 94 nIndex=0; 95 szName="Sequence"; 96 bstrName=szName.AllocSysString(); 97 ipTable->FindField(bstrName,&nIndex); 98 var_int.intVal=2; 99 ipFeature->put_Value(nIndex,var_int); 100 szName="Name"; 101 bstrName=szName.AllocSysString(); 102 ipTable->FindField(bstrName,&nIndex); 103 ipFeature->put_Value(nIndex,COleVariant("EndPoint")); 104 ipNALocationObject=ipFeature; 105 ipNALocationObject->put_NALocation(ipNALocation2); 106 ipFeature->Store(); 107 108 INAClosestFacilitySolverPtripNACFSolver=NULL; 109 INASolverPtripNASolver=NULL; 110 ipNaContext->get_Solver(&ipNASolver); 111 112 IGPMessagesPtripGPM(CLSID_GPMessages); 113ITrackCancelPtripTrackCancel(CLSID_TrackCancel); 114 VARIANT_BOOLbIsPartialSolution; 115 ipNASolver->Solve(ipNaContext,ipGPM,ipTrackCancel,&bIsPartialSolution); 116 117 szName="CFRoutes"; 118 bstrName=szName.AllocSysString(); 119 ipNARoutesClass=NULL; 120 hr=ipNamedSet->get_ItemByName(bstrName,(IUnknown**)&ipNARoutesClass); 121 122 IFeatureClassPtripFeatureClassRoutes=ipNARoutesClass; 123 IFeatureCursorPtripFCursor=NULL; 124 IQueryFilterPtripQueryFilter(CLSID_QueryFilter); 125 CStringszQueryFilter("ObjectID>0"); 126BSTRbstr_QueryFilter=szQueryFilter.AllocSysString(); 127 ipQueryFilter->put_WhereClause(bstr_QueryFilter); 128 VARIANT_BOOLbCycle=VARIANT_FALSE; 129 try 130 { 131 ipFeatureClassRoutes->Search(ipQueryFilter,bCycle,&ipFCursor); 132 } 133 catch(CException*e) 134 { 135 CStringszErrorMsg; 136 e->GetErrorMessage(szErrorMsg.GetBuffer(MAX_PATH),MAX_PATH); 137 szErrorMsg.ReleaseBuffer(); 138 e->Delete(); 139 szErrorMsg+="n"; 140 OutputDebugStr(szErrorMsg); 141 } 142 catch() 143 { 144 OutputDebugStr("AnUnknownedExceptionOccurred! n"); 145 } 146 147 IFeaturePtripLineFeature=NULL; 148 hr=ipFCursor->NextFeature(&ipLineFeature); 149 while(ipLineFeature! =NULL) 150 { 151 IGeometryPtripGeometry=NULL; 152 IPolylinePtripPolyLine=NULL; 153 ipLineFeature->get_Shape(&ipGeometry); 154 esriGeometryTypetype; 155 ipGeometry->get_GeometryType(&type); 156 if(type==esriGeometryPolyline) 157 { 158 ipPolyLine=ipGeometry; 159 AddPolyline(ipPolyLine,4); 160 } 161hr=ipFCursor->NextFeature(&ipLineFeature); 162 } 163 IActiveViewPtripActiveView=NULL; 164 ipActiveView=m_map.GetActiveView(); 165 ipActiveView->Refresh();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ArcGIS 中最短 路径 实现