ArcGIS 10:方向性に基づいてポイントレイヤーからイベントリニアレイヤーを作成する


8

速度制限を反映するポイントレイヤーと道路のラインレイヤーがあります。速度標識の位置は、速度制限が適用される方向を示します。

速度を反映する道路レイヤーの上に線形イベントテーブルを作成するにはどうすればよいですか?したがって、各セグメントについて、各方向に1つずつ、2つの速度属性を返します。

速度/道路レイヤー


「速度標識の位置は、制限速度が適用される方向を示しています」を明確にできますか これは、ポイントが道路の右側にある場合(道路の方向性に基づく)、速度が右車線に適用されることを意味しますか?ポイントは道路の近くにありますか?
スティーブンリード

@StephenLeadはい、標識ポイントはラインレイヤーから1〜5 mの位置にあり、速度が適用される方向を示します
dassouki

道路標識とともに保存されている他の属性はありますか?最初にそれらを道路にスナップしてから、どういうわけか道路の方向性を道路標識に転送し、次に頂点で線を切り、標識から各セグメントに属性値を転送する必要があるように聞こえます。ただのアイデア。あなたがデータを投稿した場合に役立つかもしれません。
Jakub Sisak GeoGraphics 2014年

@Jakub道路標識に必要な属性は「posted_speed」だけです。サインレイヤーには方向性に関する情報がありません
dassouki 2014年

ため息にはスピード以外の属性がありますか?標識を道路にリンクできるものがあるのではないかと私は尋ねています。そうしないと、標識を道路セグメントに手動でスナップし、属性を転送して道路セグメントを分割しない限り、目的の操作を行うことができません。(これはプログラムで行うこともできますが、距離が可変であるため完全な自動化ができない場合があります)結果はスタンドアロンテーブルではなく、この情報のすべてが転送される属性テーブルになります。
Jakub Sisak GeoGraphics 2014年

回答:


3

線形ルートイベントレイヤーの場合、ルートのIDと開始および終了のm値を含むテーブルを作成する必要があります。

道路にm値がない場合は、ルート作成ツールを使用してルートを作成できます

2番目のステップは、各ポイントの道路のm値を抽出することです。これは、道路に沿った位置特定機能で実行できます。あなたの姿がよく見える場合、ポイントは同じ方向の場合、道路の同じ側にあります。どちらの側にいるかを示す正または負の距離があるので、これは素晴らしいことです。

最後のステップへの最も簡単な方法は、Microsoft Excelです。

  • roadIDルートまでの距離の符号でポイントをソートします
  • m-value次の点(または方向によっては前の点)の新しい列を追加します。
  • 末尾に1つの欠損値があり、0またはm-valueセグメントの最大値のいずれかで埋める必要があります。

編集:ソート後、テーブルは次のようになります

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

ポイントがm値で並べ替えられていることがわかります。私の場合、3列目はイベントの始まりです。新しいイベントレイヤーにはフィールドfromtoフィールドが必要です。したがって、私の例では次のようになります。

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

他の方向では、

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

次に、標識をオフセットフィールドとして使用してイベントレイヤー作成し、ルートの正しい側の速度制限を見つけることができます。


これまでのところ、これは他のソリューションよりもうまく機能しています。前と次のポイントをさらに追加することについて、Excelの部分について説明していただけますか?
dassouki、2014年

3

コメントするのに十分な担当者はいませんが、私の質問は、道路がすでに速度ゾーンに対応するセグメントに含まれているかどうかです。

いずれにせよ、これは私の提案ですが、片側のバッファを許可するライセンスレベルを持っていることが条件です(高度/ ArcInfo、だと思います)。同様のプリンシパルを基本的なツールで適用できますが、より複雑になります。また、実行にはしばらく時間がかかると思います...

import arcpy
def TakeOutTrash(dataset):
    if arcpy.Exists(dataset):
        arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")

これで、中心線から6メートル離れた各道路の両側にバッファがあり、すべての標識をカバーするはずです。これが当てはまることを確認するために、場所による簡単な選択を行うことができます。そうでない場合は、1〜2メートル余分にバッファー操作を再実行してください。

次:

final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
    rows1 = arcpy.SearchCursor(buffer)
    for row1 in rows1:
        final_dict[seg] = [[],[]]
        seg = str(row1.getValue("seg_num"))
        TakeOutTrash("fl")
        fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
        arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
        rows2 = arcpy.SearchCursor(signs)
        for row2 in rows2:
            final_dict[seg][i].append(row2.getValue("posted_speed"))

これで、この形式の辞書ができました。

"seg_num":[[list of speeds on the right],[list of speeds on the left]]

たとえば、次のように、好きなことができます。

for k,v in final_dict.iteritems():
    print "road segment {0}:".format(str(k))
    print "   speeds on right: {0}".format(", ".join(v[0]))
    print "   speeds on left: {0}".format(", ".join(v[1]))

または、セグメントの両側で速度がいくつあるかをテストするか、元の道路フィーチャクラスなどのフィールドに書き込みます。繰り返しますが、これがデータの最終的な解決策になるかどうかはわかりませんが、確かにその一部として機能します。上記のスナップ/分割プロセスと組み合わせて使用​​されているのがわかりました。

道路レイヤーに書き込むには、SPD_RIGHTとSPD_LEFTの2つの新しいフィールドを作成し、今のところ(セグメントごとに速度が1つしかないことが確実でない限り)テキストフィールドにします。次に:

urows = arcpy.UpdateCursor(roads)
for row in urows:
    seg = row.getValue("seg_num")
    right_speeds = ", ".join(final_dict[seg][0])
    left_speeds = ", ".join(final_dict[seg][1])
    row.setValue("SPD_RIGHT",right_speeds)
    row.setValue("SPD_LEFT",left_speeds)
    urows.updateRows(row)

もちろん、セグメントあたりの速度は1つだけにするのが理想的ですが、これは、セグメントが現在どのように分割されているかという元の問題に戻ります。


コメントするポイントがあります。速度レイヤーはどこにありますか?私はあなたのバッファコマンドを誤解しましたか?
dassouki 2014年

わかりました、答えにもう少し追加しました。あなたが探しているものを理解しているといいのですが。
mr.adam 2014年

セグメントと速度は、データが2つの異なるエンティティによって収集されるのと同じ方法で分割されない場合があります。さらに、セグメントはいずれかの方向で異なる速度を持つことができます。
dassouki、2014年

わかりました、これを行うためのより良い方法は、最初に右側のバッファ(6mなど)を実行し、その中にある標識を選択して新しいポイントフィーチャクラスに抽出することだと考えています。このようにして、右側の標識と左側の標識にフィーチャクラスを設定できます。
mr.adam 2014年

コメントでのJakubの回答は、適切なセグメントを定義することから始めるのに適した場所であり、速度を道路の方向にリンクするために私のもので補足することができます。
mr.adam
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.