zoukankan      html  css  js  c++  java
  • 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及其二次开发,一起进步!
  • 相关阅读:
    config Doku wiki
    [转载]【python】ipython与python的区别
    数组和指针
    C++初始化数据成员
    RSA算法原理
    C++四种cast
    百度笔试准备2
    百度笔试准备1
    百度面试准备
    C++的空类中默认产生哪些类成员函数
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/1429208.html
Copyright © 2011-2022 走看看