arcengine 要素類的複製

轉自原文arcengine 要素類的複製 數據庫

 

using System;  
using System.Collections.Generic;  
using System.Text;  
using ESRI.ArcGIS.Geodatabase;  
using ESRI.ArcGIS.Geometry;  
using ESRI.ArcGIS.Carto;  
namespace MyGISClass  
{  
    /// <summary>  
    /// 該類主要包含了要素類的複製以及同要素類數據的加載  
    /// 函數主要用於SDE與Personal GDB之間數據的處理  
    /// </summary>  
    class FeatureClassDataManager  
    {  
        /// <summary>  
        /// 根據傳入的源要素類OldFeatureClass,新空間範圍,要素存儲工做空間,新要素類名  
        /// 產生具備相同字段結構和不一樣空間範圍的要素類  
        /// </summary>  
        /// <param name="OldFeatureClass">源要素類</param>  
        /// <param name="SaveFeatWorkspace">存儲工做空間</param>  
        /// <param name="FeatClsName">新要素類名</param>  
        /// <param name="pDomainEnv">新空間範圍,可爲null</param>  
        /// <returns></returns>  
        public IFeatureClass CloneFeatureClassInWorkspace(IFeatureClass OldFeatureClass, IFeatureWorkspace SaveFeatWorkspace, string FeatClsName, IEnvelope pDomainEnv)  
        {  
            IFields pFields = CloneFeatureClassFields(OldFeatureClass, pDomainEnv);  
            return SaveFeatWorkspace.CreateFeatureClass(FeatClsName, pFields, null, null, esriFeatureType.esriFTSimple, OldFeatureClass.ShapeFieldName, "");  
        }  
        /// <summary>  
        /// 複製AnnotationClass,未完待續  
        /// </summary>  
        /// <param name="OldFeatureClass"></param>  
        /// <param name="SaveFeatWorkspace"></param>  
        /// <param name="FeatClsName"></param>  
        /// <param name="pDomainEnv"></param>  
        /// <returns></returns>  
        public IFeatureClass CloneAnnotationClassInWorkspace(IFeatureClass OldFeatureClass, IFeatureWorkspace SaveFeatWorkspace, string FeatClsName, IEnvelope pDomainEnv)  
        {  
            IFeatureWorkspaceAnno pFWSAnno = (IFeatureWorkspaceAnno)SaveFeatWorkspace;  
            IAnnoClass pAnnoClass = (IAnnoClass)OldFeatureClass.Extension;  
            return null;  
        }  
        /// <summary>  
        /// 將inFeatureClass要素類中全部符合pQueryFilter的要素複製到saveFeatureClass中,僅複製不作任何修改  
        /// </summary>  
        /// <param name="inFeatureClass">源要素類</param>  
        /// <param name="saveFeatureClass">存儲要素類</param>  
        /// <param name="pQueryFilter">過濾參數</param>  
        /// <returns></returns>  
        public bool LoadFeatureClass(IFeatureClass inFeatureClass, IFeatureClass saveFeatureClass, IQueryFilter pQueryFilter)  
        {  
            //生成兩個要素類字段的對應表  
            Dictionary<int, int> pFieldsDict = new Dictionary<int, int>();  
            this.GetFCFieldsDirectory(inFeatureClass, saveFeatureClass, ref pFieldsDict);  
            IFeatureCursor pinFeatCursor = inFeatureClass.Search(pQueryFilter, false);  
            long nCount = inFeatureClass.FeatureCount(pQueryFilter);  
            IFeature pinFeat = pinFeatCursor.NextFeature();  
            IFeatureCursor psaveFeatCursor = saveFeatureClass.Insert(true);  
            //使用IFeatureBuffer在內存中產生緩存避免屢次打開,關閉數據庫  
            IFeatureBuffer psaveFeatBuf = null;  
            IFeature psaveFeat = null;  
            long n = 0;  
            while (pinFeat != null)  
            {  
                try  
                {  
                    psaveFeatBuf = saveFeatureClass.CreateFeatureBuffer();  
                    psaveFeat = psaveFeatBuf as IFeature;  
                    if (inFeatureClass.FeatureType == esriFeatureType.esriFTAnnotation)  
                    {  
                        IAnnotationFeature pAF = (IAnnotationFeature)pinFeat;  
                        IAnnotationFeature pNAF = (IAnnotationFeature)psaveFeat;  
                        if (pAF.Annotation != null)  
                        {  
                            pNAF.Annotation = pAF.Annotation;  
                        }  
                    }  
                    psaveFeat.Shape = pinFeat.Shape;  
                    foreach (KeyValuePair<int, int> keyvalue in pFieldsDict)  
                    {  
                        if (pinFeat.get_Value(keyvalue.Key).ToString() == "")  
                        {  
                            if (psaveFeat.Fields.get_Field(keyvalue.Value).Type == esriFieldType.esriFieldTypeString)  
                            {  
                                psaveFeat.set_Value(keyvalue.Value, "");  
                            }  
                            else  
                            {  
                                psaveFeat.set_Value(keyvalue.Value, 0);  
                            }  
                        }  
                        else  
                        {  
                            psaveFeat.set_Value(keyvalue.Value, pinFeat.get_Value(keyvalue.Key));  
                        }  
                    }  
                    psaveFeatCursor.InsertFeature(psaveFeatBuf);  
                }  
                catch (Exception ex) { }  
                finally  
                {  
                    psaveFeat = null;  
                    n++;  
                    if (n % 2000 == 0)  
                    {  
                        psaveFeatCursor.Flush();  
                    }  
                    pinFeat = pinFeatCursor.NextFeature();  
                }  
            }  
            psaveFeatCursor.Flush();  
            return true;  
        }  
        private IFields CloneFeatureClassFields(IFeatureClass pFeatureClass, IEnvelope pDomainEnv)  
        {  
            IFields pFields = new FieldsClass();  
            IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;  
            //根據傳入的要素類,將除了shape字段以外的字段複製  
            long nOldFieldsCount = pFeatureClass.Fields.FieldCount;  
            long nOldGeoIndex = pFeatureClass.Fields.FindField(pFeatureClass.ShapeFieldName);  
            for (int i = 0; i < nOldFieldsCount; i++)  
            {  
                if (i != nOldGeoIndex)  
                {  
                    pFieldsEdit.AddField(pFeatureClass.Fields.get_Field(i));  
                }  
                else  
                {  
                    IGeometryDef pGeomDef = new GeometryDefClass();  
                    IGeometryDefEdit pGeomDefEdit = (IGeometryDefEdit)pGeomDef;  
                    ISpatialReference pSR = null;  
                    if (pDomainEnv != null)  
                    {  
                        pSR = new UnknownCoordinateSystemClass();  
                        pSR.SetDomain(pDomainEnv.XMin, pDomainEnv.XMax, pDomainEnv.YMin, pDomainEnv.YMax);  
                    }  
                    else  
                    {  
                        IGeoDataset pGeoDataset = pFeatureClass as IGeoDataset;  
                        pSR = CloneSpatialReference(pGeoDataset.SpatialReference);  
                    }  
                    //設置新要素類Geometry的參數  
                    pGeomDefEdit.GeometryType_2 = pFeatureClass.ShapeType;  
                    pGeomDefEdit.GridCount_2 = 1;  
                    pGeomDefEdit.set_GridSize(0, 10);  
                    pGeomDefEdit.AvgNumPoints_2 = 2;  
                    pGeomDefEdit.SpatialReference_2 = pSR;  
                    //產生新的shape字段  
                    IField pField = new FieldClass();  
                    IFieldEdit pFieldEdit = (IFieldEdit)pField;  
                    pFieldEdit.Name_2 = "shape";  
                    pFieldEdit.AliasName_2 = "shape";  
                    pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;  
                    pFieldEdit.GeometryDef_2 = pGeomDef;  
                    pFieldsEdit.AddField(pField);  
                }  
            }  
            return pFields;  
        }  
        private ISpatialReference CloneSpatialReference(ISpatialReference pSrcSpatialReference)  
        {  
            double xmin, xmax, ymin, ymax;  
            pSrcSpatialReference.GetDomain(out xmin, out xmax, out ymin, out ymax);  
            ISpatialReference pSR = new UnknownCoordinateSystemClass();  
            pSR.SetDomain(xmin, xmax, ymin, ymax);  
            return pSR;  
        }  
        private void GetFCFieldsDirectory(IFeatureClass pFCold,IFeatureClass pFCnew,ref Dictionary<int,int> FieldsDictionary)  
        {  
            for(int i=0;i<pFCold.Fields.FieldCount;i++)  
            {  
                string tmpstrold=pFCold.Fields.get_Field(i).Name.ToUpper();  
                switch(tmpstrold)  
                {  
                    case "OBJECTID":  
                    case "SHAPE":  
                    case "SHAPE_LENGTH":  
                    case "SHAPE_AREA":  
                    case "FID":  
                        {  
                            //以上字段由系統自動生成  
                            break;  
                        }  
                    default:  
                        {  
                            for(int j=0;j<pFCnew.Fields.FieldCount;j++)  
                            {  
                                string tmpstrnew=pFCnew.Fields.get_Field(j).Name.ToUpper();  
                                if(tmpstrold==tmpstrnew)  
                                {  
                                    FieldsDictionary.Add(i,j);  
                                    break;  
                                }  
                            }  
                            break;  
                        }  
                }  
            }  
        }  
    }  
}  
相關文章
相關標籤/搜索