Tôi không có đủ đại diện để nhận xét, nhưng câu hỏi của tôi là liệu các con đường đã có trong các phân đoạn tương ứng với các vùng tốc độ hay chưa, tức là mỗi phân khúc thường có 1 tốc độ được liên kết với mỗi bên hoặc nhiều hơn một tốc độ.
Bất kể, đây là đề xuất của tôi, mặc dù điều này phụ thuộc vào việc bạn có cấp giấy phép cho phép bộ đệm một phía (nâng cao / ArcInfo, tôi tin). Một hiệu trưởng tương tự có thể được áp dụng với các công cụ cơ bản, nhưng sẽ phức tạp hơn. Ngoài ra, tôi hy vọng việc này sẽ mất một lúc để chạy ...
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")
Bây giờ bạn có bộ đệm cho mỗi bên của mỗi con đường, cách đường trung tâm 6 mét, sẽ bao gồm tất cả các biển báo. Bạn có thể thực hiện một lựa chọn dễ dàng theo vị trí để đảm bảo rằng đây là trường hợp và nếu không, hãy chạy lại các hoạt động của bộ đệm với 1 hoặc 2 mét thêm.
Kế tiếp:
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"))
Vì vậy, bây giờ bạn có một từ điển ở định dạng này:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
từ đó bạn có thể làm bất cứ điều gì bạn thích, ví dụ:
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]))
Hoặc chỉ kiểm tra xem có bao nhiêu tốc độ ở mỗi bên của phân khúc hoặc ghi nó vào các trường trong lớp tính năng đường ban đầu, v.v. Một lần nữa, không chắc đây có phải là giải pháp cuối cùng với dữ liệu bạn có không, nhưng nó có thể chắc chắn làm việc như là một phần của nó. Tôi có thể thấy nó đang được sử dụng cùng với quá trình chụp / tách được mô tả ở trên.
Để ghi vào lớp đường, bạn có thể tạo hai trường mới, SPD_RIGHT và SPD_LEFT và ngay bây giờ (trừ khi bạn biết chắc chắn rằng chỉ có một tốc độ trên mỗi phân đoạn) tạo cho chúng các trường văn bản. Sau đó:
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)
Tất nhiên, thật lý tưởng khi chỉ có một tốc độ cho mỗi phân đoạn, nhưng điều đó quay trở lại câu hỏi ban đầu về cách các phân khúc hiện đang được phân chia.