ArcGIS Engine基础(26)之IFeatureIndex2和IIndexQuery2实现查找某个点位置或者范围最近的要素

查找最近点位置,可以使用IProximityOperator 

查找最近点位置可以使用IProximityOperator 

 IProximityOperator pProximity = (IProximityOperator)pGeometry;

  IPoint pNearestPoint = pProximity.ReturnNearestPoint(pInputPoint,esriSegmentExtension.esriNoExtension);

该接口只是针对两个图形之间做关系操作,不能满足查找最近要素的需求。

本文采用对要素类建立空间索引IFeatureIndex(数据量大,建立索引可能会慢一些,较适用于多次查询的情况),利用索引查询IIndexQuery2的NearestFeature查找最近要素

 public static IFeature SnapNearestFeature(IFeatureClass p_FeatureClass, IEnvelope pExtent, IGeometry p_Geometry)
        {

            int o_fid = 0;
            double o_distance = 0;

            IGeoDataset f_GeoDataset = null;
            IFeature f_Feature = null;

            ITrackCancel f_TrackCancel = null;
            IFeatureIndex2 f_FeatureIndex = null;
            IIndexQuery2 f_IndexQuery = null;

            f_GeoDataset = (IGeoDataset)(p_FeatureClass);

            f_FeatureIndex = new FeatureIndexClass();
            f_TrackCancel = new CancelTrackerClass();
            f_IndexQuery = (IIndexQuery2)(f_FeatureIndex);
            f_FeatureIndex.FeatureClass = p_FeatureClass;

            //建立空间过滤器,缩小索引查询范围(如果需要)
            ISpatialFilter mSpatialFilter = new SpatialFilterClass();;
            mSpatialFilter.Geometry = (IGeometry)(pExtent);
            mSpatialFilter.GeometryField = p_FeatureClass.ShapeFieldName;
            mSpatialFilter.set_OutputSpatialReference(p_FeatureClass.ShapeFieldName, f_GeoDataset.SpatialReference);
            mSpatialFilter.SpatialRel = ESRI.ArcGIS.Geodatabase.esriSpatialRelEnum.esriSpatialRelIntersects;
            try
            {
                
                f_FeatureIndex.FeatureCursor = p_FeatureClass.Search(mSpatialFilter, false);
            }
            catch (System.Exception mexp)
            {
                System.Console.WriteLine(mexp.Message);
            }

            p_Geometry.SpatialReference = f_GeoDataset.SpatialReference;
            //设置索引查询输出坐标系
            f_FeatureIndex.set_OutputSpatialReference(p_FeatureClass.ShapeFieldName, f_GeoDataset.SpatialReference);
            try
            {
                //建立索引
                f_FeatureIndex.Index(f_TrackCancel, pExtent);
                //查询最近要素
                f_IndexQuery.NearestFeature(p_Geometry, out o_fid, out o_distance);
                f_Feature = p_FeatureClass.GetFeature(o_fid);
            }
            catch (System.Exception mexp2)
            {
                f_Feature = null;
                System.Console.WriteLine(mexp2.Message);
            }


            return f_Feature;

        }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xizhjxust_GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值