Category: SAGA

Euclidean Allocation

アロケーションラスタ ArcGISのEuclidean AllocationはGISでデータ解析していると、とても便利な機能です。ラスタデータに対するバッファ機能のようなものですが、バッファ内のセルは、一番近い基になるラスタのカテゴリまたは整数値を持つことになります。左の図で言えば、青いポリゴンの周りに様々な色のバッファがありますが、それぞれのバッファはポリゴンの属性値を持ったラスタです。各ポリゴンの縄張り範囲をある距離内で示したようなものです。ArcGISならSpatial Analystさえあればすぐに実行できるのですが、オープンソースでやる方法を探していたので、ここでその結果を報告をします。 まず、SAGAのGRID Proximity Bufferを見てみると、どうやらEuclidean Allocationらしきことができそうです。このコマンドは、QGISのプロセッシングメニューからも使えますし、もちろん、本家のSAGA GISからも使えます。Inputとしては、GRID(ラスタ)が必要なので、基になるデータがベクタならば、QGISのプロセッシングメニューから「Rasterize (vector to raster)」を探し出し、まずは基になるラスタを作成します。 GRID proximity bufferは、ラスタのNoDataの部分に対してバッファを発生させるので、コマンドを実行する前に、バッファを発生させたい部分がNoDataとなっていることを確認して下さい。SAGAである値をNoDataに変更する方法は、このポストを参考にして下さい。GRID proximity bufferの必要なパラメタを設定してコマンドを実行すると、デフォルトではDistance Grid、Allocation Grid、Buffer Gridの3つのレイヤが作成されます。今回目的としている出力はAllocation Gridですが、Distance Gridはソースへの距離を実数で表したもので、Buffer Gridは、Distance Gridを基に指定した距離間隔(Equidistance)でグリッドをクラス分けしたもので、例えばUTF座標系のデータでEquidistanceを100に指定すると、Distance Gridで123.45mの値を持つセルは200に、4570.23mのセルは、4600へとクラス分けされます。 SAGAのGRID proximity bufferは思い通りにArcGISで言うところのEuclidean Allocationをやってくれたのですが、今回のテストでは一つだけ問題がでました。それは、解析対象範囲が入力レイヤの最小範囲で指定されているので、値を持つセルがレイヤ範囲のギリギリまである場合、バッファがレイヤの範囲を超えて計算されないため、バッファが思い通りに作成されませんでした。 この問題を解決するには、レイヤの範囲を変更する必要があります。そのために手っ取り早いのは、ツールボックスのGDAL/OGR内にある、Clip raster by extentツールです。この中にある「クリップされた領域」オプションの右側にあるボタンをクリックし、表示される「レイヤー/キャンバス範囲を利用する」、「キャンバスで領域を指定して下さい」オプションを指定し、どちらかで実際のレイヤの最小範囲よりも広い範囲を指定した上でレイヤを新しく作成します。この作成されたレイヤに対しGRID proximity bufferを適用すると、今度は思い通りにバッファーの範囲が拡張されます。 SAGAのGRID proximity bufferと同じような方法をGRASSで探してみると、r.grow.distanceが使える事がわかりました。ただしこの場合は、バッファ距離が指定できないため、レイヤの領域範囲内は全てソースラスタのカテゴリ値が割り振られます。そのため、r.grow.distanceで同時に作成されるDistance layerの距離によってallocation gridをクリップする必要があります。 まとめ 今回は、GISの解析でよく使うArcGISでいうところのEuclidian AllocationをオープンソースGISを使ってどのようにやるかということについてテストしてみましたが、QGISに付属するSAGAやGRASSでも手軽に同じ解析ができることが分かりました。また、オープンソースGISの面白い解析ツールがあったら紹介したいと思います。

Posted in GIS, QGIS, SAGA Tagged with: