【不動産情報ライブラリAPI】国土交通省のデータから駅名と座標を抽出し、CSVファイルを作成する方法

Python
Österreich, Oberösterreich, Linz, Wels . Schienen einer Eisenbahn von einem fahrenden Zug zwischen Linz und Wels aus gesehen

この記事では、国土交通省が提供する「国土数値情報」を基に、駅名とその座標(緯度・経度)を抽出してCSVファイルを作成するPythonコードを紹介します。このCSVファイルは、地図データやAPI連携などで役立つデータセットとして活用できます。

駅データのダウンロード

まず、データの取得元となる「国土数値情報」の公式サイトにアクセスしてください。

国土数値情報ダウンロードページ (N05)

手順:

  1. ページ内の「N05-20_GML.zip」リンクをクリックしてダウンロードします。
  2. ZIPファイルを解凍します。
  3. 解凍後に現れる 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)

コードの解説

このコードでは、以下のステップを実行しています:

  1. GeoJSONデータの読み込み
    GeoPandasを使って N02-20_Station.geojson ファイルを読み込みます。
  2. 駅名と座標の抽出
    • ジオメトリが Point 型の場合、緯度と経度を直接取得します。
    • MultiLineString 型の場合は重心(centroid)を計算し、緯度経度を取得します。
  3. CSV形式で保存
    抽出したデータを Pandas の DataFrame に変換し、UTF-8形式で保存します。

出力されるCSVの例

生成されたCSVファイルの内容は次のようになります。

station_name,latitude,longitude
天王寺,34.64675,135.51562
新大阪,34.73028,135.49825
大阪,34.70249,135.50017

修正点と注意事項

このコードは多くのケースで正常に動作しますが、以下の点に留意してください。

  1. ジオメトリのタイプ
    サポートされていないジオメトリタイプが含まれている場合、そのデータはスキップされます。必要に応じて他のジオメトリ型の処理を追加してください。
  2. カラム名の確認
    国土数値情報のデータ構造は将来的に変更される可能性があります。N02_005 以外のカラムが駅名を保持する場合に備え、コード実行時に列名を確認することをおすすめします。
  3. データの正確性
    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を実行するコード」と連携させることで、地図データのさらなる活用が可能になります。

ぜひ、データの活用効率を向上させるためにお試しください!

コメント

タイトルとURLをコピーしました