速度制限を反映するポイントレイヤーと道路のラインレイヤーがあります。速度標識の位置は、速度制限が適用される方向を示します。
速度を反映する道路レイヤーの上に線形イベントテーブルを作成するにはどうすればよいですか?したがって、各セグメントについて、各方向に1つずつ、2つの速度属性を返します。
速度制限を反映するポイントレイヤーと道路のラインレイヤーがあります。速度標識の位置は、速度制限が適用される方向を示します。
速度を反映する道路レイヤーの上に線形イベントテーブルを作成するにはどうすればよいですか?したがって、各セグメントについて、各方向に1つずつ、2つの速度属性を返します。
回答:
線形ルートイベントレイヤーの場合、ルートのIDと開始および終了のm値を含むテーブルを作成する必要があります。
道路にm値がない場合は、ルート作成ツールを使用してルートを作成できます。
2番目のステップは、各ポイントの道路のm値を抽出することです。これは、道路に沿った位置特定機能で実行できます。あなたの姿がよく見える場合、ポイントは同じ方向の場合、道路の同じ側にあります。どちらの側にいるかを示す正または負の距離があるので、これは素晴らしいことです。
最後のステップへの最も簡単な方法は、Microsoft Excelです。
roadID
ルートまでの距離の符号でポイントをソートしますm-value
次の点(または方向によっては前の点)の新しい列を追加します。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列目はイベントの始まりです。新しいイベントレイヤーにはフィールドfrom
とto
フィールドが必要です。したがって、私の例では次のようになります。
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
次に、標識をオフセットフィールドとして使用してイベントレイヤーを作成し、ルートの正しい側の速度制限を見つけることができます。
コメントするのに十分な担当者はいませんが、私の質問は、道路がすでに速度ゾーンに対応するセグメントに含まれているかどうかです。
いずれにせよ、これは私の提案ですが、片側のバッファを許可するライセンスレベルを持っていることが条件です(高度/ 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つだけにするのが理想的ですが、これは、セグメントが現在どのように分割されているかという元の問題に戻ります。