Tạo vùng đệm bị giới hạn bởi đường bờ biển


10

Tôi đang cố gắng sử dụng ArcGIS 10.2 để tạo bộ đệm các điểm dựa trên khu vực được xác định trước (ví dụ: 400 km vuông). Ngoài ra, bộ đệm của một số điểm nằm sát đường bờ biển đòi hỏi bộ đệm phải được cắt ở bờ biển và vẫn có cùng diện tích với những điểm nằm trong đất liền (400 km vuông).

Có ai biết làm thế nào điều này có thể được thực hiện với Model Builder hoặc Arcpy không?

Tôi có các kỹ năng hạn chế với Arcpy và R nhưng sẽ rất vui khi làm việc với một số kịch bản để có được giải pháp cho việc này.

Xin vui lòng xem hình ảnh dưới đây cho thấy một đại diện đồ họa của những gì tôi đang cố gắng để đạt được

[1]


2
Bạn có thể bao gồm một hình ảnh về những gì bạn đang cố gắng để mô tả bằng lời?
PolyGeo

Làm thế nào bạn sẽ làm cho các khu vực lớn hơn khi bạn cắt sau đó? Bằng cách mở rộng bán kính của bộ đệm?
Peter Horsbøll Møller

Câu trả lời:


15

Diện tích của bộ đệm tròn là một hàm tăng đơn điệu của bán kính bộ đệm (dù sao trên hệ tọa độ phẳng). Vì vậy, một chiến lược tìm kiếm đơn giản có thể tìm thấy một bán kính Rsao cho diện tích của vùng đệm bán kính được Rcắt theo vùng đa giác Alà (tối đa một số dung sai) s.

Thuật toán tìm kiếm đơn giản nhất sẽ chỉ là tìm kiếm nhị phân. Bắt đầu với hai bán kính, một rất nhỏ và một rất lớn, sao cho diện tích bạn muốn nằm ở đâu đó giữa vùng đệm được cắt của các bán kính đó. Sau đó, chỉ cần lấy điểm giữa của những vùng đó và tính toán các vùng đệm và tìm hiểu xem bán kính bạn muốn ở trên hay dưới điểm giữa. Cập nhật giới hạn bán kính của bạn và lặp lại cho đến khi bạn đạt được trong phạm vi dung sai của khu vực bạn muốn.

Viết một tìm kiếm nhị phân bằng Python và sử dụng API Python của ArcGIS nghe có vẻ là một cách tốt để tìm hiểu! Tôi khá chắc chắn rằng tôi đã làm điều này trong R, nhiều năm trước ...

Đây là một số mã R:

cropareabuff <- function(pt, region, target){
    f = function(r){
        b = rgeos::gBuffer(pt, width=r)
        return(gArea(gIntersection(b, region)) - target)
    }
    f
}

buff_with_area <- function(pt, region, target, lower, upper){
    f = cropareabuff(pt, region, target)
    r = uniroot(f, lower=lower, upper=upper, extendInt="upX")
    list(r=r, b=gIntersection(rgeos::gBuffer(pt, width=r$root), region))
}

Sử dụng:

Đầu tiên thiết lập một khu vực đa giác đơn giản của Vương quốc Anh:

library(raster); library(rgeos); library(rgdal)
uk = getData("GADM", country="GBR", level=0)
uk = spTransform(uk,CRS("+init=epsg:27700"))
uk = gSimplify(uk, tol=1000)

Bây giờ xác định một điểm:

p = SpatialPoints(coords=list(x=269042, y=235937), proj4string=CRS("+init=epsg:27700"))

Sau đó, bạn chỉ cần:

b = buff_with_area(p, uk, 10000000000, 1, 10000)

Đây là danh sách có hai thành phần, blà bộ đệm:

plot(b$b, col=2)
plot(uk, add=TRUE)

và nó có đúng khu vực:

gArea(b$b)
[1] 1e+10

rlà đầu ra từ uniroot, bao gồm giá trị bán kính đệm.

> b$r$root
[1] 63338.88

Vì vậy, trong trường hợp này, chiều rộng bộ đệm là dưới 64km.

Điều duy nhất cần giải quyết ở đây là các giá trị ban đầu thấp hơn và cao hơn - Tôi đoán bạn có thể giao tiếp với bán kính thấp hơn sqrt(A/pi)và trên không quan trọng vì thuật toán tìm kiếm sẽ tăng nó cho đến khi nó bắt được khoảng.

Thuật toán tìm kiếm có thể thất bại nếu bán kính tối đa ban đầu thực sự quá lớn, vì bạn có thể đệm toàn bộ khu vực của mình với bán kính rất lớn, trong trường hợp thay đổi bán kính sẽ không thay đổi khu vực ... Nhưng các giới hạn hợp lý sẽ ngăn chặn điều này xảy ra.


Làm thế nào bạn làm điều này trong R? Tôi đã quên đề cập rằng tôi có một số kinh nghiệm về R vì vậy tôi cũng không bận tâm đến giải pháp sử dụng R.
Funkeh-Monkeh

Các rgeosgói và nó gBufferchức năng, nhiều khả năng ...
Spacedman

Trên thực tế tôi nói dối, tôi đã triển khai một cái gì đó giống như nó trong Python như là một plugin QGIS - nó đã đệm các đa giác cho đến khi poly được đệm là 2x (hoặc Nx) diện tích của đa giác ban đầu. Thuật toán tìm kiếm tương tự mặc dù.
Spainedman

+1. Ưu điểm của cách tiếp cận được hiển thị trong Rmã là (a) nó tách biệt các tính toán của GIS khỏi logic tìm kiếm và (b) nó tận dụng các thuật toán tìm kiếm (đã uniroot) được tối ưu hóa và thử nghiệm - bạn không phải viết một chính bạn (và nó có thể sẽ không hiệu quả nhất).
whuber

Tôi nghi ngờ cụ scipy thuật toán gốc tìm hiểu tương tự trong mô-đun tối ưu hóa của nó: docs.scipy.org/doc/scipy/reference/optimize.html (? Vâng, uniroot trích dẫn Brent, scipy có chức năng Brent-ish)
Spacedman

1

Điều đó gần như là không thể, do vị trí của các điểm. Bạn có thể tạo bộ đệm 400km 2 , nhưng các điểm gần với đường bờ biển sẽ luôn có diện tích nhỏ hơn so với các vùng xa hơn (> 400km 2 ).

Điều duy nhất bạn có thể làm là thực hiện phân tích bộ đệm trên các điểm và cắt các bộ đệm đã tạo với tính năng đường bờ biển sau đó.


2
Nó có thể không phải là không thể , nhưng nó có thể là một vấn đề NP Complete có thể gây nhiễu giải pháp. Làm cho khu vực hoàn hảo là một thách thức (có thể lấy điểm lặp để đến gần).
Vince

3
Nó không phải là không thể, và nó thậm chí không khó!
Spainedman
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.