2010년 2월 11일 목요일

Geometry 체계 이해

이 문서는 ArcObjects를 처음으로 접하는 개발자들에게 Geometry 체계에 대한 이해를 제공할 목적으로  Introduction to geometry objects 문서 중 Core Geometry Object에 대한 정보를 기술합니다.

Geometry library는 Point, Multipoint, Polyline, Polygon, MultiPatch와 같은 벡터 표현을 제공하는 핵심 라이브러리이다.

지오메트리는 피쳐와 그래픽의 shape을 정의하기 위해 지오데이터베이스, 그래픽 엘리먼트 시스템에 사용된다. 또한 편집기를 위한 작업 및 피쳐를 심볼화하고 정의하기 위한 지도 심볼 시스템에도 사용된다. 공간좌표체계(Spatial reference)는 이들 지오메트리와 밀접한 관계가 있으며 ArcObjects의 거의 모든 시스템은 지오메트리와 공간참조를 어떤 방식으로든 사용하고 있다. 즉, 지오메트리와 공간좌표체계는 GIS 엔진의 핵심 기능이라 할 수 있겠다.

 
이 외에도
BufferConstruction 객체를 이용하여 견고하고 효율적인 지오메트리 버퍼(Buffer)와 같은 작업을 수행할 수 있다. 또한 버퍼링, 좌표변환과 같은 일반적이고 유용한 지오메트리 관련 작업을 수행할 수 있으며 GeometryServer web service를 이용하면 인터넷 상에서 이러한 실행이 가능하다.
 
지오메트리를 정확하게, 일관성있게, 예측가능하게 사용하기 위해서는 지오메트리와 공간좌표체계에 대한 정확한 이해가 필요하다.

▣ Introduction to geometry objects
Points, Multipoints, Polylines, Polygons, and MultiPatches과 같은 최상위 수준의 지오메트리 객체 외에, Paths, Rings, Segments, TriangleStrips, TriangleFans, Triangles은 Polyline, Polygon, MultiPatch를 생성하기 위한 빌딩 블록의 역할을 한다.

Polyline은 Path를, Polygon은 Ring, Multipatch는
TriangleStrip, TriangleFan, Triangle, , Rring으로 구성된다.

Path와 Ring은 세그먼트에 의핸 연결된 버텍스들로 구성된다.

Segment는 버텍스를 연결한 Curve의 형태를 정의하는 parametric 기능이다. Segment 유형에는
CircularArc, Line, EllipticArc, BezierCurve가 있다.

 지오메트리에서 각 버텍스의 X, Y 좌표 외에
M (measure), Z (elevation), ID (foreign key) 속성을 정의할 수 있다.

Envelope은 지오메트리의 공간범위를 정의하며, Geometrybag은 지오메트리 컬렉션에 대한 처리를 제공한다.


Geometry 객체는 개발자에 의해 확장되지 않는다.

 
Multipoint, polyline, polygon, and MultiPatch 지오메트리는 각 유형별 제약사항이 있다.
 - 예를 들면 폴리곤은 exterior로부터 명확하게 분리되고 정의된 interior를 가질 수 있다.
 - 모든 제약사항을 만족할 때 지오메트리는 Simple, 그렇지 않은 경우 Non-simple하다고 말한다.
 
- ITopologicalOperator, IPolygonN, IPolylineN 인터페이스는 simplicity에 대한 테스트 및 적용을 위한 메쏘드를 제공한다. ITopologicalOperator 인터페이스의 Simplify 메쏘드는 다음(Simplifying a geomtery)에도 설명되어 있다.

지오메트리의 각 버텍스(Vertex)는 X, Y 좌표를 제외하고 버텍스 속성이라는 선택적 속성을 가질 수 있다.
 - Z 버텍스 속성은 double-precision 값으로 3차원 좌표계(vertical coordinate system)에서의 속성이나 깊이를 나타내는데 사용될 수 있다.
  - M 버텍스 속성(measure라 불림)double-precision 값으로 고속도로의 출구와 같은 지오메트리(대개 폴리라인)에 대한 선형좌표체계(linear reference system)를 구축하는데 사용될 수 있다.
 - ID 버텍스 속성(point ID라 불림)signed integer 값으로 외부 데이터베이스 키의 역할로 사용될 수 있다.
 - 버텍스 속성은 언제든지 추가/삭제가 가능하며 이는
IZAware, IMAware, IPointIDAware 인터페이스를 이용하여 정의할 수 있다.
 
특히, Segment 유형의 지오메트리는 위치를 정의하기 위한 다양한 메쏘드들을 제공한다.
IConstructCircularArc 인터페이스의 경우 다양한 방법으로 생성할 수 있으며 "construct" 키워드를 포함한 메쏘드 이름을 통하여 생성할 수 있다.

Top level(high-level: Point, MultiPoint, Polyline, Polygon 등) 지오메트리는 다음의 인터페이스를 통하여 다양한 연산이 가능하다.
 -
ITopologicalOperator 인터페이스를 통해 Union, Intersection, Difference, Symmetric Difference 등 Set-Theory에 기반을 둔 다양한 지오메트리 연산 수행
 -
IRelationalOperator 인터페이스를 통해 2개의 지오메트리에 대한 Disjoint, Contains, Touches 등의 다양한 공간관계 테스트를 수행
 - IProximityOperator 인터페이스를 통해 두 지오메트리간의 최단거리 등의 지오메트리에 대한 거리 관련 연산 수행

