2010년 2월 20일 토요일

ITopologicalOperator

ArcObjects Geomtery 관련 인터페이스 중 Geometry를 핸들링하는 가장 중요한 인터페이스가 무엇일까? 선택하라면 아마도 ITopologicalOperator, IRelationalOperator, IProximityOperator일 것이다.

ITopologicalOperator 인터페이스는 기존
Geometry간의 위상관계를 바탕으로 새로운 Geometry를 생성하기 위한 멤버 접근을 제공한다.

Remarks
- GeometryBags은 Buffer, Clip, Simplify만 지원한다.
- High-level Geometry(point, multipoint, polyline, polygon)에만 적용되어야 한다.
- ITopologicalOperator를 사용할 때 Spatial reference를 설정해 주는 것이 성능면에서 효율적이다. 특히 circular arcs, bezier curves, elliptical arcs의 경우에는 더욱 그렇다.
- 9.3 버전 이후에서 ITopologicalOperator5 인터페이스로 대체 및 최신 버전 사용 권장

CoClasses that implement ITopologicalOperator
 - GeometryBag, MultiPatch, Multipoint, Point, Polygon, Polyline
 - esriDefenseSolutions: GeoEllipse, GeoPolygon, GeoPolyline

Members
Boundary
[C#]
public IGeometry Boundary {get;}

Boundary는 Geometry의 exterior의 한 부분으로 원본 Geometry의 차원보다 한 차원 낮다.
즉,
PolygonBoundary는 Polygon의 Ring을 구성하는 Polyline, PolylineBoundary는 Polyline을 구성하는 각 Path의 끝점들로 구성된 Multipoint, MultipointBoundary는 Empty이다.


Buffer
[C#]
public IGeometry Buffer (double distance);

버퍼 거리는 shape과 같은 단위로 버퍼에 적용된다.
Polygon에서 음수값의 거리는 내부 버퍼를 수행하며 Polyline에서는 적용되지 않는다.


[code c#]
//create point
IPoint basePoint = new ESRI.ArcGIS.Geometry.PointClass();
basePoint.PutCoords(0, 0);

//buffer
ITopologicalOperator topoOpt = (ITopologicalOperator)basePoint;
IPolygon bufferPolygon = (IPolygon)topoOpt.Buffer(100.0);
IArea baseArea = (IArea)bufferPolygon;
System.Diagnostics.Debug.WriteLine(baseArea.Area);

//boundary
topoOpt = (ITopologicalOperator)bufferPolygon;
IPolyline boundaryLine = (IPolyline)topoOpt.Boundary;
System.Diagnostics.Debug.WriteLine(boundaryLine.Length);
[/code]
ConstructUnion    
[C#]
public void ConstructUnion (IEnumGeometry geometries);

ConstructUnion은 동일한 차원의
Geometry를 담고 있는 GeometryBag과 같은 IEnumGeometry에 대해 일괄적인 Union을 수행한다.
다수의
Geometry를 대상으로 Union을 수행할 경우 각각의 Geometry를 반복적으로 Union하는 방법보다 더 효율적이다.

Union에 대한 예제는 추후에 다룰 것이다.


ConvexHull    
[C#]
public IGeometry ConvexHull ();

GeometryConvexHull을 반환한다. ConvexHull은 Geometry를 둘러싸는 최외곽 경계 Polygon이며, Point의 경우 Point 그 자체를 반환한다.


Cut    
[C#]
public void Cut (IPolyline cutter, ref IGeometry leftGeom, ref IGeometry rightGeom);

Splits은
cutting polyline을 이용하여 이 Geometry를 왼쪽, 오른쪽 파트로 잘라낸다. 그림에서와 같이 잘라내는 Polyline의 방향 확인에 주의해야 한다.

Clip, ClipDense, QueryClippedDense, QueryClipped
[C#]
public void Clip (IEnvelope clipperEnvelope);

public void ClipDense (IEnvelope clipperEnvelope, double denseDistance);

public void QueryClippedDense (IEnvelope clipperEnvelope, double denseDistance, IGeometry clippedGeometry);

public void QueryClipped (IEnvelope clipperEnvelope, IGeometry clippedGeometry);


Clip 메쏘드는 Feature의 Geometry를 Envelope으로 클립하며, Envelope을 반환하지는 않는다.
QueryClipped은 Envelope을 이용하여 클립한
Geometry를 반환하며 Geometry 유형은 원본과 동일하다.


IsKnownSimple, IsKnownSimple, Simplify
[C#]
public bool IsKnownSimple {get;}

public bool IsSimple {get;}

public void Simplify ();


이 Geometry의 위상적 일관성을 체크하거나 설정하기 위한 멤버들로 IsKnownSimple, IsSimple, Simplify에 대해서는 이 사이트의 다음 문서를 참고한다: Simplifying a geomtery

Difference    
[C#]
public IGeometry Difference (IGeometry other);

Geometry와 대상 Geometry간의 차집합 Geometry를 반환한다.

Intersect    
[C#]
public IGeometry Intersect (IGeometry other, esriGeometryDimension resultDimension);

Geometry와 대상 Geometry간에 set-theoretic intersection에 의한 교집합(AND) Geometry를 반환한다. resultDimension 파라미터값을 이용하여 다른 차원의 결과를 생성할 수 있다.

ArcGIS 9.2 버전 이후부터는 Intersect 메쏘드를 호출하기 전에 Disjoint 테스트 수행 후 필요시 호출하는 것이 성능면에서 유리하다.

SymmetricDifference    
[C#]
public IGeometry SymmetricDifference ( IGeometry other);

Geometry와 대상 Geometry간의 대칭적 차집합(XOR) Geometry를 반환한다.
즉, 두 Geometry(G1, G2)의 Union(G1, G2) - Intersection(G1, G2) 또는 Union(Difference(G1, G2), Difference(G2, G1))의 관계가 성립한다.

Union    
[C#]
public IGeometry Union (IGeometry other);

Geometry와 대상 Geometry간에 set-theoretic intersection에 의한 합집합(OR) Geometry를 반환한다


원문 출처: http://resources.esri.com/help/9.3/ArcGISEngine/ArcObjects/esrigeometry/itopologicaloperator.htm