创建受海岸线限制的区域缓冲区


10

我正在尝试使用ArcGIS 10.2基于预定义区域(例如400平方公里)创建点的缓冲区。除此之外,某些点的缓冲区靠近海岸线,因此需要将缓冲区修剪在海岸线上,并且仍然具有与内陆缓冲区相同的面积(400平方公里)。

有谁知道可以使用“模型开发器”或“ Arcpy”完成此操作吗?

我在Arcpy和R方面的技能有限,但是很乐意进行一些脚本编写以获得解决方案。

请参见下面的图片,其中显示了我要实现的目标的图形表示

[1]


2
您是否可以包含要用文字描述的图片?
PolyGeo

切割后如何扩大面积?通过扩展缓冲区的半径?
PeterHorsbøllMøller'16

Answers:


15

圆形缓冲区的面积是缓冲区半径的单调递增函数(无论如何在平面坐标系上)。因此,一种简单的搜索策略可以找到一个半径R,使得半径缓冲区的R区域A被裁剪为多边形区域(达到一定容差)s

最简单的搜索算法只是二进制搜索。从两个半径开始,一个很小,一个很大,这样您想要的区域就在这些半径的裁剪缓冲区的区域之间。然后,只需取这些半径的中点并计算缓冲区,然后找出所需的半径是在中点之上还是之下。更新半径限制并重复,直到达到所需区域的一定公差为止。

用Python编写二进制搜索并使用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

因此,在这种情况下,缓冲区宽度不到64公里。

唯一需要摆弄的是上下限的初始值-我猜您可以将下限半径设定为直角,sqrt(A/pi)而上限则不那么重要,因为搜索算法会增大它直到捕获间隔。

如果初始最大半径确实太大,则搜索算法可能会失败,因为您可能会以很大的半径缓冲整个区域,在这种情况下,更改半径不会更改面积。但是明智的限制应该阻止这种情况的发生。


您是如何在R中做到这一点的?我忘了提到我在R方面有一定的经验,所以我也不会介意使用R的解决方案。
Funkeh-Monkeh,2016年

rgeos程序包及其gBuffer功能,最有可能...
Spacedman '16

实际上,我说谎了,我在Python中实现了类似QQ插件的功能-它缓冲多边形,直到缓冲的多边形是原始多边形面积的2倍(或Nx)。相同的搜索算法。
Spacedman

+1。R代码中显示的方法的优点是(a)将GIS计算与搜索逻辑分开,并且(b)利用uniroot经过优化和测试的搜索算法(in ),您不必编写一个自己(这可能不是最有效的)。
ub

我怀疑scipy在其优化模块中实现了类似的寻根算法:docs.scipy.org/doc/scipy/reference/optimize.html(是的,?uniroot引用了Brent,scipy具有Brent-ish功能)
Spacedman

1

由于点的位置,这几乎是不可能的。您可以创建400km 2的缓冲区,但是与较远的点(> 400km 2)相比,靠近海岸线的点将始终具有较小的面积。

您唯一可以做的就是在这些点上执行缓冲区分析,然后使用海岸线特征裁剪创建的缓冲区。


2
可能并非不可能,但这可能是NP完整问题,可能会使解决方案感到困惑。要使区域完美,是一项挑战(可能需要多次迭代才能接近)。
文斯

3
这不是没有可能,甚至没有困难!
Spacedman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.