Tạo bảng gần cho x số hàng xóm bằng Arcpy


9

Có 3 điểm có khả năng mà tôi đang cố chụp gần khoảng cách:

  1. Một ga tàu điện ngầm trao đổi, trong đó có 2 hoặc nhiều ga lân cận. Đó là, trạm trong câu hỏi kết nối 2 hoặc nhiều tuyến đường chính và có 2 hoặc nhiều trạm lân cận.
  2. Một ga tàu điện ngầm, chỉ có 1 ga lân cận. Đây là trạm ở cuối dòng.
  3. Một ga tàu điện ngầm nội tuyến, có chính xác 2 ga lân cận, một trong hai cách tiếp cận.

Tôi đang cố gắng tính toán một giá trị mà người ta có thể gọi là "khoảng cách trung bình giữa các trạm lân cận"

arcpy.GenerateNearTable_analysis()thể xử lý hai tùy chọn: Khoảng cách đến tính năng gần nhất và Khoảng cách giữa tất cả các tính năng.

Có ai có một phương pháp thông minh để giải quyết cho các kịch bản này? Lưu ý rằng mỗi trạm được chỉ định là "Trao đổi", "Thiết bị đầu cuối" hoặc "Nội tuyến" trong bảng thuộc tính trong trường "StationType".

Thêm:

Dưới đây là một số mã psuedo dựa trên đề xuất của @ whuber trong các bình luận. Tôi chưa có thời gian để tìm hiểu điều này, vì vậy nếu bất cứ ai muốn đâm vào nó, bạn sẽ được thưởng một dấu kiểm! ;)

Tôi đã xem thư viện NetworkX và nó dường như hoạt động như tôi muốn.

Cho đồ thị:

A —― B ―― C ―― D
     |
     E

cũng như các nút và liên kết:

Nodes = ["A", "B", "C", "D", "E"]
Links = [("A", "B"), ("B", "C"), ("C", "D"), ("B", "E")]

def myFunction(node):
    identify the links that node belongs to
    count the number of links
    calculate the total link lengths
    divide the total link lengths by the number of links
    return someValue

Tôi đoán tôi cũng có thể đề cập rằng tôi đang sử dụng ArcGIS 10.1 và tôi thích mô-đun arcpy.da (vì tốc độ của nó). Tôi hy vọng rằng chúng ta có thể sử dụng điều này.
Michael Markieta

3
FWIW đây hoàn toàn là một vấn đề lý thuyết đồ thị với một giải pháp chuẩn: bạn tìm kiếm biểu đồ lân cận của mỗi đỉnh. Nó có sẵn gần như ngay lập tức ngay khi bạn đại diện cho mạng theo định dạng chuẩn, chẳng hạn như DCEL (hoặc khái quát hóa nếu mạng ở dạng không phẳng). Điều này cho thấy rằng một số giải pháp Python vượt trội có thể có sẵn.
whuber

Câu trả lời:


5

Tôi tin rằng vấn đề của bạn, như @whuber, được đề xuất tốt nhất sẽ được trình bày trong Ma trận điều chỉnh . Đó là, nếu bạn có thời gian và thiên hướng để hiểu lý thuyết đằng sau nó, thay vì dựa vào một gói để thực hiện công việc cho bạn.

Đối với một đồ thị G đã cho, với các đỉnh là {v 1 , v 2 , ..., v n } trong đó n là số đỉnh, bạn cần tạo một ma trận có kích thước M i, j trong đó i = n và j = n. Mỗi đỉnh sau đó được biểu diễn ở hàng thứ i bằng số đường dẫn được tìm thấy tới đỉnh liền kề trong cột thứ j .

Ví dụ dưới đây:

nhập mô tả hình ảnh ở đây

Với dạng biểu diễn dữ liệu tương đối phức tạp nhẹ này, bạn sẽ cần đánh số các đỉnh của mình theo cách tùy ý, không đại diện cho bất kỳ thứ tự logic nào.

LƯU Ý: Giả sử không có vòng lặp trạm nào trên chính nó, hàng thứ k sẽ không bao giờ có giá trị nào khác 0 trong cột thứ k . Tất cả các định nghĩa dưới đây cho rằng điều này là đúng

LƯU Ý: Giả sử không có các đường đồng thời giữa cùng một trạm, tất cả các ví dụ bên dưới giả định rằng giá trị ô sẽ chỉ là 1 hoặc 0. Ví dụ trên cũng cho rằng du lịch hai chiều được cho phép.

Quy tắc xác định danh mục trạm:

1. Thiết bị đầu cuối

Một thiết bị đầu cuối sẽ được xác định bởi một hàng thứ k có một cột duy nhất không có giá trị 0 và giá trị nào là 1. Xem các đỉnh 1, 2 và 3 trong ví dụ 1 ở trên.

2. Ngã ba

Một điểm nối sẽ được xác định bởi một hàng thứ k có nhiều hơn hai cột chứa giá trị 1. Xem đỉnh 4 trong ví dụ 1 ở trên, thay vào đó là tất cả các đỉnh trong ví dụ 3 ở trên.

3. Nội tuyến

Một trạm nội tuyến được biểu thị bằng cách có chính xác 2 cột trong hàng thứ k trong đó giá trị là 1. Xem tất cả các đỉnh trong ví dụ 2 ở trên. (Bỏ qua thực tế là {v 1 , v 3 } giao với {v 2 , v 4 }.)


Bạn là ai và bạn đến từ đâu! Đó là một trong những câu trả lời hay nhất tôi đã nhận được trong một thời gian dài. Cảm ơn bạn @Geoist.
Michael Markieta

@MichaelMarkieta Câu chuyện vui, tôi mới biết về điều này chưa được 2 giờ trước khi tôi thấy bài viết của bạn.
nagytech

1

Bạn có thể thử sử dụng Shapely . Nếu bạn chuyển đổi các điểm cực quang của mình thành các điểm khác nhau, bạn có thể tính khoảng cách giữa các điểm riêng lẻ.

import arcpy
import shapely

arc_point1 = arcpy.Point(1,1)
arc_point2 = arcpy.Point(5,5)

shp_point1 = shapely.geometry.Point(arc_point1.X, arc_point1.Y)
shp_point2 = shapely.geometry.Point(arc_point2.X, arc_point2.Y)

distance = shp_point1.distance(shp_point2)
print "distance:", distance

Tôi nên đề cập rằng Shapely chỉ có thể được sử dụng cho các tính năng trên mặt phẳng của Cartesian, vì vậy phương pháp này sẽ không hoạt động nếu dữ liệu của bạn ở tọa độ địa lý.
Cyrus

Câu trả lời này cho thấy một sự mơ hồ trong cách hiểu câu hỏi. Tôi đã đọc câu hỏi như chỉ ra khoảng cách được biết đến; tính toán của họ dường như không phải là vấn đề. Những gì OP tìm kiếm, tôi tin, là một thuật toán để xác định một số lượng lân cận trực tiếp của các đỉnh dọc theo mạng, đến cuối cùng sau đó lấy khoảng cách của chúng và tính toán một bản tóm tắt thống kê về chúng (chẳng hạn như trung bình).
whuber

@whuber Rất tiếc! Đồng ý, tôi trả lời câu hỏi hơi vội.
Cyrus

@whuber là trên nhãn hiệu.
hhart

Điều này sẽ không làm việc cho tôi, nhưng cảm ơn!
Michael Markieta
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.