未分類

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()