zoukankan      html  css  js  c++  java
  • ArcGIS Server 开发系列(五)自定义 Toolbar 工具 (转载于Flyingis)

    前面的开发系列均是使用server开发模板程序Web Mapping Application,工具条上的基本工具是已经在模板中定制好的,在实际项目应用中,我们需要的工具远远不仅如此,如何在工具条中增加新的自定义工具是开发系列(五)所要描述的,其中使用ASP.Net 2.0 Callback framework进行异步刷新地图是重点。

        目标:
        自定义工具按钮进行矩选查询,高亮显示所选择的地图要素,页面下方的Gridview显示所选择要素的属性信息。

        准备工作:
        1.了解ESRI.ArcGIS.Server.WebControls.IMapServerToolAction接口
        2.了解ASP.Net 2.0 Callback framework
        3.新建一个网站,在ArcGIS Web Controls控件中拖动如下控件:Toolbar、Map、Toc、MapResourceManager,以及常用控件Label、DropDownList、Gridview。
        4.设置控件属性,Toolbar、Toc的BuddyControls均为Map1,Toolbar的BuddyControlType为Map,Map控件的MapResourceManager为MapResourceManager1。
        5.更改MapResourceManager属性,添加两个Resource:Selection和NorthAmerica,类型分别是Graphics Layer和ArcGIS Server Internet。
        最后视图效果:
     

        思路:

        现在重新想想我们要做什么,首先要自定义一个工具按钮,使用该工具后在地图上进行矩形选择,对选择的要素高亮显示,同时gridview显示出这些要素的属性信息。整个过程看似容易,实际上需要在客户端和服务器端之间来回切换,异步调用,这里用到了ASP.Net Callback framework,其实Server中很多地图操作都基于asp.net callback,或是实现了ICallbackEventHandler接口,理解了这一段程序开发有利于深入了解Server地图刷新、Task等组件的工作机制。

        首先在Toolbar上新增一个按钮Select Features,上图其实已经加入了,加入的方法是,选择Toolbar控件属性ToobarItems,添加一个Tool,设置以下值:

        Text:Select Feature
        CientAction:DragRectangle
        Name:SelectTool
        ServerActionAssembly:App_Code
        ServerActionClass:SelectFeatures
        
        OK,搞定!

        除了上述属性外,还可以设置该按钮各种状态下的图片显示、ToolTip等等,这里就省了,纵观这些属性,可以看出既有js脚本的交互(已经封装了,通过 ToolEventArgs传入),也有服务器端功能的实现,这时我们需新建一个类SelectFeatures,并实现 IMapServerToolAction接口,类中实现IMapServerToolAction的方法ServerAction。
    public class SelectFeatures : IMapServerToolAction {
        public void ServerAction(ToolEventArgs args)
    }

        代码实现:

        1.获取矩形框的屏幕坐标

        要查询矩选的地图信息,首先应知道矩形的坐标,在服务器端如何获取呢?
    Map mapctrl = null;
    mapctrl = (Map)args.Control;
    // 获取下拉框中的数据,在后面实现
    string targetlayername = (string)mapctrl.Page.Session["TargetLayer"];
     
    RectangleEventArgs rectargs = null;
    // 强制类型转换为RectangleEventArgs
    rectargs = (RectangleEventArgs)args;
     
    // 获取矩形选择框的屏幕坐标
    System.Drawing.Rectangle rect = rectargs.ScreenExtent;
    ESRI.ArcGIS.ADF.Web.Geometry.Point minpnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(rect.Left, rect.Bottom, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);
    ESRI.ArcGIS.ADF.Web.Geometry.Point maxpnt = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(rect.Right, rect.Top, mapctrl.Extent, (int)mapctrl.Width.Value, (int)mapctrl.Height.Value);
     
    ESRI.ArcGIS.ADF.Web.Geometry.Envelope mappoly = null;
    // minpnt、maxpnt分别是左下、右上坐标点
    mappoly = new ESRI.ArcGIS.ADF.Web.Geometry.Envelope(minpnt, maxpnt);

        所有的信息都是通过args获取,它是一个ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs对象,包含了客户端Map控件和当前客户端工具的信息,RectangleEventArgs是它的子类,强制性转换后得到矩选的矩形坐标,最后得到一个 Envelope,用于spatialfilter.Geometry属性。

        2.查询所选择的要素并对Graphics Layer进行渲染实现高亮

        这部分内容完全可以参考《ArcGIS Server 开发系列(三)--漫游 Graphics data sources》,只需要注释掉WhereClause属性赋值,再增加一行代码:
    ESRI.ArcGIS.ADF.Web.SpatialFilter spatialfilter = new ESRI.ArcGIS.ADF.Web.SpatialFilter();
    spatialfilter.ReturnADFGeometries = false;
    spatialfilter.MaxRecords = 1000;
    //spatialfilter.WhereClause = txtQuery.Text;
    spatialfilter.Geometry = mappoly;

        3.异步刷新Gridview显示地图要素的属性
    GridView gdview = (GridView)mapctrl.Page.FindControl("GridView1");
     
    object[] oa = new object[1];
    string showtable = "'visible'";
     
    // datatable为矩选时所选择的地图要素,绑定到gridview
    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();
    }
     
    // innercontent相当于innerhtml
    CallbackResult cr = new CallbackResult("div", "griddiv", "innercontent", returnstring);
    // 通过回调将信息从服务器端传输到客户端
    mapctrl.CallbackResults.Add(cr);
     
    if (datatable.Rows.Count > 1)
    {
    showtable = "'visible'";
    }
    else
    {
    showtable = "'hidden'";
    }
     
    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); 
     

  • 相关阅读:
    《WF编程》系列之32 基本活动:条件与规则 4.5 条件与规则
    《WF编程》系列之31 基本活动:事务(Transactions)与补偿(Compensation) 4.4 事务(Transactions)与补偿(Compensation)
    《WF编程》系列之30 基本活动:错误处理
    《WF编程》系列之33 基本活动:Web Services 4.6 Web Services
    《WF编程》系列之36 自定义活动:如何创建自定义活动?活动的组合 5.2 如何创建自定义活动?
    《WF编程》系列之35 自定义活动:为何创建自定义活动? 5 自定义活动
    《WF编程》系列之29 本地通信事件:HandleExternalEventActivity & 活动生成器 4.2.2 HandleExternalEventActivity
    《WF编程》系列之34 基本活动:状态活动 到目前为止,我们所讨论的工作流都是顺序工作流,而WF还支持另外一种工作流机制状态机(StateMachine)工作流,本节就来介绍这些在状态机工作流中工作的活动.
    《WF编程》系列之37 打开黑盒子:属性升级.
    《WF编程》系列之28 本地通信事件:CallExternalMethodActivity
  • 原文地址:https://www.cnblogs.com/googlegis/p/2979049.html
Copyright © 2011-2022 走看看