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