FAQ
2つのポリラインの交点を取得する方法

ナレッジ番号:5543 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

このサンプル コードは、2つのポリラインの交点を取得する方法を示します。

ポリラインは多角形なので交点が複数存在する場合があるので、交点が存在する場合は IMultipoint 型のオブジェクトが返ります。2つのラインが同一であったり、お互いの一部が重なっているが、互いに交差をしていない場合は交点を取得することはできません。Intersect メソッドの第2引数は次元を指定しますが、交点を求めたい場合は次元は0を指定します。
(※ 長さをもつジオメトリの次元は1、面積をもつジオメトリの次元は2となります。)

Image

サンプル コード

以下の関数は2本のポリライン(Polyline)を引数として、交点(IMultipoint) を返すサンプル コードです。
//最上位のレイヤーを取得
IMxDocument pMxDocument = ArcMap.Document;
IMap pMap = pMxDocument.FocusMap;
ILayer pLayer = pMap.get_Layer(0);

//Object ID が 1  のフィーチャを取得
IFeatureLayer pFeatureLayer = (IFeatureLayer)pLayer;
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IFeature pFeature1 = pFeatureClass.GetFeature(1);

//フィーチャをポリラインとして取得
IGeometry pGeometry1 = pFeature1.Shape;
IPolyline pPolyline1 = (IPolyline)pGeometry1;

//Object ID が 2  のフィーチャを取得
IFeature pFeature2 = pFeatureClass.GetFeature(2);

//フィーチャをポリラインとして取得
IGeometry pGeometry2 = pFeature2.Shape;
IPolyline pPolyline2 = (IPolyline)pGeometry2;

//空間演算のため ITopologicalOperator にキャスト
ITopologicalOperator5 pTopologicalOperator = (ITopologicalOperator5)pPolyline1;

//ポリラインとポリラインが交わっているかの空間演算
IMultipoint pMultiPoint = null;
IPoint crosspoint;
pMultiPoint = pTopologicalOperator.Intersect(pPolyline2, esriGeometryDimension.esriGeometry0Dimension) as IMultipoint;

if (pMultiPoint != null)
{
   for (int i = 0; i < ((IPointCollection)pMultiPoint).PointCount; i++)
   {
   //交点の取得
   crosspoint = ((IPointCollection)pMultiPoint).get_Point(i);
   System.Windows.Forms.MessageBox.Show("交点の数 = " + ((IPointCollection)pMultiPoint).PointCount.ToString() + "\r\n" + "交点の座標値 : (" + crosspoint.X.ToString() + "," + crosspoint.Y.ToString() + ")");
   }
}
else
{
   System.Windows.Forms.MessageBox.Show("交点はありません。");
}
'最上位のレイヤーを取得
Dim pMxDocument As IMxDocument = My.ArcMap.Document
Dim pMap As IMap = pMxDocument.FocusMap
Dim pLayer As ILayer = pMap.Layer(0)

'Object ID が 1  のフィーチャを取得
Dim pFefatureLayer As IFeatureLayer = pLayer
Dim pFeatureClass As IFeatureClass = pFefatureLayer.FeatureClass
Dim pFeature1 As IFeature = pFeatureClass.GetFeature(1)

'フィーチャをポリラインとして取得
Dim pGeometry1 As IGeometry = pFeature1.Shape
Dim pPolyline1 As IPolyline = pGeometry1

'Object ID が 2  のフィーチャを取得
Dim pFeature2 = pFeatureClass.GetFeature(2)

'フィーチャをポリラインとして取得
Dim pGeometry2 As IGeometry = pFeature2.Shape
Dim pPolyline2 As IPolyline = pGeometry2

'空間演算のため ITopologicalOperator にキャスト
Dim pTopologicalOperator As ITopologicalOperator5 = CType(pPolyline1, ITopologicalOperator5)

'ポリラインとポリラインが交わっているかの空間演算
Dim pMultiPoint As IMultipoint
Dim crosspoint As IPoint
pMultiPoint = TryCast(pTopologicalOperator.Intersect(pPolyline2, esriGeometryDimension.esriGeometry0Dimension), IMultipoint)

If (Not pMultiPoint Is Nothing) Then
   Dim i As Int16 = 0
   For i = 0 To CType(pMultiPoint, IPointCollection).PointCount - 1
      '交点の取得
      crosspoint = CType(pMultiPoint, IPointCollection).Point(i)
      System.Windows.Forms.MessageBox.Show("交点の数 = " + CType(pMultiPoint, IPointCollection).PointCount.ToString() + vbCrLf + "交点の座標値 : (" + crosspoint.X.ToString() + "," + crosspoint.Y.ToString() + ")")
   Next
Else
   System.Windows.Forms.MessageBox.Show("交点はありません。")
End If

メタデータ

機能

種類

製品