下面的代码是我们定制的一个工作流-给等高线赋值
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
public string GroupName
//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)
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 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++)
//获取高程字段的索引
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);
public void OnTargetLayerChanged()
PerformSketchToolEnabledChecks();
void OnCurrentTaskChanged()
if (pEngineEditor.CurrentTask.Name == "CalculateContourTask")
PerformSketchToolEnabledChecks();
private void PerformSketchToolEnabledChecks()
if (pEditLayer == null)
//Only enable the sketch tool if there is a polyline target layer.
if (pEditLayer.CurrentLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolyline)
pEditSketch.GeometryType = esriGeometryType.esriGeometryNull;
}
}
效果如下:
task2
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。
本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6262948.html,如需转载请自行联系原作者