博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcGIS Engine 编辑- ITask
阅读量:7224 次
发布时间:2019-06-29

本文共 6751 字,大约阅读时间需要 22 分钟。

转自原文

 

下面的代码是我们定制的一个工作流-给等高线赋值

 

 

namespace EngineApplication

{

    [Guid("5b0c0692-eaf7-4d64-9cee-c8c1afaf06f4")]

    [ClassInterface(ClassInterfaceType.None)]

    [ProgId("EditeTest.ContourTask")]

 

    public class CalculateContour : ESRI.ArcGIS.Editor.IEditTask

    {

         #region

        IEditor pEngineEditor;

        IEditSketch pEditSketch;

        IEditLayers pEditLayer;

      

        #endregion

 

  

     

 

        #region "IEditTask Implementations"

        public void Activate(IEditor pEditor, ESRI.ArcGIS.Editor.IEditTask pEditTask)

        {

            if (pEditor == null)

                return;

 

            pEngineEditor = pEditor;

            pEditSketch = pEngineEditor as IEditSketch;

            pEditSketch.GeometryType = esriGeometryType.esriGeometryPolyline;

            pEditLayer = pEditSketch as IEditLayers;

 

            //Listen to engine editor events

            ((IEngineEditEvents_Event)pEditSketch).OnTargetLayerChanged += new IEngineEditEvents_OnTargetLayerChangedEventHandler(OnTargetLayerChanged);

 

            ((IEngineEditEvents_Event)pEditSketch).OnCurrentTaskChanged += new IEngineEditEvents_OnCurrentTaskChangedEventHandler(OnCurrentTaskChanged);

        }

 

        public void Deactivate()

        {

            // TODO: Add ArcGISClass1.Deactivate implementation

 

            pEditSketch.RefreshSketch();

 

            //Stop listening to engine editor events.

            ((IEngineEditEvents_Event)pEditSketch).OnTargetLayerChanged -= OnTargetLayerChanged;

 

            ((IEngineEditEvents_Event)pEditSketch).OnCurrentTaskChanged -= OnCurrentTaskChanged;

 

            //Release object references.

            pEngineEditor = null;

            pEditSketch = null;

            pEditLayer = null;

        }

 

        public string Name

        {

            get

            {

                // TODO: Add ArcGISClass1.Name getter implementation

                return "ContourTask";

            }

        }

        public string UniqueName

        {

            get

            {

                return "ContourTask";

            }

        }

 

        public string GroupName

        {

            get

            {

                //This property allows groups to be created/used in the EngineEditTaskToolControl treeview.

                //If an empty string is supplied the task will be appear in an "Other Tasks" group.

                //In this example the Reshape Polyline_CSharp task will appear in the existing Modify Tasks group.

                return "Other Tasks";

            }

        }

 

        public void OnDeleteSketch()

        {

            // TODO: Add ArcGISClass1.OnDeleteSketch implementation

        }

 

        public void OnFinishSketch()

        {

            // TODO: Add ArcGISClass1.OnFinishSketch implementation

 

            //get reference to featurelayer being edited

            IFeatureLayer pFeatureLayer = pEditLayer.CurrentLayer as IFeatureLayer;

            //get reference to the sketch geometry

            IGeometry pPolyline = pEditSketch.Geometry;

 

            if (pPolyline.IsEmpty == false)

            {

                ParaSetting pFormSetting = new ParaSetting(pFeatureLayer.FeatureClass);

 

                pFormSetting.ShowDialog();

 

 

                if (pFormSetting.DialogResult == DialogResult.OK)

                {

                    pHeightName = pFormSetting.pFieldNames.Text;

 

                    pHeight = Convert.ToDouble(pFormSetting.dHeight.Text);

 

                    pInterval = Convert.ToDouble(pFormSetting.dInterval.Text);

 

                    pFormSetting.Dispose();

 

                    pFormSetting = null;

 

                    IFeatureCursor pFeatureCursor = GetFeatureCursor(pPolyline, pFeatureLayer.FeatureClass);

 

                    CalculateIntersect(pFeatureCursor, pPolyline);

 

                    MessageBox.Show("OK");

                }

 

 

            }

 

            //refresh the display

            IActiveView pActiveView = pEngineEditor.Map as IActiveView;

            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, (object)pFeatureLayer, pActiveView.Extent);

 

        }

 

        private IFeatureCursor GetFeatureCursor(IGeometry pGeometry, IFeatureClass pFeatureClass)

        {

 

            //空间过虑器的创建

            ISpatialFilter pSpatialFilter = new SpatialFilter();

            pSpatialFilter.Geometry = pGeometry;

            //空间过虑器几何体实体

            //空间过虑器参照系

 

            //空间过虑器空间数据字段名

            pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;

            //空间过虑器空间关系类型

            pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

            //相交

            IFeatureCursor pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);

 

