해안선에 의해 제한되는 지역 버퍼 만들기


10

ArcGIS 10.2를 사용하여 미리 정의 된 영역 (예 : 400 평방 킬로미터)을 기준으로 포인트 버퍼를 만들려고합니다. 또한, 일부 지점의 완충 장치는 해안선에 가깝고 완충 장치는 해안선에서 잘 려야하며 내륙과 동일한 면적을 유지해야합니다 (400 평방 킬로미터).

누구든지 Model Builder 또는 Arcpy로 어떻게 할 수 있는지 알고 있습니까?

Arcpy와 R에 대한 기술이 제한되어 있지만 이에 대한 해결책을 찾기 위해 스크립팅 작업을 기꺼이 도와 드리겠습니다.

내가 달성하려는 것을 그래픽으로 보여주는 아래 이미지를 참조하십시오

[1]


2
당신이 말하려는 내용의 그림을 말로 포함시킬 수 있습니까?
PolyGeo

그렇다면 잘라낼 때 어떻게 더 큰 지역을 만드시겠습니까? 버퍼의 반경을 확장하여?
Peter Horsbøll Møller

답변:


15

원형 버퍼의 영역은 버퍼 반경의 단조 증가 함수입니다 (평면 좌표계에서). 따라서 간단한 검색 전략은 다각형 영역에 클리핑 된 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)있으며 상단은 검색 알고리즘이 간격을 캡처 할 때까지 그것을 증가시키기 때문에 중요하지 않습니다.

초기 최대 반경이 너무 큰 경우 검색 알고리즘이 실패 할 수 있습니다. 큰 반경으로 전체 영역을 버퍼링 할 수 있습니다.이 경우 반경을 변경해도 영역이 변경되지 않습니다. 그러나 합리적인 한계는 이러한 상황을 중지해야합니다.


R에서 어떻게 했습니까? R에 대한 경험이 있으므로 R을 사용하는 솔루션은 마음에 들지 않습니다.
Funkeh-Monkeh 2016 년

rgeos패키지와 gBuffer기능, 가장 가능성이 ...
Spacedman

사실 저는 거짓말을하고, 파이썬에서 QGIS 플러그인과 같은 것을 구현했습니다. 버퍼링 된 폴리가 원래 폴리곤의 면적의 2 배 (또는 Nx)가 될 때까지 폴리곤을 버퍼링했습니다. 같은 검색 알고리즘.
Spacedman

+1. R코드에 표시된 접근 방식의 장점 은 (a) GIS 계산을 검색 로직과 분리하고 (b) uniroot최적화되고 테스트 된 검색 알고리즘 (에서 )을 활용한다는 것입니다. 자신 (그리고 가장 효율적이지 않을 것입니다).
whuber

내가 scipy 구현에게 그것의 최적화 모듈 비슷한 루트 찾는 알고리즘을 의심 : docs.scipy.org/doc/scipy/reference/optimize.html를 (? 예, uniroot 브렌트을 인용, scipy 브렌트 틱 기능을 가지고있다)
Spacedman

1

포인트의 위치로 인해 거의 불가능합니다. 400km 2의 버퍼를 만들 수 있지만 해안선에 더 가까운 포인트는 더 멀리 떨어진 (> 400km 2 )에 비해 항상 더 작은 면적을 갖습니다 .

당신이 할 수있는 유일한 포인트에 버퍼 분석 을 수행 하고 해안선 기능으로 나중에 만든 버퍼를 클립 하는 것입니다.


2
그것은하지 않을 수 없다 , 그러나 그것은 될 수 NP 완벽한 솔루션을 혼동 할 수 있습니다 문제. 이 영역을 완벽하게하는 것은 어려운 일입니다 (가까워 지려면 여러 번 반복해야 할 수도 있습니다).
Vince

3
불가능하지도 않고 힘들지도 않습니다!
Spacedman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.