• ArcGIS Server 9.3 最短路径分析


     

    要做网络分析,首先你的arcgis server需要具有network analysis 扩展模块的license。其次需要网络数据集,这个问题好解决,直接使用安装目录下的ArcGIS"DeveloperKit"SamplesNET"Server"data"SanFrancisco下的网络数据集将其发布,发布时记得勾上NetWork Anaysis 这项。

    然后新建一个网站,加上常用的mapmapresourcemanager,toolbar,toc 控件等,在mapresourcemanager中加入两个资源,一个是graphicslayer类型,命名为 pathLayer,一个为ArcGIS Server Local类型,命名为SanFrancisco,并加上两个textbox和一个按钮,布置好后如图1。

    首先在前台的代码如下:

    //函数search()即为所加按钮的onclick对应的函数。

    <script type="text/javascript">

         function search()

        {

            //起点的名称

           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 processCallbackError()

        {

           alert(66);

        }

     </script>

     

    后台还是callback机制来实现的。代码如下:

    public partial 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 e)

        {

            if (!IsPostBack)

                m_Callback = Page.ClientScript.GetCallbackEventReference(Page, "argument", "processCallbackResult", "context", "processCallbackError", true);

     

        }

     

     #region ICallbackEventHandler 成员

     

     public string GetCallbackResult()

     {

            return smapstring;

     }

     

     public void RaiseCallbackEvent(string eventArgument)

       {

            //请求字符串

            NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(eventArgument);

            if (keyValColl["Type"].ToString() == "findPath")

            {

                System.Text.StringBuilder sb = new System.Text.StringBuilder();

                //起点名称

                string Input1 = keyValColl["p1"];

                //终点名称

                string Input2 = keyValColl["p2"];

                //路径分析

                doFindPath(Input1, Input2);

            }

        }

    #endregion

     

    //查询最短路径的主体函数

        private void doFindPath(string name1, string name2)

        {

            //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;

                //不返回地图

                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 propSet2 = new PropertySet();

                PropertySetProperty[] propSetProperty_new2 = new PropertySetProperty[2];

                propSet2.PropertyArray = propSetProperty_new2;

     

                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;

     

                //设置Stops参数

                PropertySet[] propSets = new PropertySet[2];

                propSets[0] = propSet;

                propSets[1] = propSet2;

                NAServerPropertySets StopsPropSets = new NAServerPropertySets();

                StopsPropSets.PropertySets = propSets;

                routeParams.Stops = StopsPropSets;

                NAServerSolverResults solverResults;

                try

                {

                    //进行分析

                    solverResults = naServerProxy.Solve(solverParams);

                    NAServerRouteResults RouteSolverResults = solverResults as NAServerRouteResults;

                    //显示分析结果

                    ShowResults(solverResults);

                    //释放naServerProxy

                    naServerProxy.Dispose();

                }

                catch (Exception e)

                {

                    //释放naServerProxy

                    naServerProxy.Dispose();

                }

            }

            smapstring = Map1.CallbackResults.ToString();

        }

     

     //在地图上展示最短路径

        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 = 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;
        }
      最后效果如下图:

     

           

            

           

               

               

     

     

               

     

       

       

           

           

           

           

               

                   

     

                   

                       

                       

                    

                   

                   

                   

                   

                   

                   

                   

                   

                   

                   

                    

                   

                   

                   

                   

                   

                   

                   

                   

                   

                   

     

           

           

           

               

                   

           

               

     

           

     

    一起学习GIS及其二次开发,一起进步!
  • 相关阅读:
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
    UVA 11100 The Trip, 2007 (贪心)
    JXNU暑期选拔赛
    计蒜客---N的-2进制表示
    计蒜客---线段的总长
    计蒜客---最大质因数
    JustOj 2009: P1016 (dp)
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/1429208.html
Copyright © 2020-2023  润新知