はじめに
友人たちとの新宿集まりが千葉県民には遠い...
そこで、鉄道データの解析に着手しました。国土地理院のオープンデータを活用し、全員の最寄駅から等距離の駅を探すために、GeoPandasの学習を進めています。
現在、中間駅の最適な算出方法はまだ見つかっていませんが、しばらく時間が取れなくなりそうなので一旦途中経過を共有させていただきます。
また、紹介するコードは以下のサイトを参考にさせていただきました。
本記事からわかること
- gisデータの簡単な扱い方がわかる
- 駅と路線を日本地図上に描画することができる。
環境
- google colab
今回使ったデータ
ライブラリインストール
!pip install -U japanmap
インポート
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Point, Polygon
from japanmap import pref_names, get_data, pref_points
shpファイルを読み込む
あらかじめ、国土交通省の鉄道データをダウンロードしてください。
国土交通省の鉄道データをどこに配置するかや各ファイルをどのように管理するかはお任せします。
root_dir_path = {YOUR_DEVELOPEMENT_PATH}
# 入力ファイル
# 対象のshpファイルはエンコードがshiftjisの物を使用
LINESECTION_PATH = f"{root_dir_path}/linesection_geodata_shiftjis/N02-22_RailroadSection.shp"
STATION_PATH = f"{root_dir_path}/station_geodata_shiftjis/N02-22_Station.shp"
# shpファイル読込
gdf_linesection = gpd.read_file(LINESECTION_PATH, encoding="cp932")
gdf_station = gpd.read_file(STATION_PATH, encoding="cp932")
取得したデータはこんな感じ
- 路線データ
gdf_linesection.head()
- 駅データ
gdf_station.head()
路線データのプロット
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
pref_poly = [Polygon(points) for points in pref_points(get_data())]
gdf_pref = gpd.GeoDataFrame(crs = 'epsg:4612', geometry=pref_poly)
gdf_pref['prefecture'] = pref_names[1:]
gdf_pref.plot(ax = ax, color = 'gray')
gdf_linesection_trans = gdf_linesection[["N02_001", "N02_003", "geometry"]]
gdf_linesection_trans = gdf_linesection_trans.rename(columns={"N02_001": "路線コード", "N02_003": "路線名"})
gdf_linesection_trans.plot(ax = ax, color = 'blue')
駅データのプロット
fig, ax = plt.subplots(1, 1, figsize=(8, 8))
pref_poly = [Polygon(points) for points in pref_points(get_data())]
gdf_pref = gpd.GeoDataFrame(crs = 'epsg:4612', geometry=pref_poly)
gdf_pref['prefecture'] = pref_names[1:]
gdf_pref.plot(ax = ax, color = 'gray')
gdf_station_trans = gdf_station[["N02_005", "N02_005g", "geometry"]]
gdf_station_trans = gdf_station_trans.rename(columns={"N02_005": "駅名", "N02_005g": "駅コード"})
gdf_station_trans.plot(ax = ax, color = 'blue')
まとめ
参考サイトをもとにとりあえずデータを日本地図にプロットするところまではできました。
目標である、等距離の中間駅を算出するために全ての駅間の距離を算出できたらいいなと思ったんですが、なかなか手こずっています。
案としては、路線が通る座標から隣接する2駅の座標を特定し、その2駅間の座標から距離を算出。。。とかできたらいいなとは思っています。
今後進捗があれば更新します。