对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://74229.com

posted @ 2012-03-05 16:39  吉桂昕  阅读(777)  评论(1编辑  收藏  举报