Dưới đây là một minh họa về quy trình làm việc mà tôi đã đề cập trong bình luận ở trên và mặc dù tôi không biết về bất kỳ thói quen đóng hộp đơn giản nào để làm điều này, tôi đã đính kèm một bảng tính excel để người ta có thể nhập một tập hợp tọa độ đích gốc và sau đó trang tính tạo một tọa độ dòng hoặc tập hợp (bảng tính ở đây ). Nó có các công thức được thiết lập nên khá dễ dàng để nhập tọa độ OD mới và mở rộng các công thức để điền vào kết quả, nhưng tôi sẽ xem xét logic của quy trình một cách rõ ràng hơn và những người khác có thể đưa ra lời khuyên về cách viết kịch bản hoàn toàn bên trong ArcMap (hoặc bất cứ điều gì).
Tóm lại, tôi nghĩ rằng điều này là hợp lý để trực quan hóa dữ liệu OD chủ yếu vì cùng lý do các đường tròn lớn rất phổ biến, chúng cung cấp sự phân biệt trực quan hơn giữa các dòng. Cách tiếp cận tôi đề xuất cũng có một lợi thế so với các đường tròn lớn, trong đó hướng của dòng chảy được mã hóa theo nửa vòng tròn. Trong câu trả lời khác trên trang này, tôi đưa ra một cái nhìn tổng quát hơn về các kỹ thuật trực quan hóa cho ánh xạ dòng chảy, và nhiều kỹ thuật tương tự có thể được áp dụng ngoài việc tạo ra các cung như thế này.
Vì vậy, để chi tiết cách người ta vẽ các đường như tôi gợi ý, về cơ bản tôi chỉ có 3 bước cho quy trình, 1) tìm hướng của luồng, 2) tìm điểm giữa và khoảng cách của luồng, 3) xử lý điểm giữa là tâm của một vòng tròn, rồi vẽ cung tròn (một nửa vòng tròn từ gốc đến đích). Để rõ ràng, tôi bắt đầu với một cặp tọa độ gốc dự kiến (x1,y1)
và tọa độ đích (x2,y2)
.
Vì vậy, 1) tìm hướng của dòng chảy. Trước tiên, người ta sử dụng công thức ATAN((y2 - y1)/(x2 - x1))
và sau đó tùy thuộc vào hướng chỉ định một hướng tùy thuộc vào hướng đó là hướng đông hay hướng tây. Một ví dụ mã giả bên dưới (Tôi gán các điểm OD đều ở cùng tọa độ một hướng bằng 0). Ở đây, varaible or_rad
có nghĩa là viết tắt cho "định hướng theo radian" và pi
đề cập đến giá trị của pi.
#tan_or = ATAN((y2 - y1)/(x2 - x1)).
Do If x2 = x1 and y1 <= y2.
compute or_rad = 0.
Else if x2 = x1 and y1 > y2.
compute or_rad = pi.
Else if x1 > x2.
compute or_rad = 270/180*pi - #tan_or.
Else if x1 < x2.
compute or_rad = 90/180*pi - #tan_or.
End If.
2) Tìm điểm giữa và khoảng cách của dòng chảy. Điều này rất đơn giản, chỉ với một bộ tọa độ được ghép nối, tọa độ trung điểm trong (x, y) sẽ là (x1+x2/2,y1+y2/2)
. Vì vậy, hãy xác định mid_x = (x1 + x2)/2
và mid_y = (y1 + y2)/2
cho phần tiếp theo. Khoảng cách sử dụng lý thuyết pythagoreum chỉ đơn giản là distance = SQRT((x1 - x2)^2 + (y1 - y2)^2)
.
3) Sau đó đưa ra thông tin đó, vẽ đường tròn đã cho qua một số độ và bán kính quy định trước (bằng một nửa khoảng cách giữa hai điểm). Chẳng hạn, giả sử chúng ta bắt đầu với một tập hợp các cặp tọa độ OD tại (1,3):(3,2)
. Hướng theo độ sẽ là ~ 116 (và tính bằng radian ~ 2), điểm giữa x, y sẽ là (2,2.5)
và khoảng cách giữa hai điểm là khoảng 2,2.
Vì vậy, giả sử chúng ta muốn vẽ nửa vòng tròn 180 độ. Trong mã pseduo (sử dụng các biến tôi đã xác định), các lần lặp sẽ trông giống như;
for i in (0 to 180 degrees)
rad_i = i/180*pi. /*converts i from degrees to radians
step_or = pi - rad_i /*for clarity, this makes the circle go from origin to destination
radius = distance/2
Arc_X = mid_x + sin(or_rad - step_or)*radius.
Arc_Y = mid_y + cos(or_rad - step_or)*radius.
Chèn bên dưới là sơ đồ của tọa độ ban đầu tôi đã chỉ định ở trên. Bắt đầu từ 0 và kết thúc ở 180, đảm bảo các điểm và điểm cuối ở cùng một vị trí. Điều chỉnh vòng lặp để có nhiều bước hơn (cung chi tiết hơn) hoặc ít hơn (cung ít chi tiết hơn) nên khá rõ ràng.
Để lưu ý, các chủ đề khác trên trang web thảo luận về việc tạo các dòng từ dữ liệu điểm (xem thẻ tạo đa tuyến ). Tôi có một ví dụ trong bảng tính xls đính kèm và tôi đã sử dụng công cụ arcmap ET Geo-wizards để chuyển đổi tọa độ bảng tính thành các đường shapefile. Các cung trong dữ liệu mẫu trong bảng tính đính kèm sau đó trông như thế này;
Một cập nhật đơn giản nhưng có khả năng hữu ích cho thiết lập hiện tại này sẽ là cập nhật các công thức để cho phép một lượng lệch tâm được chỉ định trước trong cung, mặc dù tôi chưa chắc chắn làm thế nào trong vài lần thử cho đến nay. Tôi mong được góp ý và phản hồi từ cộng đồng ở đây về lời khuyên của tôi.