ArcGIS Server中缓冲区分析的实现(点)

 

首先来看一下实现点缓冲区分析的效果图吧!

 

 

  

 

 

 

实现步骤如下:

1、 分别添加html控件:SelectText,两个 Button,;ID分别是selLayertxtDistancebtnDistanceClearBuffer。例外还添加一个DIV,并且在DIV中加入一个GridVview控件,ID分别是griddivGridView1,其中GridView1用来显示与缓冲区相交的图层要素的属性。如上图所示。

2、 在工具栏上添加一个tool工具,其javascript代码如下:

<esri:ToolDefaultImage="~/images/Buffer.jpg"JavaScriptFile="" DisabledImage="~/images/Buffer.gif"ServerActionAssembly="App_Code" HoverImage="~/images/Buffer.gif"ServerActionClass="BufferTool" ClientAction="Point" ToolTip="缓冲区" SelectedImage="~/images/Buffer.png" Name="Buffer" Text="Buffer"></esri:Tool>

3、其他的一些地图控件像Map,MapResourceManager,ToolBar,Toc,ScaleBar等,自己添加并设置关联即可。

4、分别单击连个button,其click事件的代码如下:

<script language="javascript" type="text/javascript">

function btnDistance_onclick()

{

 Var v=document.getElementById("txtDistance").value+"," +document.getElementById("selLayer").value;

         //生成请求字符串

         var argument = "ControlID=Map1&ControlType=Map&Type=Distance&EventArg=" + v;

         var context = "Map";

        //m_Callback 由服务端的Page_load事件中生成的,用于请求服务端的js代码

         var script=<%= m_Callback %>

        //用eval执行字符串

        eval(script);

}

 

function ClearBuffer_onclick()

{

         //生成请求字符串

        var argument = "ControlID=Map1&ControlType=Map&Type=BufferClear&EventArg=" + "";

         var context = "Map";

         //m_Callback 由服务端的Page_load事件中生成的,用于请求服务端的js代码

         var script=<%= m_Callback %>

        //用eval执行字符串

        eval(script);

}

 

 </script>

5、   后台的.cs文件,代码如下:   

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler

{

 

    public string sADFCallBackFunctionInvocation;

     private string returnstring = "";

public string m_Callback = "";

   

protected void Page_Load(object sender, EventArgs e)

    {

  //生成客户端脚本段

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

 

    }

 

 

   #region ICallbackEventHandler 成员

 

        private string _callbackArg;

        //负责把结果回传给客户端

        string ICallbackEventHandler.GetCallbackResult()

        {

           return RaiseCallbackEvent(_callbackArg);

           

            return returnstring;

        }

 

        //负责从客户端javascript传来的参数

        void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)

        {

            _callbackArg = eventArgument;

 

        }

 

 

 public void RaiseCallbackEvent( string _callbackArg)

    {

     string v = "";

  

     NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);

 

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

             {

                    string str = keyValColl["EventArg"];

                       

                        string []str1=str.Split(',');

                        Session["BufferDistance"]=str1[0];

 

                        Session["Layer"] = str1[1];

 

                }

 

                else if (keyValColl["Type"].ToString() == "BufferClear")

                    {                        

 

                        IEnumerable gfc = Map1.GetFunctionalities();

                        ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;

              foreach (IGISFunctionality gfunc in gfc)

              {

                   if (gfunc.Resource is ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)

                            {

                                gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;

                                gResource.Graphics.Clear();

                            }

               }

 

                        Map1.Refresh();

 

                       object[] oa = new object[1];

                        string showtable = "'hidden'";

                        string sa = "var griddiv = document.getElementById('griddiv');";

                        sa += "griddiv.style.visibility = " + showtable + ";";

                        oa[0] = sa;

                        oa[0] = sa;

                        CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);

                        Map1.CallbackResults.Add(cr1);

 

                      

                      v = Map1.CallbackResults.ToString();

 

                      return v;

 

                    }

  

  

    }

 

 

6、接下来,添加一个类文件命名为:BufferTool.cs,其中的代码如下:

 

public class BufferTool : IMapServerToolAction

{

    #region IMapServerToolAction Members

 

