//屬性查詢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //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);