ワールドファイル付きラスタ(Raster image with world file)からKMZ作成

📌 ワールドファイル付きラスタ(Raster image with world file)からKMZ作成

🔍 概要

GISソフトで出力した ワールドファイル付きラスタ(JPEG + JGW) を、Google Earth で表示可能な KMZ形式 に変換する方法です。


🛠 手順

Step 1|GISソフトで出力

QGISなどで以下の2ファイルを出力します:

  • neko.jpeg(画像)
  • neko.jgw(ワールドファイル)

Step 2|PythonでKMZを自動生成

以下のスクリプトを使えば、フォルダを選ぶだけでKMZが自動生成されます。
✅ スクリプトファイル:convert_to_kmz.py をダウンロード


💻 Pythonスクリプト


#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
JPEG + JGW → KMZ に変換するツール
pip install simplekml pillow が必要
"""

import os
import glob
import tkinter as tk
from tkinter import filedialog, messagebox

try:
    import simplekml
except ImportError:
    raise SystemExit("simplekml が見つかりません。pip install simplekml を実行してください。")

try:
    from PIL import Image
except ImportError:
    raise SystemExit("Pillow が見つかりません。pip install pillow を実行してください。")

def read_worldfile(path: str):
    with open(path, "r", encoding="utf-8") as f:
        vals = [float(line.strip()) for line in f if line.strip()]
    dx = vals[0]; dy = vals[3]; x0 = vals[4]; y0 = vals[5]
    return dx, dy, x0, y0

def convert_folder(folder: str):
    image_patterns = ("*.jpg", "*.jpeg", "*.JPG", "*.JPEG")
    images = []
    for pat in image_patterns:
        images.extend(glob.glob(os.path.join(folder, pat)))
    if not images:
        messagebox.showwarning("警告", "画像が見つかりません。")
        return

    for img_path in images:
        base_name = os.path.splitext(os.path.basename(img_path))[0]
        jgw_path = next((p for p in (
            os.path.join(folder, base_name + ".jgw"),
            os.path.join(folder, base_name + ".JGW")
        ) if os.path.exists(p)), None)

        if jgw_path is None:
            print(f"スキップ(JGW なし): {img_path}")
            continue

        dx, dy, x0, y0 = read_worldfile(jgw_path)
        with Image.open(img_path) as im:
            width, height = im.size

        west  = x0 - dx / 2
        north = y0 - dy / 2
        east  = west  + dx * width
        south = north + dy * height

        kml = simplekml.Kml()
        gnd = kml.newgroundoverlay(name=base_name)
        gnd.icon.href = os.path.basename(img_path)
        gnd.latlonbox.north = north
        gnd.latlonbox.south = south
        gnd.latlonbox.east  = east
        gnd.latlonbox.west  = west

        kmz_path = os.path.join(folder, base_name + ".kmz")
        kml.savekmz(kmz_path)
        print(f"✔ KMZ 作成: {kmz_path}")

def main():
    root = tk.Tk()
    root.withdraw()
    folder = filedialog.askdirectory(title="KMZ を作成するフォルダを選択")
    if not folder:
        return
    convert_folder(folder)
    messagebox.showinfo("完了", "KMZ 変換が完了しました。Enter キーで終了します。")
    input("Enter キーで終了します…")

if __name__ == "__main__":
    main()

📦 補足情報

  • 対応形式:JPEG(.jpg / .jpeg)+ JGW(ワールドファイル)
  • 出力:KMZファイルが同フォルダ内に自動生成されます
  • Pythonライブラリ:simplekmlPillow を使用

コメント

このブログの人気の投稿

qgisからKML出力すると、ラベル、場所の属性が表示されない問題の対処法

位置情報付き写真をGoogle Earthに表示する方法