Gán ID điểm cho các thuộc tính bắt đầu và kết thúc tương ứng của polyline?


9

Tôi có hai shapefiles, Point và Polyline. Tôi đang cố gắng điền vào lớp polyline của mình với ID dữ liệu điểm (systemID) nơi các dòng bắt đầu đến nơi chúng kết thúc; ví dụ. tạo hai cột (từ và đến). Các dòng đã có hướng dòng chảy được gán cho chúng. Tôi đang sử dụng các công cụ ArcHydro nhưng Arcpy cũng ổn.

Trong ArcHydro, tôi đã thử sử dụng Công cụ thuộc tính> Tạo từ / đến nút cho các dòng nhưng nó tạo ra các giá trị cho Đến và từ đó không phải từ dữ liệu điểm của tôi. Cách khác của tôi là sử dụng Feature to Vertices và nối kết quả vào bảng dữ liệu điểm của tôi để lấy systemID. Nhưng sau đó tôi cũng sẽ phải cập nhật lớp polyline. Tôi chắc chắn có một cách dễ dàng hơn để làm điều đó.

Lưu ý: không phải tất cả các dòng đều có điểm ở các đỉnh, giá trị trống là tốt cho chúng.


Vì vậy, điểm của bạn có trường 'systemID' cần đi trong FNode, trường TNode trong polylines ... có đúng không?
Michael Promotionson

Có một câu hỏi như thế này quanh đây ở đâu đó với một câu trả lời về cơ bản là dòng bắt đầu và kết thúc dưới dạng các lớp đối tượng riêng biệt, giao cắt hai (riêng lẻ) với dữ liệu điểm của bạn để lấy id, sau đó nối chúng lại với các dòng bằng cách sử dụng dòng ID và gán cho trường bắt đầu hoặc kết thúc chính xác (có thể là trường tính toán trong đó). Tôi dường như không thể tìm thấy nó ngay bây giờ mặc dù. Tìm thấy nó trong khi đào xung quanh cho cái này .
Chris W

Đây là: gis.stackexchange.com/questions/85082 Và đó là tính năng Vertice to points, không phải dòng hoặc tính năng cho điểm. Khá nhiều những gì bạn đề cập ở cuối câu hỏi.
Chris W

@ChrisW, tôi thực sự thích câu trả lời của FelixIP về câu hỏi đó. Nó chỉ có hai thuộc tính tham gia.
Michael Promotionson

Câu trả lời:


12

Đôi khi tốt hơn là không sử dụng ra khỏi giải pháp hộp. Đây là lý do tại sao tôi đề nghị

  1. Dân số X một trường Y trong lớp nút, chuyển đổi chúng thành số nguyên, giả sử cm. Tạo trường chuỗi và điền vào nó bằng cách nối lại các chuỗi số nguyên.
  2. Làm điều tương tự trong bảng liên kết cho điểm đầu tiên trong hình.
  3. Tham gia bảng nút để liên kết sử dụng các trường được tạo mới nhất và chuyển nodeID vào trường TỪ.

Goto 2, nhưng sử dụng điểm cuối để gán TO nodeID


Thích nó! Trường tính toán một cái gì đó như str (round (! Shape! .FirstPoint.X, 3)) + "," + str (round (! Shape! .FirstPoint.Y, 3)) (trình phân tích cú pháp Python) cho từ nút, str (round (! Shape! .LastPoint.X, 3)) + "," + str (round (! Shape! .LastPoint.Y, 3)) cho nút, sau đó tương tự với điểm (dưới dạng văn bản), sau đó tham gia ... Cách tuyệt vời để tham gia không gian mà không có sự đau đớn! Làm tròn đến các chữ số có ý nghĩa hơn cho dữ liệu địa lý (như 7 hoặc 8).
Michael Promotionson

Cực kỳ nhanh cũng như trong một môi trường kịch bản, trong đó tất nhiên từ điển thay thế việc tham gia bảng chậm
FelixIP

Int (X * 100) nếu chúng được chiếu theo metres. Thường xuyên sử dụng mã của Michael
FelixIP

Chắc chắn đơn giản hơn phương pháp trong câu hỏi tôi liên kết ở trên. Ít bước hơn, ít công cụ hơn và không hạn chế cấp giấy phép. Ý tưởng thú vị để biến một tham gia không gian thành một tham gia thuộc tính thông thường.
Chris W

1

