对ArcGis Engine的增、删、改实现
/// <summary> /// 在图层里面增加feature /// </summary> /// <param name="layer">添加到的图层的名称</param> /// <param name="pMap">当前axMapControl.Map</param> /// <param name="dt">要添加的数据 DataTable格式</param> public static void AddFeature(string layer,IMap pMap,DataTable dt) { IFeatureClass featureCls = OpenLayer(layer);//目标featureclass if (featureCls == null) { throw new Exception(string.Format("加载{0}图层失败,请检查空间数据库是否有该图层", layer)); } IDataset ds = featureCls as IDataset; IWorkspace workspace = ds.Workspace; IWorkspaceEdit edit = workspace as IWorkspaceEdit; edit.StartEditing(false); edit.DisableUndoRedo(); edit.StartEditOperation(); int num = -1; for (int i = 0; i < pMap.LayerCount; i++) { if (pMap.get_Layer(i).Name == layer) { num = i; break; } } IFeatureCursor inserCursor = featureCls.Insert(true); IFeatureBuffer buffer; IFeatureLayer pFeatureLayer=pMap.get_Layer(num) as IFeatureLayer; IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IFeatureCursor Cursor = pFeatureClass.Search(null, false); IFeature pFeature = Cursor.NextFeature(); int count = 0; while (pFeature != null) { int Findex = pFeature.Fields.FindField("FID"); string FID = pFeature.get_Value(Findex).ToString(); int m = 0; int w=-1; foreach (DataRow dr in dt.Rows) { if (dr["FID"].ToString() == FID) { w = m; } m++; } //IFeature newFeature = featureCls.CreateFeature(); buffer = featureCls.CreateFeatureBuffer(); //newFeature.Shape = pFeature.Shape; buffer.Shape = pFeature.Shape; for (int i = 0; i < dt.Columns.Count; i++) { for (int n = 0; n < featureCls.Fields.FieldCount; n++) { if (featureCls.Fields.get_Field(n).Name == dt.Columns[i].ToString()) { int index = featureCls.FindField(dt.Columns[i].ToString()); string mm = dt.Rows[w][i].ToString(); buffer.set_Value(index, dt.Rows[w][i]); } } } inserCursor.InsertFeature(buffer); if (count >= 100) { inserCursor.Flush(); count = 0; } pFeature = Cursor.NextFeature(); } inserCursor.Flush(); //inserCursor.Flush(); edit.StopEditing(true); edit.StopEditOperation(); } /// <summary> /// 删除图层指定feature /// </summary> /// <param name="layer">要删除的目标图层名</param> /// <param name="MapDocID">带有要删除feature的MAPDOCID值的list</param> public static void DeleteFeature(string layer,List<string> MapDocID) { IFeatureClass pFeatureClass = OpenLayer(layer); string whereClause="MAPDOCID='"+MapDocID[0]+"'"; for (int i = 1; i < MapDocID.Count;i++ ) { string whereClause1 = " or MAPDOCID='" + MapDocID[i] + "'"; whereClause += whereClause1; } IQueryFilter pQueryFilter = new QueryFilterClass(); pQueryFilter.WhereClause = whereClause; IFeatureCursor pFeatureCursor = pFeatureClass.Update(pQueryFilter,false); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { pFeatureCursor.DeleteFeature(); pFeature = pFeatureCursor.NextFeature(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); } /// <summary> /// 删除图层指定feature /// </summary> /// <param name="layer">要删除的目标图层名</param> /// <param name="MapDocID">带有要删除feature的MAPDOCID值的list</param> public static void DeleteFeature(string layer, string MapDocID) { IFeatureClass pFeatureClass = OpenLayer(layer); string whereClause = "MAPDOCID='" + MapDocID + "'"; IQueryFilter pQueryFilter = new QueryFilterClass(); pQueryFilter.WhereClause = whereClause; IFeatureCursor pFeatureCursor = pFeatureClass.Update(pQueryFilter, false); IFeature pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { pFeatureCursor.DeleteFeature(); pFeature = pFeatureCursor.NextFeature(); } System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor); } /// <summary> /// 修改指定图层的字段 /// </summary> /// <param name="dicValue">要修改字段和值</param> /// <param name="dicCondition">要修改的条件</param> /// <param name="layer">图层名</param> /// <returns></returns> public static bool EditField(Dictionary<string, string> dicValue, Dictionary<string, string> dicCondition,string layer) { try { //找到你的图层名 IFeatureClass featureCls = OpenLayer(layer); if (featureCls == null) { throw new Exception(string.Format("加载{0}图层失败,请检查空间数据库是否有该图层",layer)); } //得到该图层下有多少数据 int featureCount = featureCls.FeatureCount(null); int fieldIndex = -1; IDataset ds = featureCls as IDataset; IWorkspace workspace = ds.Workspace; IWorkspaceEdit edit = workspace as IWorkspaceEdit; edit.StartEditing(false); edit.DisableUndoRedo(); IFeatureCursor updateCursor = featureCls.Update(null, false); edit.StartEditOperation(); IFeature feature = updateCursor.NextFeature(); while (feature != null) { int fid = feature.OID-1; string myMAPDOCID = fid.ToString(); foreach (KeyValuePair<string, string> MAPDOCID in dicCondition) { if (myMAPDOCID == MAPDOCID.Value) { foreach (KeyValuePair<string, string> myValue in dicValue) { int myIndex = -1; if (myValue.Key.Length > 10) { myIndex = featureCls.FindField(myValue.Key.Substring(0, 10)); } else { myIndex = featureCls.FindField(myValue.Key.ToString()); } if (myIndex == -1) { MessageBox.Show("SDE中未检索到'"+myValue.Key+"'字段,请检查字段名是否有误"); continue; } feature.set_Value(myIndex, myValue.Value); updateCursor.UpdateFeature(feature); } } } feature = updateCursor.NextFeature(); } edit.StopEditOperation(); edit.StopEditing(true); return true; } catch(Exception ex) { throw; } } public static IFeatureClass OpenLayer(string layerName) { try { IFeatureWorkspace pFeatureWorkspace = DCIEngine.FrameWork.Global.OpenWorkspace() as IFeatureWorkspace; IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(layerName); return pFeatureClass; } catch (Exception) { return null; } }
作者:
吉桂昕
出处: http://www.cnblogs.com/jiguixin
我的新浪微博: http://weibo.com/jiguixin
本文版权归【吉桂昕】和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
出处: http://www.cnblogs.com/jiguixin
我的新浪微博: http://weibo.com/jiguixin
本文版权归【吉桂昕】和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。