import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
# データベースファイルのパス
DB_PATH = "weather_verification(削除禁止).db"
# 出力する画像ファイル名
OUTPUT_IMAGE = "gpv_reference_map.png"
def generate_reference_map():
print("データベースから座標データを読み込んでいます...")
try:
conn = sqlite3.connect(DB_PATH)
df = pd.read_sql_query("SELECT PointID, Lon, Lat FROM GPV_Points", conn)
conn.close()
except Exception as e:
print(f"DB読み込みエラー: {e}")
return
if df.empty:
print("エラー: GPV_Points テーブルにデータがありません。先に本システムでGRIB2の抽出を行ってください。")
return
print(f"計 {len(df)} 地点の座標をプロットします...")
# ★超高解像度&巨大サイズに設定 (ズーム閲覧専用)
# figsizeを大きくし、dpiを維持することで巨大な画像(数万ピクセル)を生成します
fig, ax = plt.subplots(figsize=(40, 40), dpi=300)
# 描画範囲(少し余白を持たせる)
ax.set_xlim(df['Lon'].min() - 0.02, df['Lon'].max() + 0.02)
ax.set_ylim(df['Lat'].min() - 0.02, df['Lat'].max() + 0.02)
try:
import contextily as cx
print("詳細な背景地図データをダウンロードしています... (数分かかる場合があります)")
# ★zoom=14 を指定し、市街地の道路や区画がハッキリ見えるレベルの詳細地図を取得
cx.add_basemap(ax, crs="EPSG:4326", source=cx.providers.OpenStreetMap.Mapnik, zoom=14, alpha=1.0)
print("背景地図の取得に成功しました。")
except Exception as e:
print(f"背景地図の取得エラー: {e}")
# ★点を極小サイズ(s=10)にし、半透明(alpha=0.8)にして地図を隠さないようにする
ax.scatter(df['Lon'], df['Lat'], c='red', s=10, alpha=0.8, edgecolors='none', zorder=5)
for _, row in df.iterrows():
# ★フォントを小さく(fontsize=6)、背景の白枠を半透明(alpha=0.5)にする
ax.text(row['Lon'] + 0.0008, row['Lat'] + 0.0008, str(int(row['PointID'])),
fontsize=6, fontweight='bold', color='navy',
bbox=dict(facecolor='white', alpha=0.5, edgecolor='none', pad=0.3))
# グリッド線も細く薄く
ax.grid(True, linestyle='-', linewidth=0.5, alpha=0.3)
ax.set_title("GPV Coordinates Reference Map (High Detail Zoom Ver.)", fontsize=50, pad=20)
plt.tight_layout()
print("巨大な画像をファイルに書き出しています。しばらくお待ちください...")
# 保存処理(画像が巨大なため、PCのスペックによってはここで数十秒止まったように見えます)
plt.savefig(OUTPUT_IMAGE, bbox_inches='tight')
print(f"✅ 画像の生成が完了しました! '{OUTPUT_IMAGE}' を画像ビューアで開き、拡大して確認してください。")
if __name__ == "__main__":
generate_reference_map()