2017/02/08

【Python/FSX】YAGETで取得したFSXのフライトログファイルを統合する

YAGETなるソフトを裏で起動することで,FSXのフライトログ(場所・高度)を取得できる.
これで得られるkmlファイルをGoogleのマイマップに取り込んでニヤニヤしていたわけだが,複数のkmlファイルを取り込む時,そのスタイルを統一するのが面倒だった.

そこで,YAGETで得られた複数のkmlファイルを統合し,1つのkmlファイルにするプログラムを書いた.

# -*- coding:utf-8 -*-
from xml.etree import ElementTree
import os
import simplekml

def getPoints(path):
    tree = ElementTree.parse(path)
    elem = tree.getroot()
    
    ElementTree.register_namespace('', 'http://earth.google.com/kml/2.0')
    
    for node in tree.findall(".//{http://earth.google.com/kml/2.0}LineString/{http://earth.google.com/kml/2.0}coordinates"):
        point = node.text
    
    #最初の改行を削除
    point = point[1:]
    
    #空白で分けてリストに
    point = point.split("      ")
    
    #各項目末尾の改行を削除
    points_list = []
    for p in point:
        points_list.append(p.rstrip("\n"))
    points_list.pop(0)
    points_list.pop(-1)
    
    #,でわけてポイントのリストにする
    points_list2 = []
    for p in points_list:
        points_list2.append(p.split(","))
    return points_list2

def getPath(folderpath):
    filename_list = os.listdir(folderpath)
    filepath_list = []
    for n in filename_list:
        path = folderpath + u'\\' + n
        filepath_list.append(path)
    return filepath_list

def writeKml(points, path):
    kml = simplekml.Kml()
    cnt = 0
    points_tuple = tuple(points)
    kml.newlinestring(name="flightlog", description="flightlog",
    coords=points_tuple)
    print kml.kml()
    kml.save(path+'//flightlog.kml')

def main(folderpath):
    filepath_list = getPath(folderpath)
    #全ポイント収録用リスト
    integrated_list = []
    #各ファイルからポイントを取得,収録用リストに移し替え.
    for path in filepath_list:
        l = getPoints(path)
        for p in l:
            integrated_list.append(p)
    writeKml(integrated_list, folderpath)
    
path = raw_inputu(u"pathを入力")
main(path)

Elementtreeによるkmlファイルの読み込みに関しては「Pythonで名前空間付きのXMLを操作する(ElementTree)」を参考にした.
kmlファイルの書き込みに関してはsimplekmlのドキュメントを読んだ.

入力したフォルダ内にあるkmlファイルを1つのkmlファイルにまとめるコードになっている.

kmlの読み込みもそれ用のパッケージを使えばよかったのかなあ,と今さらながら.
一般的なXMLの読み込み方法でゴリ押しして緯度,経度,高度を文字列として取得し,それを無理やりリストに押し込む方法をとった.
ゴリ押しなので,YAGET以外で作成したkmlファイルには使えない可能性が高い.

生成されるkmlファイルは高度データが無視されている(多分newlinestringの仕様)が,Googleマップに取り込む分には高度ファイルは不必要なので,そこはまあいいかなと思っている.

久しぶりにPythonで書いたから割といつも以上に無茶苦茶なコードになってしまった感は強い.

0 件のコメント:

コメントを投稿