▣ Introduction to spatial references and coordinate grids
-  추후 제공

▣ Using geometry objects
GeometryEnvironment
GeometryEnvironment는 여러종류의 서로다른 입력으로부터 지오메트리를 생성하는 방법 및 지오메트리 메쏘드를 처리하는 과정에 필요한 글로벌 변수의 설정 등을 제공한다. 또한
IGeometryBridge와 같은 Java와 .NET 버전에 친숙한 메쏘들을 제공한다. GeometryEnvironment는 singleton 객체이기 때문에 여러번 생성해도 기존  GeometryEnvironment의 참조를 반환한다.
 
Envelope
Envelope 객체는 지오메트리의 공간 범위를 정의하는 Rectangle로 정의되며, 지오메트리의 Z, M 속성의 범위를 함께 제공한다. Envelope는 지오메트리의 Envelope 복사본을 얻거나 직접 생성할 수 있으며, 지오메트리로부터 Envelope을 얻을 경우 그 지오메트리의 공간참조정보 역시 유지된다.

Envelope의 Union 메쏘드를 이용하여 여러 지오메트리의 공간범위를 계산할 수도 있다.

 
GeometryBag
GeometryBag은
IGeometry 인터페이스를 지원하는 여러 지오메트리의 참조 집합으로 구성된다.
GeometryBag은  어떤 수준의 지오메트리 객체(
Polyline, Polygon, MultiPatch, Multipoint, segments 등)도  IGeometryCollection 인터페이스를 통해 추가될 수 있다. 그러나, 다양한 유형의 지오메트리를 담을 경우 GeometryBag을 사용하는 몇몇 Topological Operation의 경우 문제가 될 수 있다. 예를 들면, ITopologicalOperator.ConstructUnion 메쏘드를 사용할 경우 GeometryBag는 명시적인 폴리곤, 폴리라인 또는 Envelope을 포함해야 한다.

또한,
Project/ProjectEx 메쏘드는 GeometryBag이 Segment를 포함하고 있으면 GeometryBag에 적용될 수 없다. Topological Operator의 경우 high-level 지오메트리만 지원하는 메쏘드들이 있기 때문이다.
 
타 지오메트리들처럼 Geometrybag도 공간참조 속성이 있다. Geometrybag에 추가된 지오메트리는 Geometrybag과 동일한 공간참조정보를 참조한다. 만약 GeometryBag에 공간참조정보가 설정되어 있지 않을 경우 추가된 지오메트리는 어떤 참조정보도 가지지 않는다. 이는 일반적인 오류이므로 지오메트리를 추가하기 전에 Geometrybag의 공간참조정보 정의에 주의해야 한다.
 
ITopologicalOperator.ConstructUnion 메쏘드는 GeometryBag을 이용하는 좋은 예이다.
 
Point
Point 객체는 2차원 포인트이며, M, Z, ID 속성을 옵션으로 제공한다.
 
Multipoint
Multipoint 객체는 옵션으로 M, Z, ID 속성을 가진 순차적인 포인트의 컬렉션으로 구성된다.
Multipoint 객체에 대한 IPointCollection 인터페이스는 포인트 요소에 대한 직접 접근을 제공한다. 이는 Polyline과 Polygon의 버텍스에 접근하는 인터페이스와는 다른 방법으로 제공되며, 이 경우에 포인트의 복사본을 활용한다.
 
Polyline
Polyline 객체는 옵션으로 M, Z, ID 속성을 가진 순차적인 Path의 컬렉션으로 구성된다. Polyline에 대한 IPointCollection 인터페이스는 버텍스의 복사본을 처리한다. Path에 대한 직접 접근을 하려면 IGeometryCollection 인터페이스를, Segment에 대한 직접 접근을 위해서 ISegmentCollection을 사용하면 된다. IPointCollection과 ISegmentCollection 인터페이스는 Path 객체에 대해서도 사용가능하며, 같은 방법으로 사용한다.
 
Polyline 구조는 아래 다이어그램에 잘 나타나 있다.
 

Polygon
Polygon 객체는 Ring들의 포함관계에 의한 순차적인 Ring의 컬렉션으로 구성되며, Ring 역시 옵션으로 M, Z, ID 속성을 가지고 있다.
각 Ring은 Segment의 컬렉션으로 구성된다.
Polygon과 Ring 에 대한 IPointCollection 인터페이스는 버텍스의 복사본을 처리한다. Segment와 Ring에 대한 직접 접근을 위해 IGeometryCollection과 ISegmentCollection 인터페이스를 사용하면 된다.
 
아래는 Polygon 구조를 설명한 다이어그램이다.
 
 
MultiPatch
MultiPatch 지오메트리 유형은 초기에는 2차원(2D) 유효성 규칙에 제약받지 않는 3차원(3D) 폴리곤 지오메트리 유형의 지원 필요에 의해 개발되었다. 2차원의 제약사항을 제거하지 않고서는 2D 라인에 대한 Extrusion, 폴리곤에 대한 3D Visualization 등이 불가능하다.  MultiPatch는 2D 제약사항을 제거하여 폴리곤 페이스 및 폴리곤 페이스 내부 정의 등에 한계를 극복할 수 있다.
 
이하 생략...

 
▣ BufferConstruction object
 - 별도 제공

▣ Using spatial reference objects
 - 별도 제공

▣ Using transformation objects
 - 별도 제공