アークとノードの接続関係 (2005.12.05)
技術資料トップへもどる
交差点のポイントデータと道路区間のラインデータがあって、道路区間は交差点で接続している、 というモデルを考えましょう。接続関係を論ずる場合、道路区間のようなラインを「アーク」、 アークが接続する点を「ノード」と呼ぶので、以下ではそれに従います。 立体交差では、ラインが重なる場所にノードがないので交差するライン間で乗り移る ことはできません。

知りたいことは
−1本のアーク両端のノード番号は何か
−ひとつのノードに接続するアークの番号は何か
ということです。これには空間的な位置関係による検索を使い、
選択しているアークと重なるノードを検索
選択しているノードと重なるアークを検索
という操作をすることで目的のフィーチャを発見できます。

以下はこの操作を実行するAvenueスクリプトです。

1.アーク両端のノードIDを求める
'---------------------------------------------------------------
' arc2node.ave
' ラインの端点で接続するノードのID番号を求め、ライン属性に追加する
'---------------------------------------------------------------
'
' ラインテーマ:road.shp
' ノードテーマ:roadnode.shp
'
' 追加する属性
' From_node:ラインの始点に位置するノードのID
' To_node:ラインの終点に位置するノードのID
'---------------------------------------------------------------
' (C)2005 雨宮 有/GISインスティテュート
'---------------------------------------------------------------

theView = av.GetActiveDoc
roadFTab = theView.FindTheme("road.shp").GetFTab
shapeField = roadFTab.FIndField("Shape")
nodeFTab = theView.FindTheme("roadnode.shp").GetFTab
IDField = nodeFTab.FindFIeld("ID")

'道路ラインのFTabに出力先フィールドを追加
fromField = Field.Make("From_Node", #FIELD_LONG, 8, 0 )
toField   = Field.Make("To_Node",   #FIELD_LONG, 8, 0 )
roadFTab.SetEditable( true )
roadFTab.AddFields({fromField, toField})

theTolerance = 0.01 '/m
if ( roadFTab.GetSelection.Count > 0 ) then
  theLoop = roadFTab.GetSelection
else
  theLoop = roadFTab
end

for each rec in theLoop
  road_segment = roadFTab.ReturnValue( shapeField, rec )
  fromPoint = road_segment.Along(0)
  toPoint   = road_segment.Along(100)

  '始点ノード
  nodeFTab.SelectByPoint (fromPoint, theTolerance, #VTAB_SELTYPE_NEW )
  for each nodeRec in nodeFTab.GetSelection
    fromID = nodeFTab.ReturnValue( IDField, nodeRec )
  end
  roadFTab.SetValue( fromField, rec, fromID )

  '終点ノード
  nodeFTab.SelectByPoint (toPoint, theTolerance, #VTAB_SELTYPE_NEW )
  for each nodeRec in nodeFTab.GetSelection
    toID = nodeFTab.ReturnValue( IDField, nodeRec )
  end
  roadFTab.SetValue( toField, rec, toID )
end '/ for each rec

roadFTab.SetEditable( false )
2.ノードに接続するアークのIDを列挙する
'---------------------------------------------------------------
' node2arc.ave
' 交差点ポイントに対して、接続する道路区間ラインのID番号を与える
'---------------------------------------------------------------
'
' ラインテーマ:road.shp
' ノードテーマ:roadnode.shp
'
' 追加する属性
' Arc_IDs:このノードで接続する道路区間のID
'---------------------------------------------------------------
' (C)2005 雨宮 有/GISインスティテュート
'---------------------------------------------------------------

theView = av.GetActiveDoc
roadFTab = theView.FindTheme("road.shp").GetFTab
IDField = roadFTab.FindFIeld("ID")
nodeFTab = theView.FindTheme("roadnode.shp").GetFTab
shapeField = nodeFTab.FIndField("Shape")

'交差点ポイントのFTabに出力先フィールドを追加
arcIDField = Field.Make("Arc_IDs", #FIELD_CHAR, 100, 0 )
nodeFTab.SetEditable( true )
nodeFTab.AddFields({arcIDField})

theTolerance = 0.01 '/m
if ( nodeFTab.GetSelection.Count > 0 ) then
  theLoop = nodeFTab.GetSelection
else
  theLoop = nodeFTab
end

for each rec in theLoop
  arcID = ""
  crossing = nodeFTab.ReturnValue( shapeField, rec )
  '接続するアークを列挙
  roadFTab.SelectByPoint (crossing, theTolerance, #VTAB_SELTYPE_NEW )
  for each arcRec in roadFTab.GetSelection
    arcID = arcID + "," + roadFTab.ReturnValue( IDField, arcRec ).AsString
  end
  arcID = arcID.Right(arcID.count-1)

  nodeFTab.SetValue( arcIDField, rec, arcID )
end '/ for each rec

nodeFTab.SetEditable( false )
技術資料トップへもどる

©2003-2006, 有限会社GISインスティテュート. All rights reserved.
〒183-0035 東京都府中市四谷3-49-18
電話・FAX:042-405-3901
gis-i@nifty.com