    void IMapServerToolAction.ServerAction(ToolEventArgs args)

    {

        ESRI.ArcGIS.ADF.Web.UI.WebControls.Map mapctrl = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)args.Control;

 

        try

        {

            PointEventArgs pointargs = (PointEventArgs)args;

            System.Drawing.Point screenpoint = pointargs.ScreenPoint;

 

            ESRI.ArcGIS.ADF.Web.Geometry.Point mappoint = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(screenpoint.X, screenpoint.Y, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);

 

          string strbd = mapctrl.Page.Session["BufferDistance"].ToString();

 

        

            float bufferdistance;

            if (!Single.TryParse(strbd, out bufferdistance))

            {

                bufferdistance = 0.0F;

            }

         

            System.Drawing.Drawing2D.GraphicsPath gpath = new System.Drawing.Drawing2D.GraphicsPath();

            gpath.AddEllipse((float)mappoint.X - (bufferdistance / 2), (float)mappoint.Y - (bufferdistance / 2), bufferdistance, bufferdistance);

            System.Drawing.Drawing2D.Matrix translateMatrix = new System.Drawing.Drawing2D.Matrix();

            translateMatrix.Translate(0, 0);

 

            float flattening = bufferdistance / 1000; //0.005F; //decimal degrees --- 100F; //meters,feet

            gpath.Flatten(translateMatrix, flattening);

 

            ESRI.ArcGIS.ADF.Web.Geometry.PointCollection pc = new ESRI.ArcGIS.ADF.Web.Geometry.PointCollection();

            foreach (System.Drawing.PointF dpnt in gpath.PathPoints)

            {

                pc.Add(new ESRI.ArcGIS.ADF.Web.Geometry.Point(dpnt.X, dpnt.Y));

            }

 

            ESRI.ArcGIS.ADF.Web.Geometry.Ring ring = new ESRI.ArcGIS.ADF.Web.Geometry.Ring();

            ring.Points = pc;

            ESRI.ArcGIS.ADF.Web.Geometry.RingCollection rings = new ESRI.ArcGIS.ADF.Web.Geometry.RingCollection();

            rings.Add(ring);

            ESRI.ArcGIS.ADF.Web.Geometry.Polygon mappoly = new ESRI.ArcGIS.ADF.Web.Geometry.Polygon();

            mappoly.Rings = rings;

 

            IEnumerable gfc = mapctrl.GetFunctionalities();

            ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = null;

            foreach (IGISFunctionality gfunc in gfc)

            {

                if (gfunc.Resource.Name == "Buffer")

                {

                    gResource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;

                }

            }

 

            if (gResource == null)

                throw new Exception("Buffer Graphics layer not in MapResourceManager");

 

            ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer glayer = null;

 

            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;

                }

 

            }

 

            if (glayer == null)

            {

                glayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();

                gResource.Graphics.Tables.Add(glayer);

            }

 

            glayer.Clear();

 

            ESRI.ArcGIS.ADF.Web.Geometry.Geometry geom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)mappoly;

            ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement ge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(geom, System.Drawing.Color.Green);

            ge.Symbol.Transparency = 70.0;

            glayer.Add(ge);

 

            // Construct selection layer

            string targetlayername = (string)mapctrl.Page.Session["Layer"];

 

            int resource_index = 2;

            int layer_index = 0;

 

            ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)mapctrl.GetFunctionality(resource_index);

            ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource;

            bool 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);

 

                for (int i = 0; i < lnames.Length; i++)

                {

                    if (lnames[i] == targetlayername)

                    {

                        layer_index = i;

                        break;

                    }

                }

 

                ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();

                spatialfilter.ReturnADFGeometries = true;

                spatialfilter.MaxRecords = 1000;

                spatialfilter.Geometry = mappoly;

 

                System.Data.DataTable datatable = qfunc.Query(null, lids[layer_index], spatialfilter);

 

                #region Graphics Converter Usage

                /*** To use the ADF Converter to create a Graphics layer from DataTable, use the following code

                ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicsLayer graphicslayer = Converter.ToGraphicsLayer(datatable, Color.Yellow, Color.Yellow);

                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource selresource = null;

                foreach (IGISFunctionality gfunc in gfc)

                {

                    if (gfunc.Resource.Name == "Selection")

                    {

                        selresource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;

                        selresource.Graphics.Tables.Clear();

                    }

                }

                if (selresource == null)

                    return;

 

                selresource.Graphics.Tables.Add(graphicslayer);

                //*/

                #endregion

 

                #region Explicit Graphics Layer Usage

                //*** To work with a Graphics Layer explicitly, and manage it within a Graphics dataset, use the following code

 

                ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource selresource = null;

 

                foreach (IGISFunctionality gfunc in gfc)

                {

                    if (gfunc.Resource.Name == "Selection")

                    {

                        selresource = (ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource)gfunc.Resource;

                    }

                }

 

                if (selresource == null)

                    return;

 

                ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer slayer = null;

 

                foreach (System.Data.DataTable dt in selresource.Graphics.Tables)

                {

                    if (dt is ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)

                    {

                        slayer = (ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer)dt;

                        break;

                    }

                }

 

                if (slayer == null)

                {

                    slayer = new ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer();

                    selresource.Graphics.Tables.Add(slayer);

                }

 

                slayer.Clear();

 

                DataRowCollection drs = datatable.Rows;

 

                int shpind = -1;

                for (int i = 0; i < datatable.Columns.Count; i++)

                {

                    if (datatable.Columns[i].DataType == typeof(ESRI.ArcGIS.ADF.Web.Geometry.Geometry))

                    {

                        shpind = i;

                        break;

                    }

                }

 

                try

                {

                    foreach (DataRow dr in drs)

                    {

                        ESRI.ArcGIS.ADF.Web.Geometry.Geometry sgeom = (ESRI.ArcGIS.ADF.Web.Geometry.Geometry)dr[shpind];

                        ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement sge = new ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(sgeom, System.Drawing.Color.Red);

                        sge.Symbol.Transparency = 50.0;

                        slayer.Add(sge);

                    }

                }

                catch

                {

                    throw new Exception("No geometry available in datatable");

                }

                //*/

                #endregion

 

                //string cbxvalue = (string)mapctrl.Page.Session["CheckBox1Value"];

                GridView gdview = (GridView)mapctrl.Page.FindControl("GridView1");

 

                // Is gridview div visible or hidden

                object[] oa = new object[1];

                string showtable = "'hidden'";

 

                //if (bool.Parse(cbxvalue))

                //{

                    // display table of selected attributes

                    gdview.DataSource = datatable;

                    gdview.DataBind();

 

                    string returnstring = null;

 

                    using (System.IO.StringWriter sw = new System.IO.StringWriter())

                    {

                        HtmlTextWriter htw = new HtmlTextWriter(sw);

                        gdview.RenderControl(htw);

                        htw.Flush();

                        returnstring = sw.ToString();

                    }

 

                    CallbackResult cr = new CallbackResult("div", "griddiv", "innercontent", returnstring);

                    mapctrl.CallbackResults.Add(cr);

 

                   

                      showtable = "'visible'";

 

               

 

                // set visibility of griddiv

                string sa = "var griddiv = document.getElementById('griddiv');";

                sa += "griddiv.style.visibility = " + showtable + ";";

                oa[0] = sa;

                CallbackResult cr1 = new CallbackResult(null, null, "javascript", oa);

                mapctrl.CallbackResults.Add(cr1);

 

                if (mapctrl.ImageBlendingMode == ImageBlendingMode.WebTier)

                { mapctrl.Refresh(); }

                else if (mapctrl.ImageBlendingMode == ImageBlendingMode.Browser)

                {

                    mapctrl.RefreshResource(gResource.Name);

                    mapctrl.RefreshResource(selresource.Name);

                }

            }

        }

        catch (Exception e)

        {

            mapctrl.Refresh();

            System.Diagnostics.Debug.WriteLine("Exception: " + e.Message);

            return;

        }

    }

 

    #endregion

}

7、差不多就是这些了,一些命名空间自己添加吧。运行下,看效果吧。

此例子版权归千秋一统哦!

 

 

 

 

 

 

  

 

 

    

 

posted @ 2008-11-18 21:47  周文  阅读(2779)  评论(0编辑  收藏  举报