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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM