📄 selectfeature.cs
字号:
using System;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.MapControl;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
namespace Cstest1
{
/// <summary>
/// SelectFeature 的摘要说明。
/// </summary>
public class SelectFeature : ITool,ICommand
{
ESRI.ArcGIS.MapControl.AxMapControl m_MapControl; //设置地图控件对象
IPoint m_PointStart; //SelectByShape方法的鼠标点参数
INewEnvelopeFeedback m_FeedbackEnv; //拖框Envelope对象
ISelectionEnvironment SelectEnvir; //要素选择环境变量
public SelectFeature()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
private double ConvertPixelsToMapUnits(IActiveView pActiveView , double pixelUnits)
{
// 依据当前视图,将屏幕像素转换成地图单位
IPoint Point1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
IPoint Point2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
int x1, x2, y1, y2;
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(Point1, out x1, out y1);
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(Point2, out x2, out y2);
double pixelExtent = x2 - x1;
double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
return pixelUnits * sizeOfOnePixel;
}
#region ITool 成员
public void OnMouseDown(int button, int shift, int x, int y)
{
// TODO: 添加 SelectFeature.OnMouseDown 实现
if(button==1)
{
m_MapControl.Map.ClearSelection();
m_MapControl.ActiveView.Refresh();
m_PointStart=m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x,y); //获得选择点坐标
}
}
public void OnMouseMove(int button, int shift, int x, int y)
{
// TODO: 添加 SelectFeature.OnMouseMove 实现
if(button==1)
{
if(m_FeedbackEnv==null)
{
m_FeedbackEnv=new NewEnvelopeFeedback(); //创建m_FeedbackEnv
m_FeedbackEnv.Display=m_MapControl.ActiveView.ScreenDisplay;
m_FeedbackEnv.Start(m_PointStart);
}
IPoint m_PointMoveTo; //拖框Envelope的移动点参数
m_PointMoveTo=m_MapControl.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);
m_FeedbackEnv.MoveTo(m_PointMoveTo); //移动形成拖框大小
}
}
public void OnMouseUp(int button, int shift, int x, int y)
{
// TODO: 添加 SelectFeature.OnMouseUp 实现
IEnvelope m_Env; //拖框对象返回的Envelope
if(button==1)
{
if(m_FeedbackEnv==null) //点选方式
{
// 用点对象生成缓冲区
double Length = ConvertPixelsToMapUnits(m_MapControl.ActiveView, 4);
IGeometry m_Geometry=m_PointStart;
ITopologicalOperator m_Topo = (ITopologicalOperator)m_Geometry;
IGeometry m_Buffer = m_Topo.Buffer(Length);
m_Geometry = (IGeometry)m_Buffer.Envelope;
// 使用空间过滤器查找
ISpatialFilter m_SpatialFilter = new SpatialFilter();
m_SpatialFilter.Geometry = m_Geometry;
for(int i=0;i<=m_MapControl.Map.LayerCount - 1;i++)
{
ILayer m_Layer=m_MapControl.Map.get_Layer(i);
IFeatureLayer m_FeatureLayer=(IFeatureLayer)m_MapControl.Map.get_Layer(i);
IFeatureClass m_FeatureClass;
m_FeatureClass=m_FeatureLayer.FeatureClass;
switch(m_FeatureClass.ShapeType)
{
case esriGeometryType.esriGeometryPoint:
m_SpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
break;
case esriGeometryType.esriGeometryPolyline:
m_SpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
break;
case esriGeometryType.esriGeometryPolygon:
m_SpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
break;
}
m_SpatialFilter.GeometryField = m_FeatureClass.ShapeFieldName;
IQueryFilter m_Filter = m_SpatialFilter;
// 使用游标查找
IFeatureCursor m_Cursor = m_FeatureLayer.Search(m_Filter, false);
// 添加要素为选择集
IFeature m_Feature = m_Cursor.NextFeature();
while (m_Feature != null)
{
m_MapControl.Map.SelectFeature(m_Layer, m_Feature);
m_Feature = m_Cursor.NextFeature();
}
}
m_PointStart=null;
}
else
{
m_Env = m_FeedbackEnv.Stop();
m_MapControl.Map.SelectByShape(m_Env,null,false); //拖框选择方式
m_FeedbackEnv=null;
}
}
m_MapControl.ActiveView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGeoSelection,null,null); //部分刷新(对选择集刷新)
}
public void OnKeyDown(int keyCode, int shift)
{
// TODO: 添加 SelectFeature.OnKeyDown 实现
}
public void OnKeyUp(int keyCode, int shift)
{
// TODO: 添加 SelectFeature.OnKeyUp 实现
}
public int Cursor
{
get
{
// TODO: 添加 SelectFeature.Cursor getter 实现
return 0;
}
}
public bool OnContextMenu(int x, int y)
{
// TODO: 添加 SelectFeature.OnContextMenu 实现
return false;
}
public bool Deactivate()
{
// TODO: 添加 SelectFeature.Deactivate 实现
return true; //返回true,保证对象注销时不报错
}
public void Refresh(int hdc)
{
// TODO: 添加 SelectFeature.Refresh 实现
}
public void OnDblClick()
{
// TODO: 添加 SelectFeature.OnDblClick 实现
}
#endregion
#region ICommand 成员
public void OnClick()
{
// TODO: 添加 SelectFeature.OnClick 实现
}
public string Message
{
get
{
// TODO: 添加 SelectFeature.Message getter 实现
return null;
}
}
public int Bitmap
{
get
{
// TODO: 添加 SelectFeature.Bitmap getter 实现
return 0;
}
}
public void OnCreate(object hook)
{
// TODO: 添加 SelectFeature.OnCreate 实现
m_MapControl=hook as AxMapControl; //工具创建时,设置地图控件对象
SelectEnvir=new ESRI.ArcGIS.Carto.SelectionEnvironmentClass();
SelectEnvir.SearchTolerance=5; //设置为5个地图显示单位
}
public string Caption
{
get
{
// TODO: 添加 SelectFeature.Caption getter 实现
return null;
}
}
public string Tooltip
{
get
{
// TODO: 添加 SelectFeature.Tooltip getter 实现
return null;
}
}
public int HelpContextID
{
get
{
// TODO: 添加 SelectFeature.HelpContextID getter 实现
return 0;
}
}
public string Name
{
get
{
// TODO: 添加 SelectFeature.Name getter 实现
return null;
}
}
public bool Checked
{
get
{
// TODO: 添加 SelectFeature.Checked getter 实现
return false;
}
}
public bool Enabled
{
get
{
// TODO: 添加 SelectFeature.Enabled getter 实现
return false;
}
}
public string HelpFile
{
get
{
// TODO: 添加 SelectFeature.HelpFile getter 实现
return null;
}
}
public string Category
{
get
{
// TODO: 添加 SelectFeature.Category getter 实现
return null;
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -