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的更多相关文章
- ArcGIS Engine 编辑介绍
转自原文 ArcGIS Engine 编辑介绍 IWorkspaceEdit接口是ArcGIS Engine 实现空间数据编辑的重要接口,它让程序启动或者停止一个编辑流程,在这个编辑流程内,可以对数据 ...
- ArcGIS Engine 编辑- IWorkspaceEdit
转自原文 ArcGIS Engine 编辑- IWorkspaceEdit 这个例子中,我创建了1000条要素,并结合缓冲将数据写到文件中,并且添加了时间统计,当然数据是我捏造的,还请原谅,这个花费的 ...
- ArcGIS Engine 中的绘制与编辑
1.线段绘制 基本步骤 构建形状 1. 创建 IPoint IPoint m_Point = new PointClass(); m_Point.PutCoords(x, y); 2. 创建 IPoi ...
- ArcGIS Engine开发之地图基本操作(4)
ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据 ...
- ArcGIS Engine开发前基础知识(1)
ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现 ...
- 转-ArcGIS Engine许可初始化
关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错. 以Engine9.2为例,应用程序是强制初始化许可 ...
- 转-ArcGIS Engine中的License设置
AE开发中的License有两种方法进行设置,一种是通过LicenseControl控件,另一种是通过IAoInitialize接口设置.整个应用程序中只能有一种方式存在,如果进行了两种License ...
- ArcGIS Engine中的8种数据访问 (转)
数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGI ...
- ArcGIS Engine中的数据访问
ArcGIS Engine中的数据访问 数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文 ...
随机推荐
- theme-不同主题资源更改
1.找到了影响桌面小部件的布局文件packages/apps/Mms$ vim res/layout/widget.xml修改里面的背景颜色属性,可以实现预期效果,至于里面的 <LinearLa ...
- ListView- 最后一行添加控件
今天在做一个功能的时候,要求必须是在一个listview下,有一段提示行的文字,自己的那个listview的adapter用的是cursoradapter,这样的话,处理布局的灵活性就大打折扣了.最开 ...
- C++编码优化之减少冗余拷贝或赋值
临时变量 目前遇到的一些产生临时变量的情况:函数实参.函数返回值.隐式类型转换.多余的拷贝 1. 函数实参 这点应该比较容易理解,函数参数,如果是实参传递的话,函数体里的修改并不会影响调用时传入的参数 ...
- JavaScript学习总结(5)——Javascript面向(基于)对象编程
一.澄清概念 1.JS中"基于对象=面向对象" 2.JS中没有类(Class),但是它取了一个新的名字叫"原型对象",因此"类=原型对象" ...
- 让我们彻底看清MVC、MVP
这里開始记录下来自己对MVC.MVP.MVVM这三种框架模式的理解,本文从以下几个方面来梳理. 架构的目的 框架模式.设计模式 MVC设计的介绍 MVC在Android中的应用 MVC该怎样设计 MV ...
- libcurl 上传文件至 web服务器
测试环境搭建, 使用 wamp server (windows下的 apache+MySQL+php) libcurl vc6 工程代码 下载地址: http://download.csdn.ne ...
- MyCat中间件:读写分离(转)
利用MyCat中间件实现读写分离 需要两步: 1.搭建MySQL主从复制环境 2.配置MyCat读写分离策略 一.搭建MySQL主从环境 参考上一篇博文:MySQL系列之七:主从复制 二.配置MyCa ...
- hunnu11550:欧拉函数
Problem description 一个数x的欧拉函数Φ(x)定义为全部小于x的正整数中与x互质的数的数目,如小于5且和5互质的数有1.2.3.4,一共4个,故Φ(5)=4. 对于随意正整数x ...
- 国内技术管理人员批阅google的“春运交通图”项目
在整理一份报告的时候,偶然看到2008年春节期间google推出的“春运交通图”项目建设历程报道,很受启发,随以国内的技术管理人员眼光批阅了这篇文章,同时也是自嘲吧. 以下黑色字体是原报道,红色字体是 ...
- 【hdu 2328】Corporate Identity
[链接]h在这里写链接 [题意] 找一个字典序最小的公共最长子串; [题解] 后缀数组. 把所有的串用不同的分隔符分开.(大于'z'的分隔符); 然后求出那几个固定的数组. 二分一下那个子串的长度. ...