本日はgeopandasについて書いてみようと思います。geopandasについては以下のエントリーでも紹介しているのですが、今回はShapeファイルの読込・作成、GeoDataFrameの扱い方まで、一通りの使い方を紹介できればと思っています。
geopandasとは
geopandasはpandasの拡張で、地理データを含むデータをpandasのように表形式で扱うことができるGIS系のPythonライブラリです。
pandasについては以下エントリーでも紹介していますので、ぜひ読んでみてください。
環境
Windows10
Python2.7.4
Jupyter notebook
サンプルデータ
以下エントリーで使用した日本地図を使用します。
www.gis-py.com
サンプルコード
Shapeファイル読込
import geopandas as gpd fp = r"D:\gis-py\library\geopandas\data\japan_ver80.shp" data = gpd.read_file(fp)
これでOKです。それでは”data”のデータタイプを確認してみようと思います。
type(data)
GeoDataFrameというデータタイプですね。pandasにDataFrame というデータタイプがあるのですが、それプラス地理データが格納されているものをGeoDataFrameと認識していただいて大丈夫だと思います。
.head()を使用することでGeoDataFrameの最初の5行を取得することができます。
data.head()
こんな風にやっても同じ結果になります。
data[0:5]
また、カラム指定してデータを取得することもできます。
data['geometry'].head()
.plot() を使用することで読み込んだShapeを視覚化することができます。
data.plot();
.crsを使用することで読み込んだShapeの座標系などを確認することができます。
data.crs
Shapeファイル作成
.to_file()でShapeファイルの作成ができます。
out = r"D:\gis-py\library\geopandas\data\japan_ver80_2.shp" selection = data[0:50] selection.to_file(out)
日本地図の最初の50レコードを別のShapeファイルとして作成しました。
fp_50 = r"D:\gis-py\library\geopandas\data\japan_ver80_2.shp"
data_50 = gpd.read_file(fp_50)
data_50.plot();
GeoDataFrameの扱い方
GeoDataFrameをループさせる場合はこのようにします。最初の5行を抽出して、それをループさせてみました。
selection = data[0:5] for index, row in selection.iterrows(): poly_area = row['geometry'].area print("Polygon area at index {0} is: {1:.3f}".format(index, poly_area))
新しいカラムを追加場合はこのようにします。
data['area'] = None
5行目までを確認してみました。
新しく作ったカラムにデータを格納します。geometryカラムのareaの値をareaカラムに格納します。
for index, row in data.iterrows(): data.loc[index, 'area'] = row['geometry'].area
指定したカラムの最大値、最大値を取得することができます。
max_area = data['area'].max() min_area = data['area'].mean() print("Max area: %s\nMin area: %s" % (round(max_area, 2), round(min_area, 2)))
ジオメトリをGeoDataFrameに対して作ってみる
shapelyとfionaを使用します。geopandas扱う上で非常に重要なライブラリです。これらに関しては以下エントリーで紹介していますので、ぜひ読んでみてください。
空のGeoDataFrameを作る場合は、以下のようにします。
import pandas as pd import geopandas as gpd from shapely.geometry import Point, Polygon import fiona newdata = gpd.GeoDataFrame()
geometryカラムを作成してみます。
newdata['geometry'] = None
Shapelyを使用してポリゴンを作成します。
coordinates = [(24.950899, 60.169158), (24.953492, 60.169158), (24.953510, 60.170104), (24.950958, 60.169990)] poly = Polygon(coordinates) poly
作成したポリゴンをgeometryカラムに格納します。
newdata.loc[0, 'geometry'] = poly
Fionaを使用して測地系の設定を行います。
from fiona.crs import from_epsg newdata.crs = from_epsg(6668) newdata.crs
Shapeファイルを作成します。
outfp = r"D:\gis-py\library\geopandas\data\test.shp"
newdata.to_file(outfp)
いかがでしたでしょうか?これ一つで大抵のことはできてしまう超便利ライブラリです。GISとPythonを使用される方は必修といっても過言ではないかもしれません。今後はgeopandasの応用について書ければと思っています。皆さんもぜひ使ってみてください。