IEnvelope如何使用

本文介绍了IEnvelope接口在地理信息系统中的作用及其属性与方法。IEnvelope用于定义地物的外接矩形,便于快速检索和判断地物之间的拓扑关系。文章详细解释了IEnvelope的各种属性如XMax、XMin、YMax、YMin以及Height和Width,并提供了多种方法的使用说明,例如Union、Intersect和Expand等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IEnvelope是指地物的外接矩形,用来表示地物图形的大体位置和形状,一般可用于检索地物,判断地物间的拓扑关系,可以使得检索、判断的速度加快,因为有了IEnvelope,可以首先判断该外接矩形是否在检索范围内,而判断一个外接矩形是比较简单的。


另:

 Envelope也称包络线,是一个矩形区域,是每个几何形体的最小外接矩形。每个Geometry都拥有一个Envelope,包括Envelope自身。IEnv是包络线对象的主要接口,定义了XMax、XMin、YMax、YMin、Height和Width等属性,用于获取或设置一个存在的包络线对象的空间坐标。IEnvelope接口也提供了一些方法,如Expand、offset、CenterAt、PutCoords等。Expand方法用于按比例缩放包络线的范围,产生一个新的包络线对象;offset是一个偏移方法,通过一个给定的(X,y)移动包络线;CenterAt方法则通过改变包络线的中心点来移动包络线;PutCoords方法饿公国指定的坐标点来构造包络线。


接口的属性和方法:

IEnvelope接口的长宽属性Height和Width属性(读写,可以通过该属性获取或设置该边框的长和宽)

IEnvelope接口的4个顶点属性UpperLeft、UpperRight、LowerLeft和LowerRight(读写,返回IPoint类型的四个顶点,比直接获得最值坐标更加方便严谨)

IEnvelope接口的最值坐标属性XMax、XMin、YMax和YMin(读写,可以通过该属性获取或设置该边框的四个顶点的坐标)



IEnvelope接口的CenterAt(pPoint) (方法,将这个矩形的边框移动到参数pPoint的位置,但是其他属性不变,如它的Width和Height)

IEnvelope接口的Union (inEnvelope ) (方法,将参数输入的几何边框和调用该方法的几何边框求并集,并将结果赋值给第一个边框,即调用此方法的object)

IEnvelope接口的Intersect (inEnvelope ) (方法,返回与输入参数相交的区域的几何边框,并将结果赋值给第一个边框,即调用此方法的object)

IEnvelope接口的PutCoords (XMin, YMin,XMax,YMax) (方法,将新建的一个边框的4个极坐标设置为输入的参数)

IEnvelope接口的QueryCoords (XMin, YMin,XMax,YMax)(方法,将已有的一个边框的4个极坐标输出到参数当中以备后用)

IEnvelope接口的Expand (dx, dy, asRatio) (方法,按照输入的dx与dy参数来放大或者缩小当前的边框,用与对ArcMap窗体的中心放大或缩小,或者点击屏幕获得点击点的坐标,并将中心点设置成点击点,并进行一定比例的放大或者缩小)

IEnvelope接口的Offset (X, Y) (方法,将已有的一个边框的按照输入参数的大小来进行水平竖直的移动)


详细见:http://www.3sfield.com/content.php?id=314


另外Expand例子见【http://www.cnblogs.com/gisser/archive/2010/08/21/1805419.html】

