zoukankan      html  css  js  c++  java
  • arcserver中最短路径分析与障碍点的设置

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;
    using ESRI.ArcGIS.ADF.ArcGISServer;
    using ESRI.ArcGIS.ADF.Web.UI.WebControls;
    using System.Collections.Specialized;
    using System.Collections;
    /// <summary>
    /// findBarrierPath 的摘要说明
    /// </summary>
    public class findBarrierPath2
    {
     public findBarrierPath2()                                    
     {
      //
      // TODO: 在此处添加构造函数逻辑
      //
     }
         ESRI.ArcGIS.ADF.Web.UI.WebControls.Map Map1 = new ESRI.ArcGIS.ADF.Web.UI.WebControls.Map();

        string sourceLayername = "";
      
        public void doFindPath(string name1, string name2,ESRI.ArcGIS.ADF.Web.UI.WebControls.Map mapcontrl)
        {
            Map1 = mapcontrl;
            sourceLayername =(string) Map1.Page.Session["SourceLayer"];
            //ags的服务器名
            string SERVER_NAME = "cinasoft-yfs";
      
            //ags里发布的Map Service名
            string ROUTE_SERVICE_NAME = "NDTest2";
            //创建NAServerProxy
           ESRI.ArcGIS.ADF.ArcGISServer.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;
                //不返回地图
                routeParams.ReturnMap = false;
                //返回RouteGeometries
                routeParams.ReturnRouteGeometries = true;
                routeParams.ReturnStops = true;
                routeParams.ReturnDirections = true;

                //设置起点PropertySet参数
                PointN point = QueryPoint(name1);
                PropertySet propSet = new PropertySet();
                PropertySetProperty[] propSetProperty_new = new PropertySetProperty[2];
                propSet.PropertyArray = propSetProperty_new;

                PropertySetProperty propSetProperty = new PropertySetProperty();
                propSetProperty.Key = "Shape";
                propSetProperty.Value = point;

                PropertySetProperty propSetProperty2 = new PropertySetProperty();
                propSetProperty2.Key = "Name";
                propSetProperty2.Value = name1;

                propSet.PropertyArray[0] = propSetProperty;
                propSet.PropertyArray[1] = propSetProperty2;

                //设置终点PropertySet参数
                PointN point2 = QueryPoint(name2);
                //新建propertyset及PropertySetProperty数组
                PropertySet propSet2 = new PropertySet();
                PropertySetProperty[] propSetProperty_new2 = new PropertySetProperty[2];
                propSet2.PropertyArray = propSetProperty_new2;
                //设置propSet结构
                PropertySetProperty propSetProperty3 = new PropertySetProperty();
                propSetProperty3.Key = "Shape";
                propSetProperty3.Value = point2;
                PropertySetProperty propSetProperty4 = new PropertySetProperty();
                propSetProperty4.Key = "Name";
                propSetProperty4.Value = name2;

                propSet2.PropertyArray[0] = propSetProperty3;
                propSet2.PropertyArray[1] = propSetProperty4;

                //设置终点PropertySet参数
                setBarriers2 setbar = new setBarriers2();
                PointN[] pntArray = setbar.getPoint();
                PropertySet[] prosetBarriers = new PropertySet[20];
               
                for (int i = 0; i < pntArray.Length; i++)
                {
                  
                    PointN point3 = pntArray[i];

                    //新建propertyset及PropertySetProperty数组
                    PropertySet propSet3 = new PropertySet();
                    PropertySetProperty[] propSetProperty_new3 = new PropertySetProperty[1];
                    propSet3.PropertyArray = propSetProperty_new3;
                    //设置propSet结构
                    PropertySetProperty propSetProperty5= new PropertySetProperty();
                    propSetProperty5.Key = "Shape";
                    propSetProperty5.Value = point3;
                    PropertySetProperty propSetProperty6 = new PropertySetProperty();
                    propSetProperty4.Key = "Name";
                    propSetProperty4.Value = "b";

                    propSet3.PropertyArray[0] = propSetProperty5;


                    //设置障碍
                    prosetBarriers[i] = propSet3;
                 
                }
            
                ////新建propertyset及PropertySetProperty数组
                //PropertySet propSet3 = new PropertySet();
                //PropertySetProperty[] propSetProperty_new3 = new PropertySetProperty[1];
                //propSet3.PropertyArray = propSetProperty_new3;
                ////设置propSet结构
                //PropertySetProperty propSetProperty5 = new PropertySetProperty();
                //propSetProperty5.Key = "Shape";
                //propSetProperty5.Value = point3;
                //PropertySetProperty propSetProperty6 = new PropertySetProperty();
                //propSetProperty4.Key = "Name";
                //propSetProperty4.Value = "b";
                //PropertySet[] prosetBarriers = new PropertySet[1];
                //propSet3.PropertyArray[0] = propSetProperty5;


                ////设置障碍
                //prosetBarriers[0] = propSet3;

                //设置Stops参数
                PropertySet[] propSets = new PropertySet[2];
                propSets[0] = propSet;
                propSets[1] = propSet2;
                NAServerPropertySets StopsPropSets = new NAServerPropertySets();
                StopsPropSets.PropertySets = propSets;

                //PropertySet[] prosetBarriers = new PropertySet[1];
                ////设置障碍
                //prosetBarriers[0] = propSet3;
                NAServerPropertySets barriersPropSets = new NAServerPropertySets();
                barriersPropSets.PropertySets = prosetBarriers;

                routeParams.Stops = StopsPropSets;
                routeParams.Barriers=barriersPropSets;
                NAServerSolverResults solverResults;
                solverParams = routeParams as NAServerSolverParams;
                //       Response.Write("<script language='javascript' type='text/javascript'>alert(' HELL')</script>");
                try
                {
                    //进行分析
                    solverResults = naServerProxy.Solve(solverParams);
                    NAServerRouteResults RouteSolverResults = solverResults as NAServerRouteResults;
                    //显示分析结果
                    ShowResults(solverResults);
                    //释放naServerProxy
                    naServerProxy.Dispose();
                }
                catch (Exception e)
                {
                    //释放naServerProxy
                    naServerProxy.Dispose();
                    //   Response.Write("An error has occurred Mesage=" + e.Message);
                    //    Session["error"] = e.Message;
                    //   Response.Write("<script language='javascript' type='text/javascript'>alert('" + e.Message +"' )</script>");

                }

            }
        }

        public void ShowResults(NAServerSolverResults solverResults)
        {
            NAServerRouteResults RouteSolverResults = solverResults as NAServerRouteResults;
            //开始点终点路径显示
            AddRoutesAndStops(RouteSolverResults);
            //路径区域全屏显示
            PolylineN polylineN = RouteSolverResults.RouteGeometries[0] as PolylineN;
            EnvelopeN envelopeN = polylineN.Extent as EnvelopeN;
            double width = envelopeN.XMax - envelopeN.XMin;
            double height = envelopeN.YMax - envelopeN.YMin;
            double fivePercent;
            if (width > height)
            {
                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;
            Map1.Extent = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.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 = 3;
            sls.Color = System.Drawing.Color.Red;
            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 == "NDMetro")
                {
                    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);

                        //进行单层分析
                        //取得想要做路径分析的图层的图层
                        int layer_index = 0;
                        for (int i = 0; i < lnames.Length; i++)
                        {
                            if (lnames[i] == sourceLayername)
                            {
                                //if (lids[i] is string)
                                //{
                                //    if (!int.TryParse((string)lids[i], out layer_index))
                                //    {
                                //        layer_index = i;
                                //    }
                                //}
                                //else
                                layer_index = i;
                                break;
                            }
                        }
                        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();
                        //对所有的图层进行分析
                        for (int i = 0; i < lnames.Length; i++)
                        {
                            dt = qfunc.Query(null, lids[i], spatialfilter);
                            if (dt.Rows.Count!=0)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            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;
        }
        private PropertySet GeocodeAddress()
        {
            PropertySet propSet = new PropertySet() ;
           // // PointN pnt=QueryPoint(name);
           // setBarriers setbar = new setBarriers();
           // PointN pnt = setbar.getPoint();
           // PropertySetProperty[] propSetProperty_new = new PropertySetProperty[1];
           // propSet.PropertyArray[0] = CreatePropertySetProperty("Shape", pnt);
           //// propSet.PropertyArray[1] = CreatePropertySetProperty("Name", "barriers");
           // propSet.PropertyArray = propSetProperty_new;

            return propSet;
        }
        private PropertySetProperty CreatePropertySetProperty(string key, object value)
        {
            PropertySetProperty propSetProperty = new PropertySetProperty();
            propSetProperty.Key = key;
            propSetProperty.Value = value;
            return propSetProperty;
        }
    }
    点击获取障碍点

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Collections;

    using ESRI.ArcGIS.ADF.Web.UI.WebControls;
    using ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools;
    using ESRI.ArcGIS.ADF.ArcGISServer;
    using ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer;
    using ESRI.ArcGIS.ADF.Web.DataSources;
    /// <summary>
    /// setBarriers 的摘要说明
    /// </summary>
    public class setBarriers2 : IMapServerToolAction
    {

        //static double x = 0;
        //static double y = 0;

        ESRI.ArcGIS.ADF.Web.Geometry.Point adfPoint = new ESRI.ArcGIS.ADF.Web.Geometry.Point();
        //  ArrayList pnt = new ArrayList();
        //用于存储在地图上设置的临时障碍点
        static PointN[] pnt = new PointN[20];
        //临时障碍点的索引
        int i = 0;
        public setBarriers2()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

        public PointN[] getPoint()
        {

            //PointN pnt = new PointN();
            //pnt.X = x;
            //pnt.Y = y;
            return pnt;
        }
        public void ServerAction(ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs args)
        {

            //获取map控件
            ESRI.ArcGIS.ADF.Web.UI.WebControls.Map adfMap = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)args.Control;
            ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality IFun = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)adfMap.GetFunctionality(1);

            ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality adfGraphicsMapFunctionality = null;
            if (args is PointEventArgs)
            {
                //转成点
                PointEventArgs pointEventArgs = (PointEventArgs)args;
                //屏幕点

                System.Drawing.Point screenPoint = pointEventArgs.ScreenPoint;
                //  adfPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenPoint.X, screenPoint.Y, adfMap.Extent, IFun.DisplaySettings.ImageDescriptor.Width, IFun.DisplaySettings.ImageDescriptor.Height);
                adfPoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenPoint.X, screenPoint.Y, adfMap.Extent, (int)adfMap.Width.Value, (int)adfMap.Height.Value);

                pnt[i] = new PointN();
                pnt[i].X = adfPoint.X;
                pnt[i].Y = adfPoint.Y;
                //x = adfPoint.X;
                //y = adfPoint.Y;

                //MapFunctionality
                foreach (IMapFunctionality mapFunctionality in adfMap.GetFunctionalities())
                {
                    //当Resource为ADFGraphicsResource,ADFGraphicsResource为GraphicsLayer,保存在内存中用显示临时图层
                    if (mapFunctionality.Resource.Name == "pathLayer")
                    {
                        adfGraphicsMapFunctionality = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality)mapFunctionality;
                        break;
                    }
                }
                //从adfGraphicsMapFunctionality获取名为Element Graphics的DataTable
                //ElementGraphicsLayers通常用来显示图形元素,例如显示Map中被选择的图形元素。图层并不用来存储属性,而可以存储不同的图形类型。
                ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer elementGraphicsLayer = null;
                foreach (System.Data.DataTable dataTable in adfGraphicsMapFunctionality.GraphicsDataSet.Tables)
                {
                    if (dataTable.TableName == "Element Graphics")
                    {
                        elementGraphicsLayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dataTable;
                        break;
                    }
                }
                //如果名为Element Graphics的DataTable为null,就新建Element Graphics DataTable添加到adfGraphicsMapFunctionality.GraphicsDataSet中,同时刷新Toc1显示
                if (elementGraphicsLayer == null)
                {
                    elementGraphicsLayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();
                    elementGraphicsLayer.TableName = "Element Graphics";
                    adfGraphicsMapFunctionality.GraphicsDataSet.Tables.Add(elementGraphicsLayer);

                }
                //定义标点样式
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol simpleMarkerSymol = new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                //   simpleMarkerSymol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star;
                simpleMarkerSymol.Color = System.Drawing.Color.Green;
                simpleMarkerSymol.Width = 10;

                //定义标点选中样式
                ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol simpleSelectedMarkerSymbol = new ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol();
                simpleSelectedMarkerSymbol.Color = System.Drawing.Color.Yellow;
                simpleSelectedMarkerSymbol.Width = 12;
                simpleSelectedMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star;
                ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement graphicElement = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(adfPoint, simpleMarkerSymol, simpleSelectedMarkerSymbol);
                //把标点添加到elementGraphicsLayer
                elementGraphicsLayer.Add(graphicElement);
            }
            //刷新显示
            if (adfMap.ImageBlendingMode == ImageBlendingMode.WebTier)
            {
                //整个地图控件刷新
                adfMap.Refresh();
            }
            else
            {
                //只刷新部分Resource
                adfMap.RefreshResource(adfGraphicsMapFunctionality.Resource.Name);
            }

              i++;
        }
    }

  • 相关阅读:
    第六周上机任务
    java第四次作业
    第二次上机练习
    第三周作业
    第一次上机作业
    计算机1802刘思源
    第五次上机作业
    第六周作业
    第四次上机作业
    第三次上机作业
  • 原文地址:https://www.cnblogs.com/gisdream/p/1812900.html
Copyright © 2011-2022 走看看