ArcGIS.Server.9.2.DotNet实现EditorTask功能扩展

来源:互联网 发布:仪器比对 数据分析 编辑:程序博客网 时间:2024/04/28 15:41

 

目的:
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
原创粉丝点击