Phát triển hình học PostGIS theo tỷ lệ phần trăm


10

Tôi đang tìm cách để thêm một bộ đệm xung quanh hình học PostGIS, nhưng kích thước của bộ đệm nên phụ thuộc vào kích thước của hình học. Đó là, tôi muốn mỗi hình học được mở rộng bằng, giả sử, 5%.

Ý tưởng là tôi đang tìm kiếm hình học giao nhau, nhưng có thể có lỗi lên tới 5% liên quan đến mỗi hình mà tôi muốn tính đến.

Bất cứ ai cũng biết cách tốt nhất để đi về điều này?

Cơ sở dữ liệu có hàng triệu hàng, vì vậy tôi muốn nó khá nhanh.


2
5% của cái gì? Giả sử bạn đang sử dụng đa giác, có phải là 5% chiều rộng lớn nhất, chiều rộng hẹp nhất, hộp giới hạn, khoảng cách của một đỉnh từ tâm ...? Nếu bạn đang nói về điểm hoặc đường, thì nó thậm chí còn ít ý nghĩa hơn!
MerseyViking

Tôi đoán khoảng cách đỉnh-centroid - hoặc có thể tăng 5% diện tích cũng sẽ ổn. Tăng hộp giới hạn là tốt nếu hình học được thu nhỏ để sau đó điền vào khung giới hạn đó. Tất cả các hình học là đa giác khép kín (đại đa số là tứ giác).
James Baker

Câu trả lời:


8

Các ý kiến ​​cho thấy 5% không cần phải đạt được với độ chính xác cao. (Nếu có, nó sẽ mất một dài thời gian để đệm một triệu đa giác!) Chúng ta có thể vì thế gọi Nguyên tắc Pizza : tuyến tính rescaling một tính năng 2D bởi một yếu tố một tính lại tỷ lệ diện tích của nó bằng một ^ 2.

Đây là cách lý luận đi:

  • Khi hình dạng không quá phức tạp - đặc biệt là nếu nó lồi - thì bộ đệm tạo ra một kết quả tương đương với việc định cỡ lại hình dạng xung quanh một điểm trung tâm. (Tuy nhiên, điều quan trọng là phải hiểu rằng bộ đệm không bao giờ tương đương với việc thay đổi kích thước cho bất kỳ hình dạng nào ngoài đĩa. Đối với một số hình dạng lõm, một "bộ đệm" được tính toán thông qua việc thay đổi kích thước thực sự không bao gồm các phần của hình dạng ban đầu! chúng tôi sẽ tính toán một bộ đệm chính hãng có hình dạng, nhưng chỉ sử dụng sự tương đương gần đúng này như một phương pháp phỏng đoán để ước tính số lượng bộ đệm theo.)

  • Nếu vùng đệm được lớn hơn 5%, thì mức độ thay đổi kích thước phải là sqrt (1 + 5/100), gần bằng 1.025: nghĩa là chúng ta nên mở rộng hình dạng thêm 2,5% theo mọi hướng .

  • Tương tự, nếu chúng ta nghĩ rằng hình dạng có "đường kính" (bằng khoảng cách thông thường), bán kính của nó sẽ tăng 2,5%. Điều đó bằng 2,5% / 2 = 1,25% đường kính.

  • Chúng ta có thể ước tính đường kính điển hình từ khung giới hạn của hình dạng. Sử dụng, giả sử, trung bình số học hoặc hình học của độ dài cạnh của hộp.

Điều này cho thấy quy trình làm việc sau đây:

  1. Lấy hộp giới hạn của hình dạng.

  2. Gọi e là trung bình của độ dài cạnh của hộp.

  3. Bộ đệm hình dạng bằng 1,25% của e ; nghĩa là, bằng (5/100) / 4 * e .

Bởi vì bước 1 và 2 yêu cầu rất ít tính toán, điều này cung cấp chính nó như là một trong những giải pháp nhanh nhất có thể. Để kiểm tra độ chính xác, bạn có thể (tất nhiên) tính toán các khu vực của các hình dạng được đệm và so sánh chúng với các khu vực ban đầu để xem mức độ tăng của chúng đến mức tăng 5% mong muốn. Đôi khi các vùng đệm sẽ thậm chí lớn hơn 5%, nhưng hiếm khi chúng ít hơn và chúng không thể được đánh giá thấp hơn.

Ví dụ

Để kiểm tra và minh họa, chúng ta hãy xem xét một số hình dạng đơn giản.

  1. Một đĩa có bán kính r có một hộp giới hạn với các cạnh có chiều dài 2 r . Công thức của chúng tôi tính e = (5/100) / 4 * 2 * r = r / 40. Hình dạng bộ đệm rõ ràng là một đĩa đồng tâm có bán kính r + r / 40 = 1.025 r . Khu vực cũ là pi * r ^ 2 trong khi khu vực mới là pi * (1.025 r ) ^ 2 = pi * 1.0506 * r ^ 2, lớn hơn 5,06%.

  2. Một hình chữ nhật có các cạnh song song với trục tọa độ có độ dài rs cho e = ( r + s ) / 2. Diện tích bổ sung từ việc đệm hình chữ nhật đến từ bốn hình chữ nhật có chiều rộng (5/100) / 4 e = e / 80 = ( r + s ) / 160 giáp hai bên cộng với bốn phần tư bán kính e / 80 ở các góc. Bỏ qua các vòng tròn, sẽ nhỏ so với các khu vực khác, Tổng diện tích mới bằng

    2 ( r + s ) * ( r + s ) / 160 = ( r ^ 2 + s ^ 2 + 2 r * s ) / 80.

    Khi rs không quá khác nhau, chúng ta có thể hình r ^ 2 + s ^ 2 xấp xỉ 2 r * s . Phép tính gần đúng này đơn giản hóa tổng diện tích mới thành 4 r * s / 80 = 5% diện tích ban đầu của r * s , như dự định.


4

Bạn muốn sử dụng kết hợp ST_Scale ( http://postgis.net/docs/ST_Scale.html ) và ST_Translate ( http://postgis.net/docs/ST_Translate.html ) tôi nghĩ. Chúng tôi có một ví dụ về điều này trong PostGIS in Action và tương tự trong Chương 8. Nếu bạn không có cuốn sách này, bạn có thể tải xuống mã cho chương đó tại đây:

http://www.postgis.us/ch CHƯƠNG_08

Đoạn trích từ cuốn sách Xem ví dụ 8.26:

    -- Listing 8.26 Combining Scale and Translation to maintain centroid
    SELECT xfactor, yfactor, 
       ST_Translate(ST_Scale(hex.the_geom, xfactor, yfactor), 
       ST_X(ST_Centroid(the_geom))*(1 - xfactor), 
       ST_Y(ST_Centroid(the_geom))*(1 - yfactor) ) As scaled_geometry
    FROM 
 ( SELECT ST_GeomFromText('POLYGON((0 0,64 64,64 128,0 192,-64 128,-64 64,0 0))') As the_geom)  As hex
    CROSS JOIN (SELECT x*0.5 As xfactor 
        FROM generate_series(1,4) As x) As xf
    CROSS JOIN (SELECT y*0.5 As yfactor
        FROM generate_series(1,4) As y) As yf;

Làm. Bây giờ dường như cũng có ST_Transscalenhưng bằng cách nào đó tôi không thể tìm ra cách để làm cho nó hoạt động ...
n1000

0

Điều này rất muộn cho bữa tiệc nhưng gần đây tôi đã phát triển một chức năng PostGIS tùy chỉnh để thực hiện điều này, cũng như thu nhỏ nó nếu cần thiết:

ST_Dilate

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.