            return pFeatureCursor;

 

 

        }

 

        //起始等高线值

        private double pHeight;

        //等高线间距

        private double pInterval;

        //高程字段名

        private string pHeightName;

 

 

 

        private void CalculateIntersect(IFeatureCursor pFeatureCursor, IGeometry Geometry)

        {

 

 

            //要素游标

            IMultipoint pIntersectionPoints = null;

            //多点

            IPointCollection pPointColl = null;

 

            List<IFeature> pFeatureList = new List<IFeature>();

            //和直线相交的要素集合,未排序

            double[,] pIndex = null;

            //距离和初始索引

 

 

            if (pFeatureCursor == null)

            {

                return;

            }

            ITopologicalOperator pTopoOperator = Geometry as ITopologicalOperator;

 

            IPointCollection pSketchPointColl = Geometry as IPointCollection;

            //所画直线的起点

            IPoint P0 = pSketchPointColl.get_Point(0);

            IFeature pFeature = pFeatureCursor.NextFeature();

            double HValue = 0;

            int FldIndex = 0;

            pFeatureList.Clear();

            while ((pFeature != null))

            {

                //和直线相交的要素集合

                pFeatureList.Add(pFeature);

                //

                pFeature = pFeatureCursor.NextFeature();

            }

            //此时pFeatureL中的等值线并不是按顺序(空间)排列,需要排序

            //求出各交点到直线起点距离

            int pCount = pFeatureList.Count;

            pIndex = new double[2, pCount];

            for (int i = 0; i <= pCount - 1; i++)

            {

                try

                {

                    pFeature = pFeatureList[i];

                    //求交点:

                    pIntersectionPoints = pTopoOperator.Intersect(pFeature.Shape, esriGeometryDimension.esriGeometry0Dimension) as IMultipoint;

 

                    pPointColl = pIntersectionPoints as IPointCollection;

                    //QI

                    //原来序号

                    pIndex[0, i] = i;

                    //距离

                    pIndex[1, i] = GetDistace(P0, pPointColl.get_Point(0));

                    //下个要素

                    pFeature = pFeatureCursor.NextFeature();

                }

                catch (Exception e)

                {

                    MessageBox.Show(e.ToString());

                }

            }

            //排序:将和直线相交的等直线按与起点的距离排序,冒泡法

            for (int i = 0; i <= pCount - 1; i++)

            {

                for (int j = i + 1; j <= pCount - 1; j++)

                {

                    if (pIndex[1, j] < pIndex[1, i])

                    {

                        double pTempindex = pIndex[0, i];

                        pIndex[0, i] = pIndex[0, j];

                        pIndex[0, j] = pTempindex;

                        //交换索引

                        double pTemp = pIndex[1, i];

 

                        pIndex[1, i] = pIndex[1, j];

 

                        pIndex[1, j] = pTemp;

                        //交换距离

                    }

                }

            }

            //开始高程赋值

            HValue = pHeight;

            try

            {

                for (int i = 0; i <= pCount - 1; i++)

                {

                    pFeature = pFeatureList[i];

                    //获取高程字段的索引

                    FldIndex = pFeature.Fields.FindField(pHeightName);

                    //高程赋值

                    pFeature.set_Value(FldIndex, HValue as object);

                    //要素更新

                    pFeature.Store();

                    //Get the next feature and next H

                    HValue = HValue + pInterval;

                }

 

            }

            catch (Exception e)

            {

 

 

                MessageBox.Show(e.ToString());

            }

        }

 

        /// <summary>

        /// 获取我们画的线和等高线之间的距离

        /// </summary>

        /// <param name="pPoint1"></param>

        /// <param name="pPoint2"></param>

        /// <returns></returns>

        private double GetDistace(IPoint pPoint1, IPoint pPoint2)

        {

            return (pPoint1.X - pPoint2.X) * (pPoint1.X - pPoint2.X) + (pPoint1.Y - pPoint2.Y) * (pPoint1.Y - pPoint2.Y);

        }

 

        #endregion

 

        public void OnTargetLayerChanged()

        {

            PerformSketchToolEnabledChecks();

        }

 

 

 

        void OnCurrentTaskChanged()

        {

            if (pEngineEditor.CurrentTask.Name == "CalculateContourTask")

            {

                PerformSketchToolEnabledChecks();

            }

        }

 

        private void PerformSketchToolEnabledChecks()

        {

            if (pEditLayer == null)

                return;

 

            //Only enable the sketch tool if there is a polyline target layer.

            if (pEditLayer.CurrentLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolyline)

            {

                pEditSketch.GeometryType = esriGeometryType.esriGeometryNull;

                return;

            }

 

 

            pEditSketch.GeometryType = esriGeometryType.esriGeometryPolyline;

 

        }

 

    }

}

 

效果如下:

 

task2

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262948.html
,如需转载请自行联系原作者
你可能感兴趣的文章
Linux 面试知识点笔记
查看>>
论flex布局和box布局的华为meta8手机自带浏览器的兼容
查看>>
dubbo与springcloud初识
查看>>
iis web.config 配置示例
查看>>
归并排序
查看>>
java 的转义字符
查看>>
SharedPreferences的使用注意事项
查看>>
sofa-pbrpc高级用法
查看>>
Oracle 函数返回表实例2种写法实例
查看>>
mysql数据库主从复制
查看>>
Shell标准输出、标准错误 >/dev/null 2>&1
查看>>
Android自定义对话框(Dialog)位置,大小
查看>>
设置python的默认编码为utf8
查看>>
简易sqlhelper-java
查看>>
通过案例对SparkStreaming 透彻理解三板斧之一:解密SparkStreaming运行机制
查看>>
HBuilder 学习笔记
查看>>
利用OpenStreetMap(OSM)数据搭建一个地图服务
查看>>
TopN算法与排行榜
查看>>
lucene排序算法之向量空间模型(一)
查看>>
新浪微博数据Json格式解析
查看>>