(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