よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【データ加工 Linuxコマンド編】Android地図アプリOsmAndの経路座標データを取得・加工する

前回投稿の 【PythonとAndroid地図アプリOsmAnd】経路座標デー タを取得・加工する - よちよちpython では Android地図アプリ OsmAnd で取得・保存した経路座標データファイル(.pgx)から座標データだけを抽出する方法としてPythonを使いました。

今回はLinuxコマンドで同じことをやってみます。こっちが簡単かも。

  • これでできる。
$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g'  | sed -e 's/lon="//g' | sed -e 's/">//g' | sed -e 's/  *//g' >locations.csv ↩️

「gpxファイル」から座標データを抜き出し「locations.csv」で保存しています。
先頭のgrepコマンドの引数にあるファイル名「2022-02-06_15-27_Sun.gpx」は適宜変更して下さいませ。



説明は以下。



実行環境

Linux環境と、経路座標データのgpxファイルが保存できれば何でも構いません。
gpxファイルは作業ディレクトリに置いておきます。



座標抽出

ここから本題。Linuxコマンドで行います。

  • gpxファイルの存在確認
$ ls | grep *.gpx ↩️ (← 改行 エンターキー)
2022-02-06_15-27_Sun.gpx

「2022-02-06_15-27_Sun.gpx」という経路座標ファイルがカレントディレクトリに保存されていることが確認できた。



  • 座標データのある行のみ取得

gpxファイルには経路の座標が複数記録されています。その行は「<trkpt」から始まりますので、grepコマンドで抽出します。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx  ↩️(← 改行エンターキーのつもり
      <trkpt lat="33.3027671" lon="130.5579563">
      <trkpt lat="33.3027594" lon="130.5579148">
      <trkpt lat="33.3027713" lon="130.557914">

以下省略

座標データ行だけを抽出できた。



  • 続けて、「"」を「,」に置換

上で置換した各行には緯度と経度が「"」(ダブルクォーテーション と スペース1つ) で繋がっています。最終的にCSVファイルにしたいので、「,」のカンマに置換します。
sedコマンドを使い、sed -e 's/" /,/g' で「"」を全て「カンマ」に置換する事ができますので、「| パイプ」で繋ぎます。

grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g'
      <trkpt lat="33.3027671,lon="130.5579563">
      <trkpt lat="33.3027594,lon="130.5579148">
      <trkpt lat="33.3027713,lon="130.557914">

(以下省略)

カンマに置換できた。



  • <trkpt lat="」を削除する

<trkpt lat="は不要なので置換で削除します。上記にその置換コマンドをパイプで繋げます。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g' ↩️
      33.3027671,lon="130.5579563">
      33.3027594,lon="130.5579148">
      33.3027713,lon="130.557914">

(以下省略)

<trkpt lat="が削除できた。



  • lon="」を置換で削除

これも同様に sedコマンド で置換し、パイプでコマンドを繋ぎます。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g'  | sed -e 's/lon="//g' ↩️
      33.3027671,130.5579563">
      33.3027594,130.5579148">

(以下省略)

lon="」を削除できた。



  • ">」を置換で削除

行末に付いている">を削除します。上記同様にパイプでコマンドを繋ぎます。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g'  | sed -e 's/lon="//g' | sed -e 's/">//g'
      33.3027671,130.5579563
      33.3027594,130.5579148

(以下省略)

">を削除できた。



  • 先頭のスペースを削除

sedコマンド でスペースを置換して削除します。またパイプでコマンドを繋ぎます。

スペースを置換で削除するときは「s/ *//」です。スペース2つ*でスペースを表します。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g'  | sed -e 's/lon="//g' | sed -e 's/">//g' | sed -e 's/  *//g' ↩️
33.3027671,130.5579563
33.3027594,130.5579148

(以下省略)

完成した。



  • リダリレクトでCSVファイルで保存

上記をファイルで保存します。モニターに出力されている結果を「>保存ファイル名」と繋ぐと、出力がそのファイル名で保存できます。

$ grep '<trkpt' 2022-02-06_15-27_Sun.gpx | sed -e 's/" /,/g' | sed -e 's/<trkpt lat="//g'  | sed -e 's/lon="//g' | sed -e 's/">//g' | sed -e 's/  *//g' >locations.csv ↩️

「locations.csv」の名前で保存しました。

  • 保存を確認しておきます
$ ls | grep *.csv ↩️
locations.csv

保存されています。



  • 内容確認

先頭10行をデフォルト表示する headコマンド でファイル内容を確認します。-n 行数 のオプションで表示行数を指定することもできます。

$ head -3 locations.csv ↩️
33.3027671,130.5579563
33.3027594,130.5579148
33.3027713,130.557914

オーケー 👌

  • 見直し反省点

緯度、経度の座標の連結部分で,カンマに置換していますが、いきなりsed -e 's/" lon="/,/g' で済みますね。すみません。



以上です。



【参考 関連】