8-2. generate_kml.py

(time, latitude, longitude, height_above_mean_sea_level) の項目を含むGPSデータ(data_gps.csv)*を元にGoogle Earthで表示できるKMLファイルを作成するツールです。ほかのセンサーデータが含まれていてもよく、(height_above_mean_sea_level) がなくてもKMLファイルが作成されます。

*BiPでOpenデータとなっているKatsufumi Sato (Atmosphere and Ocean Research Institute, University of Tokyo) 提供のオオミズナギドリのデータ (title: 9B41870_TS-AxyTrek_Movebank_YNo.6_release20210824) の一部を使用しています。

下記のコードをテキストエディタにコピーし、generate_kml.py という名前で保存します。

import pandas as pd
import simplekml

# 入力ファイルと出力ファイルのパス
input_file = "data_gps.csv"
output_file = "output.kml"

# CSVファイルを読み込み
df = pd.read_csv(input_file)

# latitude と longitude が空でないデータのみ抽出
df_filtered = df.dropna(subset=['latitude', 'longitude'])

# KMLオブジェクトの作成
kml = simplekml.Kml()

# ラインのための座標リストを作成
coords = []
for index, row in df_filtered.iterrows():
    latitude = row['latitude']
    longitude = row['longitude']
    altitude = row.get('height_above_mean_sea_level', None)
    time = row['time']
    
    # 高度情報が存在する場合は高度も座標に含める
    if pd.notna(altitude):
        coords.append((longitude, latitude, altitude))
    else:
        coords.append((longitude, latitude))

    # 各ポイントに時刻情報をポップアップで表示させる
    point = kml.newpoint(coords=[(longitude, latitude, altitude)] if pd.notna(altitude) else [(longitude, latitude)])
    point.description = f"Time: {time}"
    point.style.iconstyle.scale = 0  # ポイントのピンを非表示にするためスケールを0に設定

# KMLにラインストリングを追加
linestring = kml.newlinestring(name="Flight Path", coords=coords)

# ラインのスタイル設定
linestring.style.linestyle.color = simplekml.Color.red  # 赤色のライン
linestring.style.linestyle.width = 3  # ラインの太さを指定
linestring.extrude = 1  # ラインを地表からの高さとして見せる(Google Earthで効果を発揮)

# KMLファイルを保存
kml.save(output_file)

print(f"KMLファイルの作成が完了しました。出力ファイルは {output_file} に保存されています。")

実行方法

使用するPython環境に必要なライブラリ(simplekml)をインストールしてください。

pip install simplekml

コマンドラインでスクリプトを保存したディレクトリに移動し、以下のコマンドを実行します。

python generate_kml.py