見出し画像

[Geopandas] ベクトルデータを一つのポリゴンにまとめて面積算出する

今回は、ベクトルデータを一つのポリゴンにまとめて面積算出します。
使用するデータは私が温泉が大好きなので「おんせん県おおいた」の市町村界のデータを用意し、市町村界データを一つのポリゴンにまとめて大分県の面積を算出しようと思います。

ベクトルデータを用意する

大分県の市町村界のデータ入手先は、e-Statと呼ばれる統計情報を扱うサイトで入手します。

上記のリンクから、大分県全域の世界測地系緯度経度のShapefileをダウンロードします。

ダウンロード一覧画面

一つのポリゴンにまとめる

複数のポリゴンの同じ属性情報から一つのポリゴンにまとめることをディゾルブといいます。大分県の面積を算出するためにディゾルブしてポリゴンを一つにします。主な流れは、ディゾルブしたい対象のカラムを決めて、ディゾルブする流れになります。

i) カラムを決める

ディゾルブするカラム名を決めていきましょう。
まず属性情報の一覧を確認します。

import geopandas as gpd
vector_path = '/content/drive/MyDrive/GIS_NOTE/data/r2ka44.shp'
vector = gpd.read_file(vector_path)
vector.head()
市町村界の属性情報(一部)

ディゾルブして大分県(全域)を表現できるならどのカラムでもいいのですが、今回はPREFを使用していきます(画像の赤線)😁

ii) ディゾルブする

カラムを決めたらディゾルブしてみましょう!
ディゾルブは、

dissolve = vector.dissolve(by = 'PREF', as_index = False)

で簡単に実行できます。今回ディゾルブするときにまとめた値をindexに割り当てないようにas_index = False にしています(デフォルトはTrue)。注意点はdissolveメソッドを実行しても演算結果を置き換えてくれないため、別の変数を用意する必要があります(同じ変数でもあり)。

形状を確認する

ディゾルブ処理が完了したら形状を確認します。

ディゾルブ前後のベクトルデータ形状

すこし分かりづらいですが、市町村ごとに分かれているポリゴンデータがきちんとディゾルブされて一つになっていることが確認できます。

面積算出に必要なCRSを確認・変更する

きちんとした面積を算出するためにCRSを確認していきましょう!
CRSとは空間参照系と呼ばれるもので、今回使用しているベクトルデータのCRSは、

dissolve.crs

で確認できます。結果は、

ベクトルデータのCRS

で画像の通りEPSG: 4326でした。EPSG: 4326は地理座標系(緯度・経度)であり、正しく面積を算出することができません。そのため、メートルが単位である座標系に変換する必要があります。今回、変換に使用する座標系はUTM座標系を使用します。今回の記事ではEPSGやUTM座標系の詳しい説明は省略します。

では、大分県のUTM座標系を調べていきましょう。

平面直角座標系とUTM座標系の対象地域(esriより引用)

上図から大分県の位置は赤文字2番あたりなため、UTM座標系は52系であることがわかります。そのためEPSGで表現すると32652になり、地理座標系をUTM座標系に変換することができます。

dissolve = dissolve.to_crs(epsg=32652)
ディゾルブ直後のCRS

面積を算出する

CRSの変換処理できたら面積を算出していきます。
面積算出は、

dissolve.area

で算出でき、結果は、

面積算出結果(m^2)

となります。.area属性で算出した面積の単位は平方メートル(m^2)のため、すこし見づらいですね😅 そのため平方キロメートル(km^2)で算出します。

やり方は.area属性で算出した面積に10^6を割ってあげたら出ます😁
結果は、

dissolve.area / pow(10, 6)
面積算出結果(km^2)

で、きちんと算出されてますね😊
実際の資料と比べてみますと、

H28 総面積(大分のホームページより引用)
https://www.pref.oita.jp/uploaded/attachment/1043135.pdf

で概ね同じですね。

まとめ

今回はベクトルデータを使用してディゾル・面積算出を行いました\(^^)/ dissolveメソッドの引数を設定すると統計的な処理も可能ですので、興味のある方は試してみてください。面積算出する際に座標系を考える所が少々難しいですね💦 追々、座標系について記事を書こうと思います。ここまで読んでいただきありがとうございました😊

この記事が気に入ったらサポートをしてみませんか?