FAQ
ジオメトリ オブジェクトの空間的な位置関係を調査する方法

ナレッジ番号:2904 | 登録日:2023/05/29 | 更新日:2023/12/28

概要

このトピックではジオメトリ間の近接関係を調べる方法を紹介します。ジオメトリ間の距離を調べるには、IProximityOperator::ReturnDistance メソッドを使用します。最近接点を調べるには ReturnNearestPoint メソッド、もしくは QueryNearestPoint メソッドを使用します。最近接点はジオメトリの頂点に限りません。セグメント上の任意の地点を返します。

ReturnNearestPoint メソッドと QueryNearestPoint メソッドの役割は同じですが、引数と戻り値が異なります。ReturnNearestPoint メソッドでは最近接点を示す Point オブジェクトがメソッドの戻り値として返されますが、QueryNearestPoint メソッドでは事前にインスタンス化(New)した Point オブジェクトを用意しておき、メソッドの引数にセットします。メソッド実行後にオブジェクトに XY 座標値がセットされます。

オブジェクトのインスタンス化を実行しない分 QueryNearestPoint メソッドがより高速に動作します。大量のジオメトリ オブジェクトに対して最近接点の座標を取得したい場合は、QueryNearestPoint を使用するとより高速に処理できます。ArcObjects で Query~ という名前のメンバは同様の処理を行います。

サンプルコード

このサンプルでは、4つの頂点を含む Polygon オブジェクトと Point オブジェクトを作成し、IProximityOperator のメンバによって 2つのジオメトリ間の距離と最近接点を調べます。

Image

//ポリゴンの作成
IPoint[] pPoint = new PointClass[4];
pPoint[0] = new PointClass() { X = 0, Y = 0 };
pPoint[1] = new PointClass() { X = 0, Y = 100 };
pPoint[2] = new PointClass() { X = 100, Y = 100 };
pPoint[3] = new PointClass() { X = 100, Y = 0 };

IPointCollection pPointCollection  = new PolygonClass();
pPointCollection.AddPoint(pPoint[0]);
pPointCollection.AddPoint(pPoint[1]);
pPointCollection.AddPoint(pPoint[2]);
pPointCollection.AddPoint(pPoint[3]);
pPointCollection.AddPoint(pPoint[0]);

IProximityOperator pProximityOperator = (IProximityOperator)pPointCollection;  //キャスト


//比較ポイントの作成
IPoint pInPoint= new PointClass();
pInPoint.PutCoords(300, 50);


//近接点の取得(ReturnNearestPoint)
IPoint pNearestPoint = pProximityOperator.ReturnNearestPoint(pInPoint, esriSegmentExtension.esriNoExtension);

//近接点の取得(QueryNearestPoint)
pNearestPoint = new PointClass();  //事前に空の Point オブジェクトを作成
pProximityOperator.QueryNearestPoint(pInPoint, esriSegmentExtension.esriNoExtension, pNearestPoint);

Double dblNearestDistance  = pProximityOperator.ReturnDistance(pInPoint);

System.Diagnostics.Debug.WriteLine("距離:" + dblNearestDistance.ToString() + "X:" + pNearestPoint.X.ToString() + "Y:" + pNearestPoint.Y.ToString());
'ポリゴンの作成
Dim pPoint(3) As IPoint
pPoint(0) = New PointClass()
pPoint(1) = New PointClass()
pPoint(2) = New PointClass()
pPoint(3) = New PointClass()

pPoint(0).PutCoords(0, 0)
pPoint(1).PutCoords(0, 100)
pPoint(2).PutCoords(100, 100)
pPoint(3).PutCoords(100, 0)

Dim pPointCollection As IPointCollection = New PolygonClass()
pPointCollection.AddPoint(pPoint(0))
pPointCollection.AddPoint(pPoint(1))
pPointCollection.AddPoint(pPoint(2))
pPointCollection.AddPoint(pPoint(3))
pPointCollection.AddPoint(pPoint(0))

Dim pProximityOperator As IProximityOperator = CType(pPointCollection, IProximityOperator)


'比較ポイントの作成
Dim pInPoint As IPoint = New PointClass()
pInPoint.PutCoords(300, 50)


'近接点の取得(ReturnNearestPoint)
Dim pNearestPoint As IPoint = pProximityOperator.ReturnNearestPoint(pInPoint, esriSegmentExtension.esriNoExtension)

'近接点の取得(QueryNearestPoint)
pNearestPoint = New PointClass()  '事前に空の Point オブジェクトを作成
pProximityOperator.QueryNearestPoint(pInPoint, esriSegmentExtension.esriNoExtension, pNearestPoint)

Dim dblNearestDistance As Double
dblNearestDistance = pProximityOperator.ReturnDistance(pInPoint)

System.Diagnostics.Debug.WriteLine("距離:" + dblNearestDistance.ToString() + "X:" +  pNearestPoint.X.ToString() + "Y:" + pNearestPoint.Y.ToString())

メタデータ

種類

製品