ArcGIS 10: Tạo một lớp tuyến tính sự kiện từ một lớp điểm dựa trên tính định hướng


8

Tôi có một lớp điểm phản ánh các giới hạn tốc độ và một lớp đường của các con đường. Vị trí của biển báo tốc độ cho biết giới hạn tốc độ được áp dụng theo hướng nào.

Làm cách nào tôi có thể tạo bảng sự kiện tuyến tính trên đầu lớp đường phản ánh tốc độ? Vì vậy, đối với mỗi phân đoạn, trả về hai thuộc tính tốc độ, một thuộc tính cho mỗi hướng.

Lớp tốc độ / đường


Bạn có thể làm rõ "Vị trí của biển báo tốc độ cho biết giới hạn tốc độ được áp dụng theo hướng nào"? Điều này có nghĩa là nếu điểm nằm ở bên phải đường (dựa trên hướng của đường) thì tốc độ sẽ áp dụng cho làn bên phải? Làm thế nào gần với đường là điểm nằm?
Stephen chì

@StephenLead Có, điểm ký hiệu nằm cách lớp đường 1 đến 5m để cho biết tốc độ được áp dụng theo hướng nào
dassouki

Có bất kỳ thuộc tính khác được lưu trữ với các dấu hiệu đường bộ? Âm thanh như bạn sẽ cần phải đưa chúng ra đường trước sau đó bằng cách nào đó chuyển hướng của đường sang biển báo đường sau đó cắt các đường theo các đỉnh và chuyển các giá trị thuộc tính từ các biển báo sang từng đoạn. Chỉ là một ý tưởng. Có thể giúp đỡ nếu bạn đăng dữ liệu.
Jakub Sisak GeoGraphics

@Jakub thuộc tính duy nhất tôi muốn từ biển báo là "post_speed". Lớp ký hiệu không có thông tin về tính định hướng
dassouki

Những tiếng thở dài có thuộc tính nào khác ngoài tốc độ không? Tôi đang hỏi bởi vì có thể có một cái gì đó có thể liên kết các dấu hiệu với các con đường. Mặt khác, những gì bạn muốn làm là không thể nếu không chụp thủ công các biển báo trên các đoạn đường, chuyển thuộc tính và tách các đoạn đường. (bạn có thể thực hiện việc này theo chương trình nhưng khoảng cách có thể thay đổi nên không thể tự động hóa hoàn toàn) Kết quả sẽ không phải là bảng độc lập mà là bảng thuộc tính mà tất cả thông tin này sẽ được chuyển.
Jakub Sisak GeoGraphics

Câu trả lời:


3

Đối với các lớp sự kiện tuyến tính tuyến tính, bạn cần tạo một bảng chứa ID của tuyến đường và các giá trị m bắt đầu và kết thúc.

Nếu đường của bạn không có giá trị m, bạn có thể tạo tuyến bằng công cụ tạo tuyến .

Bước thứ hai là trích xuất các giá trị m của các con đường của bạn cho từng điểm, có thể được thực hiện với tính năng định vị dọc theo đường . Nếu tôi nhìn rõ trên hình của bạn, các điểm nằm ở cùng một phía của đường nếu chúng cùng hướng. Điều này thật tuyệt vời bởi vì sau đó bạn có một khoảng cách tích cực hoặc tiêu cực cho bạn biết bạn đang ở bên nào.

Cách dễ nhất đến bước cuối cùng là trong Microsoft Excel:

  • Sắp xếp các điểm của bạn theo roadIDvà theo dấu hiệu của khoảng cách đến tuyến đường
  • Thêm một cột mới với m-valueđiểm tiếp theo (hoặc điểm trước đó, tùy theo hướng).
  • Sẽ có một giá trị bị thiếu ở cuối nên được điền bằng 0 hoặc tối đa m-valuecủa phân khúc.

EDIT: sau khi sắp xếp, bảng của bạn sẽ trông như thế này

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

Bạn thấy rằng các điểm được sắp xếp theo giá trị m. Cột thứ ba trong trường hợp của tôi sẽ là sự khởi đầu của sự kiện. lớp sự kiện mới nên có một fromvà một totrường. Vì vậy, trong ví dụ của tôi, nó sẽ trông như sau:

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

theo hướng khác, nó sẽ là

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

Sau đó, bạn có thể tạo lớp sự kiện của mình bằng cách sử dụng dấu hiệu làm trường bù để xác định giới hạn tốc độ ở phía bên phải của tuyến đường.


Cho đến nay điều này là làm việc tốt hơn so với các giải pháp khác. Bạn có thể giải thích phần excel về việc thêm điểm trước và điểm tiếp theo không?
dassouki

3

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.


Bây giờ bạn có bất kỳ điểm để bình luận; lớp tốc độ đến đâu? Tôi đã hiểu nhầm lệnh đệm của bạn?
dassouki

ok tôi thêm một chút nữa vào câu trả lời Tôi hy vọng tôi hiểu những gì bạn đang tìm kiếm.
mr.adam

các phân đoạn và tốc độ có thể không được phân chia theo cùng một cách như dữ liệu được thu thập bởi hai thực thể khác nhau; hơn nữa, một phân khúc có thể có tốc độ khác nhau theo một trong hai hướng.
dassouki

Ok, tôi đang nghĩ rằng cách tốt hơn để làm điều này là trước tiên chỉ cần thực hiện một bộ đệm bên phải, 6m hoặc một cái gì đó, sau đó chọn các dấu hiệu nằm trong đó và trích xuất chúng vào một lớp tính năng điểm mới. Bằng cách đó, bạn có thể có một lớp tính năng cho các dấu hiệu bên phải và một cho các dấu hiệu bên trái.
mr.adam

Câu trả lời của Jakub trong các bình luận là một nơi tốt để bắt đầu về mặt xác định các đoạn tốt và nó có thể được bổ sung với tôi để liên kết tốc độ với hướng của đường.
mr.adam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.