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);
相關文章
相關標籤/搜索