【不動産情報ライブラリAPI】駅名を入力するだけでXYZ座標を自動変換!地図APIを簡単に活用するPythonプログラム

Python

地図や地理データを扱うとき、「XYZ座標」の取得に苦労したことはありませんか?特に地図タイルを扱う際には、指定した経度緯度をXYZ形式に変換する必要があります。しかし、この変換は手間がかかり、エラーが発生しやすいものです。

今回の記事では、駅名を入力するだけでXYZ座標を計算し、その座標を使ってAPIを実行するPythonプログラムをご紹介します。手作業の煩わしさを解消し、スムーズな地図データ取得を実現するこのツールを、ぜひ試してみてください!

背景:なぜXYZ座標が必要なのか?

地図データを扱うとき、Google MapsやOpenStreetMapなどで使われる「タイル座標」形式があります。この形式では、地球全体を一定のズームレベルで分割したタイルにデータを載せています。この座標を指定することで、APIから必要な範囲の地図や地理情報を取得することができます。

しかし、タイル座標は経度緯度とは異なるため、独自の変換が必要です。この変換作業を効率化するために作成したのが、今回ご紹介するPythonプログラムです。

プログラムの特徴

  1. 駅名を入力するだけ
    利用者は駅名を入力するだけで、対応する経度緯度をもとにXYZ座標を計算します。
  2. APIリクエストを簡略化
    XYZ座標を手作業で入力する必要がなく、スムーズに地図データを取得できます。
  3. エラーを防ぐ設計
    正確な座標変換に基づき、誤ったデータ入力によるAPIエラーを防ぎます。

プログラムのコード

以下が今回ご紹介するPythonコードです。このコードは、事前に用意された駅名と座標のCSVデータを読み込むことで、駅名からXYZ座標を計算し、指定したAPIを呼び出します。

import pandas as pd
from pyproj import Transformer
import math
import requests

# 駅名から対応するXYZ座標を計算する関数
def lonlat_to_xyz(lon, lat, z=15):
    """
    経度・緯度をXYZタイル座標に変換
    """
    transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857")  # WGS84 -> Web Mercator
    x_mercator, y_mercator = transformer.transform(lat, lon)
    
    # タイルの解像度 (Web Mercator の全体サイズを 256px * 2^z タイルで分割)
    tile_size = 256
    initial_resolution = 40075016.68557849 / tile_size  # 地球周囲長 / 初期タイルサイズ
    resolution = initial_resolution / (2**z)
    
    # XYZタイル座標の計算
    x_tile = int((x_mercator + 20037508.342789244) / (tile_size * resolution))
    y_tile = int((20037508.342789244 - y_mercator) / (tile_size * resolution))
    
    return x_tile, y_tile, z

# 駅名を基にAPIを実行する関数
def execute_api(station_name, csv_file):
    """
    駅名を基にXYZ座標を計算し、APIを実行
    """
    # 駅データの読み込み
    df = pd.read_csv(csv_file)
    
    # 駅名で検索
    station_row = df[df["station_name"] == station_name]
    if station_row.empty:
        raise ValueError(f"駅名 '{station_name}' はデータベースに存在しません。")
    
    # 経度・緯度の取得
    lon = station_row["longitude"].values[0]
    lat = station_row["latitude"].values[0]
    
    # XYZ座標を計算
    x, y, z = lonlat_to_xyz(lon, lat)
    
    # APIリクエストの設定
    API_KEY = '****'  # APIキーを設定してください
    url = 'https://www.reinfolib.mlit.go.jp/ex-api/external/XKT013?'
    headers = {"Ocp-Apim-Subscription-Key": API_KEY}
    params = {
        'response_format': 'geojson',
        'z': z,
        'x': x,
        'y': y
    }
    
    # APIリクエスト
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        raise RuntimeError(f"APIリクエスト失敗: {response.status_code}, {response.text}")

# プログラムの実行例
if __name__ == "__main__":
    station_name = "天王寺"  # 駅名を指定
    csv_file = "station_data.csv"  # 駅データのCSVファイル
    try:
        geojson_data = execute_api(station_name, csv_file)
        print("API実行成功!取得データ:")
        print(geojson_data)
    except Exception as e:
        print(f"エラー: {e}")

使い方

1.CSVデータを準備
駅名、経度、緯度を含むCSVファイルを用意します。以下は、station_data.csv の例です。CSVデータの作成方法は別記事で紹介しています。

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

2.コードを実行
上記のコードをPython環境で実行します。駅名を入力し、APIリクエストの結果が表示されることを確認してください。

まとめ

今回のプログラムは、地図データ取得の効率化を目指して設計されました。手作業でのXYZ座標確認を自動化し、エラーリスクを軽減するだけでなく、業務の効率化にもつながります。ぜひ、皆さんも活用してみてください!

もしこの記事が役に立ったら、シェアやコメントをお待ちしています。次回はさらに応用的な地理データの活用方法をご紹介しますので、お楽しみに!

コメント

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