转自原文ArcGIS Engine 编辑- ITask

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

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

ArcGIS Engine 编辑- ITask的更多相关文章

  1. ArcGIS Engine 编辑介绍

    转自原文 ArcGIS Engine 编辑介绍 IWorkspaceEdit接口是ArcGIS Engine 实现空间数据编辑的重要接口,它让程序启动或者停止一个编辑流程,在这个编辑流程内,可以对数据 ...

  2. ArcGIS Engine 编辑- IWorkspaceEdit

    转自原文 ArcGIS Engine 编辑- IWorkspaceEdit 这个例子中,我创建了1000条要素,并结合缓冲将数据写到文件中,并且添加了时间统计,当然数据是我捏造的,还请原谅,这个花费的 ...

  3. ArcGIS Engine 中的绘制与编辑

    1.线段绘制 基本步骤 构建形状 1. 创建 IPoint IPoint m_Point = new PointClass(); m_Point.PutCoords(x, y); 2. 创建 IPoi ...

  4. ArcGIS Engine开发之地图基本操作(4)

    ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...

  5. ArcGIS Engine开发前基础知识(1)

    ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现 ...

  6. 转-ArcGIS Engine许可初始化

    关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错. 以Engine9.2为例,应用程序是强制初始化许可 ...

  7. 转-ArcGIS Engine中的License设置

    AE开发中的License有两种方法进行设置,一种是通过LicenseControl控件,另一种是通过IAoInitialize接口设置.整个应用程序中只能有一种方式存在,如果进行了两种License ...

  8. ArcGIS Engine中的8种数据访问 (转)

    数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGI ...

  9. ArcGIS Engine中的数据访问

    ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ...

随机推荐

  1. do_pj--下拉代码脚本的使用

    接本目录 /home/zhangshuli/git2/vanzo_team/xulei/Platform.py 在~/bin目录下链接 ln -sf ~/git2/vanzo_team/xulei/P ...

  2. socket UDP简单通讯

    // // SocketUDPServerClient.m // socket_server_client // // Created by lujunjie on 2016/11/26. // Co ...

  3. Mongodb总结6-数据库启动、停止、备份等命令

    #启动Mongodb默认启动,需要在/data/db,Windows下对应的目录是Mongod.exe所在磁盘分区的根目录,例如Mongodb存放在D:/Mongodb,那么对应的路径就是D:/dat ...

  4. Android Material风格的应用(三)--DrawerLayout

    添加抽屉导航 Android Material风格的应用(一)--AppBar TabLayoutAndroid Material风格的应用(二)--RecyclerViewAndroid Mater ...

  5. amazeui学习笔记--css(常用组件4)--关闭按钮Close

    amazeui学习笔记--css(常用组件4)--关闭按钮Close 一.总结 1.关闭按钮基本用法:关闭按钮样式,可以结合其他不同组件使用.对 <a> 或者 <button> ...

  6. Validation failed for query for method public abstract boxfish.bean.Student boxfish.service.StudentServiceBean.find(java.lang.String)!

    转自:https://blog.csdn.net/lzx925060109/article/details/40323741 1. Exception in thread "main&quo ...

  7. Linux CentOS PhpMyAdmin安装--转载

    原文地址:https://www.centos.bz/2011/04/linux-centos-phpmyadmin-install/ 安装好PHP,Apache和MySQL程序后,为了管理MySQL ...

  8. solrcloud集群搭建

    solrcloud 集群搭建 初始条件: 1. 三台服务器 IP 地址分别为 192.168.1.133 192.168.1.134 192.168.1.135 2. 使用 solr-5.3.1,zo ...

  9. iOS_06_基本运算符

    一.算术运算 c语言一共有34种运算符,包括了常见的加减乘除 1.加法运算+ # 除了能做加法运算,还能表示正号:+5.+90 2.减法运算- # 除了能做减法运算,还能表示符号:-10.-200 3 ...

  10. ejs模板引擎的使用

    引入ejs.min.js 创建模板,以<%=jsCode%>包裹起来其余的html和html结构一样 focusTemplateData是模板使用的数据,使用$.each()方法遍历绑定数 ...