2010년 2월 19일 금요일

IRelationalOperator

ArcObjects Geomtery 관련 인터페이스 중 Geometry를 핸들링하는 가장 중요한 인터페이스가 무엇일까? 선택하라면 아마도 ITopologicalOperator, IRelationalOperator, IProximityOperator일 것이다.
여기에서는 두 Geometry간의 공간관계를 확인하는 IRelationalOperator 인터페이스를 살펴본다.


DE-9IM(Dimensionally Extended 9 Intersection Model)
DE-9IM(Clementini-Matrix)은 두 Geometry간의 공간관계를 정의하는 수학적인 접근 방식으로
8가지의 공간관계 연산자를 정의하고 있으며 ISO/TC 211OGC에서도 채택하고 있다.
공간관계 연산은 Equal, Touches, Contains, Within, Disjoint, Crosses, Overlaps, Intersects이며 두 지리 객체의 경계(Boundary), 내부(Interior), 외부(Exterior) 사이의 교차 여
부를 판정하여 지리 객체의 관련성을 검사한다.


DE-9IM은 다음의 과정을 통해 확장되었다.
  - Four-Intersection Model (4IM): Boolean set of operations (considering intersections between boundary and exterior)
 - Nine-Intersection Model (9IM, Egenhofer-Matrix): Egenhofer operators (taking into account exterior, interior and boundary of objects)
 - Dimensionally Extended Nine-Intersection Model (DE-9IM,
Clementini-Matrix): Clementini operators using the same topological primitives as Egenhofer but considering the dimension type of the intersection.

※ DE-9IM은 다음의 URL을 참고

- http://postgis.org/documentation/manual-svn/ch04.html#DE-9IM
- http://download.boulder.ibm.com/ibmdl/pub/ps/products/db2/info/vr9/pdf/letter/nlv/ko_KR/db2sbk90.pdf
- http://gis.hsr.ch/wiki/images/3/3d/9dem_springer.pdf
- http://docs.codehaus.org/display/GEOTDOC/Point+Set+Theory+and+the+DE-9IM+Matrix
- http://edndoc.esri.com/arcsde/9.3/concepts/geometry/shapes/spatial_relations/predicates.htm

ArcObjects의 IRelationalOperator는 두 Geometry간의 공간관계를 확인하는 멤버들로 구성되며 Boolean값을 반환한다. ESRI 테크니컬 문서 중 "Shape Comparison Language"를 참조할 것.

CoClasses that implement IRelationalOperator
 - Envelope, GeometryBag, Multipoint, Point, Polygon, Polyline

Members
Contains
대상 Geometry가 Base Geometry의 일부분이고 Interior의 교차가 Empty가 아닌 상태, 즉 Base Geometry가 대상 Geometry를 완전히 포함하는 경우 True를 반환한다.

Contains와 Within은 역관계이며, Empty Geomtery는 다른 Geomtry와 Contains 관계가 성립될 수 없으나, Within 관계는 성립될 수 있다.

예)
Contains 관계가 True인 경우


Crosses
서로 다른 차원을 갖는 두 공간 객체들이 교차하는 경우 True를 반환하며, Clementini 연산자이다.
두 Polyline의 경우 Point만을 공유하고 공유 포인트는 Polyline의 끝점이 아니어야 한다. Polyline과 Polygon의 경우 Polygon 내부에서 Polyline을 공유하며, Polyline이 포함되지 않아야 한다.

Polyline/
Polyline, Polyline/Polygon,Polygon/Polyline 관계에서만 성립하며, 두 Geometry 중 하나가 Empty이면 False를 반환한다.

예)
Crosses 관계가 True인 경우


Disjoint
두 Geometry가 교차하지 않을 경우 True를 반환하며,
Clementini 연산자이다.
Disjoint가 False이면 두 Geometry는 교차하는 역관계가 성립한다.

두 Geometry 중 하나가 Empty이면 False를 반환한다.

예)
Disjoint 관계가 True인 경우


