ポリラインの開始と終了の属性にそれぞれポイントIDを割り当てますか?


9

ポイントとポリラインの2つのシェープファイルがあります。ポリラインレイヤーに、ラインの始点から終点までのポイントデータID(systemID)を入力しようとしています。例えば。2つの列(fromおよびto)を作成します。ラインにはすでにフローの方向が割り当てられています。私はArcHydroツールを使用していますが、Arcpyも問題ありません。

ArcHydroで、属性ツール>ラインのFrom / Toノードの生成を使用してみましたが、ポイントデータからではないToおよびFromの値が作成されます。もう1つの方法は、Feature to Verticesを使用して、その結果をポイントデータテーブルに結合し、systemIDを取得することでした。ただし、ポリラインレイヤーも更新する必要があります。もっと簡単な方法があるはずです。

注:すべての線の頂点にポイントがあるわけではありません。空白の値で十分です。


したがって、ポイントにはポリシステムのFNode、TNodeフィールドに移動する必要があるフィールド 'systemID'があります...そうですか?
Michael Stimson、2014

この辺りにこのような質問があります。答えは基本的にラインツーポイントの開始と終了が別々のフィーチャクラスであり、2つを(個別に)ポイントデータと交差させてIDを取得し、ラインを使用してそれらをラインに空間的に結合します。 IDと正しい開始フィールドまたは終了フィールドへの割り当て(そこで計算されるフィールドである可能性があります)。今は見つけられないようです。周りを掘りながら、それを発見し、この1
Chris W、

ここにそれがあります:gis.stackexchange.com/questions/85082そして、それはポイントへのフィーチャー頂点であり、ラインへのフィーチャーまたはポイントへのフィーチャーではありませんでした。質問の最後であなたが述べたことのほとんど。
Chris W

@ChrisW、私それよりもFelixIPの答えが本当に好きです。2つの属性結合のみです。
Michael Stimson、2014

回答:


12

時には、すぐに使えるソリューションを使用しない方がよい場合があります。これが私が提案する理由です

  1. ノードレイヤーにXフィールドとYフィールドを入力し、それらを整数(cmなど)に変換します。文字列フィールドを作成し、整数の文字列表現を連結して入力します。
  2. シェイプの最初のポイントについて、リンクテーブルで同様のことを行います。
  3. 最後に作成されたフィールドを使用してノードテーブルをリンクに結合し、nodeIDをFROMフィールドに転送します。

移動2、ただし最後のポイントを使用してTOノードIDを割り当てる


いいね!以下のようなフィールドを計算何かSTR(ラウンド(!形!.firstPoint.X、3))+ "" + STR(ラウンド(!形!.firstPoint.Y、3))のノードから、用(Pythonのパーサ)STR(ラウンド(!Shape!.lastPoint.X、3))+ "、" + str(round(!Shape!.lastPoint.Y、3)) forノードの場合、ポイントと同様に(テキストとして)結合します...フェリックスの苦痛なしの空間結合の優れた方法!地理データ(7や8など)のより有効な桁に丸めます。
Michael Stimson、2014

もちろん、ディクショナリが遅いテーブル結合に置き換わるスクリプト環境でも非常に高速です
FelixIP

Int(X * 100)メートル単位で投影されている場合。代わりにMichaelのコードを使用
FelixIP

上記でリンクした質問の方法よりも間違いなく単純です。手順が少なく、ツールが少なく、ライセンスレベルの制限はありません。空間結合を通常の属性結合に変換する興味深いアイデア。
Chris W

1

私は数ヶ月前に同じことをしました。私はarcpyを使用しましたが、スクリプトが長すぎてここに投稿できないので、私が行ったことの概要を説明します。

  1. 空間結合を使用して、特定のラインフィーチャ内にあるポイント/ノードを検出しました。

  2. 空間結合では流れの方向が考慮されていないため、開始点と終了点を確認するためにarcpyを使用しました。これを行うには、arcpy describe関数を使用してラインフィーチャの開始/終了頂点の座標情報を抽出し、これらを接続されたポイントの座標値と比較しました。

  3. 最後に、どちらのto / fromポイントがどれであるかを調べたら、setValue関数を使用して、元のポリラインデータセットのto / fromフィールドに値を入力しました。

もちろん、これ以外にも少しありますが、要点をまとめました。


私の幾何学的ネットワークでは、流れの方向はどの基本方向でもかまいません。フロー方向ラスターまたは同等のものを使用していない限り、生の座標の比較からフロー方向を確認することはできませんでした。パイプが自然の輪郭に対して傾斜している場合や、水が上り坂で汲み上げられる場合があるため、それでも問題が発生する可能性があります。流れの方向が正しいことをどのように確認できますか?
プリシラ

1

@FelixIPに触発されましたが、ネットワークが400K以上のパイプと500K以上のノードで非常に大きいため、結合や追加ファイルの作成なしでソリューションを書きたかったのです。

ジオメトリックネットワークの構築により、節点とパイプの両端のX、Yが一致するように強制されます。arcpyカーソルの形状トークンを使用してこれらの場所にアクセスし、それらを一致させることができます。線の形状トークンは、頂点の配列を、描画された順序で返します。私のネットワークでは、フローの方向を設定するためにこれを使用するため、パイプの描画順序は大幅にQAされます。つまり、最初の頂点はパイプの始まりであり、最後の頂点はパイプの終わりです。

参照:ASSETID =パイプのID、UNITID =パイプの開始時のノードID、UNITID2 =パイプの終了時のノードID

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

これは私が行うことの90%ですが、ノードディクショナリが既に利用可能であるため、パイプを2回通過することはありません。
FelixIP 2019
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.