• ArcGIS.Server.9.2.DotNet实现EditorTask功能扩展(自带例子 十、三)


    目的:
    1.arcgis server9.2 ADF实现EditorTask功能扩展。在EditorTask控件上添加地理元素框选裁剪和选中元素数量统计功能。
    准备工作:
    1.参考DeveloperKit\SamplesNET\Server\Web_Applications目录下的Common_CustomEditorTaskCSharp.zip
    2.本例是在ArcGIS.Server.9.2.DotNet实现在线编辑EditorTask使用(自带例子 十、二) 基础上做的。
    完成后的效果图:

    开始:
    1.在上一篇中已经实现了EditorTask控件的使用,已经编辑属性的过滤控制等功能,本篇在上一篇的基础上实现
    EditorTask功能扩展,在Editor面板上添加一个框选裁剪和选中数量统计功能两个自定义功能。
    2.首先在Page_Init页面事件中添加EditorTask1的ToolsCreated事件,代码如下:
    1protected void Page_Init(object sender, EventArgs e)
    2        {
    3          //ToolsCreated事件
    4            EditorTask1.ToolsCreated += new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolsCreatedEventHandler(EditorTask1_ToolsCreated);
    5           
    6        }
    3.在EditorTask1_ToolsCreated方法中实现框选裁剪和数量统计2个功能按钮的添加,具体代码和说明如下:
     1void EditorTask1_ToolsCreated(object sender, ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolsCreatedEventArgs e)
     2        {
     3            //编辑panel
     4            if (e.Parent == EditorTask1.Editor.ExistingFeatureEditor)
     5            {
     6                //编辑panel包含两个toolbars: GeometryToolbar1和GeometryToolbar2
     7                foreach (ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar editorToolbar in e.Toolbars)
     8                {
     9                    string ToolbarID=editorToolbar.ID;
    10                    if (ToolbarID == "GeometryToolbar1")
    11                    {
    12                        //name,mapID,useSnapping,geometryType,minSelectedFeatures
    13                        //EditorTool的名称,ID,是否扑捉,元素类型,最小选择数
    14                        ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool clip =new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool("Clip",((ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditExistingFeaturePanel)e.Parent).ParentEditor.MapID, false,ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.Line | ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.Polygon, 1);
    15                        //EditorTool的客户端Action,设置设置成矩形操作
    16                        clip.ClientAction = ESRI.ArcGIS.ADF.Web.UI.WebControls.Constants.HTML_DRAG_RECTANGLE;
    17                        //设置EditorTool的图片和tip
    18                        clip.DefaultImage = "~/images/clip.png";
    19                        clip.SelectedImage = "~/images/clip_ON.png";
    20                        clip.HoverImage = "~/images/clip_OVER.png";
    21                        clip.ToolTip = "Clip feature(s)";
    22
    23                        //设置EditorTool的功能类
    24                        clip.ServerActionAssembly = "CustomEditorTask";
    25                        clip.ServerActionClass = "CustomEditorTask.ClipFeatures";
    26                        //把这个EditorTool添加到Toolbar上
    27                        editorToolbar.ToolbarItems.Add(clip);
    28                        //设置宽
    29                        editorToolbar.Width = new Unit(editorToolbar.Width.Value + 35, UnitType.Pixel);
    30                    }

    31                }

    32
    33                //新建EditorToolbar
    34                ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar newEditorToolbar =new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar();
    35                //只显示图标
    36                newEditorToolbar.ToolbarStyle = ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolbarStyle.ImageOnly;
    37                //id
    38                newEditorToolbar.ID = "MyCustomToolbar";
    39                //
    40                newEditorToolbar.BuddyControlType = ESRI.ArcGIS.ADF.Web.UI.WebControls.BuddyControlType.Map;
    41                //设置EditorToolbar的Map控件
    42                newEditorToolbar.BuddyControls.Add(new ESRI.ArcGIS.ADF.Web.UI.WebControls.BuddyControl(((ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditExistingFeaturePanel)e.Parent).ParentEditor.MapID));
    43
    44                //新建EditorCommand
    45                ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorCommand vertCount =new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorCommand("VerticeCount", ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.All, 1);
    46                //设置EditorCommand的图片和tip
    47                vertCount.DefaultImage = "~/images/verticecount.png";
    48                vertCount.SelectedImage = "~/images/verticecount_ON.png";
    49                vertCount.HoverImage = "~/images/verticecount_OVER.png";
    50                vertCount.ToolTip = "Count the number of vertices in the selected feature";
    51                //设置EditorCommand的功能类
    52                vertCount.ServerActionAssembly = "CustomEditorTask";
    53                vertCount.ServerActionClass = "CustomEditorTask.VerticeCount";
    54
    55                //把新建EditorCommand添加到EditorToolbar
    56                newEditorToolbar.ToolbarItems.Add(vertCount);
    57                newEditorToolbar.Width = new Unit(newEditorToolbar.ToolbarItems.Count * 35, UnitType.Pixel);
    58
    59                //把新建的EditorToolbar添加到EditorTask1
    60                e.Toolbars.Add(newEditorToolbar);
    61            }
    4.上面把2个功能按钮添加到Editor面板上后还需要编写实现具体功能的代码,就上面代码中clip.ServerActionClass = "CustomEditorTask.ClipFeatures";vertCount.ServerActionClass = "CustomEditorTask.VerticeCount";的ClipFeatures类和VerticeCount类,新建CustomEditorTools.cs文件,然后添加如下代码:
      1namespace CustomEditorTask
      2{
      3    class ClipFeatures : EditorServerToolAction
      4    {
      5        private List<int> features = new List<int>();
      6
      7        public List<int> Features
      8        {
      9            get return features; }
     10        }

     11
     12        protected override bool Init(Editor editor)
     13        {
     14            features.Clear();
     15            return base.Init(editor);
     16        }

     17
     18        protected override void EditorServerAction()
     19        {
     20            //区域
     21            IEnvelope env = Geometry as IEnvelope;
     22            //map描述
     23            MapDescription mapDesc = Editor.MapFunctionality.MapDescription;
     24            //选中的Feature数量
     25            int[] fidSet = LayerDescription.SelectionFeatures;
     26            if (fidSet != null && fidSet.Length > 0)
     27            {
     28                //geometry拓扑逻辑操作
     29                ITopologicalOperator3 topo3 = null;
     30                IFeature feature = null;
     31                try
     32                {
     33                    //开始编辑
     34                    StartEditOperation();
     35                    //IFeatureCursor提供枚举features集合的成员方法,游标
     36                    IFeatureCursor cursor = FeatureLayer.FeatureClass.GetFeatures(fidSet, false);
     37                    //获取下一个features
     38                    feature = cursor.NextFeature();
     39                    //进行循环
     40                    while (feature != null)
     41                    {
     42                        topo3 = (ITopologicalOperator3)feature.ShapeCopy;
     43                        topo3.Clip(env);
     44                        IGeometry geometry = (IGeometry)topo3;
     45                        if (!geometry.IsEmpty)
     46                        {
     47                            feature.Shape = geometry;
     48                            //存储Feature,存储row
     49                            feature.Store();
     50
     51                            features.Add(feature.OID);
     52                        }

     53                        feature = cursor.NextFeature();
     54                    }

     55                    //停止编辑
     56                    StopEditOperation();
     57                }

     58                catch (Exception e)
     59                {
     60                    //终止编辑操作
     61                    AbortEditOperation(e);
     62                }

     63                if (features.Count > 0)
     64                {
     65                    // Refresh the Editor, Map, vertices, etc. with the new selection set
     66                    Refresh(features, true);
     67                }

     68            }

     69        }

     70    }

     71
     72    class VerticeCount : EditorServerCommandAction
     73    {
     74        protected override void EditorServerAction()
     75        {
     76            ESRI.ArcGIS.ADF.ArcGISServer.MapDescription mapDesc = Editor.MapFunctionality.MapDescription;
     77            int[] fidSet = LayerDescription.SelectionFeatures;
     78            if (fidSet != null && fidSet.Length > 0)
     79            {
     80                IFeature feature = null;
     81
     82                int pointCount = 0;
     83                //IFeatureCursor提供枚举features集合的成员方法,游标
     84                IFeatureCursor cursor = FeatureLayer.FeatureClass.GetFeatures(fidSet, false);
     85                feature = cursor.NextFeature();
     86                while (feature != null)
     87                {
     88                    //如果是点类型
     89                    if (feature.Shape is IPoint)
     90                    {
     91                        pointCount += 1;
     92                    }

     93                    else//非点类型
     94                    {
     95                        IPointCollection pointCollection = (IPointCollection)feature.Shape;
     96                        pointCount += pointCollection.PointCount;
     97                    }

     98                    feature = cursor.NextFeature();
     99                }

    100                string status = string.Format("alert( '选中数量为:{0}个');", pointCount);
    101                ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult jsStatusCallbackResult =new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(nullnull"javascript", status);
    102                this.ToolbarItemInfo.Toolbar.CallbackResults.Add(jsStatusCallbackResult); 
    103            }

    104        }

    105    }

    106
    107    public class CustomEditorTools
    108    {
    109
    110    }

    111}

    112
    5.这样就完成了2个自定义功能的开发,测试运行。
    6.这里例子中还有一个自定义 TooledEditorPanel的实现了,觉得不是太有用了这里就不详细讲了贴一下代码和说明。
      1namespace CustomEditorTask
      2{
      3    public class CustomCreateFeaturePanel : TooledEditorPanel
      4    {
      5        public CustomCreateFeaturePanel(EditorTask task): base("Custom Create Feature Panel", task, "customCreateFeaturePanel")
      6        { }
      7
      8        protected override void OnLoad(EventArgs e)
      9        {
     10            base.OnLoad(e);
     11            //ParentEditor的Layer变换事件
     12            this.ParentEditor.LayerChanged += new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Editor.LayerChangedHandler(Editor_LayerChanged);
     13        }

     14
     15        //当选择图层的类型变换时间显示相应的编辑工具
     16        void Editor_LayerChanged(ESRI.ArcGIS.Carto.IFeatureLayer featureLayer)
     17        {
     18            //获取EditorToolbar
     19            ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar toolbar =(ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar)this.Toolbars[0];
     20            //获取EditorTool 
     21            ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool tool =(ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool)toolbar.ToolbarItems[0];
     22            //设置FeatureTool属性
     23            SetCreateFeatureToolProperties(featureLayer, ref tool);
     24            //刷新EditorToolbar
     25            toolbar.Refresh();
     26            //进行回调登记
     27            ParentEditor.CallbackResults.CopyFrom(toolbar.CallbackResults);
     28
     29            //设置tool的属性js
     30            string jsToolbarItemEnable = "var toolbar = Toolbars['" + toolbar.ClientID + "']; var toolbaritem = toolbar.items['" + tool.Name + "'];toolbaritem.clientAction = 'Map" + tool.ClientAction + "'; toolbaritem.defaultImage = '" + tool.DefaultImage + "'; toolbaritem.hoverImage = '" + tool.HoverImage + "';toolbaritem.selectedImage = '" + tool.SelectedImage + "';toolbaritem.disabledImage = '" + tool.DisabledImage + "';EditorToolbars['" + toolbar.ClientID + "'].tools['" + tool.Name + "'].shapeType = '" + tool.GeometryType.ToString() + "';";
     31            //CallbackResult就可以将信息传回客户端,执行js脚本
     32            ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult setToolPropertiesCallbackResult =new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult(nullnull"javascript", jsToolbarItemEnable);
     33            ParentEditor.CallbackResults.Add(setToolPropertiesCallbackResult);
     34        }

     35
     36        private void SetCreateFeatureToolProperties(ESRI.ArcGIS.Carto.IFeatureLayer featureLayer, ref ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool tool)
     37        {
     38            string shapeType = "";
     39            if(featureLayer == null)
     40            {
     41                shapeType="esriGeometryPoint";
     42            }

     43            else
     44            {
     45                shapeType = featureLayer.FeatureClass.ShapeType.ToString();
     46            }

     47            string shapeString;
     48            string clientAction;
     49            switch (shapeType)
     50            {
     51                    //线对象
     52                case "esriGeometryPolyline":
     53                    shapeString = "line";
     54                    clientAction = "Polyline";
     55                    tool.GeometryType = ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.Line;
     56                    break;
     57                    //面、多边形
     58                case "esriGeometryPolygon":
     59                    shapeString = "polygon";
     60                    clientAction = "Polygon";
     61                    tool.GeometryType = ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.Polygon;
     62                    break;
     63                    //
     64                case "esriGeometryPoint":
     65                default:
     66                    tool.GeometryType = ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.ToolGeometry.Point;
     67                    shapeString = "point";
     68                    clientAction = "Point";
     69                    break;
     70            }

     71            //设置tool的显示图标
     72            tool.DefaultImage = this.Page.ClientScript.GetWebResourceUrl(typeof(ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditorTask), string.Format("ESRI.ArcGIS.ADF.ArcGISServer.Editor.Resources.images.edCreate-{0}.gif", shapeString));
     73            tool.DisabledImage = this.Page.ClientScript.GetWebResourceUrl(typeof(ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditorTask), string.Format("ESRI.ArcGIS.ADF.ArcGISServer.Editor.Resources.images.edCreate-{0}.gif", shapeString));
     74            tool.HoverImage = this.Page.ClientScript.GetWebResourceUrl(typeof(ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditorTask), string.Format("ESRI.ArcGIS.ADF.ArcGISServer.Editor.Resources.images.edCreate-{0}-OVER.gif", shapeString));
     75            tool.SelectedImage = this.Page.ClientScript.GetWebResourceUrl(typeof(ESRI.ArcGIS.ADF.ArcGISServer.Editor.EditorTask), string.Format("ESRI.ArcGIS.ADF.ArcGISServer.Editor.Resources.images.edCreate-{0}-ON.gif", shapeString));
     76            //设置tool的客户端动作
     77            tool.ClientAction = clientAction;
     78        }

     79
     80        protected override System.Collections.Generic.List<ESRI.ArcGIS.ADF.Web.UI.WebControls.Toolbar> CreateToolbars()
     81        {
     82            List<ESRI.ArcGIS.ADF.Web.UI.WebControls.Toolbar> toolbars =new List<ESRI.ArcGIS.ADF.Web.UI.WebControls.Toolbar>();
     83            ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar editorToolbar =new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorToolbar();
     84            editorToolbar.ID = "customCreateFeatureToolbar";
     85            editorToolbar.BuddyControlType = BuddyControlType.Map;
     86            editorToolbar.BuddyControls.Add(new BuddyControl(this.ParentEditor.MapID));
     87            editorToolbar.ToolbarStyle = ToolbarStyle.ImageOnly;
     88            editorToolbar.Group = "EditorToolbarGroup";
     89
     90            ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool tool =new ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.EditorTool();
     91            tool.Name = "customCreateFeatureTool";
     92            tool.MapID = this.ParentEditor.MapID;
     93            tool.UseSnapping = true;
     94            SetCreateFeatureToolProperties(this.ParentEditor.FeatureLayer, ref tool);
     95            tool.ServerActionAssembly = "ESRI.ArcGIS.ADF.ArcGISServer.Editor";
     96            tool.ServerActionClass = "ESRI.ArcGIS.ADF.ArcGISServer.Editor.Tools.CreateFeature";
     97
     98            editorToolbar.ToolbarItems.Add(tool);
     99            editorToolbar.Width = new Unit(editorToolbar.ToolbarItems.Count * 35, UnitType.Pixel);
    100
    101            toolbars.Add(editorToolbar);
    102
    103            return toolbars;
    104        }

    105    }

    106}

    107
  • 相关阅读:
    vs2015 打开xaml:右击-打开方式->xml编辑器
    交互式计算机图形学(基于webGL)资源使用
    利用pushState开发无刷页面切换
    js 阻止冒泡 stopPropagation
    PHP中“简单工厂模式”实例讲解
    ajax传递特殊字符串问题 +%@
    GitHub自学
    ajax 请求超时 取消请求
    mongo操作之分页
    我使用过的Linux命令之date
  • 原文地址:https://www.cnblogs.com/hll2008/p/1290475.html
Copyright © 2020-2023  润新知