Lựa chọn hàng xóm gần nhất được nhóm trong QGIS


14

Tôi có một danh sách chứa hơn 100.000 điểm ở định dạng lat / long mà tôi đã nhập vào qgis.

Bây giờ, những gì tôi đang cố gắng làm ở đây là nhóm tất cả các điểm này thành các nhóm hộp và về cơ bản, điều đó có nghĩa là tôi muốn chia bản đồ thành các hộp giới hạn.

Yêu cầu của tôi là như sau:

  • không có nhóm nào được đóng hộp nên có BÀI 100 và KHÔNG CÓ HƠN 200 điểm
  • không nên đặt điểm trong nhiều nhóm
  • tất cả các điểm nên được dựa trên người hàng xóm gần nhất của họ

Làm thế nào tôi có thể đạt được điều này thông qua qgis?

Tôi giả sử rằng người ta có thể vượt qua một số mã truy vấn tùy chỉnh và lưu kết quả hoặc các hộp được tạo dưới dạng shapefile đúng không? Ai đó có thể vui lòng giải thích làm thế nào điều này có thể được thực hiện và mã sẽ trông như thế nào?

Như đã đề cập, mục tiêu của tôi là có một loạt các hộp vuông được hiển thị dưới dạng một lớp shapefile trong đó trong mỗi hộp có không dưới 100 thuộc tính và không quá 200.


6
Đối với tất cả những người đánh dấu câu hỏi này là "yêu thích": Tại sao không nâng cao nó? Một người sẽ nghĩ rằng câu hỏi yêu thích của bạn nên là một câu hỏi hay.
underdark

1
Tại sao bạn cần quyền anh? Nếu bạn tạo các hộp dựa trên số lượng, dù sao chúng cũng sẽ có kích thước khác nhau nên việc xếp gạch là không cần thiết. Có lẽ dễ dàng hơn để nhóm thành đa giác (tức là vỏ lồi).
diciu

@diciu cảm ơn đã phản hồi. Vâng, tôi đoán một thân tàu lồi sẽ ổn vì tôi có thể biến chúng thành hộp sau đó. Tôi sẽ sử dụng mã nào để làm điều đó bằng cách sử dụng phương pháp tiếp cận thân lồi?
NetConstructor.com

2
Nếu bạn sử dụng vỏ lồi, các hộp giới hạn của bạn (bao quanh thân tàu) sẽ chồng lấp và yêu cầu của bạn về một điểm trong một BBOX duy nhất không còn được thỏa mãn. Vỏ lồi không hoạt động như một bước trung gian đối với BBOX mà là thay thế. Và thậm chí sau đó, tạo ra một giải pháp chung chung sẽ được tham gia.
diciu

Câu trả lời:


13

Tôi có thể giúp bạn có được một phần của cách đó bằng cách giả sử bạn đã tìm ra cách yêu cầu (a) nửa cực đông của một tập hợp các điểm và (b) nửa cực bắc của một tập hợp các điểm. Từ những điều này, tất nhiên, bạn có thể dễ dàng có được (c) nửa cực tây hoặc (d) nửa cực nam. (Tôi không biết QGIS, nhưng nói chung, một cách để làm (a) là yêu cầu tọa độ x trung vị và sau đó tìm nạp tất cả các điểm có tọa độ x vượt quá. Các giải pháp cho (b) - (d) là tương tự .)

Sử dụng khả năng này, giải pháp thu được với một đệ quy dễ dàng. Để mô tả nó, giả sử có một quy trình Half, thực hiện các hoạt động trước đó, có hai đối số: đầu tiên là một tập hợp các điểm và thứ hai là một mã bằng truekhi phân vùng đông tây được mong muốn và bằng falsecách khác. Nó trả về hai tập con của đầu vào mà phân vùng theo yêu cầu.

Procedure Box(P: set of points, i: boolean, n: integer)
Begin
    If (Count(P) > 2*n) then
        {R,S} = Half(P,i)
        Q = Box(R,!i,n) + Box(S,!i,n)
    Else
        Q = {P}
    Endif
    Return Q
End

Trong mã giả này, phân vùng R và S P; Box (R ,! I, n) là phân vùng của R theo hướng trực giao , Box (S ,! I, n) là phân vùng của S theo hướng trực giao, "+" có nghĩa là hình thành liên kết lý thuyết tập hợp và {} chỉ định một bộ. (Thay thế hướng chia tách sẽ tạo ra các hộp thay vì các dải.) Tham số n chỉ định kích thước tối thiểu của một nhóm trong phân vùng; kích thước tối đa là 2 n .

Thí dụ

Ở đây, như một minh họa, là một tập hợp P gồm 12.891 điểm ngẫu nhiên được phân chia Box(P,true,100)thành các nhóm có kích thước từ 100 đến 200. Thuật toán tạo ra 128 hộp trong đó 37 có 100 điểm và 91 có 101 điểm.


2
Thuật toán là hiệu quả. Chạy trên một lõi đơn, nó xử lý gấp mười lần số điểm (128.910) trong 18 giây. Nó chia tỷ lệ là O (n log (n) log (n)) cho n điểm. (Nó có thể được cải thiện để loại bỏ một trong những yếu tố của log (n), nhưng nỗ lực này dường như không đáng giá.)
whuber

1
@W bạn đã sử dụng một loại từ vựng để tạo điều kiện phân vùng tọa độ điểm?

2
@whuber cái này thật tuyệt
dassouki

1
@Dan Một loại từ vựng sẽ giúp nhưng không cần thiết. Lưu ý rằng có thể tìm thấy giá trị trung bình của n giá trị trong thời gian O (n) (không phải O (n log (n))), vì vậy việc phân chia các điểm thành nửa phía đông-tây hoặc nửa phía bắc-nam là không có triệu chứng là O (n ) tính toán.
whuber
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.