シェルスクリプトマガジン

第10回 写真から場所を調べる

 4行目では、Yahoo! JAPANのアプリケーションIDを変数「yahoo_appid」に代入しています。この変数は46行目で使います。

 7~9行目は、表示する地図の幅(width)、高さ(height)、縮尺(scale)の指定です。幅と高さはピクセルで指定します。縮尺は「1」~「20」の範囲で指定し、「1」が最も広範囲な表示になります。自分が所望するサイズや縮尺に変更してください。これらの変数も46行目で使います。

 11行目では、identifyコマンドで写真データからメタ情報を取り出し、「|」(パイプライン)で次のコマンドにその結果を渡しています。grepコマンドで必要な情報のみ切り出してから、「>」(リダイレクト)を使ってその情報を「/tmp/gps_data」ファイルに格納しています。「$1」は、第1回で説明した特殊な変数です。シェルスクリプト実行時に指定した第1引数になります。第1引数には、写真データのファイル名を指定します。grepコマンドの「-e 文字列」オプションは、OR条件になります。このオプションで指定したどれかの文字列を含んでいれば、その行が出力されます。

 14行目以降は、/tmp/gps_dataファイルから情報を取り出して表示にするための加工します。

 まず、14~16行目で撮影日時を取り出しています。撮影日時は「exif:DateTime: 2015:01:11 12:27:23」のような形式で保存されています。14行目のgrepコマンドでその行だけにし、「sed」コマンドで「exif:DateTime:」を削除して「年:月:日 時:分:秒」の情報にして変数「photo_date_time」に代入しています。ここで使用した「$(」と「)」で囲んだ「コマンド置換」とsedコマンドについては、第1回を参照してください。15行目と16行目では、年:月:日と時:分:秒に分けて、変数の「photo_date」と「photo_time」に代入しています。「cut」コマンドについては、第1回を参照してください。

 19~28行目は、関数の定義です。関数の基本構文は、次のようになります。

 定義した関数を実際に使用している箇所は、31と32行目です。関数は、

関数名 引数1 引数2 …

のようにシェルスクリプト内で記述すると、コマンドのように実行できます。引数は、必要なければ指定しなくても構いませんが、「$1」「$2」「$3」などの特殊な変数で関数内の処理に渡せます。

 19行目で、「exif:GPSLatitude: 35/1, 36/1, 102/100」や「exif:GPSLongitude: 139/1, 41/1, 2571/100」からgrepコマンドでその行だけを切り出し、sedコマンドで数値部分を取り出して変数「gps」に格納しています。数値部分は「35/1, 36/1, 102/100」のような形式になります。21~23行目で度、分、秒に当たる部分をそれぞれ切り出し、変数の「gps_do」「gps_fun」「gps_byo」に代入しています。切り出す処理に「tr」コマンドを使っています。trコマンドは文字を置き換えるコマンドです。ここでは「/」を「,」に置き換えています。「,」を区切り文字として判断すれば、cutコマンドで必要な部分が切り出せるからです。

 24行目で、YOLPから地図上の位置が調べられるように切り出した値を度数に加工します。計算式は、次のようになります。

緯度(または経度) = 度 + 分 ÷ 60 + 秒 ÷ (3600×100)

 緯度や経度を正確に計算する場合、小数点以下の値が重要になります。そこで「bc」コマンドを使いました。bcコマンドを、

のように実行します。「scale=」の数値は、小数点以下の値です。