GeoCore更新例 — jgd2024b補正に新しい地震(2025年青森県東方沖)を追加する


GeoCore更新例 — jgd2024b補正に新しい地震(2025年青森県東方沖)を追加する

GeoCoreのjgd2024b補正に新しい地震を追加する

GeoConverterPro / GeoPrismJP が共有する座標変換エンジン GeoCore には、地震による急激な地殻変動を補正する jgd2024b 補正(JGD2024 → jgd2024b、PatchJGD相当)が組み込まれています。新しい地震の座標補正パラメータが国土地理院から公開されたとき、GeoCore にどう取り込むのか——実際に行った 「令和7年(2025年)青森県東方沖の地震」の追加作業を例に、設計と手順を技術的にまとめます。

本記事はエンジン内部の更新手順を扱う開発メモです。一般的な PatchJGD・地殻変動補正の考え方は、関連記事のほうがわかりやすいかもしれません。


何を追加したのか

jgd2024b 補正はこれまで日向灘地震(2024)までの地震に対応していました。今回、その後に国土地理院が公開した1件を追加します。

項目 内容
地震名 令和7年(2025年)青森県東方沖の地震
発生日 2025年12月8日
パラメータ公表日 2026年2月5日
ファイル aomori2025_BL.par(PatchJGD用 座標補正パラメータ Ver.1.0.0)
データレコード数 8,523
メッシュ範囲 6040458062412000(青森県域・北緯約40〜41度)
補正量 dB(緯度秒)−0.00100〜+0.00050 / dL(経度秒)0.00000〜+0.00400(cmオーダー)
文字コード Shift_JIS、改行 CRLF

地殻変動によるズレの可視化イメージ

jgd2024c(セミダイナミック補正)/ jgd2024d(pos2jgd 定常時補正)は別系統の定常補正で、今回の対象外です。標高補正版(*_h.par)も水平座標補正には不要のため対象外としました。


設計のキモ:ループ範囲のハードコードを持たない

このエンジンの更新が軽く済むのは、補正適用ロジックが地震の件数をハードコードしていないためです。

GeoCore の補正データは SQLite(jgdMerge2024.db)に格納され、地震ごとに year_no で区別されています。

GeoCoreの座標補正データベース

year_no 地震
0 熊本地震
1 令和6年能登半島地震(本体+補完をマージ)
3 日向灘地震
4 令和7年青森県東方沖地震(今回追加)

地殻変動によるズレの可視化イメージ

補正本体の BaseJGDCorrection.applyForwardCorrection は、対象メッシュの4隅から allYearNos動的に収集し、昇順で順次適用します。上限値を埋め込んでいないため、DB に year_no=4 の行を足すだけで自動的に適用対象に入ります

青森県域(mesh 60xx 帯)は熊本・能登・日向灘の領域と地理的に重ならないため、多重補正の心配もありません。

GeoCoreの座標変換フロー


手順A:パラメータの取得と検証

国土地理院の一覧ページから .par(ZIP)を取得し、展開して中身を検証します。リポジトリには生 .par を置かず(既存も .db のみコミット)、作業用一時フォルダで扱って DB の差分だけを反映する方針です。

cd <作業用一時フォルダ>
curl -L -o aomori2025.zip https://www.gsi.go.jp/common/000275890.zip
unzip -o aomori2025.zip          # → aomori2025_BL.par (Shift_JIS, 8523レコード)

ヘッダは for PatchJGD Ver.1.0.0、16行目が見出し MeshCode dB(sec) dL(sec)、17行目からデータ、という構造です。先頭・末尾のデータ行は次のような cm オーダーの値です。

60404580   0.00001   0.00005
 ...
62412000  -0.00053   0.00211

手順B:DBへ year_no=4 を追加

mesh_corrections_new(本番)と mesh_corrections(旧・互換)の両テーブルへ、year_no=4 として INSERT します。スキーマは mesh_code TEXT, db_sec, dl_sec, year_no で、PatchJGD の dB/dL をそのまま 1:1 でマッピングします(補正は加算規約)。

import sqlite3, io

PAR = "aomori2025_BL.par"
DB  = "1-code/GeoCore/Sources/GeoCore/Databases/jgdMerge2024.db"
YEAR_NO = 4

rows = []
with io.open(PAR, encoding="shift_jis") as f:
    lines = f.read().splitlines()
start = next(i for i, l in enumerate(lines) if "MeshCode" in l) + 1
for l in lines[start:]:
    p = l.split()
    if len(p) < 3:
        continue
    rows.append((p[0], float(p[1]), float(p[2]), YEAR_NO))
