2010년 2월 18일 목요일

IProximityOperator

ArcObjects Geomtery 관련 인터페이스 중 Geometry를 핸들링하는 가장 중요한 인터페이스가 무엇일까? 선택하라면 아마도 ITopologicalOperator, IRelationalOperator, IProximityOperator일 것이다. 여기에서는 그 중 인접성과 관련된 연산을 수행하는 IProximityOperator의 메쏘드를 살펴본다.

IProximityOperator 인터페이스는 두 Geometry간의 거리를 계산하거나 주어진 포인트로부터 다른
Geometry의 가장 가까운 포인트나 가장 가까운 포인트간의 거리를 계산하는데 사용한다.

▣ CoClasses that implement IProximityOperator
- BezierCurve, CircularArc, EllipticArc, Envelope, Line, Multipoint, Point, Polygon, Polyline
- esriDefenseSolutions: GeoEllipse, GeoPolygon, GeoPolyline

▣ Members
① QueryNearestPoint
주어진 포인트에서 대상
Geometry간의 가장 가까운 포인트를 쿼리(copy)한다. segment extension 옵션에 의해 가장 가까운 포인트는 Geometry의 extension을 이용해서도 계산될 수 있다.
다음 코드에서와 같이 QuerynearestPoint를 호출하기 위해서 InputPoint(nearest Point)는 반드시 호출하기 전에 할당할 것.

[C#]public void QueryNearestPoint (IPoint p, esriSegmentExtension extension, IPoint nearest);
[code c#]
IPoint fromPoint = new ESRI.ArcGIS.Geometry.PointClass();
IPoint toPoint = new ESRI.ArcGIS.Geometry.PointClass();
fromPoint.PutCoords(0, 0);
toPoint.PutCoords(0, 10);

ILine lineSeg = new ESRI.ArcGIS.Geometry.LineClass();
lineSeg.PutCoords(fromPoint, toPoint);

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

IProximityOperator proxOpt = (IProximityOperator)lineSeg;

IPoint nearestPoint = new ESRI.ArcGIS.Geometry.PointClass();
proxOpt.QueryNearestPoint(origPoint, esriSegmentExtension.esriNoExtension, nearestPoint);
[/code]



② ReturnNearestPoint
주어진 포인트에서 대상
Geometry간의 가장 가까운 포인트를 검색한 후 생성/반환한다. segment extension 옵션에 의해 가장 가까운 포인트는 Geometry의 extension을 통해서 계산될 수 있다.

[C#]public IPoint ReturnNearestPoint(IPoint p, esriSegmentExtension extension);
[code c#]
IPoint fromPoint = new ESRI.ArcGIS.Geometry.PointClass();
IPoint toPoint = new ESRI.ArcGIS.Geometry.PointClass();
fromPoint.PutCoords(0, 0);
toPoint.PutCoords(0, 10);

ILine lineSeg = new ESRI.ArcGIS.Geometry.LineClass();
lineSeg.PutCoords(fromPoint, toPoint);

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

IProximityOperator proxOpt = (IProximityOperator)lineSeg;

IPoint nearestPoint = proxOpt.ReturnNearestPoint(origPoint, esriSegmentExtension.esriNoExtension);
[/code]


③ ReturnDistance
Geometry간의 최단거리를 반환한다. 두 Geometry가 intersect 관계이면 거리는 0이다.
최단거리만 반환하는 메쏘드이다.

[C#]public double ReturnDistance (IGeometry other);
[code c#]
IPoint fromPoint = new ESRI.ArcGIS.Geometry.PointClass();
IPoint toPoint = new ESRI.ArcGIS.Geometry.PointClass();
fromPoint.PutCoords(0, 0);
toPoint.PutCoords(0, 10);

ILine lineSeg = new ESRI.ArcGIS.Geometry.LineClass();
lineSeg.PutCoords(fromPoint, toPoint);

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

IProximityOperator proxOpt = (IProximityOperator)lineSeg;

double pointDist = proxOpt.ReturnDistance(origPoint);
[/code]


※ esriSegmentExtension Constants

esriSegmentExtension에 대한 내용은 다음 그림을 참조하면 된다. Geometry상에서의 거리나 최단거리 포인트를 얻고자 할 경우에는 esriNoExtension을 사용하고 특히, esriExtend*는 시작/끝점에서의 확장을 통해 최단거리 포인트 등을 얻을 수 있다.



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