GIS

ArcObject : GDB 속성 테이블을 DataTable 로 컨버전 (FeatureClass를 DataTable로 컨버전하기)-C#

조심이 2010. 12. 6. 16:39
반응형

      SDE를 사용할때는 DB에서 쿼리로 정보를 가져오면 되는데 File GDB를 사용하다 보니 
      File GDB의 속성 테이블이나 피쳐클래스 정보를 DataTable로 만들어 쓰면 편한 경우가 많아 만들어 보았다. ㅋ

       using ESRI.ArcGIS.Geodatabase;

         우선 피쳐클래스나 속성 테이블에서 가져올 정보를 ICursor 형태로 만들어 주는 메소드를 정의한다.
 
       // 속성 테이블이나 FeatureClass 에서 ICursor 가져오기 
        public static ICursor GetCursor(IFeatureWorkspace pFeatWS, string sTableName, string sCauseWhere)
        {
            ITable pTable;
            ICursor pCursor = null; ;
            IQueryFilter pFilter = null; ;

            try
            {
                pTable = pFeatWS.OpenTable(sTableName);
                pFilter = new QueryFilter();
                pFilter.WhereClause = sCauseWhere;
                pCursor = pTable.Search(pFilter, false);
            }
            catch (Exception err)
            {
              
            }
            return pCursor;
          
        }
   

FeatureClass 또는 GDB 테이블 DataTable로 컨버전

//FeatureClass 또는 GDB 속성 테이블 DataTable로 컨버전
  /// <summary>
        /// ITable 데이터테이블로 (bskim)
        /// </summary>
        /// <param name="pFeatWS">워크스페이스</param>
        /// <param name="sTableName">피쳐클래쓰 또는 테이블 명</param>
        /// <param name="sCauseWhere">조건절</param>
        /// <returns></returns>
 public static DataTable ITableToDataTable(IFeatureWorkspace pFeatWS, string sTableName, string sCauseWhere)
        {
            ICursor pCursor = null;
            IRow pRow = null;
            IFields pFields = null;
            IField pField = null;

            DataTable dataTB = new DataTable();  //컨버전할 DataTable

         //위에 함수 호출 ICursor  가져오기...
            pCursor = GetCursor(pFeatWS, sTableName, sCauseWhere);

            if (pCursor == null)
            {
                dataTB = null;
                return dataTB;
            }
            pFields = null;
            pRow = pCursor.NextRow();


            int count = 0;
            if (pRow != null)
            {
                pFields = pRow.Fields;

               //DataTable에 피쳐클래스 나 테이블의 필드명을 이용하여 DataTable 필드를 만든다.
                for (int i = 0; i < pFields.FieldCount; i++)
                {

                    dataTB.Columns.Add(new DataColumn(pFields.get_Field(i).Name, typeof(string)));
                }

                while (pRow != null)
                {
                  
                    DataRow newRow = dataTB.NewRow();
                    object Value = "";

                  //DataTable에 값채우기
               for (int i = 0; i < pFields.FieldCount; i++)
                    {
                        Value = pRow.get_Value(pRow.Fields.FindField(pFields.get_Field(i).Name));
                        newRow[pFields.get_Field(i).Name] = Value.ToString();
                    }

                    dataTB.Rows.Add(newRow);
              
                    pRow = pCursor.NextRow();
                }
            
            }
            else
            {
                return null;
            }

           
           dataTB.AcceptChanges();
            return dataTB; //DataTable로 만들어 반환한다.
        }

반응형