assert len(rows) == 8523, f"想定8523件 != {len(rows)}"

con = sqlite3.connect(DB); c = con.cursor()
c.execute("DELETE FROM mesh_corrections_new WHERE year_no=?", (YEAR_NO,))  # 重複防止
c.execute("DELETE FROM mesh_corrections     WHERE year_no=?", (YEAR_NO,))
c.executemany("INSERT INTO mesh_corrections_new(mesh_code,db_sec,dl_sec,year_no) VALUES(?,?,?,?)", rows)
c.executemany("INSERT INTO mesh_corrections    (mesh_code,db_sec,dl_sec,year_no) VALUES(?,?,?,?)", rows)
con.commit(); con.close()

INSERT 後は metadatarecord_count / unique_mesh_count も更新し、検証クエリで件数を確認します。

SELECT year_no, COUNT(*) FROM mesh_corrections_new GROUP BY year_no;
-- 期待: 0,1,3 に加えて 4 = 8523

手順C:Swift側のラベルとカタログ

補正の適用自体は DB 追加で動きますが、UI に「どの地震か」を出すためにラベルとカタログを更新します。

jgd2024bCorrection.swiftyearNoEventNames に追加:

yearNoEventNames: [
    0: "熊本地震",
    1: "令和6年能登半島地震",
    2: "令和6年能登半島地震(補完)",
    3: "日向灘地震",
    4: "青森県東方沖地震"   // ← 追加
]

YearNoEventCatalog.swiftjgd2024b 末尾にエントリを追加:

YearNoEventCatalogEntry(
    datasetKey: "jgd2024b", yearNo: 4,
    eventName: "令和7年(2025年)青森県東方沖地震",
    shortLabel: "青森県東方沖地震",
    fileName: "aomori2025_BL.par", recordCount: 8523,
    eventDateText: "2025-12-08",
    eventPeriodText: "2026年補正",
    sourceDocumentVersion: "Ver.1.0.0",
    sourceNote: "パラメータ公表日 2026-02-05",
    isVerified: true)

アプリ側の地震選択リストはこのカタログ駆動なので、エントリ追加で自動的に選択肢へ反映されます。
補正量ヒートマップ


手順D:テスト

リグレッションを防ぐため、青森県域の代表点で次を確認します。

  1. 補正が適用される(青森市付近で JGD2024→jgd2024b が非ゼロ、cm オーダーの差)
  2. 順変換→逆変換のラウンドトリップが元座標に収束する
  3. 既存地震(熊本・能登・日向灘)の回帰が壊れていない
  4. YearNoEventCatalogStore.event(datasetKey:"jgd2024b", yearNo:4) が取得できる

期待値は更新後 DB から実測して固定値化し、swift build / swift test が通ることを確認します。


影響範囲

ヒートマップ生成 gen_heatmap.pySELECT DISTINCT year_no で動的に列挙するため、DB 更新だけで青森のヒートマップ対応も自動的に視野に入ります(画像生成は対象追加で行う)。

補正量ヒートマップ

なお本作業は Swift版 GeoCore が対象です。C#版 GeoCore(GeoMauiApps 側が正本)は詳細な地震情報の表示を使わないため、DB の更新のみで問題なく動作します。


まとめ

新しい地震を jgd2024b 補正へ追加する作業は、「DB に year_no 行を足し、ラベル/カタログを更新し、テストで固める」の3点に集約されます。適用ロジックが件数をハードコードせず動的に収集する設計のおかげで、地震が増えても本体コードはほぼ触らずに済みます。データ駆動でエンジンを薄く保つ——GeoCore の設計思想がそのまま運用の軽さに効いた一例です。

関連記事

出典:

  • 国土地理院「座標標高補正パラメータファイル一覧」 https://www.gsi.go.jp/sokuchikijun/sokuchikijun41012.html
  • 国土地理院「令和7年(2025年)青森県東方沖の地震に関する情報」 https://www.gsi.go.jp/BOUSAI/20251209_aomorikentohouoki_earthquake_00001.html
  • 国土地理院「座標補正ソフトウェア PatchJGD」 https://www.gsi.go.jp/sokuchikijun/sokuchikijun40036.html

お願い
本記事の情報は参考目的で掲載しており、正確性・完全性を保証するものではありません。誤記・不正確な情報がございましたら、下のコメント欄よりご指摘いただければ、確認のうえ修正いたします。ご協力をお願いいたします。


※ 用語について:本記事で使用している jgd2024b・jgd2024c・jgd2024d は、GeoCore の座標変換機能名であり、一般的な正式名称ではありません。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP