Tạo đa giác Thiessen có trọng số?


17

Tôi có một shapefile điểm và tôi tạo đa giác Thiessen (Voronoi) theo chương trình bằng cú pháp kịch bản này:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

Tuy nhiên, mỗi điểm có liên quan đến một khu vực (tức là kích thước ưa thích của mỗi đa giác) và tôi muốn các đa giác Thiessen có trọng số dựa trên trường này.

Điều đó có thể không và bằng cách nào?

Có mã nào liên quan trong VBA không?

Câu trả lời:


15

nhiều cách để khoảng cách trọng lượng để xây dựng đa giác Thiessen. Ý tưởng cơ bản trong việc xây dựng chúng dựa trên việc so sánh khoảng cách giữa một điểm x tùy ý và hai điểm cố định pq ; bạn cần quyết định xem x có "gần" với p hơn so với q hay không. Để kết thúc này - ít nhất là về mặt khái niệm - chúng tôi xem xét khoảng cách dp = d ( x , p ) và dq = d ( x , q ). Trọng số thường xảy ra theo hai cách: các điểm có thể được cho trọng số dương wp và wq và khoảng cách có thể được chuyển đổi.

Để có ý nghĩa, sự biến đổi (mà tôi sẽ viết là f ) nên tăng khi khoảng cách tăng; nghĩa là, f (d ')> f (d) bất cứ khi nào d'> d> = 0. Ví dụ về các biến đổi như vậy là f (d) = d + 1, f (d) = d ^ 2 (Định luật hấp dẫn bán lẻ của Reilly ), f (d) = 1 - 1 / d (giả sử tất cả các khoảng cách đều nhỏ hơn 1), f (d) = log (d), f (d) = exp (d) -1.

Sau đó, chúng ta sẽ nói x "gần" với p hơn là q chính xác khi

f (d ( x , p )) / wp <f (d ( x , q )) / wq.

Lưu ý sự phân chia theo các trọng số, thay vì nhân: điều này có nghĩa là các trọng số lớn sẽ có xu hướng "kéo vào" các điểm ở khoảng cách lớn hơn. Bạn sẽ thấy điều này trong ví dụ chạy bên dưới.

Đây là điều tuyệt vời và toàn bộ quan điểm của giải trình hơi trừu tượng này: mặc dù các vùng Thiessen có thể có các ranh giới phức tạp, cực kỳ khó tính, nhưng chúng tương đối dễ tính toán bằng cách sử dụng biểu diễn dựa trên lưới. Đây là công thức:

  1. Đối với mỗi điểm đầu vào p , hãy tính lưới khoảng cách Euclide của nó [d (p)].

  2. Sử dụng Đại số bản đồ để áp dụng f và các trọng số, từ đó biểu thị lại từng lưới khoảng cách như

    [fp] = f ([d (p)]) / wp.

    Dưới đây là một ví dụ sử dụng f (d) = 100 + d ^ (3/2); quy mô là 400 x 600.

    Hình 1

    Khi f (d) tăng giá trị sẽ tối hơn. Rõ ràng khoảng cách trong ví dụ này liên quan đến điểm đỏ trung tâm; bốn điểm khác có được tính toán khoảng cách riêng của họ (không hiển thị). Các khu vực của các chấm tỷ lệ thuận với trọng lượng của chúng, đó là 2, 10, 3, 4 và 5.

  3. Tính toán tối thiểu cục bộ của tất cả các lưới [fp]. Gọi đây là [f]. Đây là một ví dụ.

    Hình 2

  4. Bằng cách so sánh [f] với mỗi [fp], với mỗi ô lưới chỉ định mã định danh của p đầu tiên mà [f]> = [fp]. ( Chẳng hạn, điều này có thể được thực hiện trong một bước với thao tác vị trí thấp nhất .)

    Hình 3

    (Tôi nghi ngờ có tồn tại một thuật toán ở bất cứ đâu sẽ tính toán một giải pháp định dạng vector cho hàm trọng số này f.)

Rõ ràng nếu bạn có nhiều hơn một số điểm p, bạn sẽ viết kịch bản này và nếu số lượng của chúng có hàng nghìn, bạn có thể sẽ từ bỏ nỗ lực là không thể tính toán được (mặc dù có nhiều cách để đẩy nhanh phép tính bằng cách xếp nó).

Một ví dụ khác, hiển thị đa giác Thiessen trên ellipsoid, xuất hiện tại /gis//a/17377/ .


3
+1 Tôi chưa bao giờ nhận ra vấn đề này trở nên dễ dàng hơn thế nào bằng cách tiếp cận raster.
Kirk Kuykendall

Whuber: Quá trình rất tinh vi! Tuy nhiên, để tập trung vào sự tán thưởng của tôi; Mỗi điểm trong tệp đầu vào của tôi đại diện cho phần trăm gần đúng của một thửa đất. Tôi tạo bằng cách sử dụng dòng script được ghi chú bên trên tệp đa giác vector Thiessen. Mỗi đa giác được gán một không gian tức là một kích thước dựa trên nguyên tắc đa giác thiessen có khoảng cách bằng nhau của ranh giới. Mặt khác, mỗi parel đất có kích thước được xác định trước được cung cấp trong trường diện tích; và đây là yếu tố mà tôi muốn tính đến vì đa giác sẽ tỷ lệ thuận với yếu tố này. Bất cứ ý tưởng xin vui lòng?
Demetris

Tôi không hiểu nhận xét của bạn, Demetris. Chúng có vẻ như bạn thực sự muốn có một bản đồ khu vực hơn là một bộ sưu tập đa giác Thiessen. Nó sẽ giúp giải thích lý do tại sao bạn tính toán các đa giác này. Vấn đề gì họ sẽ giải quyết? Làm thế nào họ sẽ được giải thích?
whuber

Whuber: Mỗi điểm đầu vào của tôi trong quy trình đa giác Thiessen thể hiện trọng tâm gần đúng của một lô đất mới. Vì vậy, tôi tạo ra các đa giác thiessen dựa trên các điểm này đại diện cho hình dạng của các thửa đất (một thửa đất một điểm). Tôi có thể tạo ra nhiều bộ hình dạng lô đất ngẫu nhiên bằng cách di chuyển các điểm này để nuôi thuật toán di truyền của tôi. Vấn đề là những hình dạng bưu kiện được tạo ra này (tức là đa giác) có một khu vực được xác định trước và tôi tự hỏi liệu có thể tính đến điều này khi sử dụng hoạt động đa giác Thiessen. Tôi hy vọng rằng điều này có ý nghĩa.
Demetris

Thuật toán di truyền của bạn đang cố gắng làm gì? Có vẻ như bạn không cần đa giác Thiessen có trọng số: Tôi tin rằng không tồn tại trọng số nào có thể đảm bảo cho các đa giác đạt được các khu vực được chỉ định trước hoặc thậm chí các khu vực tương đối được chỉ định trước.
whuber

10

Những gì bạn muốn là một sơ đồ Voronoi có trọng số: http://en.wikipedia.org/wiki/ WEighted_Voronoi_diagram cũng được biết đến như một phần tử Dirichlet tròn khi được thực hiện với trọng số nhân trong mặt phẳng 2d. Ai đó dường như đã xây dựng tiện ích mở rộng arcgis 9 để xây dựng các tiện ích sau: http://arcscripts.esri.com/details.asp?dbid=15481 Với hướng dẫn sử dụng có sẵn tại đây http://geography.unt.edu/~pdong/software .htm và một bài báo được xuất bản tại Dong, P., 2008. Tạo và cập nhật sơ đồ Voronoi có trọng số nhân cho các tính năng điểm, đường và đa giác trong GIS. Máy tính & Khoa học địa chất, Tập 34, Số 4, Trang 411-421.

Có một bài viết gần đây về thuật toán dựa trên vectơ (tôi giả sử thuật toán của P Dong là dựa trên raster) cho điều này. http://www.scTHERirect.com/science/article/pii/S0098300411003037 Tóm tắt cho biết mã c # được bao gồm.


1
Blord-castillo: Rất cám ơn về tất cả thông tin này. Nó rất hữu ích và tôi sẽ chấp nhận đây là một câu trả lời toàn diện. Tuy nhiên, vấn đề mới của tôi là tôi muốn chạy công cụ đó trong mã của mình nhiều lần bằng cách cung cấp các đầu vào như egas dòng script trên. Điều đó có thể không?
Demetris
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.