• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

gisoracle

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

ArcEngine 开发自动完成多边形功能 http://blog.csdn.net/hsg77/article/details/8661785

 

ArcEngine 开发自动完成多边形功能

using System;
using System.Collections.Generic;
using System.Text;
using GIS.ArcGIS.Commands.SelEx;
using ESRI.ArcGIS.Controls;
using Net.Resource;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Display;
using GIS.ArcGIS.Common;
using GIS.ArcGIS.Carto;
using GIS.ArcGIS.EditEx;
using System.Windows.Forms;

namespace GIS.ArcGIS.Commands.EditEx
{
/// <summary>
/// ArcEngine 开发自动完成多边形功能
/// vp:hsg
/// create date:2012-07-20
/// modify date:2013-03-12
/// </summary>
public class EditAutoCompletePolygonTool : EditGisBaseTool, ILineSelect
{
private EngineEditorClass eedit = new EngineEditorClass();
public EditAutoCompletePolygonTool()
{

}
~EditAutoCompletePolygonTool()
{
try
{
m_Cursor = null;
}
catch (Exception ee)
{
}
}


#region ICommand 成员
public override int Bitmap
{
get
{
return 0;
}
}
public string Description
{
get { return "自动完成多边形功能"; }
}

public override string Caption
{
get { return this.Description; }
}

public override string Category
{
get { return "AutoCompletePolygon"; }
}

public override bool Checked
{
get { return false; }
}

public override bool Enabled
{
get
{
if (eedit.TargetLayer != null)
{
return true;
}
return false;
}
}

public override int HelpContextID
{
get { return 0; }
}

public override string HelpFile
{
get { return ""; }
}

public override string Message
{
get { return this.Description; }
}

public override string Name
{
get { return this.Description; }
}

public override void OnClick()
{
if (m_Cursor == null)
{
m_Cursor = ResourceLib.getInstance().GetCursorResource("Net.Resource.Select.PointSelect.cur");
}
this.Step = 0;
this.IsUsed = false;
this.LineFeedback = null;
}

public override string Tooltip
{
get { return this.Description; }
}

#endregion

#region ITool 成员
private System.Windows.Forms.Cursor m_Cursor = null;
public override int Cursor
{
get
{
if (m_Cursor != null)
{
return m_Cursor.Handle.ToInt32();
}
else
{
return 0;
}
}
}

public override bool Deactivate()
{
return true;
}

public override bool OnContextMenu(int x, int y)
{
return false;
}

private void CreatePolygonsFromFeatures(IFeatureClass getpolygon_fc)
{
IDataset pDataset = getpolygon_fc as IDataset;
IWorkspace pWorkspace = pDataset.Workspace;
IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit;
if (pWorkspaceEdit.IsBeingEdited() != true)
{
pWorkspaceEdit.StartEditing(true);
if (pWorkspaceEdit.IsBeingEdited() != true)
{
return;
}
pWorkspaceEdit.StartEditOperation();
}
IFeatureConstruction pFeatureConstruction = new FeatureConstructionClass();


IMap pMap = this.HookHelper.FocusMap;// axMapControl1.Map;
IEnumFeature pEnumFeature = pMap.FeatureSelection as IEnumFeature;
IFeature pFeature = pEnumFeature.Next();
if (pFeature == null)
{
MessageBox.Show("pEnumFeature为空");
return;
}

pFeatureConstruction.ConstructPolygonsFromFeatures(null, getpolygon_fc, null, false, false, pEnumFeature, null, 0.01, null);
MessageBox.Show("转化结束");
}

/// <summary>
/// 双击 结束画
/// </summary>
public override void OnDblClick()
{
try
{
object objMiss = Type.Missing;
//
if (this.IsUsed == false) return;
if (this.LineFeedback == null) return;
if (this.Step > 1)
{
IPolyline tpPolyline = this.LineFeedback.Stop();
if (tpPolyline == null)
{
this.Step = 0;
this.IsUsed = false;
this.LineFeedback = null;
return;
}
IGeometry tpLine = tpPolyline;
//获取构面的线集合
GeometryBagClass enumGeoLines = new GeometryBagClass();
enumGeoLines.AddGeometry(tpLine, ref objMiss, ref objMiss);
//
if (eedit.TargetLayer != null && eedit.TargetLayer is IFeatureLayer)
{
IFeatureLayer FeatLayer = eedit.TargetLayer as IFeatureLayer;
FeatLayer.Selectable = true;
IFeatureClass fc = FeatLayer.FeatureClass;
IDataset pDataset = fc as IDataset;
IWorkspace pWorkspace = pDataset.Workspace;
//
IGeoDataset geoDS = fc as IGeoDataset;
IEnvelope processingBounds = geoDS.Extent;
//
IInvalidArea invalidArea = new InvalidAreaClass();

//要素构造类
IFeatureConstruction pfeatBuild = new FeatureConstructionClass();
//从enumGeoLines集合中构面并保存到fc面图层中
//pfeatBuild.ConstructPolygonsFromGeometries(null, fc, null, false, enumGeoLines, null, 0.0001);
//开始自动完成构面并保存到fc面图层中
IFeatureSelection featsel = FeatLayer as IFeatureSelection;
ISelectionSet selSet = featsel.SelectionSet;
pfeatBuild.AutoCompleteFromGeometries(fc, processingBounds, enumGeoLines, invalidArea, 0.0001, pWorkspace, out selSet);
if (selSet != null)
{
MessageBox.Show(selSet.Count.ToString());
}
//
this.HookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, this.HookHelper.ActiveView.Extent);
//
}
else
{
System.Windows.Forms.MessageBox.Show("目标图层为空,请开启编辑会话", "提示");
}
this.Step = 0;
this.IsUsed = false;
this.LineFeedback = null;
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message, "提示");
}
}

public virtual IGeometry Erase(IGeometry source, IGeometry other)
{
ITopologicalOperator topoOper = source as ITopologicalOperator;
if (!topoOper.IsSimple)
{
topoOper.Simplify();
}
IGeometry geo = topoOper.Difference(other);
topoOper = geo as ITopologicalOperator;
if (!topoOper.IsSimple)
{
topoOper.Simplify();
}
return geo;
}

public override void OnKeyDown(int keyCode, int shift)
{
}

public override void OnKeyUp(int keyCode, int shift)
{
}

public override void OnMouseDown(int button, int shift, int x, int y)
{
if (this.HookHelper.ActiveView == null) return;
if (button == 1) //MouseDown左键 开始画点/连续画点
{
IPoint tpPoint = null;
if (this.Step <= 0)
{
//开始画点
tpPoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
this.LineFeedback = new NewLineFeedbackClass();
this.LineFeedback.Start(tpPoint);
this.Step += 1;
this.LineFeedback.Display = this.HookHelper.ActiveView.ScreenDisplay;
this.IsUsed = true;
}
else
{
//连续画点
tpPoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
this.Step += 1;
this.LineFeedback.AddPoint(tpPoint);
}
} //--
else //MouseDown右键
{
}

}

public override void OnMouseMove(int button, int shift, int x, int y)
{
if (this.IsUsed == true)
{
IPoint mappoint = this.HookHelper.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
this.LineFeedback.MoveTo(mappoint);
}
}

public override void OnMouseUp(int button, int shift, int x, int y)
{
}

public override void Refresh(int hdc)
{
}

#endregion

#region ILineSelect 成员

public esriSpatialRelEnum getSpatialRel(esriGeometryType geoType)
{
//System.Windows.Forms.MessageBox.Show(geoType.ToString());
esriSpatialRelEnum SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
switch (geoType)
{
case esriGeometryType.esriGeometryPolygon: //面对面Polygon
SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
case esriGeometryType.esriGeometryPoint: //面对点Point
SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
case esriGeometryType.esriGeometryPolyline: //面对线Polyline
SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
case esriGeometryType.esriGeometryLine: //面对线Line
SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
default:
SpatialRelEnum = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
return SpatialRelEnum;
}

public ISymbol getSelectionSymbol(esriGeometryType geoType)
{
ISymbol symbol = null;
switch (geoType)
{
case esriGeometryType.esriGeometryPolygon: //点对面Polygon
symbol = new SimpleFillSymbolClass();
ISimpleFillSymbol fs = symbol as ISimpleFillSymbol;
fs.Color = EnvironmentSelectionClass.getInstance.DefaultColor;
fs.Outline.Color = EnvironmentSelectionClass.getInstance.DefaultColor;
fs.Outline.Width = 1;
fs.Style = esriSimpleFillStyle.esriSFSSolid;

break;
case esriGeometryType.esriGeometryPoint: //点对点Point
symbol = new SimpleMarkerSymbolClass();
(symbol as ISimpleMarkerSymbol).OutlineColor = EnvironmentSelectionClass.getInstance.DefaultColor;
(symbol as ISimpleMarkerSymbol).Outline = true;
(symbol as ISimpleMarkerSymbol).OutlineSize = 5;
(symbol as ISimpleMarkerSymbol).Style = esriSimpleMarkerStyle.esriSMSCircle;
break;
case esriGeometryType.esriGeometryPolyline: //点对线Polyline //点作Buffer容差值
symbol = new SimpleLineSymbolClass();
(symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;
(symbol as ISimpleLineSymbol).Width = 1;
(symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;
break;
case esriGeometryType.esriGeometryLine: //点对线Line
symbol = new SimpleLineSymbolClass();
(symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;
(symbol as ISimpleLineSymbol).Width = 1;
(symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;
break;
default:
symbol = new SimpleLineSymbolClass();
(symbol as ISimpleLineSymbol).Color = EnvironmentSelectionClass.getInstance.DefaultColor;
(symbol as ISimpleLineSymbol).Width = 1;
(symbol as ISimpleLineSymbol).Style = esriSimpleLineStyle.esriSLSSolid;
break;
}
return symbol;
}

private INewLineFeedback m_LineFeedback = null;
public INewLineFeedback LineFeedback
{
get { return m_LineFeedback; }
set { m_LineFeedback = value; }
}
private bool m_IsUsed = false;
public bool IsUsed
{
get
{
return m_IsUsed;
}
set
{
m_IsUsed = value;
}
}
private int m_Step = 0;
public int Step
{
get { return m_Step; }
set { m_Step = value; }
}

#endregion
}
}

posted on 2015-08-11 23:07  gisai  阅读(268)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3