Geopandasまたはfionaを使用してシェープファイルをラスタライズする-Python


10

このhttp://tinyurl.com/odfbanuのような本当に単純なシェープファイルを少しラスタライズする必要があります。これは、米国のシェープファイルクーティン郡です。GDALRasterizeLayerはすべてのポリゴンをラスターに書き込みませんか?しかし、Giopandasやfionaを使用して、tiffの記述部分にrastraioを使用する方法があるかどうか疑問に思っていました。

したがって、私の目標は、ラスタライズして、共通の値(例ではLSAD)を共有するすべてのポリゴンに値を割り当てることです。

だから私はスレッドでshongololoに触発されたコードの最初を書きました: Pythonで属性に基づいてポリゴンをディゾルブします(シェイプリー、フィオナ)?

from geopandas import GeoDataFrame

name_in = 'cb_2013_us_county_20m.shp'

#Open the file with geopandas
counties = GeoDataFrame.from_file(name_in)

#Add a column to the Geodataframe containing the new value
for i in range (len(counties)):
    LSAD = counties.at[i,'LSAD']
    if LSAD == 00 :
        counties['LSAD_NUM'] == 'A'
    elif LSAD == 03 :
        counties['LSAD_NUM'] == 'B'
    elif LSAD == 04 :
        counties['LSAD_NUM'] == 'C'
    elif LSAD == 05 :
        counties['LSAD_NUM'] == 'D'
    elif LSAD == 06 :
        counties['LSAD_NUM'] == 'E'
    elif LSAD == 13 :
        counties['LSAD_NUM'] == 'F'
    elif LSAD == 15 :
        counties['LSAD_NUM'] == 'G'  
    elif LSAD == 25 :
        counties['LSAD_NUM'] == 'I'          
    else :
        counties['LSAD_NUM'] == 'NA'

本当に簡単なものなので、これらの形状を実際にティフに書き込むにはどうすればいいのかと思っています。私はそれが最良の選択肢であると信じていたので、Geopandasを使い始めましたが、フィオナの提案があれば、私もそれを受け入れます。

私はrasterioからコードを見つけました。これは形の良いジオメトリを取得して新しいラスターに書き込むことができるようですhttp://tinyurl.com/op49uek

# I guess that my goal should be to load my list of geometries under geometry to be able to pass it to rasterio later on
geometry = {'type':'Polygon','coordinates':[[(2,2),(2,4.25),(4.25,4.25),(4.25,2),(2,2)]]}

with rasterio.drivers():
    result = rasterize([geometry], out_shape=(rows, cols))
    with rasterio.open(
            "test.tif",
            'w',
            driver='GTiff',
            width=cols,
            height=rows,
            count=1,
            dtype=numpy.uint8,
            nodata=0,
            transform=IDENTITY,
            crs={'init': "EPSG:4326"}) as out:
                 out.write_band(1, result.astype(numpy.uint8))

答えはGDALrasterizeについてです。誰かがGeopandasとrasterioを使用して同じことをすることについてアイデアを持っているかどうかを正確に尋ねています。重複していません
User18981898198119

役立つ可能性のあるコードを見つけ、投稿を編集
User18981898198119

回答:


19

順調に進んでおり、ジオパンダのGeoDataFrameはフィオナでのラスタライズに適しています。Fionaは素晴らしいツールセットですが、DataFrameはネストされた辞書よりもシェープファイルやジオメトリに適していると思います。

import geopandas as gpd
import rasterio
from rasterio import features

ファイル名を設定する

shp_fn = 'cb_2013_us_county_20m.shp'
rst_fn = 'template_raster.tif'
out_fn = './rasterized.tif'

GeoPANDAS read_fileでファイルを開きます

counties = gpd.read_file(shp_fn)

(上記のコードのように)新しい列を追加します。

for i in range (len(counties)):
    LSAD = counties.at[i,'LSAD']
    if LSAD == 00 :
        counties['LSAD_NUM'] == 'A'
    elif LSAD == 03 :
        counties['LSAD_NUM'] == 'B'
    elif LSAD == 04 :
        counties['LSAD_NUM'] == 'C'
    elif LSAD == 05 :
        counties['LSAD_NUM'] == 'D'
    elif LSAD == 06 :
        counties['LSAD_NUM'] == 'E'
    elif LSAD == 13 :
        counties['LSAD_NUM'] == 'F'
    elif LSAD == 15 :
        counties['LSAD_NUM'] == 'G'  
    elif LSAD == 25 :
        counties['LSAD_NUM'] == 'I'          
    else :
        counties['LSAD_NUM'] == 'NA'

rasterioを使用してフィーチャを書き込むためのテンプレートとして使用するラスターファイルを開きます

rst = rasterio.open(rst_fn)

出力の入力ラスターからメタデータをコピーして更新する

meta = rst.meta.copy()
meta.update(compress='lzw')

次に、フィーチャをラスターに焼き付けて書き出します

with rasterio.open(out_fn, 'w+', **meta) as out:
    out_arr = out.read(1)

    # this is where we create a generator of geom, value pairs to use in rasterizing
    shapes = ((geom,value) for geom, value in zip(counties.geometry, counties.LSAD_NUM))

    burned = features.rasterize(shapes=shapes, fill=0, out=out_arr, transform=out.transform)
    out.write_band(1, burned)

全体的なアイデアは、(ジオメトリ、値)のタプルを含む反復可能オブジェクトを作成することです。ここで、ジオメトリは形状の良いジオメトリであり、値は、そのジオメトリの位置でラスターに焼き付けたいものです。FionaとGeoPANDASはどちらも形の良いジオメトリを使用しているので、あなたは幸運です。この例では、ジェネレータを使用して、GeoDataFrameから抽出され、zip()を使用して結合された(geometry、value)ペアを反復処理します。

out_fnファイルはw+読み取りと書き込みに使用する必要があるため、必ずモードで開いてください。


1

geocubeは、rasterioをラップするgeopandasデータをラスタライズするために特別に設計された新しいツールです。これにより、プロセスが簡略化され、テンプレートラスターが不要になります。

https://github.com/corteva/geocube

上記の例のコンテキストでは:

from geocube.api.core import make_geocube
import geopandas

counties = geopandas.read_file("zip://cb_2013_us_county_20m.zip/cb_2013_us_county_20m.shp")

文字は次のようにデータフレームに設定できます:

counties["LSAD_LETTER"] = 'NA'
lsad_letter = counties.LSAD_LETTER.copy()
lsad_letter[counties.LSAD=='00'] = 'A'
lsad_letter[counties.LSAD=='03'] = 'B'
lsad_letter[counties.LSAD=='04'] = 'C'
lsad_letter[counties.LSAD=='05'] = 'D'
lsad_letter[counties.LSAD=='06'] = 'E'
lsad_letter[counties.LSAD=='13'] = 'F'
lsad_letter[counties.LSAD=='15'] = 'G'
lsad_letter[counties.LSAD=='25'] = 'I'
counties["LSAD_LETTER"] = lsad_letter

ただし、ラスタライズできるのは数値のみです。これはカテゴリの例です:https : //corteva.github.io/geocube/stable/examples/categorical.html

したがって、それを使用する代わりに、文字列形式の数値を使用して整数に変換します。

counties["LSAD_NUM"] = counties.LSAD.astype(int)

次に、データをラスタライズします。

cube = make_geocube(
    counties,
    measurements=["LSAD_NUM"],
    resolution=(1, -1),
)

ここに画像の説明を入力してください

最後に、それをラスターにエクスポートします。

cube.LSAD_NUM.rio.to_raster("lsad_num.tif")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.