Arcgis Engine 二次开发之空间查询

一、空间查询实现思路

通过主界面将MapControl传到空间查询的界面,用户可以通过“选择图层”的下拉框选择不同的图层,再选择“空间关系”,目前有的为相交、包含、穿越、接触,用户可以再点击不同的图形直接在地图上进行画框查询,若查询出结果,在地图上高亮显示,系统会自动弹出属性表框,用户可以直接查看所选要素的相关信息。
在这里插入图片描述

二、空间查询流程图

在这里插入图片描述

三、关键代码

1、选择图层
代码与属性查询相同

2、选择空间关系方法:

public esriSpatialRelEnum getSpatialRel()
        {
            if (cobSRel.SelectedIndex == 0)
            {
                return (esriSpatialRelEnum)1;
            }
            else if (cobSRel.SelectedIndex == 1)
            {
                return (esriSpatialRelEnum)8;
            }
            else if (cobSRel.SelectedIndex ==2)
            {
                return (esriSpatialRelEnum)6;
            }
            else if (cobSRel.SelectedIndex == 3)
            {
                return (esriSpatialRelEnum)4;
            }
            else
            {
                return (esriSpatialRelEnum)1;
            }
        }

3、点击图形时,设置一个值,在主界面获得值:

  private void button1_Click(object sender, EventArgs e)
    {
        Flag = 2;
    }
    private void button5_Click(object sender, EventArgs e)
    {
        Flag = 3;
    }
    private void button2_Click(object sender, EventArgs e)
    {
        Flag = 4;
    }
    private void button3_Click(object sender, EventArgs e)
    {
        Flag = 5;
    }
    private void button4_Click(object sender, EventArgs e)
    {
        Flag = 6;
    }
    public int setFlag()
    {
        return Flag;
    }

4、主界面axMapControl1_OnMouseDown事件,当空间查询框弹出来时,进行判断,获得空间查询选择的图层,以及设置的Flag值:
代码如下:

if (psQ != 1)
            {
                if (!pspatialQueryForm.IsDisposed)
                {
                    ISpatialFilter pSpatialFilter = new SpatialFilter();
                    IGeometry geometry = null;
                    flag = pspatialQueryForm.setFlag();//获得窗体传来的flag值

                    IFeatureLayer pFeatureLayer = pspatialQueryForm.SelectLayer();//获得需要查询的图层
                    IFeatureSelection pFeatureSelection = pFeatureLayer as IFeatureSelection;
                    //根据flag值获得geometry
                    switch (flag)
                    {
                        case 2:
                            ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();
                            point.PutCoords(e.mapX, e.mapY);
                            geometry = point as IGeometry;
                            break;
                        case 3:
                            geometry = axMapControl1.TrackLine();
                            break;
                        case 4:
                            geometry = axMapControl1.TrackRectangle();
                            break;
                        case 5:
                            geometry = axMapControl1.TrackCircle();
                            break;
                        case 6:
                            geometry = axMapControl1.TrackPolygon();
                            break;
                        default:
                            ESRI.ArcGIS.Geometry.IPoint point1 = new ESRI.ArcGIS.Geometry.PointClass();
                            point1.PutCoords(e.mapX, e.mapY);
                            geometry = point1 as IGeometry;
                            break;
                    }
                    //将geometry赋给pSpatialFilter
                    pSpatialFilter.Geometry = geometry;
                    //设置空间关系(从空间查询窗体获得)
                    pSpatialFilter.SpatialRel = pspatialQueryForm.getSpatialRel();
                    List<IFeature> pFeatures = new List<IFeature>();//框选的数据集
                    List<IFeature> pFeatureFr = new List<IFeature>();//框选的数据集
                    try
                    {
                        IFeatureCursor featureCursor = pFeatureLayer.Search(pSpatialFilter, false);
                        IFeature pFeature;
                        pFeatureSelection.CombinationMethod = esriSelectionResultEnum.esriSelectionResultNew;
                        while ((pFeature = featureCursor.NextFeature()) != null)
                        {
                            pFeatureSelection.Add(pFeature);
                            axMapControl1.Refresh();
                            
                            pFeatures.Add(pFeature);//将高亮显示的要素在属性表中展示出来
                        }
                        pFeatureFr = pFeatures;
                        //将高亮显示的要素在属性表中展示出来
                        if (pFeatureFr.Count!=0)
                        {
                            FrmAttribute frm = new FrmAttribute(pFeatures);
                            frm.Show();
                        }
                        //pFeatureFr = null;
                    }
                    catch (Exception pException)
                    {
                        MessageBox.Show(pException.Message);
                    }
                }
                

四、注意事项

空间查询和属性查询的原理差不多,核心代码实现并不是很困难,但是在两个窗体之间互相传值,在主界面中点击地图进行操作时,会出现很多问题,在关掉空间查询窗体时,在点击主界面的地图会报错,无法正确根据空间关系查询出结果等,最后在多次调试下,添加全局变量和利用pspatialQueryForm.IsDisposed解决了这个问题。

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值