arcengine 缓冲区查询 (ITopologicalOperator ISpatialFilter接口 )

来源:互联网 发布:mysql创建存储过程例子 编辑:程序博客网 时间:2024/05/22 01:49

参考1

缓冲区查询特别有用,也很方便,照着别人的自己写了一个,记录一下。

缓冲区查询主要用到的核心接口就两个,ITopologcialOperator和ISpatialFilter这两个接口。第一个接口用来构建缓冲区和进行其他的拓扑操作,第二个接口是空间过滤器,其中提供空间查询的各种关系。这两个接口还有很多其他属性和方法,用到时自行查看帮助。
一下是缓冲区查询的核心代码,当然之前必须指定查找的目标图层和建立缓冲区的图层和对象。
                IGeometry pGeometry = TestFeature.Shape;
                ITopologicalOperator pTopologicalOperator = pGeometry as ITopologicalOperator;
                pGeometry = pTopologicalOperator.Buffer(Distence);//Distence是缓冲距离
                pTopologicalOperator.Simplify();
                ISpatialFilter pSpatialfilter = new SpatialFilterClass();
                pSpatialfilter.Geometry = pGeometry;
                pSpatialfilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                pSpatialfilter.GeometryField = "Shape";
                ILayer pLayer = this.axMCl1.get_Layer(0);
                IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
                IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
                IFeatureCursor FeatureCursor = pFeatureClass.Search(pSpatialfilter, false);
                IFeature Feature = FeatureCursor.NextFeature();


参考2

  //开始点选查询
                        IMap pMap;
                        pMap = axMapControl1.Map as IMap;

                        //获取点图层
                        IFeatureLayer pFeatureLayer;
                        pFeatureLayer = pMap.get_Layer(i) as IFeatureLayer;
                        IFeatureClass pFeatureClass;
                        pFeatureClass = pFeatureLayer.FeatureClass;

                        //获取鼠标点击点
                        IPoint pPoint;
                        pPoint = new PointClass();
                        pPoint.PutCoords(e.mapX, e.mapY);

                        IGeometry pGeometry;

                        //定义缓冲区
                        double db = 2;
                        ITopologicalOperator pTop;
                        pTop = pPoint as ITopologicalOperator;
                        pGeometry = pTop.Buffer(db);

                        //选取
                        pMap.SelectByShape(pGeometry, null, false);
                        pMap.ClearSelection();

                        //空间过滤运算
                        ISpatialFilter pSpatialFilter = new SpatialFilterClass();
                        pSpatialFilter.Geometry = pGeometry;


                        //设置为不同的要素类型的图层
               
                    
                        switch (pFeatureClass.ShapeType)
                        {
                            case esriGeometryType.esriGeometryPoint:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                                break;
                            case esriGeometryType.esriGeometryPolyline:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;
                                break;
                            case esriGeometryType.esriGeometryPolygon:
                                pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
                                break;

                        }
                        pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;

                        //指针
                        IFeatureCursor pFeatureCursor;
                        pFeatureCursor = pFeatureClass.Search(pSpatialFilter, false);
                        IFeature pFeature;
                        pFeature = pFeatureCursor.NextFeature();

                        //开始遍历
                        while (pFeature != null)
                        {

                            //获取要素的字段名和字段值
                            int n = pFeature.Fields.FieldCount;
                            string sName;
                            string sValue;


                            //这句话的对象需要随着地图的改变而改变。可以是ID,FID 等带有唯一标识身份的 东西。
                            int index = pFeature.Fields.FindField("ObjectID");
                            if (index == -1)
                                return;
                            IField pField = pFeature.Fields.get_Field(index);
                            sName = pField.Name;

                            sValue = pFeature.get_Value(index).ToString();


                            pDataRow = pDataTable.NewRow();

                            //之所以这样赋值是为了保证ID的唯一性;
                            pDataRow["ID"] = lyrName + sValue;
                            pDataRow["Name"] = sValue;
                            pDataRow["ParentID"] = lyrName;
                            pDataTable.Rows.Add(pDataRow);

                            pFeature = pFeatureCursor.NextFeature();

                        }
                        //这个是师兄交的,指针等占内存的东西在用完之后一定要释放;!!!
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
                    }
                  


0 0
原创粉丝点击