zoukankan      html  css  js  c++  java
  • ArcGIS Server 9.3 中线缓冲区查询的实现

     

    效果如上图。步骤如下:

    1、加入一个按钮和一个textbox,并为按钮设置监听事件。如下所示:

    请输入缓冲距离:<ext:TextField ID="txtBuffer" runat="server">

    </ext:TextField><br /><br />&nbsp;&nbsp; &nbsp;&nbsp;                                                                             

    <ext:Button ID="btnOperAreaAnaysis" Text="作业带分析runat="server">                   

     <Listeners>

      <Click Handler="OperAreaAnaysis(#{txtBuffer});" />

    </Listeners>

    </ext:Button>

    2、前台的点击按钮的js相应函数如下:

    //作业带分析

    function OperAreaAnaysis(txtField) {

        if (txtField.getValue() == "") {

            Ext.MessageBox.alert('提示', '为了使用作业带分析,请设置缓冲距离!', function() {

               txtField.focus(true, true);

          });

         return false;

        }

        var map = $find('Map1');

        //画线函数

      map.getGeometry(ESRI.ADF.Graphics.ShapeType.Path, SelectPipe, null, 'red', 'blue', 'pointer', true);

    }

     

    function SelectPipe(inputGeometry) {

        var map = $find('Map1');

        var val = document.getElementById("txtBuffer").value;

       

        var ringCoords = inputGeometry.getPath(0).get_coordinates();

        var CoordsStr = "";

       for (var i = 0; i < ringCoords.length; i++) {

     

            CoordsStr += ringCoords[i][0] + ":" + ringCoords[i][1] + ";";

    }

    //callback函数

        SetCustomOperation(CoordsStr + "%" + "OAA" + "*" + val);

       

    requestTableData();//获取查询后的结果并显示在一个Ext的gridpanel中。

       

    }

    Default页面加入 callback函数如下:

    function SetCustomOperation(sVal)

     {

                var message ='';

                message +=',' + sVal;

                var context ='Map1'

                <%=sCallBack%>              

     } 

    3、后台的callback函数如下:

     

    public partial class _Default : System.Web.UI.PageICallbackEventHandler

    { public string sCallBack = string.Empty;

    private string smapstring = string.Empty;

    protected void Page_Load(object sender, EventArgs e)

    {

    if (!IsPostBack)

      {

    sCallBack = Page.ClientScript.GetCallbackEventReference(this, "message", "processCallbackResult", "context", "postBackError", true);

    }

    }

    }

    #region ICallbackEventHandler 成员

    public string GetCallbackResult()

     {

            return smapstring;

     }

    public void RaiseCallbackEvent(string eventArgument)

     {

    if (eventArgument.Contains("OAA"))

        {

           string[] str1 = eventArgument.Split('*');

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

           string[] str3=str2[1].Split('%');

            string str = str3[0];

            OperationAreaAnaysis(str,str1[1]);

          }

    }

    #endregion

    4、接着是实现功能函数了。如下:

    public void OperationAreaAnaysis(string str, string bufferdistance)

    {

         DataSet DS = new DataSet();

         DataTable DT = new DataTable();

     try

      {

             object[] oa = new object[1];

             if (Map1.Scale > 8000)

             {

                 oa[0] = "Ext.MessageBox.alert('提示','为了使用作业带分析,请把地图比例尺放大到8000以内');";

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

                 Map1.CallbackResults.Add(pRst);

                 smapstring = Map1.CallbackResults.ToString();

                 Session["Gridview1"] = null;

                 return;

             }

    ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal  MapRes = Map1.GetFunctionality("管线").Resource as ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal;

     IServerContext sc = MapRes.ServerContextInfo.ServerContext;

             ESRI.ArcGIS.Geometry.IPointCollection pPointColl = (ESRI.ArcGIS.Geometry.IPointCollection)sc.CreateObject("esriGeometry.Polyline");

     

             string[] Coord1 = str.Split(';');

             for (int i = 0; i < Coord1.Length - 1; i++)

             {

                 string[] Coord2 = Coord1[i].Split(':');

                 ESRI.ArcGIS.Geometry.IPoint pPoint = (ESRI.ArcGIS.Geometry.IPoint)sc.CreateObject("esriGeometry.Point");

                 pPoint.X = Convert.ToDouble(Coord2[0]);

                 pPoint.Y = Convert.ToDouble(Coord2[1]);

                 object missingVal = System.Reflection.Missing.Value;

                 pPointColl.AddPoint(pPoint, ref missingVal, ref missingVal);

     

             }

     

             IGeometry pPolylineGeo = pPointColl as IGeometry;

             ESRI.ArcGIS.Geometry.IGeometry igeo = null;

             //缓冲需要的Geometry

             igeo = pPolylineGeo;

     

             double distance = Convert.ToDouble(bufferdistance) / 100000;//因为本例的地图坐标是WGS84坐标,所以转换了下单位

             ESRI.ArcGIS.ADF.Web.Geometry.Polygon mappoly = null;

     

             ESRI.ArcGIS.Geometry.ITopologicalOperator topop = (ESRI.ArcGIS.Geometry.ITopologicalOperator)igeo;

             ESRI.ArcGIS.Geometry.IPolygon bufferPolygon;

             bufferPolygon = (ESRI.ArcGIS.Geometry.IPolygon)topop.Buffer(distance);

             // 定义valueobject的点

             ESRI.ArcGIS.ADF.ArcGISServer.PolygonN buffer_polyn;

             // 进行comobject到valueobject之间的转换

             buffer_polyn = (ESRI.ArcGIS.ADF.ArcGISServer.PolygonN)          ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.ComObjectToValueObject(bufferPolygon, sc, typeof(ESRI.ArcGIS.ADF.ArcGISServer.PolygonN));

             //缓冲分析的结果

             mappoly = (ESRI.ArcGIS.ADF.Web.Geometry.Polygon) ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.ToAdfPolygon(buffer_polyn);

     

             //把buffer结果范围进行显示

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

             //查找ElementGraphicsLayer在Buffer中

           ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality Tempfunc = Map1.GetFunctionality("TempEle");

    ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource gResource = Tempfunc.Resource as ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapResource;

     

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

    //设置点显示

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

           //设置透明度

            ge.Symbol.Transparency = 50;

             //添加到Buffer中进行显示

              glayer.Add(ge);

             Map1.RefreshResource(gResource.Name);

             //缓冲区查询

             ESRI.ArcGIS.ADF.Web.DataSources.IGISFunctionality gisfunc = Map1.GetFunctionality("兴趣点");

             ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisRes = gisfunc.Resource;

             bool supp = gisRes.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));

         if (supp)

        {

                 ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality QFunc;

                 QFunc=(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisRes.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 = true;

                 spatialfilter.MaxRecords = 10000;

                 spatialfilter.Geometry = mappoly;

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

                 {

                     DataTable datatable = QFunc.Query(gisfunc.Name, lids[i], spatialfilter);

                     datatable.TableName = gisRes.Name + "_" + lnames[i];

     

                     if (datatable.Rows.Count > 0)

                     {

                         if (DT.Rows.Count < 1)

                         {

                             DT = datatable.Clone();

                         }

                         DT.Merge(datatable);

                     }

                 }

             }

             DS.Tables.Add(DT);

             Session["Gridview1"] = DS;

             smapstring = Map1.CallbackResults.ToString();

             if (DS.Tables[0].Rows.Count < 1)

                 return;

         }

         catch (Exception ex)

         {

             SystemLog.WriteLog("作业带分析出错!", ex);

         }

         Session["Gridview1"] = DS;

     }

    5、以上函数就已经获得缓冲区查询后的dataset了,自己将他展示出来就行了(本博客中有相关的内容,例如ArcgisServer9.3 中矩形选择查询的实现(利用callback机制)。

    一起学习GIS及其二次开发,一起进步!
  • 相关阅读:
    2016年3月3日
    性能测试之我解
    Vim命令合集
    vi-vim常用命令
    架构的本质是
    网站三层架构学习之一 分层式结构
    Spring 4 + Quartz 2.2.1 Scheduler Integration Example
    “城市民族工作条例”详解--建议废止
    字符串匹配处理
    LogBack简易教程
  • 原文地址:https://www.cnblogs.com/tuncaysanli/p/1400912.html
Copyright © 2011-2022 走看看