여기에서는 두 Geometry간의 공간관계를 확인하는 IRelationalOperator 인터페이스를 살펴본다.
▣ DE-9IM(Dimensionally Extended 9 Intersection Model)
DE-9IM(Clementini-Matrix)은 두 Geometry간의 공간관계를 정의하는 수학적인 접근 방식으로 8가지의 공간관계 연산자를 정의하고 있으며 ISO/TC 211 및 OGC에서도 채택하고 있다.
공간관계 연산은 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]
[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]
두 Geometry의 교차되는 부분이 같은 차원으로 일부를 포함하면서 그 외의 일부는 포함되지 않으며 True를 반환하며, Clementini 연산자이다.
Polyline/Polyline, Polygon/Polygon, Multipoint/Multipoint간에만 적용되며, 두 Geometry 중 하나가 Empty이면 False를 반환한다.
예) Overlaps 관계가 True인 경우
⑥ Touches
두 Geometry가 한 점 이상에서 서로 교차하고 interior는 교차하지 않으며 True를 반환하며, Clementini 연산자이다. 예를 들면, Point와 Polyline 관계에서 Polyline의 끝점과 Point가 일치하는 경우에만 Touchs 관계가 성립한다.
예) Touches 관계가 Ttrue인 경우
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
댓글 없음:
댓글 쓰기