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 件のコメント:
コメントを投稿