要做网络分析,首先你的arcgis server需要具有network analysis 扩展模块的license。其次需要网络数据集,这个问题好解决,直接使用安装目录下的ArcGIS"DeveloperKit"SamplesNET"Server"data"SanFrancisco下的网络数据集将其发布,发布时记得勾上NetWork Anaysis 这项。
然后新建一个网站,加上常用的map,mapresourcemanager,toolbar,toc 控件等,在mapresourcemanager中加入两个资源,一个是graphicslayer类型,命名为 pathLayer,一个为ArcGIS Server Local类型,命名为SanFrancisco,并加上两个textbox和一个按钮,布置好后如图1。
首先在前台的代码如下:
//函数search()即为所加按钮的onclick对应的函数。
<scripttype="text/javascript">
function
{
//起点的名称
var v1=document.getElementById("Text1").value;
//终点的名称
var v2=document.getElementById("Text2").value;
var argument = "ControlID=Map1&ControlType=Map&Type=findPath&p1="+v1+"&p2="+v2;
var context = "Map";
<%= m_Callback %>;
}
function
{
alert(66);
}
</script>
后台还是callback机制来实现的。代码如下:
publicpartial class _Default : System.Web.UI.Page,ICallbackEventHandler
{
public string m_Callback = String.Empty;
public string smapstring = String.Empty;
protected void Page_Load(object sender, EventArgs
{
if
"argument", "processCallbackResult", "context", "processCallbackError", true);
}
#region ICallbackEventHandler 成员
public string
{
return
}
public void RaiseCallbackEvent(string
{
//请求字符串
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(eventArgument);
if (keyValColl["Type"].ToString() == "findPath")
{
StringBuilder sb = new System.Text.StringBuilder();
//起点名称
string Input1 = keyValColl["p1"];
//终点名称
string Input2 = keyValColl["p2"];
//路径分析
doFindPath(Input1, Input2);
}
}
#endregion
//查询最短路径的主体函数
private void doFindPath(string name1, string
{
//ags的服务器名
string SERVER_NAME = "ZHOUWEN";
//ags里发布的Map Service名
string ROUTE_SERVICE_NAME = "SanFrancisco";
//创建NAServerProxy
NAServerProxy naServerProxy = NAServerProxy.Create(SERVER_NAME, ROUTE_SERVICE_NAME, null);
if (naServerProxy == null)
{
naServerProxy.Dispose();
throw (new System.Exception("Error"));
}
else
{
//获取网络层的名称
string[] nLayers = naServerProxy.GetNALayerNames(esriNAServerLayerType.esriNAServerRouteLayer);
NAServerSolverParams solverParams = naServerProxy.GetSolverParameters(nLayers[0]) as NAServerSolverParams;
//路由分析参数
NAServerRouteParams routeParams = solverParams as NAServerRouteParams;
//不返回地图
false;
//返回RouteGeometries
true;
true;
true;
//设置起点PropertySet参数
PointN
PropertySet propSet = new PropertySet();
PropertySetProperty[] propSetProperty_new = new PropertySetProperty[2];
propSet.PropertyArray = propSetProperty_new;
PropertySetProperty propSetProperty = new PropertySetProperty();
"Shape";
propSetProperty.Value = point;
PropertySetProperty propSetProperty2 = new PropertySetProperty();
"Name";
propSetProperty2.Value = name1;
propSet.PropertyArray[0] = propSetProperty;
propSet.PropertyArray[1] = propSetProperty2;
//设置终点PropertySet参数
PointN
PropertySet propSet2 = new PropertySet();
PropertySetProperty[] propSetProperty_new2 = new PropertySetProperty[2];
propSet2.PropertyArray = propSetProperty_new2;
PropertySetProperty propSetProperty3 = new PropertySetProperty();
"Shape";
propSetProperty3.Value = point2;
PropertySetProperty propSetProperty4 = new PropertySetProperty();
"Name";
propSetProperty4.Value = name2;
propSet2.PropertyArray[0] = propSetProperty3;
propSet2.PropertyArray[1] = propSetProperty4;
//设置Stops参数
PropertySet[] propSets = new PropertySet[2];
propSets[0] = propSet;
propSets[1] = propSet2;
NAServerPropertySets StopsPropSets = new NAServerPropertySets();
StopsPropSets.PropertySets = propSets;
routeParams.Stops = StopsPropSets;
NAServerSolverResults
try
{
//进行分析
solverResults = naServerProxy.Solve(solverParams);
NAServerRouteResults RouteSolverResults = solverResults as NAServerRouteResults;
//显示分析结果
ShowResults(solverResults);
//释放naServerProxy
naServerProxy.Dispose();
}
catch (Exception
{
//释放naServerProxy
naServerProxy.Dispose();
}
}
smapstring = Map1.CallbackResults.ToString();
}
//在地图上展示最短路径
public void ShowResults(NAServerSolverResults
{
NAServerRouteResults RouteSolverResults = solverResults as NAServerRouteResults;
//开始点终点路径显示
AddRoutesAndStops(RouteSolverResults);
//路径区域全屏显示
PolylineN polylineN = RouteSolverResults.RouteGeometries[0] as PolylineN;
EnvelopeN envelopeN = polylineN.Extent as EnvelopeN;
double
double
double
if
{
fivePercent = width * .05;
}
else
{
fivePercent = height * .05;
}
envelopeN.XMin = envelopeN.XMin - fivePercent;
envelopeN.YMin = envelopeN.YMin - fivePercent;
envelopeN.XMax = envelopeN.XMax + fivePercent;
envelopeN.YMax = envelopeN.YMax + fivePercent;
Converter.ToAdfEnvelope(envelopeN);
Map1.Refresh();
}
private void AddRoutesAndStops(NAServerRouteResults rResult)
{
//分析结果路径
Polyline[] lines = rResult.RouteGeometries;
RecordSet stops = rResult.Stops;
//获取Buffer的MapFunctionality
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality mapFunct = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)Map1.GetFunctionality("pathLayer");
//获取Buffer的MapResource
ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)mapFunct.Resource;
//把buffer结果范围进行显示
ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;
//查找ElementGraphicsLayer在Buffer中
foreach (System.Data.DataTable dt in gResource.Graphics.Tables)
{
if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)
{
glayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;
break;
}
}
//如果Buffer中没有ElementGraphicsLayer就新增加一个ElementGraphicsLayer
if (glayer == null)
{
glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
gResource.Graphics.Tables.Add(glayer);
}
//清除ElementGraphicsLayer中的内容
glayer.Clear();
ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)ESRI.ArcGIS.ADF.Web.DataSources.
ArcGISServer.Converter.ToAdfPolyline((PolylineN)lines[0]);
//设置点显示
ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Red);
//设置透明度
ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleLineSymbol sls = new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleLineSymbol();
sls.Width = 5;
sls.Color = System.Drawing.Color.Blue;
sls.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.LineType.Dash;
sls.Transparency = 50;
ge.Symbol = sls;
// ge.Symbol.Transparency = 50;
//添加到Buffer中进行显示
glayer.Add(ge);
Record[] stopRecords = stops.Records;
int stopCount = stopRecords.Length;
for (int iStop = 0; iStop < stopCount; iStop++)
{
ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom2 = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.
ToAdfPoint(stopRecords[iStop].Values[1] as PointN);
//设置点显示
ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge2 = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom2, System.Drawing.Color.Red);
//设置透明度
ge2.Symbol.Transparency = 50;
//添加到Buffer中进行显示
glayer.Add(ge2);
}
}
//按名称查找点
private PointN QueryPoint(string name)
{
PointN point = new PointN();
IEnumerable func_enum = Map1.GetFunctionalities();
DataTable dt = null;
foreach (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality gisfunctionality in func_enum)
{
if (gisfunctionality.Resource.Name == "SanFrancisco")
{
bool supported = false;
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = gisfunctionality.Resource;
supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
if (supported)
{
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
string[] lids;
string[] lnames;
qfunc.GetQueryableLayers(null, out lids, out lnames);
ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
spatialfilter.ReturnADFGeometries = false;
spatialfilter.MaxRecords = 1;
spatialfilter.WhereClause = "NAME LIKE '" + name + "'";
spatialfilter.Geometry = Map1.GetFullExtent();
dt = qfunc.Query(null, lids[3], spatialfilter);
//lnames名称
//[0]: "Stops"
//[1]: "Barriers"
//[2]: "Routes"
//[3]: "Facilities"
//[4]: "Incidents"
//[5]: "Barriers"
//[6]: "Routes"
//[7]: "Facilities"
//[8]: "Barriers"
//[9]: "Lines"
//[10]: "Polygons"
//[11]: "Hospital"
//[12]: "bayareamultiroutestops"
//[13]: "bayareaincident"
//[14]: "bayareafacilities"
//[15]: "HwySt"
//[16]: "MajorSt"
//[17]: "Streets"
//[18]: "Lakes"
//[19]: "Parks"
//[20]: "ShoreLine"
}
}
}
DataRowCollection drs = dt.Rows;
int shpind = -1;
for (int i = 0; i < dt.Columns.Count; i++)
{
if (dt.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))
{
shpind = i;
break;
}
}
foreach (DataRow dr in drs)
{
ESRI.ArcGIS.ADF.Web.Geometry.Point geom = (ESRI.ArcGIS.ADF.Web.Geometry.Point)dr[shpind];
//ESRI.ArcGIS.ADF.Web.Geometry.PointCollection points = geom.Points;
point.X = geom.X;
point.Y = geom.Y;
}
return point;
}
最后效果如下图: