海岸線によって制限されているエリアバッファーを作成する


10

ArcGIS 10.2を使用して、事前定義されたエリア(例:400平方km)に基づいてポイントのバッファーを作成しようとしています。さらに、いくつかのポイントのバッファーは海岸線に近く、バッファーを海岸線でクリップする必要がありますが、内陸と同じ面積(400平方km)です。

これがモデルビルダーまたはArcpyでどのように実行できるかを誰かが知っていますか?

私はArcpyとRのスキルは限られていますが、この問題の解決策を得るためにいくつかのスクリプトに取り組みたいと思います。

私が達成しようとしていることをグラフィック表示した下の画像をご覧ください

[1]


2
言葉で表現しようとしていることの写真を含めることができますか?
PolyGeo

そのとき、あなたが切り取るとき、どのようにエリアをより大きくしますか?バッファの半径を拡張することによって?
PeterHorsbøllMøller2016

回答:


15

円形バッファーの面積は、バッファー半径の単調増加関数です(とにかく平面座標系で)。したがって、単純な検索戦略は、多角形領域にクリップされたR半径のバッファのR領域Aが(ある程度の許容範囲まで)であるような半径を見つけることができますs

最も単純な検索アルゴリズムは、バイナリ検索です。1つの非常に小さい半径と1つの非常に大きい半径の2つの半径から開始して、必要な領域が、それらの半径のクリップされたバッファーの領域の間のどこかにあるようにします。次に、それらの中間点を取り、バッファー領域を計算し、必要な半径が中間点の上か下かを計算します。半径の制限を更新し、目的の領域の許容範囲内になるまで繰り返します。

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))
}

使用法:

最初に、シンプルなUKポリゴンリージョンを設定します。

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)

これは2つのコンポーネントを含むリストで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弱でした。

ここでいじる唯一の事柄はより低いそしてより高い初期値です-私はあなたがより低い半径を直感することができsqrt(A/pi)、検索アルゴリズムがそれが間隔を捕獲するまでそれを増やすので、より高い半径はそれほど重要ではないと思います。

領域全体を巨大な半径でバッファリングしている可能性があるため、初期最大半径が本当に大きすぎると、検索アルゴリズムが失敗する可能性があります。


Rでこれをどのように行いましたか?私はRでの経験があることを忘れていたので、Rを使用するソリューションも気にしません。
Funkeh-Monkeh 2016年

rgeosパッケージとそのgBuffer最も可能性の高い機能、...
Spacedman

実際、私は嘘をつきました、私はQGISプラグインとしてPythonでそのようなものを実装しました-バッファされたポリゴンが元のポリゴンの2倍(またはN倍)になるまでポリゴンをバッファしました。同じ検索アルゴリズムですが。
Spacedman、2016年

+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 Complete問題である可能性があります。領域を完璧にすることが課題です(近づくには数十回の反復が必要になる場合があります)。
Vince

3
それは不可能ではなく、難しいことでもありません!
Spacedman、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.