この記事では、国土交通省が提供する「国土数値情報」を基に、駅名とその座標(緯度・経度)を抽出してCSVファイルを作成するPythonコードを紹介します。このCSVファイルは、地図データやAPI連携などで役立つデータセットとして活用できます。
駅データのダウンロード
まず、データの取得元となる「国土数値情報」の公式サイトにアクセスしてください。
手順:
- ページ内の「N05-20_GML.zip」リンクをクリックしてダウンロードします。
- ZIPファイルを解凍します。
- 解凍後に現れる
N02-20_Station.geojson
ファイルを使用します。このファイルには全国の駅データが含まれています。
必要なライブラリのインストール
今回のスクリプトは、地理空間データを処理するための GeoPandas とデータ操作用の Pandas を使用します。以下のコマンドでこれらのライブラリをインストールしてください。
pip install geopandas pandas
Pythonコード:駅名と座標の抽出
以下は、ダウンロードした N02-20_Station.geojson
を基に駅名とその緯度・経度を抽出し、CSV形式で保存するコードです。
import geopandas as gpd
import pandas as pd
def extract_station_data(input_file, output_csv):
"""
駅データから駅名と緯度経度を抽出してCSVに保存する関数
"""
# GeoJSONファイルを読み込む
gdf = gpd.read_file(input_file)
# 利用可能な列名とジオメトリタイプを確認
print("利用可能な列名:", gdf.columns)
print("ジオメトリタイプ:", gdf.geometry.geom_type.value_counts())
extracted_data = []
for _, row in gdf.iterrows():
if row.geometry.geom_type == "Point":
# Point型の場合は緯度経度を直接取得
station_name = row["N02_005"]
lon, lat = row.geometry.x, row.geometry.y
extracted_data.append({"station_name": station_name, "latitude": lat, "longitude": lon})
elif row.geometry.geom_type == "MultiLineString":
# MultiLineString型の場合は重心を使用
centroid = row.geometry.centroid
station_name = row["N02_005"]
lon, lat = centroid.x, centroid.y
extracted_data.append({"station_name": station_name, "latitude": lat, "longitude": lon})
else:
# サポートされていないジオメトリタイプを表示
print(f"Unsupported geometry type: {row.geometry.geom_type}")
# PandasデータフレームとしてCSVファイルに保存
df = pd.DataFrame(extracted_data)
df.to_csv(output_csv, index=False, encoding="utf-8-sig")
print(f"CSVファイルにデータを保存しました: {output_csv}")
# 入力ファイル(GeoJSON)と出力先(CSV)の指定
input_file = "N02-20_Station.geojson"
output_csv = "station_data.csv"
# 関数を実行
extract_station_data(input_file, output_csv)
コードの解説
このコードでは、以下のステップを実行しています:
- GeoJSONデータの読み込み
GeoPandasを使ってN02-20_Station.geojson
ファイルを読み込みます。 - 駅名と座標の抽出
- ジオメトリが
Point
型の場合、緯度と経度を直接取得します。 MultiLineString
型の場合は重心(centroid)を計算し、緯度経度を取得します。
- ジオメトリが
- CSV形式で保存
抽出したデータを Pandas の DataFrame に変換し、UTF-8形式で保存します。
出力されるCSVの例
生成されたCSVファイルの内容は次のようになります。
station_name,latitude,longitude
天王寺,34.64675,135.51562
新大阪,34.73028,135.49825
大阪,34.70249,135.50017
修正点と注意事項
このコードは多くのケースで正常に動作しますが、以下の点に留意してください。
- ジオメトリのタイプ
サポートされていないジオメトリタイプが含まれている場合、そのデータはスキップされます。必要に応じて他のジオメトリ型の処理を追加してください。 - カラム名の確認
国土数値情報のデータ構造は将来的に変更される可能性があります。N02_005
以外のカラムが駅名を保持する場合に備え、コード実行時に列名を確認することをおすすめします。 - データの正確性
MultiLineString
型の重心を使用する場合、駅の正確な位置を示さない可能性があります。この場合、追加のデータ確認が必要です。
実行後の確認
コードを実行すると、以下のようなメッセージが表示されます。
利用可能な列名: Index(['N02_001', 'N02_002', 'N02_003', 'N02_004', 'N02_005', 'geometry'], dtype='object')
ジオメトリタイプ:
Point 1000
MultiLineString 500
dtype: int64
CSVファイルにデータを保存しました: station_data.csv
これにより、データが正しく処理されたことが確認できます。
このコードの利点
手動でデータを処理する手間を省き、数千件の駅情報を効率的に整理できます。また、このCSVデータは後述する「駅名を基にXYZ座標を算出しAPIを実行するコード」と連携させることで、地図データのさらなる活用が可能になります。
ぜひ、データの活用効率を向上させるためにお試しください!
コメント