GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

geopandasの使い方をマスターしよう ~Shapeファイルの読込・作成、GeoDataFrameの扱い方まで~

本日はgeopandasについて書いてみようと思います。geopandasについては以下のエントリーでも紹介しているのですが、今回はShapeファイルの読込・作成、GeoDataFrameの扱い方まで、一通りの使い方を紹介できればと思っています。

www.gis-py.com

www.gis-py.com

geopandasとは

geopandasはpandasの拡張で、地理データを含むデータをpandasのように表形式で扱うことができるGIS系のPythonライブラリです。

pandasについては以下エントリーでも紹介していますので、ぜひ読んでみてください。

www.gis-py.com

環境

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)


f:id:sanvarie:20181101153703p:plain

GeoDataFrameというデータタイプですね。pandasにDataFrame というデータタイプがあるのですが、それプラス地理データが格納されているものをGeoDataFrameと認識していただいて大丈夫だと思います。

.head()を使用することでGeoDataFrameの最初の5行を取得することができます。

data.head()


f:id:sanvarie:20181101153955p:plain

こんな風にやっても同じ結果になります。

data[0:5]

また、カラム指定してデータを取得することもできます。

data['geometry'].head()


f:id:sanvarie:20181101155250p:plain

.plot() を使用することで読み込んだShapeを視覚化することができます。

data.plot();

f:id:sanvarie:20181101154134p:plain

.crsを使用することで読み込んだShapeの座標系などを確認することができます。

data.crs


f:id:sanvarie:20181101154306p:plain

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();


f:id:sanvarie:20181101154844p:plain

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))


f:id:sanvarie:20181101155712p:plain

新しいカラムを追加場合はこのようにします。

data['area'] = None


5行目までを確認してみました。
f:id:sanvarie:20181101155918p:plain

新しく作ったカラムにデータを格納します。geometryカラムのareaの値をareaカラムに格納します。

for index, row in data.iterrows():
    data.loc[index, 'area'] = row['geometry'].area


f:id:sanvarie:20181101160141p:plain

指定したカラムの最大値、最大値を取得することができます。

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)))


f:id:sanvarie:20181101160357p:plain

ジオメトリをGeoDataFrameに対して作ってみる

shapelyとfionaを使用します。geopandas扱う上で非常に重要なライブラリです。これらに関しては以下エントリーで紹介していますので、ぜひ読んでみてください。

www.gis-py.com

www.gis-py.com


空のGeoDataFrameを作る場合は、以下のようにします。

import pandas as pd
import geopandas as gpd
from shapely.geometry import Point, Polygon
import fiona

newdata = gpd.GeoDataFrame()

f:id:sanvarie:20181101160740p:plain


geometryカラムを作成してみます。

newdata['geometry'] = None


f:id:sanvarie:20181101161014p:plain


Shapelyを使用してポリゴンを作成します。

coordinates = [(24.950899, 60.169158), (24.953492, 60.169158), (24.953510, 60.170104), (24.950958, 60.169990)]
poly = Polygon(coordinates)
poly

f:id:sanvarie:20181101161155p:plain

作成したポリゴンをgeometryカラムに格納します。

newdata.loc[0, 'geometry'] = poly

f:id:sanvarie:20181101161257p:plain


Fionaを使用して測地系の設定を行います。

from fiona.crs import from_epsg
newdata.crs = from_epsg(6668)
newdata.crs

f:id:sanvarie:20181101161537p:plain

Shapeファイルを作成します。

outfp = r"D:\gis-py\library\geopandas\data\test.shp"
newdata.to_file(outfp)

f:id:sanvarie:20181101161842p:plain

いかがでしたでしょうか?これ一つで大抵のことはできてしまう超便利ライブラリです。GISとPythonを使用される方は必修といっても過言ではないかもしれません。今後はgeopandasの応用について書ければと思っています。皆さんもぜひ使ってみてください。