Buat buffer area yang dibatasi oleh garis pantai

10

Saya mencoba menggunakan ArcGIS 10.2 untuk membuat buffer poin berdasarkan area yang telah ditentukan (misalnya 400 km persegi). Lebih jauh dari itu, penyangga dari beberapa titik dekat dengan garis pantai yang mengharuskan penyangga terpotong di garis pantai dan masih memiliki area yang sama dengan yang ada di daratan (400 km persegi).

Adakah yang tahu bagaimana ini bisa dilakukan dengan Model Builder atau Arcpy?

Saya memiliki keterampilan terbatas dengan Arcpy dan R tetapi akan senang bekerja pada beberapa skrip untuk mendapatkan solusi untuk ini.

Silakan lihat gambar di bawah ini yang menunjukkan representasi grafis dari apa yang saya coba capai

[1]

Funkeh-Monkeh
sumber
2
Apakah Anda dapat memasukkan gambar dari apa yang Anda coba gambarkan dalam kata-kata?
PolyGeo
Bagaimana Anda membuat area lebih besar saat Anda memotong? Dengan memperluas jari-jari buffer?
Peter Horsbøll Møller

Jawaban:

15

Area buffer sirkular adalah fungsi peningkatan jari-jari buffer secara monotonik (pada sistem koordinat planar). Jadi strategi pencarian yang sederhana dapat menemukan jari R- jari sedemikian rupa sehingga daerah penyangga jari-jari yang Rterpotong pada wilayah poligon Aadalah (hingga toleransi) s.

Algoritma pencarian paling sederhana hanya akan menjadi pencarian biner. Mulailah dengan dua jari, satu sangat kecil dan satu sangat besar, sehingga area yang Anda inginkan berada di antara area buffer yang terpotong dari jari-jari tersebut. Kemudian ambil saja titik tengahnya dan hitung daerah penyangga, dan cari tahu apakah jari-jari yang Anda inginkan berada di atas atau di bawah titik tengah. Perbarui batas radius Anda dan ulangi sampai Anda mendapatkan toleransi di area yang Anda inginkan.

Menulis pencarian biner dengan Python dan menggunakan ArcGIS Python API terdengar seperti cara yang bagus untuk belajar! Saya cukup yakin saya sudah melakukan ini di R, tahun lalu ...

Ini beberapa kode 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))
}

Pemakaian:

Pertama-tama mengatur wilayah poligon UK sederhana:

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)

Sekarang tentukan satu poin:

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

Maka Anda hanya:

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

Ini adalah daftar dengan dua komponen, badalah buffer:

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

dan memiliki area yang tepat:

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

dan rmerupakan output dari uniroot, yang mencakup nilai radius buffer.

> b$r$root
[1] 63338.88

Jadi dalam hal ini lebar buffer sedikit di bawah 64 km.

Satu-satunya hal untuk mengutak-atik di sini adalah nilai awal yang lebih rendah dan atas - Saya kira Anda dapat intuisi radius yang lebih rendah karena sqrt(A/pi)dan atas tidak begitu penting karena algoritma pencarian akan meningkatkannya sampai menangkap interval.

Algoritme pencarian mungkin gagal jika jari-jari maks awal benar-benar terlalu besar, karena Anda mungkin melindungi seluruh wilayah Anda dengan jari-jari besar, dalam hal ini mengubah jari-jari tidak akan mengubah area ... Tetapi batas yang masuk akal harus menghentikan hal ini terjadi.

Spacedman
sumber
Bagaimana Anda melakukan ini di R? Saya lupa menyebutkan bahwa saya memiliki pengalaman dalam R jadi saya tidak akan keberatan menggunakan R juga.
Funkeh-Monkeh
The rgeospaket dan yang gBufferfungsi, kemungkinan besar ...
Spacedman
Sebenarnya saya berbohong, saya menerapkan sesuatu seperti itu di Python sebagai plugin QGIS - itu buffered poligon sampai buffered poly adalah 2x (atau Nx) area poligon asli. Algoritma pencarian yang sama.
Spacedman
+1. Keuntungan dari pendekatan yang ditunjukkan dalam Rkode adalah (a) memisahkan perhitungan GIS dari logika pencarian dan (b) memanfaatkan algoritma pencarian (dalam uniroot) yang telah dioptimalkan dan diuji - Anda tidak perlu menulis satu diri Anda sendiri (dan kemungkinan itu bukan yang paling efisien).
Whuber
Saya menduga scipy mengimplementasikan algoritma pencarian akar yang serupa dalam modul optimisasinya : docs.scipy.org/doc/scipy/reference/optimize.html (ya,? Tanpa tanda kutip Brent, scipy memiliki fungsi Brent-ish)
Spacedman
1

Itu hampir mustahil, karena posisi poin. Anda dapat membuat buffer 400 km 2 , tetapi poin yang lebih dekat ke garis pantai akan selalu memiliki area yang lebih kecil dibandingkan dengan yang lebih jauh (> 400 km 2 ).

Satu-satunya hal yang dapat Anda lakukan adalah melakukan analisis buffer pada poin dan klip buffer yang dibuat dengan fitur garis pantai sesudahnya.

Stefan
sumber
2
Mungkin bukan tidak mungkin , tetapi bisa menjadi masalah NP Lengkap yang dapat mengacaukan solusi. Mendapatkan area yang sempurna adalah tantangan (mungkin perlu beberapa iterasi untuk mendekat).
Vince
3
Itu tidak mustahil, dan itu bahkan tidak sulit!
Spacedman