ArcGIS에서 Feature는 좌표에 대한 도형 데이터와 속성으로 묶어진 단위입니다. ESRI에서 정의한 Shape 파일의 경우 좌표에 대한 도형 데이터는 .SHP 파일에 저장되며 속성은 .DBF 파일에 저장됩니다. 속성은 하나의 DB 테이블 개념과 정확히 일치합니다. DB 테이블의 필드 정보와 각 필드에 대한 값들의 집합의 구성 요소인 로우(Row) 또는 레코드(Record)로 구성됩니다.
필드 정보라 함은 필드의 이름과 필드의 타입 그리고 필드 타입에 대한 데이터 저장 가능 길이 등으로 구성됩니다. 이 포스트는 Shape 파일에 대해서 .DBF에 저장된 필드 정보를 얻어내는 ArcObjects의 API에 대해서 설명합니다.
가장 먼저 해야할 작업은 .DBF 파일을 여는 것에서 시작합니다. 다음 코드는 .DBF 파일을 여는 방법입니다.
ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWF; ESRI.ArcGIS.Geodatabase.IFeatureWorkspace pFW; pWF = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory(); pFW = pWF.OpenFromFile("d:/__data__", 0) as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace; ESRI.ArcGIS.Geodatabase.ITable pTable; pTable = pFW.OpenTable("seoul");
.SHP 파일을 여는 것과 매우 동일하다는 것을 알 수 있습니다. 다른 부분은 8, 9번 라인에서 ITable 타입으로 하여 테이블을 여는 것입니다. 위의 예는 d:/__data__ 폴더 안에 seoul.dbf 파일을 열어 그 테이블을 ITable 타입인 pTable에 저장해 놓는 경우입니다.
이렇게 얻은 pTable을 통해 필드 정보를 얻기 위한 코드는 아래와 같습니다.
ESRI.ArcGIS.Geodatabase.IFields pFields; pFields = pTable.Fields; int cntFields = pFields.FieldCount;
테이블의 필드 정보는 IFields 타입에 저장되며 pTable의 Fields 속성을 통해 접근이 가능합니다. 4번째 줄은 필드의 전체 개수를 얻는 코드입니다. 이제 이렇게 얻은 pFields를 통해 각 필드의 이름, 별칭(Alias), 필드길이, 정밀도, 타입을 얻어 ListBox 컨트롤에 채워 보는 코드는 아래와 같습니다.
listBox1.Items.Clear(); for(int iField=0; iField<cntFields; ++iField) { ESRI.ArcGIS.Geodatabase.IField pField; pField = pFields.get_Field(iField); string AliasName = pField.AliasName; string FieldName = pField.Name; int Length = pField.Length; int Precision = pField.Precision; ESRI.ArcGIS.Geodatabase.esriFieldType FT = pField.Type; listBox1.Items.Add(FieldName + "(" + AliasName + ")"); listBox1.Items.Add(" Length: " + Length.ToString()); listBox1.Items.Add(" Precision: " + Precision.ToString()); listBox1.Items.Add(" Type: " + FT.ToString()); listBox1.Items.Add(""); }
참고로 ListBox 컨트롤의 이름은 listBox1입니다. 앞서 구한 전체 필드의 개수를 통해 반복문에서 필드 정보를 IField 타입으로 가져와 필드의 정보를 구할 수 있습니다. 이름은 IField 타입의 Name 속성으로 알 수 있고, 별칭명은 AliasName, 길이는 Length, 정밀도는 Precision 그리고 필드의 타입은 Type으로 알 수 있습니다. 참고로 아래는 실행 결과 화면입니다.