원형 버퍼의 영역은 버퍼 반경의 단조 증가 함수입니다 (평면 좌표계에서). 따라서 간단한 검색 전략은 다각형 영역에 클리핑 된 R
반경 버퍼 R
영역 A
이 (최대 허용 오차) 반경을 찾을 수 있습니다 s
.
가장 간단한 검색 알고리즘은 이진 검색 일뿐입니다. 두 개의 반지름, 하나는 매우 작고 하나는 매우 큰 것으로 시작하여 원하는 영역이 해당 반경의 클리핑 된 버퍼 영역 사이에있게하십시오. 그런 다음 그 중간 점을 계산하고 버퍼 영역을 계산하고 원하는 반경이 중간 점 위 또는 아래인지 확인하십시오. 반경 제한을 업데이트하고 원하는 영역의 허용 오차 내에 도달 할 때까지 반복하십시오.
파이썬에서 이진 검색을 작성하고 ArcGIS Python API를 사용하는 것은 배우는 좋은 방법처럼 들립니다! 몇 년 전에 R 에서이 작업을 수행했다고 확신합니다 ...
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))
}
용법:
먼저 간단한 영국 다각형 영역을 설정하십시오.
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)
이제 포인트를 정의하십시오 :
p = SpatialPoints(coords=list(x=269042, y=235937), proj4string=CRS("+init=epsg:27700"))
그런 다음에
b = buff_with_area(p, uk, 10000000000, 1, 10000)
이것은 두 가지 구성 요소가있는 목록이며 b
버퍼입니다.
plot(b$b, col=2)
plot(uk, add=TRUE)
올바른 영역이 있습니다.
gArea(b$b)
[1] 1e+10
및 r
로부터 출력 uniroot
버퍼 반경 값을 포함한다.
> b$r$root
[1] 63338.88
따라서이 경우 버퍼 너비는 64km 미만이었습니다.
여기에서 바이올린과 함께 할 수있는 유일한 것은 낮은 초기 값입니다. 낮은 반경을 intuit 할 수 sqrt(A/pi)
있으며 상단은 검색 알고리즘이 간격을 캡처 할 때까지 그것을 증가시키기 때문에 중요하지 않습니다.
초기 최대 반경이 너무 큰 경우 검색 알고리즘이 실패 할 수 있습니다. 큰 반경으로 전체 영역을 버퍼링 할 수 있습니다.이 경우 반경을 변경해도 영역이 변경되지 않습니다. 그러나 합리적인 한계는 이러한 상황을 중지해야합니다.