Tôi đã làm điều tương tự một vài tháng trước. Tôi đã sử dụng arcpy nhưng kịch bản quá dài để đăng ở đây vì vậy tôi sẽ cung cấp cho bạn một phác thảo về những gì tôi đã làm.

  1. Tôi đã sử dụng phép nối không gian để phát hiện điểm / nút nào trong một tính năng đường cụ thể.

  2. Bởi vì phép nối không gian không tính đến hướng dòng chảy, tôi đã sử dụng arcpy để xác định đó là điểm bắt đầu và là điểm kết thúc. Tôi đã có thể làm điều này bằng cách sử dụng hàm mô tả arcpy để trích xuất thông tin tọa độ cho các đỉnh bắt đầu / kết thúc của tính năng đường thẳng và so sánh chúng với các giá trị tọa độ của các điểm được kết nối.

  3. Cuối cùng, một khi tôi tìm ra điểm đến / điểm nào mà tôi đã sử dụng hàm setValue để điền vào các trường đến / từ trong tập dữ liệu đa tuyến gốc.

Rõ ràng, có nhiều hơn một chút so với điều này nhưng tôi đã vạch ra những điểm chính.


Trong mạng hình học của tôi, hướng dòng chảy có thể theo bất kỳ hướng nào của hồng y. Tôi không thể xác định được hướng dòng chảy từ việc so sánh tọa độ thô trừ khi tôi cũng đang sử dụng raster hướng dòng chảy hoặc thứ gì đó tương đương. Thậm chí điều đó có thể có vấn đề bởi vì đôi khi các đường ống được dốc chống lại các đường viền tự nhiên hoặc nước được bơm lên dốc. Làm thế nào bạn có thể chắc chắn rằng hướng dòng chảy của bạn là chính xác?
Priscilla

1

Tôi đã được truyền cảm hứng bởi @FelixIP, nhưng tôi muốn viết một giải pháp mà không cần tham gia hoặc tạo các tệp bổ sung, vì mạng của tôi khá lớn với các ống 400K + và các nút 500K +.

Cấu trúc mạng hình học buộc X, Y của các nút và các đầu ống phải trùng nhau. Bạn có thể truy cập các vị trí này với các mã thông báo hình dạng trong các con trỏ hình cung và khớp với chúng. Mã thông báo hình dạng cho các dòng trả về một mảng các đỉnh theo thứ tự mà chúng được vẽ. Trong mạng của tôi, thứ tự vẽ của các đường ống rất nhiều QA'd vì chúng tôi sử dụng điều này để đặt hướng dòng chảy. Vì vậy, đỉnh đầu tiên là điểm bắt đầu của đường ống và đỉnh cuối cùng là điểm cuối của đường ống.

Tham khảo: ASSETID = id của pipe, UNITID = id id ở đầu ống, UNITID2 = id id ở cuối ống.

nodes = "mergeNodes"
pipes = "SEWER_1"

nodeDict = {}
pipeDict = {}

#populate node dictionary with X,Y as the key and node ID as the value
for node in arcpy.da.SearchCursor(nodes, ["UNITID", "SHAPE@XY"]):
    nodeDict[(node[1][0], node[1][1])] = node[0]

#populate pipe dictionary with pipe ID as the key and list of X,Y as values 
#vertices populated in the order that the line was draw
#so that [0] is the first vertex and [-1] is the final vertex
for pipe in arcpy.da.SearchCursor(pipes, ["ASSETID", "SHAPE@"]):
    for arrayOb in pipe[1]:
        for point in arrayOb:
            if pipe[0] in pipeDict:
                pipeDict[pipe[0]].append((point.X, point.Y))
            else: 
                pipeDict[pipe[0]] = [(point.X, point.Y)]

#populate UNITID with the first vertex of the line
#populate UNITID2 with the final vertex of the line
with arcpy.da.UpdateCursor(pipes, ["ASSETID", "UNITID", "UNITID2"]) as cur:
    for pipe in cur:
        if pipeDict[pipe[0]][0] in nodeDict:
            pipe[1] = nodeDict[pipeDict[pipe[0]][0]]
        if pipeDict[pipe[0]][-1] in nodeDict:
            pipe[2] = nodeDict[pipeDict[pipe[0]][-1]]
        cur.updateRow(pipe)

Đây là 90% những gì tôi làm, nhưng tôi không đi qua các ống hai lần, vì từ điển nút đã có sẵn.
FelixIP
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.