废话不多说,如题。
(1)数据获取及建立数据集
不同类型的空间分析需要不同类型的数据,对于最短路径分析,需要的数据是网络数据集。具体过程如下:打开一个shapefile格式的polyline图层,这里采用道路中心线图层(道路中心线.shp数据);
将“道路中心线.shp”数据转换为网络数据集:在ArcCatalog中,图层右键,选择New NetWork Dataset;
通过对Network Dataset命名,设定数据源,创建连通性,指定高程数据,指定转弯数据源,定义属性,确定方向规则。即可生成的网络数据集包括“道路中心线_ND”网络数据集和“道路中心线_ND-Junctions”点状shp数据。
在创建的过程中需要注意数据的字段是否有设置网络阻力信息的属性值:距离、旅行时间等等。确定方向规则貌似需要很多额外的字段,如果没有最后一步的direction是灰的,我照着示例数据(那个旧金山的)添加了几个类型为TEXT的字段,然后为空,即可。
(2)最短路径建模及发布
在ArcGIS中创建一个新的工具箱,命名为Routing,并在工具箱的基础上新建模型,命名为ShortesRoute。
对于最短路径模型,需要考虑的输入参数有三个:网络数据集、位置点以及障碍点,其中,网络数据集在运行前已经指定,不用动态输入,位置点和障碍点需要动态数据,位置点必须大于等于两个。
建模过程:
A、Network Analyst Tools->Analysis->Make Route Layer,在输入网络集中选择之前声称的道路中心线_nd,选择输出的图层名为Route
B、Network Analyst Tools->Analysis->Add Locations为模型添加两个输入点:位置点和障碍点,分别设置Sub Layer中设置为Stops和Barriers。
C、Network Analyst Tools->Analysis->Solve 添加Solve(处理)节点;
D、Data Management Tools->General-> Select Date 以及Network Analyst Tools->Analysis->Directions添加输出结果节点,一种是以xml形式来对路径进行描述,一种是直接生成附加图层,生成的最终模型如下图:
加图有些麻烦,就放个成图吧。
为了方便地图的显示和处理,将地图和gp文档相分离,将道路中心线_ND与制作的模型保存为一个地图文档,将其他的数据保存为一个地图文档:“XXXXGP.mxd”和“XXXX.mxd”。
将“XXXX.mxd”以MapServices的形式发布,将“XXXXGP.mxd”以GPServices的形式发布。
(3)代码实现部分
A、地图服务地址:
http://localhost/arcgis/rest/services/XXXX/MapServer
B、GP服务地址:
http://localhost/arcgis/rest/services/XXXXGP/GPServer/ShortestRoute
C、存放位置点和障碍点的数据集:
locaFS = new FeatureSet();
barrFS = new FeatureSet();
D、最终的图层显示图层:
shortestGraLayer = map1.Layers["ShortestRouts"] as GraphicsLayer;
E、鼠标点击添加位置点和障碍点:
private void map1_MouseClick(object sender, Map.MouseEventArgs e)
{
Graphic graphic;
if (_pointType == pointType.location)
{
graphic = new Graphic()
{
Symbol = LayoutRoot.Resources["GreenMarkerSymbol"] as Symbol,
Geometry = e.MapPoint,
};
locaFS.Features.Add(graphic);
}
else if (_pointType == pointType.barrier)
{
graphic = new Graphic()
{
Symbol = LayoutRoot.Resources["RedMarkerSymbol"] as Symbol,
Geometry = e.MapPoint,
};
barrFS.Features.Add(graphic);
}
else
{
return;
}
shortestGraLayer.Graphics.Add(graphic);
}
F、最短路径分析执行GP服务:
shortestRoutGP = new Geoprocessor("http://localhost/arcgis/rest/services/XXXXGP /GPServer/ShortestRoute");
shortestRoutGP.ExecuteCompleted += new EventHandler<GPExecuteCompleteEventArgs>(shortestRoutGP_ExecuteCompleted);
shortestRoutGP.Failed += new EventHandler<TaskFailedEventArgs>(shortestRoutGP_Failed);
shortestRoutGP.ExecuteAsync(parameters);
void shortestRoutGP_ExecuteCompleted(object sender, GPExecuteCompleteEventArgs e)
{
//shortestGraLayer.Graphics.Clear();
foreach (GPParameter parameter in e.Results.OutParameters)
{
if (parameter is GPFeatureRecordSetLayer)
{
GPFeatureRecordSetLayer gpLayer = parameter as GPFeatureRecordSetLayer;
Graphic graphic = new Graphic()
{
Symbol = LayoutRoot.Resources["BlueLineSymbol"] as Symbol,
Geometry = gpLayer.FeatureSet.Features[0].Geometry,
};
shortestGraLayer.Graphics.Add(graphic);
}
}
parameters.Clear();
}
具体细节不累述,核心代码就这些啦。