Dairesel bir tamponun alanı, tampon yarıçapının monoton olarak artan bir fonksiyonudur (yine de düzlemsel bir koordinat sisteminde). Böylece basit bir arama stratejisi, çokgen bölgeye kırpılmış R
yarıçap tamponunun alanı ( bazı toleranslara kadar) olacak şekilde bir yarıçap bulabilir .R
A
s
En basit arama algoritması sadece bir ikili arama olacaktır. İstediğiniz alan, bu yarıçapların kırpılmış arabelleklerinin alanı arasında bir yer olacak şekilde iki küçük yarıçapla başlayın. Ardından, bunların orta noktasını alın ve tampon alanlarını hesaplayın ve istediğiniz yarıçapın orta noktanın üstünde mi altında mı olduğunu bulun. Özel alan sınırlarınızı güncelleyin ve istediğiniz alana tolerans gösterene kadar tekrarlayın.
Python'da bir ikili arama yazmak ve ArcGIS Python API'sini kullanmak öğrenmek için iyi bir yol gibi geliyor! Bunu yıllar önce R'de yaptığımdan eminim ...
İşte bazı R kodu:
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))
}
Kullanımı:
İlk önce basit bir İngiltere poligonal bölgesi kurun:
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)
Şimdi bir nokta tanımlayın:
p = SpatialPoints(coords=list(x=269042, y=235937), proj4string=CRS("+init=epsg:27700"))
Sonra sadece:
b = buff_with_area(p, uk, 10000000000, 1, 10000)
Bu, iki bileşenli bir listedir b
, arabellektir:
plot(b$b, col=2)
plot(uk, add=TRUE)
ve doğru alana sahip:
gArea(b$b)
[1] 1e+10
ve arabellek yarıçapı değerini içeren r
çıktıdır uniroot
.
> b$r$root
[1] 63338.88
Bu durumda tampon genişliği 64km'nin biraz altındaydı.
Burada uğraşacak tek şey, alt ve üst başlangıç değerleridir - Sanırım daha düşük bir yarıçapı sezgiselleştirebilirsiniz sqrt(A/pi)
ve üst, arama algoritması aralığı yakalayana kadar artıracağı için önemli değildir.
İlk maksimum yarıçap gerçekten çok büyükse arama algoritması başarısız olabilir, çünkü tüm bölgenizi büyük bir yarıçapla tamponluyor olabilirsiniz, bu durumda yarıçapı değiştirmek alanı değiştirmeyecektir ... Ancak mantıklı sınırlar bu durumu durdurmalıdır.