[GIS] ArcObjects, 속성 테이블(DBF)의 필드 정보 얻기

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으로 알 수 있습니다. 참고로 아래는 실행 결과 화면입니다.

사용자 삽입 이미지

[GIS] ArcObjects, Shape 파일로부터 레이어 추가하기

ArcObjects는 GIS 어플리케이션 개발에 적용할 수 있는 매우 방대하며 매우 강력한 라이브러리입니다. 기본적으로 ArcGIS를 설치하면 개발자가 쉽게 사용할 수 있도록 되어 있습니다. 필자는 2002년 초에 처음 ArcObjects를 접했는데… 그 방대함과 강력함에 매료되었습니다. 제가 아는 GIS 개발 범위에서 필요한 기능은 모두 ArcObjects에서 구할 수 있었다고 해도 과언이 아닐 정도로 말입니다.

간단한 수치지도 도시, 네트워크 및 위상 분석, 그리드 분석, 3D에 대한 틴, 모델 등의 표현과 관련된 공간 분석 그리고 강력한 편집 기능 등… 이루 다 말할 수 없을 정도로 방대한 GIS 개발 도구를 제공합니다. 처음 ArcObjects를 접하고 수년이 흘렀지만 여전이 ArcObjects는 GIS 어플리케이션 개발에서 매우 큰 영역을 차지하고 있으며 향후에도 개발자와 GIS 개발 회사에 미치는 영향력은 더 커지거나 지금처럼 계속 유지될 것으로 기대됩니다.

ArcObjects를 이용한 GIS 시스템 개발에 대한 일을 맡으면서 ArcObjects를 활용해야할 일이 생겼습니다. 과거 ArcObjects를 사용하여 개발했던 프로젝트의 경험에 대한 기억이 가물가물해져 버렸습니다. 해서… 그때의 실수가 되풀이 되지 않도록 ArcObjects에 대한 경험을 글로 하나 하나 남겨 놔야 겠다는 생각이 들어 ArcObjects 관련 글을 포스팅하기로 하였습니다.

그 첫번째는 GIS에서 수치지도 교환에 거의 표준으로 활용되고 있는 ESRI의 SHP 파일을 추가하는 방법입니다. 개발언어는 C#를 사용할 것이며 Form 기반의 어플리케이션의 폼에 ArcObjects에서 제공하는 MapControl을 올려 놓습니다. MapControl의 정확한 클래스 타입은 AxMapControl입니다. 그리고 버턴을 하나 올려 놓습니다. 이 버턴 안의 코드는 지정된 폴더에 존재하는 SHP 파일을 MapControl에 추가하는 코드입니다.

ESRI.ArcGIS.Geodatabase.IWorkspaceFactory pWF;
ESRI.ArcGIS.Geodatabase.IFeatureWorkspace pFW;
ESRI.ArcGIS.Carto.IFeatureLayer pFL;

pWF = new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactory();
pFW = pWF.OpenFromFile("d:/__data__", 0) 
              as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace;
pFL = new ESRI.ArcGIS.Carto.FeatureLayer();
pFL.FeatureClass = pFW.OpenFeatureClass("seoul");
pFL.Name = pFL.FeatureClass.AliasName;

axMapControl1.AddLayer(pFL);

SHP 파일 하나를 추가하 위한 절차가 단순하지 않다는 것을 느낄 수 있습니다. 이는 ArcObjects가 매우 다양한 데이터 포맷을 지원하는 이유이며 로컬 데이터 뿐만 아니라 네트워크로부터 데이터를 받을 수 있도록 하기 위함입니다.

중요한 부분만을 짚어 설명한다면 6번 줄의 코드에서 OpenFromFile 매서드의 첫번째 인자 값인 d:/__data__ 라는 폴더를 작업공간으로 지정하겠다는 의미입니다. 즉, 추가하고자 하는 SHP 파일이 존재하는 경로입니다. 두번째 인자는 부모 윈도우의 핸들로써 NULL(0) 값으로 주어도 관계없습니다. 실제 SHP 파일명은 9번째 줄의 OpenFeatureClass 매서드의 인자로 지정하며 주의할 점은 확장자인 .shp를 생략하고 있다는 점입니다.

이런 절차로 생성한 ILayer 타입인 IFeatureLayer를 MapControl의 AddLayer 매서드의 인자로 주게 되어 추가할 수 있습니다. 결과는 아래와 같습니다.

사용자 삽입 이미지

레이어를 추가하자 마자 MapControl은 추가된 레이어의 전체를 도시하게 됩니다. 이상으로 간단히 SHP 파일을 ArcObjects에서 제공하는 MapControl에 추가하여 도시하는 방법을 살펴보았습니다.