Equals
두 Geometry가 서로 일치할 경우 True를 반환하며, Clementini 연산자는 아니다.
Polyline과 Polygon의 경우
, 두 Geomtry의
Symmetric Difference(ITopologicalOperator::SymmetricDifference 메쏘드를 내부적으로 사용)가 Empty일 경우 Equal 관계가 True이며, 방향과 M/Z 속성은 무시된다. 따라서 M/Z의 비교가 필요할 경우 IClone::IsEqual 메쏘드를 사용할 수 있다.
Multipoints의 경우 , IRelationalOperator::Equals 은 IClone::IsEqual 메쏘드를 사용한다.

GeometryBags은 지원하지 않는다.

예) Equals 관계가
True인 경우

.NET에서 System.Object은 Equals 메쏘드를 가지고 있으므로 다음 C# 코드를 참조하여 공간관계 테스트를 위해서는 IGeometry 참조변수를 명시적으로 사용해야 한다.
[code c#]
ESRI.ArcGIS.Geometry.IPoint pt1 = new ESRI.ArcGIS.Geometry.PointClass();
pt1.PutCoords(5, 5);

ESRI.ArcGIS.Geometry.IPoint pt2 = new ESRI.ArcGIS.Geometry.PointClass();
pt2.PutCoords(5, 5);

ESRI.ArcGIS.Geometry.IRelationalOperator rel1 = pt1 as ESRI.ArcGIS.Geometry.IRelationalOperator;
ESRI.ArcGIS.Geometry.IGeometry geom2 = pt2 as ESRI.ArcGIS.Geometry.IGeometry;

bool relEqual = rel1.Equals(pt2); //calling IRelationalOperator::Equals
Console.WriteLine("Equal: " + relEqual.ToString());
bool netEqual =  rel1.Equals(pt2 as object);  //calling Object::Equals
Console.WriteLine("Equal: " + netEqual.ToString());
[/code]
Overlaps
두 Geometry의 교차되는 부분이 같은 차원으로
일부를 포함하면서 그 외의 일부는 포함되지 않으며 True를 반환하며, Clementini 연산자이다.

Polyline/Polyline, Polygon/Polygon, Multipoint/Multipoint간에만 적용되며, 두 Geometry 중 하나가 Empty이면 False를 반환한다.

예) Overlaps 관계가
True인 경우


Touches
두 Geometry가 한 점 이상에서 서로 교차하고 interior는 교차하지 않으며 True를 반환하며,
Clementini 연산자이다. 예를 들면, Point와 Polyline 관계에서 Polyline의 끝점과 Point가 일치하는 경우에만 Touchs 관계가 성립한다.

Point와 Point간의 비교는 성립하지 않으며 두 Geometry 중 하나가 Empty이면 False를 반환한다.

예) Touches 관계가 Ttrue인 경우

Within
Base Geometry가 두 Geometry와 교차하고 Interior의 교차가 Empty가 아닌 상태, 즉 Base Geometry가 대상 Geomtry에 완전히 포함되면 True를 반환하며, Clementini 연산자이다.

Within과 Contains는 역관계이며, Base Geoemtry가 Empty일 경우 대상 Geometry가 Empty가 아니면 Within 관계가 성립한다.

예) Within 관계가 True인 경우


Relation
Shape Comparison Language를 이용하여 두 Geometry간에 정의된 관계가 있으며 True를 반환한다. Shape Comparison Language(SCL)는 Calculus-Based Method (CBM - Clementini와 Felice)를 기반으로 하며 ArcObjects에서는 이를 확장하였다.

▣ 예제 코드
[code c#]
IPoint baseGeom = new ESRI.ArcGIS.Geometry.PointClass();
IPoint compGeom = new ESRI.ArcGIS.Geometry.PointClass();
baseGeom.PutCoords(0, 10);
compGeom.PutCoords(0, 10);

IRelationalOperator relOpt = (IRelationalOperator)baseGeom;

bool isEqual = relOpt.Equals(compGeom);
[/code]
더 많은 코드 예제는 다음 URL을 참고할 것
-
http://resources.esri.com/help/9.3/ArcGISEngine/ArcObjects/esrigeometry/IRelationalOperator_Example.htm

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