博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Arcgis Engine(ae)接口详解(2):featureClass查询
阅读量:7115 次
发布时间:2019-06-28

本文共 4240 字,大约阅读时间需要 14 分钟。

hot3.png

//属性查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                    //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);

 

转载于:https://my.oschina.net/u/1251858/blog/1539266

你可能感兴趣的文章
Zabbix实现短信报警设置(实战)
查看>>
Windows下Git多账号配置,同一电脑多个ssh-key的管理
查看>>
微信打开网址添加在浏览器中打开提示遮罩
查看>>
maven 打包 java中的配置文件
查看>>
13.生成规格文件
查看>>
maven学习手记 - 1
查看>>
DLL基本开发规则
查看>>
前端进阶-Position
查看>>
PDO和PDOStatement类常用方法
查看>>
JS - The react framework
查看>>
在js自定义函数中使用$(event.target)代替$(this)
查看>>
[HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理
查看>>
Codechef MARCH14 GERALD07加强版
查看>>
React-Apollo-Prisma-Graphql
查看>>
第17章 网络编程
查看>>
Test a website's performance
查看>>
C#四则运算器(多态方法实现)
查看>>
小程序flex-direction
查看>>
编程基本功(一)
查看>>
迭代器随笔
查看>>