この記事について
仕事で GIS データを扱うことになったので、基本から学ぶことにしました。
以下の講座を受けながら、緯度・経度を持つCSVをGeoDataFrameに変換する方法をメモ。
※この記事のデータは講座で出てくるものとは違うものを使います。
やりかた
準備 - 緯度・経度を持つCSVを用意する
今回は東京都のオープンデータで、多摩市のスポーツ施設の一覧を使います。
データは以下のように、緯度と経度の情報が入ってはいるものの、geojson
などの形式になっていないただのCSVです。
以下のサイトでデータの内容を参照できます。
⬆️にもリンクがありますが、以下のリンクから CSV をダウンロードできます。
csvを任意のフォルダに置いた状態で、以下に進みます。
Step1. CSVを普通の pandas の DataFrame として読み込む
まず、CSVを普通の pandas の DataFrame として読み込みます。
# 普通の pandas の DataFrame として読み込む
path = './132241_tama_sportsfacilities.csv'
df = pd.read_csv(path)
path
の指定は、適宜変更してください。
今回の多摩市のデータは、カラム数がやたら多い(23行、122列)ので、必要に応じてほしい列だけに絞ります。
# ほしい列だけを取り出す
wanted_cols = "ID 名称 緯度 経度 電話番号 利用可能曜日".split()
df = df[wanted_cols]
Step2. 緯度と経度の列を geometry 列として定義する
現時点では、緯度と経度の情報は名前こそ緯度・経度であるものの、データ型としては numpy の float 型として入っています。
以下の記事で記載したとおり、GeoPandasには アクティブなジオメトリ列 の定義が必要です。
なので緯度・経度情報を、ジオメトリ型に変換しつつ、アクティブなジオメトリ列 として使えるように準備する必要があります。
以下のコードで、緯度と経度をまとめて GeometryArray
にすることができます。
# geometry として使う列を定義する
geometry_cols = gpd.points_from_xy(df['経度'], df['緯度'])
Step3. もとの DataFrame に geometry 列を合わせて GeoDataFrame を作る
以下のコードで、今作った geometry 列用の GeometryArray
をもとの df
に足して、GeoDataFrame を作ることができます。
# もとの df に geometry 列を足して GeoDataFrame を作る
gdf = gpd.GeoDataFrame(df, geometry=geometry_cols)
gdf
を表示すると、以下のように、緯度経度を Point
として持つ geometry
列が、もとの df
のうしろにくっついた形になっていることがわかります。
おまけ
上記の gdf
を geojson として保存することは、以下のコードで可能なのですが、今のままだとcrsの情報がないと怒られます。
outpath = './tama.geojson'
gdf.to_file(outpath, driver='GeoJSON', encoding='shift-jis')
たぶんcrsの情報を別途定義する方法があるのだろうと思いますが、そちらはわかり次第(必要になり次第)まとめたいと思います。