地図や地理データを扱うとき、「XYZ座標」の取得に苦労したことはありませんか?特に地図タイルを扱う際には、指定した経度緯度をXYZ形式に変換する必要があります。しかし、この変換は手間がかかり、エラーが発生しやすいものです。
今回の記事では、駅名を入力するだけでXYZ座標を計算し、その座標を使ってAPIを実行するPythonプログラムをご紹介します。手作業の煩わしさを解消し、スムーズな地図データ取得を実現するこのツールを、ぜひ試してみてください!
背景:なぜXYZ座標が必要なのか?
地図データを扱うとき、Google MapsやOpenStreetMapなどで使われる「タイル座標」形式があります。この形式では、地球全体を一定のズームレベルで分割したタイルにデータを載せています。この座標を指定することで、APIから必要な範囲の地図や地理情報を取得することができます。
しかし、タイル座標は経度緯度とは異なるため、独自の変換が必要です。この変換作業を効率化するために作成したのが、今回ご紹介するPythonプログラムです。
プログラムの特徴
- 駅名を入力するだけ
利用者は駅名を入力するだけで、対応する経度緯度をもとにXYZ座標を計算します。 - APIリクエストを簡略化
XYZ座標を手作業で入力する必要がなく、スムーズに地図データを取得できます。 - エラーを防ぐ設計
正確な座標変換に基づき、誤ったデータ入力による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座標確認を自動化し、エラーリスクを軽減するだけでなく、業務の効率化にもつながります。ぜひ、皆さんも活用してみてください!
もしこの記事が役に立ったら、シェアやコメントをお待ちしています。次回はさらに応用的な地理データの活用方法をご紹介しますので、お楽しみに!
コメント