接触する線と交差する線を区別しますか?


9

ArcGIS 10でこれらのケースをどのように区別しますか?

  • ケース1:線の両端が別の線に接している
  • ケース2:両方の端点が交差する線上でぶら下がる

私はトリムライン機能を見ていますが、それは私が望むものではありません(破壊的)。

実世界のユースケースは、高速道路の両方の道路を接続するサービス道路と、高速道路と交差する道路の他のケースを区別することです。

ここに画像の説明を入力してください ここに画像の説明を入力してください

回答:


13

一度に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)を簡単にクエリできます。

定義クエリの例:

  • ケース1(2回タッチ、2回交差):"NUM_TOUCHES" = 2 AND "NUM_INTERSECTIONS" = 2
  • ケース2(タッチしない、2回交差する):"NUM_TOUCHES" = 0 AND "NUM_INTERSECTIONS" = 2

見つかった2つのケースのインスタンスの図については、以下のスクリーンショットを参照してください。 さまざまな線の交差/タッチ関係を示すArcMapスクリーンショット

実世界のデータでは、通常、通りのセグメントは交差点で分割され、ぶら下がりは、インターチェンジや橋のように道路が互いに交差するときにのみ発生します。したがって、通常、タッチと同じ数の機能が交差しています。

より一般的なケースでは、かどうかをチェックして、ダングルを探します"NUM_INTERSECTIONS" > "NUM_TOUCHES"


精巧な答えをありがとう。スクリプトツールに変換するときに少し問題があります(レイヤーを選択しようとするとフリーズします)が、このアプローチが有効であると確信しています。
mvexel

もう1つのコメント:フィールド名の長さを10文字未満に減らす必要がありました(おそらく、レイヤーソースがシェープファイルであるため)。
mvexel

この回答の冒頭で迷っていたArcGISドキュメンテーションイメージへのURLがあるようです。
PolyGeo

@PolyGeoどれ?私には元気そうだ。
blah238 16

奇妙なことですが、最初の写真(4行目について)が昨日の小さな十字架として表示されていました。今日は元気です。私がよく使用しているiOSクライアントではなく、ブラウザー(現在使用中)で見たようです。
PolyGeo

2

頂点でラインを分割(データ管理)

「頂点で入力ラインまたはポリゴン境界を分割することによって生成されるラインを含むフィーチャクラスを作成します」

アトリビューションを保持します。

ここに画像の説明を入力してください

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//00170000003z000000


それがどのように役立つかはわかりませんが、もう少し良くするために何をする必要があるかを明確にできたと思います。質問を編集しました。
mvexel 2012

-1

フィーチャレイヤーをコピーし、ラインをトリミングしてから、トリミングされたフィーチャセットを元のフィーチャセットと比較して、変更されたフィーチャを見つけますか?きれいではありませんが、ほぼ間違いなくPythonを使用する必要がありますが、動作するはずです。


-1

ネットワークのノードを抽出することもできます。ケース1の場合、価数が4のノードが2つ取得されます。ケース2の場合、ノードはありません。


ArcGISでこれを行う方法を提案できますか?
blah238

誰かのスクリプトまたはツールを使用して、始点ノードと終点ノードである一意のIDをポリラインに追加できます。私はarchydroがそれを実行することを知っていますが、それを実行するスクリプトがarcscripts Webサイトにあることを確認します。次に、プログラミング以外の方法で、頻度ツールをfromフィールドで実行し、次にtoノードフィールドで実行してそれらを合計すると、ノードの価数が得られ、ノードを表すポイントレイヤーに結合できます。
Hornbydd 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.