<think>我们之前已经提供了四种空间选择方法的代码,现在需要说明如何在实际的ArcEngine项目中调用这些方法。 通常,这些方法会与地图控件(如MapControl)的鼠标事件结合使用,让用户在地图上绘制相应的几何图形(矩形、圆形、多边形、折线),然后根据绘制的图形进行选择。 下面我们将分步骤说明如何实现: 1. 在菜单项点击事件中设置当前的操作模式(如矩形选择、圆形选择等),并开始绘制。 2. 使用MapControl的绘图事件(如OnMouseDown, OnMouseMove, OnMouseUp)来绘制几何图形。 3. 在绘图完成后,调用上述空间选择方法。 由于ArcEngine提供了ToolbarControl和MapControl等控件,我们可以使用ITool接口来实现绘图工具。但为了更直接地展示,这里我们使用MapControl的鼠标事件来实现绘图。 注意:在实际开发中,我们可能会创建自定义工具(继承自ESRI.ArcGIS.Controls.BaseTool),但这里为了简化,直接在Form中处理鼠标事件。 以下是详细的步骤和代码示例: 步骤1:在窗体类中定义一些变量来跟踪绘图状态和几何图形。 步骤2:在菜单项点击事件中设置当前的绘图模式。 步骤3:在MapControl的鼠标事件中绘制几何图形,并在完成时进行选择。 由于代码较长,我们将分别实现四个选择方法对应的绘图和选择过程。 首先,在窗体类中声明以下变量:</think># ArcEngine 空间选择功能实现指南 下面我将详细说明如何在 ArcEngine 项目中实际使用上述空间选择代码,包括完整的集成步骤和示例代码。 ## 完整实现方案 ### 1. 项目设置与引用 首先确保在 VS2010 项目中添加了必要的 ArcEngine 引用: - ESRI.ArcGIS.Carto - ESRI.ArcGIS.Geometry - ESRI.ArcGIS.Display - ESRI.ArcGIS.System ### 2. 主窗体代码实现 ```csharp using System; using System.Windows.Forms; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Controls; namespace GISApplication { public partial class MainForm : Form { private IMapControl3 m_mapControl; private SpatialSelector m_spatialSelector; private DrawMode m_currentDrawMode = DrawMode.None; private IPoint m_startPoint; private bool m_isDrawing = false; private IRubberBand m_rubberBand; private IGeometry m_currentGeometry; public MainForm() { InitializeComponent(); InitializeMapControl(); InitializeSpatialSelector(); } private void InitializeMapControl() { // 初始化地图控件 axMapControl1.ActiveView.GiveFeedback += ActiveView_GiveFeedback; axMapControl1.OnMouseDown += AxMapControl1_OnMouseDown; axMapControl1.OnMouseMove += AxMapControl1_OnMouseMove; axMapControl1.OnMouseUp += AxMapControl1_OnMouseUp; m_mapControl = (IMapControl3)axMapControl1.Object; } private void InitializeSpatialSelector() { m_spatialSelector = new SpatialSelector(m_mapControl); } // 菜单项点击事件处理 private void rectangleToolStripMenuItem_Click(object sender, EventArgs e) { m_currentDrawMode = DrawMode.Rectangle; Cursor = Cursors.Cross; } private void circleToolStripMenuItem_Click(object sender, EventArgs e) { m_currentDrawMode = DrawMode.Circle; Cursor = Cursors.Cross; } private void polygonToolStripMenuItem_Click(object sender, EventArgs e) { m_currentDrawMode = DrawMode.Polygon; Cursor = Cursors.Cross; } private void polylineToolStripMenuItem_Click(object sender, EventArgs e) { m_currentDrawMode = DrawMode.Polyline; Cursor = Cursors.Cross; } // 地图控件鼠标事件处理 private void AxMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e) { if (m_currentDrawMode == DrawMode.None) return; m_startPoint = new PointClass(); m_startPoint.PutCoords(e.mapX, e.mapY); m_isDrawing = true; switch (m_currentDrawMode) { case DrawMode.Rectangle: m_rubberBand = new RubberEnvelopeClass(); break; case DrawMode.Circle: m_rubberBand = new RubberCircleClass(); break; case DrawMode.Polygon: m_rubberBand = new RubberPolygonClass(); break; case DrawMode.Polyline: m_rubberBand = new RubberLineClass(); break; } m_rubberBand.Display = axMapControl1.ActiveView.ScreenDisplay; m_currentGeometry = m_rubberBand.TrackNew(axMapControl1.ActiveView.ScreenDisplay, null); } private void AxMapControl1_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e) { if (!m_isDrawing) return; // 实时更新绘制状态 axMapControl1.ActiveView.ScreenDisplay.UpdateWindow(); } private void AxMapControl1_OnMouseUp(object sender, IMapControlEvents2_OnMouseUpEvent e) { if (!m_isDrawing) return; m_isDrawing = false; // 执行空间选择 switch (m_currentDrawMode) { case DrawMode.Rectangle: m_spatialSelector.SelectByRectangle((IEnvelope)m_currentGeometry); break; case DrawMode.Circle: IPoint center = new PointClass(); center.PutCoords(e.mapX, e.mapY); double radius = GetDistance(m_startPoint, center); m_spatialSelector.SelectByCircle(center, radius); break; case DrawMode.Polygon: m_spatialSelector.SelectByPolygon((IPointCollection)m_currentGeometry); break; case DrawMode.Polyline: m_spatialSelector.SelectByPolyline((IPointCollection)m_currentGeometry); break; } // 重置绘图状态 m_currentDrawMode = DrawMode.None; Cursor = Cursors.Default; } // 辅助方法:计算两点距离 private double GetDistance(IPoint p1, IPoint p2) { double dx = p2.X - p1.X; double dy = p2.Y - p1.Y; return Math.Sqrt(dx * dx + dy * dy); } } // 绘图模式枚举 public enum DrawMode { None, Rectangle, Circle, Polygon, Polyline } } ``` ### 3. SpatialSelector 类实现 ```csharp public class SpatialSelector { private IMapControl3 m_mapControl; private ISelectionEnvironment m_selectionEnv; public SpatialSelector(IMapControl3 mapControl) { m_mapControl = mapControl; InitializeSelectionEnvironment(); } private void InitializeSelectionEnvironment() { m_selectionEnv = new SelectionEnvironmentClass(); IRgbColor blueColor = new RgbColorClass(); blueColor.Red = 0; blueColor.Green = 0; blueColor.Blue = 255; m_selectionEnv.DefaultColor = blueColor; } public void SelectByRectangle(IEnvelope envelope) { try { IFeatureLayer featureLayer = GetTargetLayer(); if (featureLayer == null) return; IInteractiveSelection interactiveSelection = (IInteractiveSelection)featureLayer; interactiveSelection.SelectByShape( (IGeometry)envelope, m_selectionEnv, esriSelectionResultEnum.esriSelectionResultNew, false ); RefreshMap(); } catch (Exception ex) { MessageBox.Show($"矩形选择错误: {ex.Message}"); } } public void SelectByCircle(IPoint center, double radius) { try { ICircularArc circularArc = new CircularArcClass(); circularArc.PutCoordsByAngle(center, radius, 0, 2 * Math.PI); IGeometryCollection geomColl = new PolygonClass(); geomColl.AddGeometry((IGeometry)circularArc, null, null); IPolygon circle = (IPolygon)geomColl; circle.Close(); IFeatureLayer featureLayer = GetTargetLayer(); if (featureLayer == null) return; IInteractiveSelection interactiveSelection = (IInteractiveSelection)featureLayer; interactiveSelection.SelectByShape( circle, m_selectionEnv, esriSelectionResultEnum.esriSelectionResultNew, false ); RefreshMap(); } catch (Exception ex) { MessageBox.Show($"圆形选择错误: {ex.Message}"); } } public void SelectByPolygon(IPointCollection points) { try { IPolygon polygon = new PolygonClass(); polygon.SpatialReference = m_mapControl.SpatialReference; polygon.AddPointCollection(points); IFeatureLayer featureLayer = GetTargetLayer(); if (featureLayer == null) return; IInteractiveSelection interactiveSelection = (IInteractiveSelection)featureLayer; interactiveSelection.SelectByShape( (IGeometry)polygon, m_selectionEnv, esriSelectionResultEnum.esriSelectionResultNew, false ); RefreshMap(); } catch (Exception ex) { MessageBox.Show($"多边形选择错误: {ex.Message}"); } } public void SelectByPolyline(IPointCollection points) { try { IPolyline polyline = new PolylineClass(); polyline.SpatialReference = m_mapControl.SpatialReference; polyline.AddPointCollection(points); IFeatureLayer featureLayer = GetTargetLayer(); if (featureLayer == null) return; IInteractiveSelection interactiveSelection = (IInteractiveSelection)featureLayer; interactiveSelection.SelectByShape( (IGeometry)polyline, m_selectionEnv, esriSelectionResultEnum.esriSelectionResultNew, false ); RefreshMap(); } catch (Exception ex) { MessageBox.Show($"折线选择错误: {ex.Message}"); } } private void RefreshMap() { IActiveView activeView = (IActiveView)m_mapControl.Map; activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); } private IFeatureLayer GetTargetLayer() { // 实际项目中应提供图层选择功能 // 这里简单返回第一个可编辑的要素图层 for (int i = 0; i < m_mapControl.LayerCount; i++) { ILayer layer = m_mapControl.get_Layer(i); if (layer is IFeatureLayer featureLayer && featureLayer.FeatureClass != null) { return featureLayer; } } MessageBox.Show("未找到有效的要素图层"); return null; } } ``` ### 4. 使用步骤详解 1. **项目初始化**: - 创建 Windows Forms 应用程序 - 添加 ESRI MapControl 到窗体 - 添加菜单栏(包含矩形、圆形、多边形、折线选择项) 2. **功能集成**: - 将 `MainForm` 和 `SpatialSelector` 类添加到项目中 - 在窗体设计器中添加菜单项并绑定点击事件 3. **图层准备**: - 在 MapControl 中添加至少一个要素图层(如 Shapefile 或 GDB 要素类) - 确保图层可编辑且支持选择操作 4. **操作流程**: ```mermaid graph TD A[用户点击菜单项] --> B[设置当前绘图模式] B --> C[用户在地图上绘制图形] C --> D[鼠标释放时触发选择] D --> E[创建几何对象] E --> F[执行空间选择] F --> G[高亮显示结果] ``` ### 5. 关键功能说明 1. **绘图交互**: - 使用 `IRubberBand` 接口实现实时绘制反馈 - 不同几何类型使用不同的橡皮筋类: - `RubberEnvelopeClass`:矩形 - `RubberCircleClass`:圆形 - `RubberPolygonClass`:多边形 - `RubberLineClass`:折线 2. **选择逻辑**: - 所有选择方法都通过 `SelectByShape` 实现 - 使用 `esriSelectionResultNew` 参数清除之前的选中状态 - 设置 `false` 参数表示不使用选择缓存 3. **性能优化**: - 使用 `PartialRefresh` 仅刷新选择部分 - 空间参考一致性处理避免坐标转换开销 - 异常处理确保程序稳定性 ### 6. 实际应用示例 ```csharp // 在窗体加载时添加图层 private void MainForm_Load(object sender, EventArgs e) { // 添加示例图层 string shpPath = @"C:\Data\Cities.shp"; axMapControl1.AddShapeFile(Path.GetDirectoryName(shpPath), Path.GetFileName(shpPath)); // 缩放到图层范围 axMapControl1.Extent = axMapControl1.get_Layer(0).AreaOfInterest; } ``` ### 7. 常见问题解决 1. **选择结果不显示**: - 检查图层是否支持选择(`IFeatureLayer` 接口) - 确认 `PartialRefresh` 参数为 `esriViewGeoSelection` - 验证选择颜色是否设置正确 2. **几何创建错误**: - 确保所有几何对象都设置了正确的空间参考 - 多边形必须闭合(使用 `Close` 方法) - 验证几何坐标是否在图层范围内 3. **性能问题**: - 大数据量时考虑使用空间索引 - 使用 `ISpatialFilter` 替代交互式选择 - 限制选择要素数量(设置最大选择数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值