回答:
一度に1つのフィーチャの場合、通常の[場所による選択 ]ダイアログを使用して、次のキーをラインオンラインオーバーレイの空間関係タイプのガイドとして([場所による選択]から:グラフィックの例)使用することで、これをインタラクティブに簡単に行うことができます。
(ソース:arcgis.com)ラインを使用してラインを選択
交点A、C、D、E、F、G、H、I、J G、Hを含む COMPLETELY_CONTAINS G CONTAINS_CLEMENTINI G、H F、H内 COMPLETELY_WITHIN F WITHIN_CLEMENTINI F、H ARE_IDENTICAL_TO H BOUNDARY_TOUCHES C、E
この場合の関連する関係タイプはINTERSECT
およびBOUNDARY_TOUCHES
です。上の図からわかるように、を使用BOUNDARY_TOUCHES
して、ラインの端点に接するフィーチャを選択できます。ちょうど2つの機能が選択されている場合は、ケース1になります。ある機能が他の機能に影響されず、それらが交差しているだけの場合、BOUNDARY_TOUCHES
何も選択されません。INTERSECT
エンドポイントで接触しているかどうかに関係なく、交差するすべてのフィーチャが選択されます。したがって、エンドポイントに接触する機能がないことがわかっていても、交差する機能がある場合は、ケース2になります。
プロセスを自動化するには、次のPythonスクリプト(必要に応じてスクリプトツールとして実装)を使用して、フィーチャクラスまたはレイヤーの各フィーチャのタッチと交差の数を計算します。
import arcpy
################################ Configuration #################################
numTouchesField = "NUM_TOUCHES"
numIntersectionsField = "NUM_INTERSECTIONS"
################################################################################
def countTouches(layer, feature):
"""Returns the number of times the boundary of a feature touches other
features in the same feature layer."""
return countSpatialRelation(layer, feature, "BOUNDARY_TOUCHES")
def countIntersections(layer, feature):
"""Returns the number of times a feature intersects other features in the
same feature layer."""
return countSpatialRelation(layer, feature, "INTERSECT") - 1 # Subtract 1 because the feature will always intersect its clone in the feature layer
def countSpatialRelation(layer, feature, relation):
"""Returns the number of times a feature meets the specified spatial
relationship with other features in the same feature layer."""
arcpy.SelectLayerByLocation_management(layer, relation, feature)
count = int(arcpy.GetCount_management(layer).getOutput(0))
return count
def addField(table, fieldName, fieldType):
"""Adds a fields of the given name and type to a table, unless a field with
the same name already exists."""
desc = arcpy.Describe(table)
fieldInfo = desc.fieldInfo
fieldIndex = fieldInfo.findFieldByName(fieldName)
if fieldIndex == -1:
# Field does not exist, add it
arcpy.AddField_management(table, fieldName, fieldType)
def countTouchesAndIntersections(layer):
"""Adds and populates fields describing the number of times each feature
touches and intersects other features in the feature layer."""
addField(layer, numTouchesField, "LONG")
addField(layer, numIntersectionsField, "LONG")
desc = arcpy.Describe(layer)
shapeField = desc.shapeFieldName
rows = arcpy.UpdateCursor(layer)
for row in rows:
feature = row.getValue(shapeField)
row.setValue(numTouchesField, countTouches(layer, feature))
row.setValue(numIntersectionsField, countIntersections(layer, feature))
rows.updateRow(row)
del row, rows
if __name__ == "__main__":
layer = arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0))
countTouchesAndIntersections(layer)
それが実行されると、正確に2回接触して正確に2回交差する機能(ケース1)と0回接触して正確に2回交差する機能(ケース2)を簡単にクエリできます。
定義クエリの例:
"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2
見つかった2つのケースのインスタンスの図については、以下のスクリーンショットを参照してください。
実世界のデータでは、通常、通りのセグメントは交差点で分割され、ぶら下がりは、インターチェンジや橋のように道路が互いに交差するときにのみ発生します。したがって、通常、タッチと同じ数の機能が交差しています。
より一般的なケースでは、かどうかをチェックして、ダングルを探します"NUM_INTERSECTIONS" > "NUM_TOUCHES"
。
頂点でラインを分割(データ管理)
「頂点で入力ラインまたはポリゴン境界を分割することによって生成されるラインを含むフィーチャクラスを作成します」
アトリビューションを保持します。
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000
ネットワークのノードを抽出することもできます。ケース1の場合、価数が4のノードが2つ取得されます。ケース2の場合、ノードはありません。