GDALを使用したベクターレイヤーでのラスターのクリッピング


26

Osgeoインストーラーを使用してGDALをインストールしました。ラスターレイヤーをベクターレイヤーでプログラムでクリップするにはどうすればよいですか?これに役立つGDAL APIはありますか?Pythonを使用しています。

回答:


13

gdal apiについてはわかりません。WarpAPI チュートリアルから参照されてvoid* GDALWarpOptions::hCutlineいるWarp Optionsにはありますが、明示的な例はありません。プログラマティックな答えが必要ですか?コマンドラインユーティリティは、すぐに使用できます。

  1. 関心領域のクリッピングポリゴンのみを含むシェープファイルを作成する
  2. ogrinfoクリッピングシェープファイルの範囲を決定するために使用します
  3. gdal_translate形状範囲にクリップするために使用します
  4. 使用gdalwarpして-cutline、パラメータ

ステップ2と3は最適化のためのもので、でうまくいくことができますgdalwarp -cutline ...

すべてが1つのスクリプトにまとめられたLinuxベースのソリューションのLinfinityのポリゴン使用したGDALによるラスターのクリッピングを参照してください。別のカットラインの例は、Mapnikの陰影起伏を作成する Michael Coreyのチュートリアルで見ることができます。


マット、あなたはtrac.osgeo.org/gdal/ticket/1599を思い出すかもしれませんカットラインはこれを満たしているように見えます
マイクT


10

このテーマは常に戻ってきているようです。私自身は、GDAL> 1.8が非常に高度であるため、そのタスクを実行するための公正なコマンドライン処理を既に提供していることを知りませんでした。

Mike Toewsからのコメントは非常に便利ですが、たとえば次のようにすることができます。

gdalwarp -of GTiff -cutline DATA/area_of_interest.shp -cl area_of_interest  -crop_to_cutline DATA/PCE_in_gw.asc  data_masked7.tiff 

このコマンドは、優れたサブプロセスモジュールを備えたpythonスクリプト内にラップできます。

私にとって本当に問題だったのは、その問題に対する最小限の解決策を提供する必要があったということです。つまり、できるだけシンプルで、多くの外部依存を必要としないということです。Joel LawheadによるチュートリアルのようにPython Imaging Libraryを使用するのは適切ですが、次のソリューションを思い付きました。Numpyマスクアレイの使用。
それが良いかどうかはわかりませんが、それは私が知っていたものでした(3年前...)。
元々、元のラスター内に有効なデータ領域(たとえば、同じ出力ラスターの範囲)を作成しましたが、ラスターも小さくする(たとえば-crop_to_cutline)アイデアが気に入ったのでworld2Pixel、Joel Lawheadから採用 しました。ここに私自身の解決策があります:

def RasterClipper():
    craster = MaskRaster()
    contraster2 = 'PCE_in_gw.aux'
    craster.reader("DATA/"+contraster2.replace('aux','asc'))
    xres, yres = craster.extent[1], craster.extent[1]
    craster.fillrasterpoints(xres, yres)
    craster.getareaofinterest("DATA/area_of_interest.shp")
    minX, maxX=craster.new_extent [0]-5,craster.new_extent[1]+5
    minY, maxY= craster.new_extent [2]-5,craster.new_extent[3]+5
    ulX, ulY=world2Pixel(craster.extent, minX, maxY)
    lrX, lrY=world2Pixel(craster.extent, maxX, minY)
    craster.getmask(craster.corners)
    craster.mask=np.logical_not(craster.mask)
    craster.mask.resize(craster.Yrange.size,craster.Xrange.size)
    # choose all data points inside the square boundaries of the AOI,
    # replace all other points with NULL
    craster.cdata= np.choose(np.flipud(craster.mask), (craster.data, -9999))
    # resise the data set to be the size of the squared polygon
    craster.ccdata=craster.cdata[ulY:lrY, ulX:lrX]
    craster.writer("ccdata2m.asc",craster.ccdata, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)
    # in second step we rechoose all the data points which are inside the
    # bounding vertices of AOI
    # need to re-define our raster points
    craster.xllcorner, craster.yllcorner = minX, minY
    craster.xurcorner, craster.yurcorner = maxX, maxY
    craster.fillrasterpoints(10,10)
    craster.getmask(craster.boundingvertices) # just a wrapper around matplotlib.nxutils.points_in_poly
    craster.data=craster.ccdata
    craster.clip2(new_extent_polygon=craster.boundingvertices)
    craster.data = np.ma.MaskedArray(craster.data, mask=craster.mask)
    craster.data = np.ma.filled(craster.data, fill_value=-9999)
    # write the raster to disk
    craster.writer("ccdata2m_clipped.asc",craster.data, (minX+xres*.5, maxY+yres*.5), 10,10,Flip=False)

完全な説明についてはclass MaskRaster、それの方法を参照してください私のプロジェクトのgithubのを

このコードを使用すると、GDALを使用する必要があります。ただし、私のソフトウェアの対象読者は依存関係が多すぎて難しいため、将来可能な純粋なPythonで使用する計画です(Debianを使用してソフトウェアを開発し、クライアントはWindows 7を使用しています...)。


あなたが与えたコマンドラインの例は好きですが、-crop_to_cutline引数が何をするのか説明できますか?クリッピングシェープファイルが-cutlineで指定されているため、その目的が何であるかわかりません。
ヘンドラ

1
-cutlineオプションは、ラスターをポリゴンレイヤーの内側の境界ボックスにクリップします。たとえば、範囲が小さい場合、出力ラスタも小さくなります。これがない場合、出力ラスターは元のラスターと同じサイズになりますが、関心領域外のすべてのポイントにNULLが含まれます。
-Oz123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.