web-dev-qa-db-ja.com

GDALレイヤーのラスタライズ

編集

これを行う適切な方法は次のとおりです。 ドキュメント

_import random
from osgeo import gdal, ogr    

RASTERIZE_COLOR_FIELD = "__color__"

def rasterize(pixel_size=25)
    # Open the data source
    orig_data_source = ogr.Open("test.shp")
    # Make a copy of the layer's data source because we'll need to 
    # modify its attributes table
    source_ds = ogr.GetDriverByName("Memory").CopyDataSource(
            orig_data_source, "")
    source_layer = source_ds.GetLayer(0)
    source_srs = source_layer.GetSpatialRef()
    x_min, x_max, y_min, y_max = source_layer.GetExtent()
    # Create a field in the source layer to hold the features colors
    field_def = ogr.FieldDefn(RASTERIZE_COLOR_FIELD, ogr.OFTReal)
    source_layer.CreateField(field_def)
    source_layer_def = source_layer.GetLayerDefn()
    field_index = source_layer_def.GetFieldIndex(RASTERIZE_COLOR_FIELD)
    # Generate random values for the color field (it's here that the value
    # of the attribute should be used, but you get the idea)
    for feature in source_layer:
        feature.SetField(field_index, random.randint(0, 255))
        source_layer.SetFeature(feature)
    # Create the destination data source
    x_res = int((x_max - x_min) / pixel_size)
    y_res = int((y_max - y_min) / pixel_size)
    target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', x_res,
            y_res, 3, gdal.GDT_Byte)
    target_ds.SetGeoTransform((
            x_min, pixel_size, 0,
            y_max, 0, -pixel_size,
        ))
    if source_srs:
        # Make the target raster have the same projection as the source
        target_ds.SetProjection(source_srs.ExportToWkt())
    else:
        # Source has no projection (needs GDAL >= 1.7.0 to work)
        target_ds.SetProjection('LOCAL_CS["arbitrary"]')
    # Rasterize
    err = gdal.RasterizeLayer(target_ds, (3, 2, 1), source_layer,
            burn_values=(0, 0, 0),
            options=["ATTRIBUTE=%s" % RASTERIZE_COLOR_FIELD])
    if err != 0:
        raise Exception("error rasterizing layer: %s" % err)
_

元の質問

osgeo.gdal.RasterizeLayer()の使用方法に関する情報を探しています(docstringは非常に簡潔で、CまたはC++ APIドキュメントでは見つかりません。 のドキュメントしか見つかりませんでした。 Javaバインディング )。

ユニットテスト を採用し、ポリゴンで作成された.shpで試してみました。

_import os
import sys
from osgeo import gdal, gdalconst, ogr, osr

def rasterize():
    # Create a raster to rasterize into.
    target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', 1280, 1024, 3,
            gdal.GDT_Byte)
    # Create a layer to rasterize from.
    cutline_ds = ogr.Open("data.shp")
    # Run the algorithm.
    err = gdal.RasterizeLayer(target_ds, [3,2,1], cutline_ds.GetLayer(0),
            burn_values=[200,220,240])
    if err != 0:
        print("error:", err)

if __name__ == '__main__':
    rasterize()
_

正常に動作しますが、取得できるのは黒の.tifだけです。

_burn_values_パラメーターは何ですか? RasterizeLayer()を使用して、属性の値に基づいて異なる色のフィーチャを持つレイヤーをラスタライズできますか?

それができない場合、私は何を使うべきですか? [〜#〜] agg [〜#〜] 地理データのレンダリングに適していますか(noアンチエイリアスと非常に堅牢なレンダラー、おそらく「ダーティデータ」(縮退したポリゴンなど)から、非常に大きなフィーチャと非常に小さなフィーチャを正しく描画でき、大きな座標で指定されることもあります)?

ここでは、ポリゴンは属性の値によって区別されます(色は関係ありません。属性の値ごとに異なるものが必要です)。

29
Luper Rouch

編集:私はqGIS pythonバインディングを使用すると思います: http://www.qgis.org/wiki/Python_Bindings

それが私が考えることができる最も簡単な方法です。以前に何かを手で転がしたのを覚えていますが、それは醜いです。 qGISは、別のWindowsインストールを作成して(pythonを操作するために)、XML-RPCサーバーをセットアップして別のpythonで実行する必要がある場合でも、より簡単になります_ 処理する。

GDALに適切にラスタライズさせることができます。これも素晴らしいことです。

私はしばらくgdalを使用していませんが、これが私の推測です:

_burn_values_は、Z値を使用しない場合の偽色用です。 _[255,0,0]_を使用すると、ポリゴン内のすべてが_burn=[1,2,3],burn_values=[255,0,0]_(赤)になります。ポイントがどうなるかわかりません-プロットされない可能性があります。

Z値を使用する場合は、gdal.RasterizeLayer(ds,bands,layer,burn_values, options = ["BURN_VALUE_FROM=Z"])を使用します。

私はあなたが見ていたテストからこれを引き出しています: http://svn.osgeo.org/gdal/trunk/autotest/alg/rasterize.py

別のアプローチ-ポリゴンオブジェクトを引き出し、形を整えて描画しますが、魅力的ではない場合があります。または、geodjangoを調べてください(JavaScriptを使用してブラウザーにプロットするためにopenlayersを使用していると思います)。

また、ラスタライズする必要がありますか?本当に精度が必要な場合は、PDFエクスポートの方が適している可能性があります。

実際、Matplotlibを使用すると(フィーチャを抽出して投影した後)、ラスタライズよりも簡単で、より多くの制御を取得できることがわかったと思います。

編集:

より低いレベルのアプローチはここにあります:

http://svn.osgeo.org/gdal/trunk/gdal/swig/python/samples/gdal2grd.py \

最後に、ポリゴンを反復処理して(ローカル投影に変換した後)、直接プロットすることができます。ただし、複雑なポリゴンは使用しない方がよいでしょう。そうしないと、少し悲しみが生じます。複雑なポリゴンがある場合...独自のプロッタをロールしたい場合は、 http://trac.gispython.org/lab のshapelyとr-treeを使用するのがおそらく最善です。

Geodjangoは尋ねるのに良い場所かもしれません..彼らは私よりも多くを知っているでしょう。彼らはメーリングリストを持っていますか?周りにはpythonマッピングの専門家もたくさんいますが、誰もこれについて心配していないようです。 qGISやGRASSなどでプロットしているだけだと思います。

真剣に、彼らが何をしているのかを知っている誰かが答えてくれることを願っています。

9
wisty