Met Post

Python、プログラミングのメモ、気象、海洋のこととか

GeoPandasで国土数値情報を加工してみた1

地理情報データをPandasで扱うための拡張ライブラリgeopandasを利用して国土数値情報データを加工してみた。

国土数値情報データのダウンロードページの土地利用区分の3次メッシュデータを利用する。このデータには各メッシュにおける土地利用区分毎の面積がデータとして格納されている。 今回は、このデータを加工して各メッシュで最も利用面積の大きな利用区分を求めたデータを作成してみる。また、国土数値情報のファイルは1次メッシュ毎にファイル分割されていて県別になっていないため、神奈川県に含まれるメッシュのみ抽出してみた。

まずは、データの読み込みを行う。

# 処理したいshapeファイルのリスト
shpfiles = [shpfile for shpfile in glob.glob('./*/*jgd*/*.shp')]

# shapeファイルを読み込んで結合させる
df = pd.concat([gpd.read_file(shpfile, encoding='shift-jis') for shpfile in shpfiles])

# 後の処理のため3次メッシュを明示的に整数にしておく
df['メッシュ'] = df['メッシュ'].apply(int)

読み込んだDataFrameには、shapeファイルのshapeデータ(polygon、pointなど)と対応する属性が格納されている。

f:id:ttmych:20170419222451p:plain

総務省統計局のホームページ で公開されている、都道府県毎の3次メッシュコードのcsvファイルを利用して、神奈川県に該当するメッシュのみ取り出してみる。

# 神奈川県のメッシュコード一覧を読み込み
df_city = pd.read_csv('csv/city-mesh_14.csv', encoding='shift-jis', 
                       dtype={'基準メッシュコード': np.int64})

# 3次メッシュコードが一覧に含まれるレコードのみ抽出
df = df[df['メッシュ'].isin(df_city['基準メッシュコード'].tolist())]

各メッシュ毎に最大面積をもつ利用区分を求める。利用区分名が列名になっているので行ごとに処理する。 その他の列は不要なので、3次メッシュコード、土地利用区の列を取り出す。

cols = [e for e in df.columns.tolist() if e not in ['geometry', 'メッシュ']]
df['landtype'] = df[cols].apply(lambda x: x.argmax(), axis=1)

df = df[['メッシュ','landtype','geometry']]

最後にDataFrameをshapeファイル形式で出力する。dbfファイル、shxファイルも同時に出力される。

df.to_file('土地利用区分.shp', driver='ESRI Shapefile', encoding='shift-jis')

出力したshapeファイルをQISで表示すると以下のようになる。 f:id:ttmych:20170419224008p:plain:w600

QGISguiから編集・加工できるが、pythonで加工できるようにしておくとまとめて加工するときはスクリプトで自動化できて便利だと思う。Pandasベースなので統計処理とかも応用ができるしいろいろ試していきたい。