2018/08/15

写真からGPS情報を抜き出してQGISで表示する方法(Linux + QGIS)


 現地調査等を行った際にどこに行ったのかをGPS情報付きの写真からデータを取り出して表示させてみようという記事です. データの読み出しにはShell script を, データの表示にはQGISを使っています. Python でも試してみようと思ったんですが, 画像を読み込まないといけない可能性があり, めんどくさそうなのでやめました..

<EXIFデータとは>

 デジカメやスマホで撮った写真にはEXIFというデータが付与されてます. 今回の記事では, EXIFデータに含まれるGPS情報を抜き出す方法を紹介します. EXIFデータはExchangeable Image File Formatの略で簡単に言えば, 画像を説明するMETAデータのファイルフォーマットのことのようです.

<shell script コード>

#! /bin/bash
for i in `ls *CIMG????.jpg` ;do 
  exiftool $i |grep GPS |grep Position |grep -v Error |grep -v 0.00 |awk '{OFMT = "%.6f"}{print $9 + $11/60 + $12/3600, $4 + $6/60 + $7/3600}'
done |sort |uniq |tr " " "," > result.csv
    
最初の`ls *CIMG????.jpg`で選択したファイルに対して, for文で繰り返し処理を行っています. 処理の中身は"exiftool"という便利なコマンドを用いて, "grep" コマンドで必要なデータを抜き出します. ちなみ"grep -v ~~" で~~が含む行を表示しない, です. その後, "awk" コマンドを用いて, 必要なデータを表示させています. 自分で試してみるとわかりやすいと思います. 今回はfor文を3行のネスト構造で書きましたが, ネスト構造を崩して1行で書くことも可能です. ここまで複雑な処理でも, 1行でかけてしまうのは, ワンライナー("|"で繋いで, 1行で処理ができる)と呼ばれるshell scriptの強みでしょうか. 一方他人にとってコードが読みにくいという欠点もあるようです.

<QGISの操作 - データの読み込みとベースマップの表示>

 抜き出したデータをQGISアプリケーションを用いて, 表示させてみます. まず, QGISアプリを起動します. Layer >> Add Layer >> Add Delimited Text Layer と選択し, 先ほど作成したresult.csvを選択します. x field, y field そして, 地図投影法と測地法を指定します. よくわからない場合は投影法はLat/Lonを測地法はWGS84を選択しとけば良いと思います.
ここまでで撮影たポイントを表示できたでしょうか??. できたら次に, ベースマップを読み込んでみましょう. Web >> OpenLayers plugin >> Google maps >> Google satellite あたりを表示してみましょう. いい感じに見えましたか!??? OpenLayers pluginをinstall していない人は Plugins >> manage and install Pluginsからインストールしてみましょう!!