⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectfeature.cs

📁 C#+arcengine的一个适量数据编辑系统
💻 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 + -