首页 > 代码库 > 查询矩形范围内的"点"要素
查询矩形范围内的"点"要素
步骤
1,首先在含有主视图控件 ESRI.ArcGIS.Controls.AxMapControl mapCtrl_main 的主类中定义一个 IEnvelope 成员变量,用于记录鼠标在主视图控件画好的轮廓
1 private ESRI.ArcGIS.Geometry.IEnvelope mainInvelope = null; //(主视图上)2 public ESRI.ArcGIS.Geometry.IEnvelope MainInvelopeValue {3 get {4 return mainInvelope;5 }6 }
并设置成外界可访问的属性.
2,在该类中定义一bool变量,以控制查询
1 private bool startMainInvelope = false; //标识在主视图上画轮廓矩形,以进行该范围内点查询.
3,在 mapCtrl_main 的 onm ouseDown 响应事件中,控制轮廓的顺畅画好
1 if (1 == e.button && startMainInvelope) { //在主视图上画轮廓. 2 mainInvelope = mapCtrl_main.TrackRectangle(); 3 try { 4 if (!mainInvelope.IsEmpty) 5 Engine.App_Code.Draw.DrawSymbol(mapCtrl_main.Map, mainInvelope); 6 } 7 catch (System.Exception ex) { 8 MessageBox.Show(ex.Message); 9 }10 }
其中用到画轮廓的辅助方法定义为:
1 /// <summary> 2 /// 画轮廓. 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e">根据IEnvelope对象画轮廓.</param> 6 public static void DrawSymbol(ESRI.ArcGIS.Carto.IMap map, ESRI.ArcGIS.Geometry.IEnvelope e) { 7 ESRI.ArcGIS.Carto.IGraphicsContainer hawkGC = (ESRI.ArcGIS.Carto.IGraphicsContainer)map; 8 ESRI.ArcGIS.Carto.IActiveView aView = (ESRI.ArcGIS.Carto.IActiveView)hawkGC; 9 hawkGC.DeleteAllElements();10 11 ESRI.ArcGIS.Carto.IElement recEle = (ESRI.ArcGIS.Carto.IElement)new ESRI.ArcGIS.Carto.RectangleElementClass();12 recEle.Geometry = e;13 ESRI.ArcGIS.Display.ISimpleLineSymbol outLine = new ESRI.ArcGIS.Display.SimpleLineSymbolClass();14 outLine.Color = ColorPaint(255, 255);15 outLine.Width = 2;16 17 //填充样式.18 ESRI.ArcGIS.Display.ISimpleFillSymbol fillSym = new ESRI.ArcGIS.Display.SimpleFillSymbolClass();19 fillSym.Color = ColorPaint(255, 0);20 fillSym.Outline = outLine;21 22 ESRI.ArcGIS.Carto.IFillShapeElement fillShape = (ESRI.ArcGIS.Carto.IFillShapeElement)recEle;23 fillShape.Symbol = fillSym;24 hawkGC.AddElement((ESRI.ArcGIS.Carto.IElement)fillShape, 0);25 aView.PartialRefresh(ESRI.ArcGIS.Carto.esriViewDrawPhase.esriViewGraphics, null, null);26 }
4,在查询窗口中,用 GetLayerByName 方法定位好待查询的点要素图层(方法定义为)
1 /// <summary> 2 /// 根据图层名获取图层. 3 /// </summary> 4 /// <param name="map"></param> 5 /// <param name="layerName">图层名称.</param> 6 /// <returns></returns> 7 public static ESRI.ArcGIS.Carto.ILayer GetLayerByName(ESRI.ArcGIS.Carto.IMap map, string layerName) { 8 ESRI.ArcGIS.Carto.IEnumLayer enunLayer = map.get_Layers(null, false); 9 enunLayer.Reset();10 ESRI.ArcGIS.Carto.ILayer resultLayer = null;11 while ((resultLayer = enunLayer.Next()) != null) {12 if (resultLayer.Name.Equals(layerName)) {13 break;14 }15 }16 return resultLayer;17 }
5,查询窗口实现查询的所有代码:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace Engine {11 public partial class fQueryInvelopePoints : Form {12 private ESRI.ArcGIS.Carto.IMap map = null;13 private fMain fMain = null;14 public fQueryInvelopePoints(fMain fMain, ESRI.ArcGIS.Carto.IMap map) {15 this.fMain = fMain;16 this.map = map;17 InitializeComponent();18 }19 20 /// <summary>21 /// 查询指定矩形范围内的点要素.22 /// </summary>23 /// <param name="envelope">指定的矩形范围.</param>24 /// <param name="featureClass">待查询的要素.</param>25 /// <returns>返回结果的游标</returns>26 public ESRI.ArcGIS.Geodatabase.IFeatureCursor GetAllFeaturesFromPointSearchInGeoFeatureLayer(ESRI.ArcGIS.Geometry.IEnvelope envelope, ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass) {27 if (featureClass == null)28 return null;29 ESRI.ArcGIS.Geodatabase.ISpatialFilter spatialFilter = new ESRI.ArcGIS.Geodatabase.SpatialFilterClass();30 spatialFilter.Geometry = envelope;31 spatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelEnvelopeIntersects;32 spatialFilter.GeometryField = featureClass.ShapeFieldName;33 return featureClass.Search(spatialFilter, false);34 }35 36 private void fQueryInvelopePoints_Load(object sender, EventArgs e) {37 Engine.App_Code.Layer_Assist.InitLayers(map, cbox_layer);38 }39 40 private void btn_query_Click(object sender, EventArgs e) {41 lsbox.Items.Clear(); //清空原始数据.42 ESRI.ArcGIS.Carto.ILayer lyr = Engine.App_Code.Layer_Assist.GetLayerByName(map, cbox_layer.Text);43 if (lyr is ESRI.ArcGIS.Carto.IFeatureLayer) { //矢量数据.44 ESRI.ArcGIS.Carto.IFeatureLayer fLyr = (ESRI.ArcGIS.Carto.IFeatureLayer)lyr;45 ESRI.ArcGIS.Geometry.IEnvelope selEnvelope = fMain.MainInvelopeValue;46 //获取矩形范围内的要素.47 ESRI.ArcGIS.Geodatabase.IFeatureCursor fCur = GetAllFeaturesFromPointSearchInGeoFeatureLayer(selEnvelope, fLyr.FeatureClass);48 ESRI.ArcGIS.Geodatabase.IFeatureClass fc = fLyr.FeatureClass;49 ESRI.ArcGIS.Geodatabase.IFeature f = null;50 string v = "";51 string k = "";52 k = "name";53 fMain.mapCtrl_main.ActiveView.Refresh(); //高亮显示前.54 try {55 while ((f = fCur.NextFeature()) != null) {56 map.SelectFeature(fLyr, f); //高亮显示.57 v = Convert.ToString(f.get_Value(f.Fields.FindField("name")));58 lsbox.Items.Add(k + " : " + v);59 }60 }61 catch (System.Exception ex) {62 MessageBox.Show(ex.Message + "不支持查询的图层或查询字段错误:NAME");63 }64 fMain.mapCtrl_main.ActiveView.Refresh(); //高亮显示后.65 }66 }67 }68 }
6,运行时,画好矩形轮廓后,在主视图控件类中调用即可:
1 if (mainInvelope == null || mainInvelope.IsEmpty) { 2 MessageBox.Show("画轮廓为空"); 3 return; 4 } 5 if (fInvelopePoints == null) 6 fInvelopePoints = new fQueryInvelopePoints(this, mapCtrl_main.Map); 7 fInvelopePoints.FormClosed += (s, ea) => { 8 fInvelopePoints = null; 9 };10 fInvelopePoints.Show(this);
其中 fInvelopePoints 为定义在主视图类中的查询窗口的成员变量:
1 //查询窗口.2 private fQueryInvelopePoints fInvelopePoints = null;
附
在主视图中画矩形轮廓如图:
查询后,弹出查询结果如图:
查询矩形范围内的"点"要素
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。