vòng tròn tối đa bên trong một đa giác không đều từ một điểm ngẫu nhiên


8

Tôi đang cố gắng xây dựng một thuật toán để tạo vòng tròn bán kính tối đa trong một đa giác không đều (đường điều tra dân số) dựa trên một tâm của vòng tròn đã cho.

Động lực cho việc này là che khuất vị trí của một cá nhân đã trả lời một cuộc khảo sát. Vị trí thực tế của họ được biết đến, tuy nhiên nó cần được che khuất trong phân tích, để phát hành dữ liệu ra công chúng, để phân tích thêm.

Chúng tôi muốn có một đa giác hình bánh rán cho mỗi người trả lời khảo sát có bán kính bên trong (dễ), giới hạn bởi bán kính bên ngoài bị giới hạn bởi đường điều tra dân số mà cá nhân đang ở. Vị trí cuối cùng của họ sẽ được đặt ngẫu nhiên trong đa giác bánh rán .

Tôi đã thấy nhiều câu trả lời cho các câu hỏi tương tự ở đây, nhưng không phải câu hỏi cụ thể này, mà trong trường hợp này bắt đầu với một vị trí CỤ THỂ.

Khi chúng ta đã thiết lập được bánh rán, chúng ta có thể chọn ngẫu nhiên vị trí của phản ứng riêng lẻ trong đa giác. Điều đó tương đối dễ dàng ...

Cảm ơn ý tưởng của bạn, cho đến nay tôi có vẻ khá mạnh mẽ và tính toán "đắt đỏ" hoặc không hiệu quả ...


1
Có phải đó chỉ là khoảng cách ngắn nhất từ ​​vị trí cụ thể đến ranh giới của đa giác mà bạn muốn?
Nicklas Aven

Bạn đang sử dụng phần mềm hoặc ngôn ngữ lập trình nào?
Pablo

Tại sao không chỉ giao cắt các annulus mong muốn với đường? Tốt hơn nữa, không có lý do gì để sử dụng các hình tròn - bạn cũng có thể sử dụng một hình vuông, điều này sẽ dẫn đến việc thực hiện nhanh hơn.
whuber

3
Dường như có ít hoặc không có sự đồng thuận . Tổng quan về một số phương pháp xuất hiện ở đây, bắt đầu p. 34 . Một phương pháp tinh vi đã được đề xuất trên trang web của chúng tôi . Một nhóm làm việc quốc tế gần đây đã khám phá nhiều vấn đề liên quan. Một đánh giá gần đây của Mathews & Harel có thể hữu ích.
whuber

3
@whuber, cảm ơn rất nhiều! Tôi giả sử bạn là Bill Huber giống nhau đã đăng trợ giúp và mã nguồn kể từ khi tôi bắt đầu sử dụng GIS vào năm 1998. Tôi yêu tất cả các tập lệnh Avenue của bạn, đã học được rất nhiều từ họ (và tôi cho rằng chương trình được tham chiếu bên dưới là ArcView, đó là tuyệt vời như thế nào nó chạy nhanh những ngày này !!!). Chỉ muốn cho bạn biết bạn được đánh giá cao như thế nào trong cộng đồng các học viên GIS! Cảm ơn tất cả những năm của bạn lời khuyên tuyệt vời!
Percy

Câu trả lời:


3

Một phương pháp đơn giản để di chuyển các vị trí trong phạm vi như vậy khai thác một biểu diễn có khoảng cách đến ranh giới của đường. Bắt đầu bằng một đại diện đa giác của các vùng được điều tra dân số (là thông thường),

  1. Chuyển đổi nó thành ranh giới đa giác (một lớp đa tuyến).

  2. Tính toán khoảng cách lưới Euclide với các ranh giới.

  3. Trích xuất khoảng cách Euclide tại các vị trí nhất định.

  4. Di chuyển từng vị trí trong phạm vi được cho bởi khoảng cách - theo định nghĩa, là tối đa đến ranh giới.

Mỗi loại thường chỉ cần một lệnh duy nhất với một hệ thống GIS, làm cho toàn bộ chuỗi dễ dàng tự động hóa và dễ dàng thực hiện thủ công. Đây là các lệnh hiệu quả , bởi vì chúng không yêu cầu xây dựng bộ đệm cho mỗi điểm (thường tạo ra vài chục đến gần một nghìn điểm để mô tả một vòng hoặc annulus ). Không cần tìm kiếm hoặc thử nghiệm ngẫu nhiên, cả hai điểm: được thay thế trực tiếp bởi số tiền được đảm bảo để lại trong phạm vi Điều tra dân số ban đầu của họ.


Ví dụ: tôi đã di chuyển 172.902 vị trí trong 47 vùng theo hướng ngẫu nhiên bằng các chuyển vị được phân bố đồng đều giữa một nửa khoảng cách và toàn bộ khoảng cách đến ranh giới. Đây là một phần của một đường trước khi di chuyển:

Hình 1

(hình vuông màu vàng đánh dấu các vị trí) và sau khi di chuyển:

Hình 2

(bây giờ hình vuông màu xám đánh dấu các vị trí mới). Toàn bộ hoạt động chỉ mất một hoặc hai phút (sử dụng một hệ thống GIS cũ lỗi thời :-).

Bằng cách so sánh các số liệu này chặt chẽ, bạn có thể thấy rằng

  • Các điểm hiện đang ở gần ranh giới (chẳng hạn như gần hai hồ được hiển thị dưới dạng "lỗ hổng" màu trắng trong các hình này) nhất thiết phải ở gần ranh giới.

  • Điểm xa ranh giới có xu hướng di chuyển xa.

Do đó, một điểm gần ranh giới có khả năng (nhưng không chắc chắn) có nguồn gốc rất gần, trong khi bất kỳ điểm nào ở xa ranh giới có khả năng bắt nguồn từ một nơi khác xa ranh giới. Hai khuynh hướng này khác xa hoàn toàn ngẫu nhiên: chúng có thể (khá dễ dàng) được khai thác bởi một người muốn xâm nhập sự riêng tư mà các phong trào này dự định chi trả.

Các phương pháp tốt hơn sẽ làm cho các kết nối giữa vị trí cuối cùng và vị trí ban đầu trở nên khó khăn hơn và ngẫu nhiên hơn. Tối thiểu, các điểm nên được di chuyển trong các khu vực lớn hợp lý thay vì trong các khu vực có kích thước khác nhau (và có thể nhỏ tùy ý). Các chuyển động như vậy không dễ dàng thực hiện với lưới, vì thông thường chúng yêu cầu một số thử nghiệm và lỗi: bạn tạo ra một loạt các điểm ngẫu nhiên trong một vùng lân cận của mỗi điểm ban đầu và chọn điểm đầu tiên nằm trong cùng một đường điều tra dân số. Đó là một vòng lặp liên quan đến (1) một chuyển động ngẫu nhiên và (2) một cuộc điều tra điểm đa giác. Cả hai hoạt động đều nhanh, nhưng điều này đòi hỏi một chút lập trình để thực hiện vòng lặp.

(Trong một bình luận cho câu hỏi, tôi cung cấp liên kết đến một số nghiên cứu về các phương pháp được sử dụng để ngụy trang dữ liệu định vị cho mục đích riêng tư.)


2

Tôi chỉ muốn thử bánh rán của bạn trong PostGIS

Tôi đã thử nó trên PostGISonline.

Để thực hiện bài kiểm tra tương tự, bạn truy cập: http://postgisonline.org/map.php

Có một số đa giác được gọi là "thuộc tính" in:

SELECT * FROM property;

và nhấn "Map1"

Sau đó, bạn có thể kiểm tra mã bánh rán bằng cách sao chép bên dưới vào textarea và nhấn "map2" (sau đó bản đồ thuộc tính sẽ vẫn còn):

SELECT ST_Difference(ST_Buffer(the_geom,dist),ST_Buffer(the_geom,dist/3)) the_geom,dist FROM
(
    SELECT ST_Distance(poly.boundary,points.the_geom) dist, points.the_geom FROM
    (
        SELECT ST_Boundary(the_geom) boundary,the_geom FROM property
    ) poly
    INNER JOIN
    (
        SELECT ST_SetSrid('POINT(137816 267009)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(139816 268542)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(135016 268102)'::geometry,3021) the_geom
    ) points
    ON ST_Contains(poly.the_geom,points.the_geom)
) a

Điều đó sẽ cung cấp cho bạn một kết quả như: nhập mô tả hình ảnh ở đây


PostGIS hoàn toàn là đá! Cảm ơn, đó là công việc tuyệt vời, tốt đẹp!
Percy

1

Hy vọng giải pháp Python này sẽ giúp bạn hiểu. Quy trình công việc chung như sau:

  1. Chuyển đổi đa giác thành polylines để bạn có thể tính toán khoảng cách gần
  2. Đệm các điểm dựa trên khoảng cách gần

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

# Import arcpy module
import arcpy, os
from arcpy import env

env.overwriteOutput = 1

env.workspace = r'C:\sample.gdb\temp'
Dir = env.workspace

# Local variables:
points = "points"
polygon = "polygon"
points_2 = "points"
buffers = "buffers"
polyline = "polyline"

# Polygon To Line
arcpy.PolygonToLine_management(polygon, polyline, "IDENTIFY_NEIGHBORS")

# Near
arcpy.Near_analysis(points, polyline)

# Buffer
arcpy.Buffer_analysis(points_2, buffers, "NEAR_DIST")

Cảm ơn! có vẻ như nó có thể làm việc :-) chúng tôi sẽ thử!
Percy
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.