2010년 2월 8일 월요일

[Tips]Modifying schema objects

이 문서는 ArcGIS 9.3. 버전을 기준으로 작성되었으며, .NET C#(3.0) 샘플 코드 실행을 위해서는 다음의 어셈블리를 참조해야 한다.
- ESRI.ArcGIS.ADF
- ESRI.ArcGIS.Geodatabase
- ESRI.ArcGIS.System (ESRI.ArcGIS.esriSystem)

이 문서는 Geodatabase API를 사용하는 개발자들에게 CheatSheet(커닝페이퍼?)을 제공할 목적으로 작성되었으며 주요 내용은 성능향상, 범하기 쉬운 실수 등을 제공한다.
예제 코드는 특정 상황에 대한 샘플 코드로서 패턴을 제공하고, 상황에 따라 오류를 비교하기 위해 임의의 오류를 포함하고 있으므로 이 코드를 재활용해서는 안된다.


⑩ Modifying schema objects
API 내에 Geodatabase 객체(
datasets, domains, fields 등)의 모든 Type은 그에 대응하는 클래스가 있다.

개발자는 이들 클래스들의 작동이 2가지로 구분된다는 것을 알아야 한다.

 - 지오데이터베이스에 자동으로 물리적인 변경을 가하는 클래스: Class, Table 등
 - 지오데이터베이스에 물리적인 변경을 가하지 않는 클래스: Fields, Domains, Indexes

 
이에 대한 기본적인 예제는
IClass.AddField와 IFieldsEdit.AddField이 있다.
 -
IClass.AddField: 테이블에 실제 필드를 추가한다.
 -
IFieldsEdit.AddField: 필드 컬렉션(IFields)에 메모리상으로만 추가되고 실제 테이블을 변경하지 않는다.

이 문서에 보면 수많은 개발자들이 테이블을 열고 필드를 얻어 새로운 필드를 추가해도 물리적으로 테이블에 반영되지 않는다는 것을 개고생(
hard way, ㅋㅋ)을 통해서 알았다는 군요...
 
기타 유효하지 않은(
invalid) 작업은 다음과 같다.:
 - IFieldEdit 인터페이스를 이용하여 지오데이터베이스에 이미 생성된 Fields를 변경
 -
IIndexesEdit 인터페이스를 이용하여 지오데이터베이스에 이미 생성된 Index 컬렉션을 변경
 -
IIndexEdit 인터페이스를 이용하여 지오데이터베이스에 이미 생성된 Indexes를 변경
  ☞ 이들은 IClass, IClassSchemaEdit 등의 인터페이스를 통해서 물리적인 변경이 가능하다.
 
또다른 작업으로 Workspace로부터 Domain을 추출하여 변경을 가하는 것이다. 예를 들면
CodedValueDomain을 추가하는 것이다. 이 작업 역시 지오데이터베이스에 반영되지 않으며, IWorkspaceDomains2.AlterDomain 메쏘드를 이용하여 물리적인 변경이 가능하다.

※ Domain 및 Subtype
일반적으로 ArcGIS GeoDatabase에서 무결성 보장을 위한 Rule을 관리하기 위한 방법으로 공간 측면에서는 Topology Rule 및 Network Rule을 속성 측면에서는 Domain과 Subtype을 활용한다.

Domain 클래스는 RangeDomain과 CodedValueDomain으로 구성되며 분할/합병에 대한 규칙을 포함한다.
 - RangeDomain은 Numeric/Date 필드값에 대한 최대/최소 범위를 설정
 - CodedValueDomain은 주로 String 필드에 대한 유효한 값의 목록을 코드/값(설명) 형식으로 관리

또한 Subtype은 이 Domain을 이용하여 하나의 class(FeatureClass, Table 등) 내에 존재하는 객체를 그룹화하여 관리한다.

이들은 프로그래밍 레벨에서 제약조건을 관리하지 않아도 GeoDatabase 레벨에서 설정만으로 관리될 수 있다.  사실 데이터 입력 오류 최소화 등 관리 측면에서는 좋은 개념인데 대부분의 ArcGIS를 활용하는 응용프로그램에서 이 개념을 잘 사용하지 않는 것 같다..
.

출처 : ArcGIS Resource Center