Saya tidak punya cukup perwakilan untuk berkomentar, tetapi pertanyaan saya adalah apakah jalan sudah ada di segmen yang sesuai dengan zona kecepatan, yaitu apakah setiap segmen umumnya memiliki 1 kecepatan yang terkait dengannya per sisi, atau lebih dari satu.
Bagaimanapun, inilah saran saya, meskipun bergantung pada Anda memiliki tingkat lisensi yang akan memungkinkan penyangga satu sisi (lanjutan / ArcInfo, saya percaya). Prinsipal yang serupa dapat diterapkan dengan alat-alat dasar, tetapi akan lebih kompleks. Juga, saya berharap ini akan membutuhkan waktu untuk menjalankan ...
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")
Sekarang Anda memiliki penyangga untuk setiap sisi jalan, yaitu 6 meter dari garis tengah, yang harus mencakup semua rambu. Anda dapat melakukan pemilihan dengan lokasi yang mudah untuk memastikan bahwa ini adalah masalahnya, dan jika tidak, jalankan kembali operasi buffer dengan 1 atau 2 meter ekstra.
Lanjut:
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"))
Jadi sekarang Anda memiliki kamus dalam format ini:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
dari mana Anda dapat melakukan apa pun yang Anda suka, misalnya:
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]))
Atau hanya menguji berapa banyak kecepatan yang ada di setiap sisi segmen, atau menulisnya ke bidang di kelas fitur jalan asli, dll. Sekali lagi, tidak yakin apakah ini bisa menjadi solusi akhir dengan data yang Anda miliki, tetapi bisa tentu bekerja sebagai bagian dari itu. Saya bisa melihatnya digunakan bersamaan dengan proses gertakan / pemisahan yang dijelaskan di atas.
Untuk menulis ke lapisan jalan, Anda bisa membuat dua bidang baru, SPD_RIGHT dan SPD_LEFT, dan untuk saat ini (kecuali Anda tahu pasti bahwa hanya ada satu kecepatan per segmen) buatkan bidang teks. Kemudian:
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)
Tentu saja, ideal untuk hanya memiliki satu kecepatan per segmen, tetapi itu kembali ke pertanyaan awal tentang bagaimana segmen saat ini terpecah.