[Python]KML to CSV/ KML→CSV変換
- handmadeapp
- 2020年3月13日
- 読了時間: 2分
Google My Mapsに登録した場所の情報をCSV形式で保存したい、ということがあり、
・KML形式で出力したファイルを読み、
・必要な項目を整理した上で、
・CSV形式に出力する
KML→CSV変換ツールを作成しました。
まず、XML形式のファイルを読み込むのは、xml.etree.ElementTreeを利用することに。
「root.iter('*')」で、全ての要素を順に見ていく。
元のKMLファイルの構造は、
Placemark
┗ name
┗ description
┗ styleUrl
┗ Point
┗ coordinates
となっており、サンプルとしてはこんな感じ。

CSV変換の要件は、以下の通り。
①KML:<name> → CSV:「name_jp」「name_en」
・「日本語-英語」「英語-日本語」「日本語」「英語」の4パターンがある想定
・「-」区切りでテキストを分割
・分割後、1文字目が半角英数なら「name_en」、そうでなければ「name_jp」
②KML:<description> → CSV:「description」
・何も入力がない場合は、空白のまま
③KML:<coordinates> → CSV:「longitude」「latitude」
・「,」区切りで入っている1つ目を「longitude」、2つ目を「latitude」へ
KMLファイルの要素を上から順に見ていきながら、
Placemark毎に、Key=CSV項目とするDictionary型の変数に必要な情報をセットし、
次のPlacemarkに進む前にCSVへの書き出す方向で検討。
CSVへの書き込みは、csv.DictWriterで。
<name>と<coordinates>は必ず値が入っており、次の場所の登録時に更新されるので、
CSV書き込み後の placeDictの値のクリアは「description」のみとした。
残りは、KMLから読み込んだ必要項目を「placeDict」にセットする部分のみ。
①KML:<name> → CSV:「name_jp」「name_en」
「-」区切りで分割した文字列を、日/英判定する必要がある。
こちらの記事を参考に、unicodedata.east_asian_widthを利用することに。
②KML:<description> → CSV:「description」
これは簡単で、読み込んだ情報をそのままセットするだけ。
③KML:<coordinates> → CSV:「longitude」「latitude」
「,」区切りで分割した文字列を、一旦「coordArray」に格納し、
1つ目を「longitude」、2つ目を「latitude」へセットする。
コードの全体はこちら。
これで、サンプルのKMLは、以下のCSVに。
Comments