这个系列的最初完成是在网友的帮助下完成的,特别感谢Alex xu的无私帮助,后来因为偶然的原因,误删了,现在补充上!虽然现在自己这一年忙于其他的项目,不过对于AGS的开发,真的还是非常有感情的!
本文版权归小能所有,转载麻烦标明出处,谢谢! 同时写作过程中也参阅了大量其他网络文档,如果您觉得侵犯版权,请和我联系:chinazhousheng@gmail.com
前几天在群里面有朋友问我最短路径的事,他想实现一个可能分别在地图上取点设置起点与终点的功能,再计算最短路径的功能。由于最近很多事情,所以一直没有做,昨天花了一点时间,做了一下,其实还是一个状态保存的问题,其思路如下:
step1 :点击地图上的起点,获取起点的坐标,将其转换并保存至session 中
step2:获取终点坐标,判断session中是否有值,如果有,则获取起点
step3:计算最短路径(这在前面已经说过,稍微改变一下),显示在地图上
step4:清除session
大体思路就是这样,当然还有其他的思路,希望大家实现后共享,这次的代码很简单,我简单的发一点!
//获取屏幕点,并转换成Map点
ESRI.ArcGIS.ADF.Web.Geometry.Point pnt = new ESRI.ArcGIS.ADF.Web.Geometry.Point();
ESRI.ArcGIS.ADF.Web.UI.WebControls.PointEventArgs ptargs = null;
ptargs = (PointEventArgs)args;
pnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(ptargs.ScreenPoint.X, ptargs.ScreenPoint.Y, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);


if (System.Web.HttpContext.Current.Session["beg_point"]==null)

{
System.Web.HttpContext.Current.Session["beg_point"] = pnt;

}


else

{

try

{
// Get the NAServer

using (NAServerProxy naServer = NAServerProxy.Create(SERVER_NAME, ROUTE_SERVICE_NAME, null))

{

if (naServer == null)
throw (new System.Exception("Could not find the web service."));

// Get the NAServerSolverParams
string[] naLayers = naServer.GetNALayerNames(esriNAServerLayerType.esriNAServerRouteLayer);

NAServerSolverParams solverParams = naServer.GetSolverParameters(naLayers[0]) as NAServerSolverParams;

// Set the NAServerRouteParams
NAServerRouteParams routeParams = solverParams as NAServerRouteParams;
DateTime time;

routeParams.ReturnMap = false;
routeParams.ReturnRouteGeometries = true;
routeParams.ReturnStops = true;
routeParams.ReturnDirections = false;

// Geocode two addresses and create the stop network locations
NetAnalysis location = new NetAnalysis(mapctrl);

/**/////
PropertySet[] propSets = new PropertySet[2];
propSets[0] = GeocodeAddress(beg_point.X, beg_point.Y);//
propSets[1] = GeocodeAddress(pnt.X, pnt.Y);//

NAServerPropertySets StopsPropSets = new NAServerPropertySets();
StopsPropSets.PropertySets = propSets;

NAServerRouteParams routeParams1 = solverParams as NAServerRouteParams;
routeParams1.Stops = StopsPropSets;

/**//////
// Solve the Route
NAServerSolverResults solverResults;
solverResults = naServer.Solve(solverParams);

// Display results
location.OutputResults(solverResults);

}

}
catch (Exception exception)

{
//pnlDirectionSummary.Visible = false;
//lblDirections.Visible = false;
//lblTotalDistance.Visible = false;
//dataGridDirections.Visible = false;
lblError.Text = "An error has occurred Mesage = " + exception.Message;
}
private PropertySetProperty CreatePropertySetProperty(string key, object value)

{
PropertySetProperty propSetProperty = new PropertySetProperty();
propSetProperty.Key = key;
propSetProperty.Value = value;
return propSetProperty;
}



private PropertySet GeocodeAddress(double streetAddress_x, double streetAddress_y)

{

//寻找地理位置
PointN addr_point = new PointN() ;
addr_point.X = streetAddress_x;
addr_point.Y = streetAddress_y;
//新建propertyset及PropertySetProperty数组
PropertySet propSet = new PropertySet();
PropertySetProperty[] propSetProperty_new = new PropertySetProperty[2];
propSet.PropertyArray = propSetProperty_new;
//设置propSet结构
propSet.PropertyArray[0] = CreatePropertySetProperty("Shape", addr_point) as PropertySetProperty;
propSet.PropertyArray[1] = CreatePropertySetProperty("Name", "44") as PropertySetProperty;
return propSet;
}
当然,可以添加效果,比如点击起点后,在地图上画一个标志!下面是结果图
