Arcgis Engine(ae)接口详解(2):featureClass查询

//属性查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    //IQueryFilter表明查询条件,QueryFilterClass表明只限于属性查询(就是没有空间查询)
                    IQueryFilter queryFilter = new QueryFilterClass();
                    //属性查询的条件,跟sql语句where部分格式相似,但不完成相同,格式在开发手册有额外的补充
                    queryFilter.WhereClause = "name='张三'";

                    //获取某个字段的索引,后面取字段值用到
                    int xxxFieldIdx = featureClass.FindField("xxx");

                    //进行查询,获取到的IFeatureCursor是查询结果的游标,可经过游标获取到查询结果内容

                    //Search方法第一个参数设为null就是查询全部数据,也就是不过滤

                    //参数2是是否自动回收要素
                    //当值为true,也就是遍历要素速度会更快,缺点是不能访问上一次循环的feature
                    //当值为false,遍历速度相对慢些,但能够访问上一次循环的feature
                    //关于什么是上一次循环的feature?游标遍历要素是经过featureCursor.NextFeature(),每一次NextFeature就返回下一条要素
                    IFeatureCursor featureCursor = featureClass.Search(queryFilter, true);
                    IFeature feature = null;
                    //遍历查询结果的全部要素,使用while循环
                    //游标每次NextFeature就会返回结果的下一条要素,若是遍历完了就会返回null
                    //所以下一句其实包含了两句代码,首先是NextFeature获取到下一条要素,实际上是判断feature是否为null做为判断是否遍历彻底部结果要素
                    while ((feature = featureCursor.NextFeature()) != null)
                    {
                        //获取属性字段的字段值
                        //xxxFieldIdx表明字段索引
                        //获取到的值都是object类型,但实际上字段类型各有不一样,edm提供了类型转换类方便进行类型转换,下例是把值转换为string
                        string fieldValue = DataConvert.ObjToString(feature.Value[xxxFieldIdx]);

                        //获取几何字段的值
                        //由于一条要素有且只有一个几何字段,因此也不用再传入字段索引
                        //获取几何对象有Shape和ShapeCopy,关于他们的区别,官方文档是这么说的:
                        //When modifying the geometry of a feature or a set of features, use the ShapeCopy property to obtain a copy of the feature's geometry, perform the modification on the geometries, then apply the modifications by setting the geometry to the Shape property
                        //大意是若是你要修改feature的shape,那就先用ShapeCopy获取到几何对象,修改几何对象后,再经过Shape属性赋值回去
                        IGeometry geometry = feature.Shape;
                        IGeometry geometry2 = feature.ShapeCopy;

                        //获取feature的oid
                        //oid能够做为feature的惟一标识
                        int oid = feature.OID;
                    }

                    //释放游标,注意不能漏!!!!
                    //ae的对象大部分是不用手动释放的,游标是少数的例外
                    //不释放游标,可能会形成后续查询变慢,数据被锁等各类奇怪现象,因此强烈建议用完就释放
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursor);


                    //空间查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    //geometryFilter表明做为查询条件的结合对象,因为这里没有数据,因此只是给null值,
                    IGeometry geometryFilter = null;

                    //ISpatialFilter表明查询条件,SpatialFilterClass表明空间查询过滤,但实际也包含了属性查询的过滤功能,能够同时进行空间和属性过滤
                    ISpatialFilter spatialFilter = new SpatialFilterClass();
                    //做为过滤条件的几何对象
                    //PS:过滤条件的几何对象的空间参考和被查询featureClass的空间参考要同样,不然极可能查询出错
                    spatialFilter.Geometry = geometryFilter;
                    //空间关系,Intersect表明重叠,Intersect意思是只要有一点重叠的地方就为true
                    //关于其余的空间关系,在开发手册有详细说明
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

                    //查询和遍历结果要素跟属性查询同样,再也不说明
                    featureCursor = featureClass.Search(spatialFilter, true);
                    feature = null;
                    while ((feature = featureCursor.NextFeature()) != null)
                    {

                    }

                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(featureCursor);


                    //属性或空间查询,获取查询结果记录数量
                    IQueryFilter queryFilter2 = new QueryFilterClass();
                    queryFilter2.WhereClause = "name='张三'";
                    //filter部分跟上述的查询同样
                    int count = featureClass.FeatureCount(queryFilter2);

                    //一些其余获取要素的方法

                    //经过oid获取要素
                    //因为oid能够做为要素的惟一标识,所以能够经过一个oid获取一条要素
                    //获取大量要素不建议用这个,由于每次获取都至关于查询了一次,大量调用会比较慢
                    int oid1 = 111;
                    feature = featureClass.GetFeature(oid1);
相关文章
相关标签/搜索