【PHP】画像のGPS情報取得ツールPHP-PhotoGpsアップデート(version 1.5.6)

PHP

以前作成したツールPHP-PhotoGpsをversion1.5.6にアップデートしました。

GitHub - macocci7/PHP-PhotoGps: Get GPS data from a photo.
Get GPS data from a photo. Contribute to macocci7/PHP-PhotoGps development by creating an account on GitHub.

以前の記事で書いた時は、緯度・経度・高度のみの機能でしたが、機能追加でいろいろできるようになっています。

特徴

JPEGファイルのEXIFデータからGPS情報を読み取ります。

リモートファイル(HTTP/HTTPS)もサポートしています。

緯度・経度は10進数、60進数の出力切替ができます。

方向を示す矢印画像も生成できます。

スピードや日付、時刻などを認識しやすい形式で出力します。

出力フォーマットの調整もできます。

サポートしているEXIFバージョンは2.1~3.0です。

環境要件

  • PHP 8.0.30以降インストール済
  • GDライブラリが有効
  • Composerインストール済

インストール

次のコマンドでインストールできます。

composer require macocci7/php-photo-gps

example

exampleを作業フォルダにコピーして色々いじってみると良いと思います。

cp -ra vendor/macocci7/php-photo-gps/example/ ./

使い方

まずはインストール先のvendor内にあるautoload.phpをrequireします。

use宣言をしてからインスタンス生成します。

<?php

require_once('../vendor/autoload.php');

use Macocci7\PhpPhotoGps\PhotoGps;

$filename = 'img/with_gps.jpg';    // includes GPS tags
$pg = new PhotoGps($filename);

言語設定

現在サポートされているのは英語と日本語です。

デフォルトは英語です。

$pg->langs()

で現在使用可能な言語の一覧を取得できます。

array(2) {
  [0] =>
  string(3) "eng"
  [1] =>
  string(2) "ja"
}

このような配列で返ります。

$pg->lang()

で現在設定されている言語名を取得できます。

$pg->lang('eng')

で英語に設定できます。

$pg->lang('ja')

で日本語に設定できます。

GPS情報一覧の取得

$pg->gps();

EXIFデータ中のタグ名が「GPS」で始まるもの全てを取得し、配列として返します。

緯度・経度・高度の取得

$pg->latitude(); // 緯度10進数: 37.057274166667
$pg->latitudeS(); // 緯度60進数: 37°3'26.2"N 
$pg->longitude(); // 経度10進数: 140.89244166667
$pg->longitudeS(); // 経度60進数: 140°53'32.8"E 
$pg->altitude(); // 高度数値: 13
$pg->altitudeS(); // 高度文字列: (Above Ellipsoidal Surface) 13.00 m

これは英語の出力です。

日本語に設定すると日本語で出力します。

方向の取得

$pg->direction(); // 画像(レンズ)の向き: 306.2544
$pg->directionS(); // 画像(レンズ)の向き: T 306.25°
$pg->destBearing(); // 目的地の方向: 138.69320066335
$pg->destBearingS(); // 目的地の方向: T 138.69°
$pg->track(); // 移動方向: 62.8972
$pg->trackS(); // 移動方向: T 62.90°

北を0°とし、時計回りの角度として数値を取得できます。

「GPS***Ref」の値が「T」の時は真北基準、「M」の時は磁北基準となります。

磁北は常に動き続けているので、「M」で記録されることはまずないと思います。

方向矢印の生成には、

use Macocci7\PhpPhotoGps\Helper\Arrow;

$direction = 123.456789;
$path = 'img/arrow123.45.png';
Arrow::make($direction)->save($path);

のようにすると、生成画像が保存されます。

Arrow::make() の返り値は

Intervention\Image\Image (v2.7)

なので、response()を使えば、

save()せずにHTTPレスポンスとして画像を出力できます。

HTTP Responses | Intervention Image v2 | intervention.io
Intervention Image provides an easy way to manipulate images with PHP using the GD or Imagick library.

スピードの取得

$pg->speed() // スピード: 12.453799890651
$pg->speedS() // スピード: 12.45km/h

「GPSSpeedRef」の値によって単位が決まります。

GPSSpeedRef単位備考
Kkm/h時速キロメートル
Mmph時速マイル
Nknotノット

日付・時刻の取得

$pg->datestamp(); // 日付: 2018/03/31
$pg->timestamp(); // 時刻: 12:34:56

書式変更もできます。

$pg->datestampFormat(); // 日付書式取得: Y/m/d
$pg->datestampFormat('l jS \of F Y'); // 日付書式設定: Monday 18th of September 2023
$pg->resetDatestampFormat(); // 日付書式リセット: Y/m/d

$pg->timestampFormat(); // 時刻書式取得: H:i:s
$pg->timestampFormat('g:i a'); // 時刻書式設定: 3:43 am
$pg->resetTimestampFormat(); // 時刻書式リセット: H:i:s

これは英語の設定です。

言語設定を日本語にすると、日本語の書式設定が反映されます。

日付・時刻の書式はPHPの日付書式パラメータを使います。

PHP: DateTimeInterface::format - Manual

Exifバージョン毎のGPSタグの定義取得

ExifバージョンによってGPSタグの定義が異なることがあります。

基本的には、バージョンアップ毎にタグが追加され、下位互換があるのですが、

一部、GPSAltitudeRefなどは下位互換がなかったりするケースがあります。

現時点(2024/02/06)での最新バージョンはExif3.0です。

Exif3.0の場合、

GPSAltitudeRef基準
0正値楕円体高
1負値楕円体高
2正値海抜
3負値海抜

ですが、Exif2.2~Exif2.32(Exif3.0の前のバージョン)では

GPSAltitudeRef基準
0正値海抜
1負値海抜

となっています。Exif2.1では、

GPSAltitudeRef基準
0正値海抜

となっています。

これらの定義を取得するには、

use Macocci7\PhpPhotoGps\Helper\Gps;

//$exifVersion = "0210";
//$exifVersion = "0220";
//$exifVersion = "0221";
//$exifVersion = "0230";
//$exifVersion = "0231";
//$exifVersion = "0232";
$exifVersion = "0300";

Gps::def('exif' . $exifVersion . '.fields');

で配列として取得するとができます。

配列を基に表にしたものはこちらを参照してください。

GitHub - macocci7/PHP-PhotoGps: Gets GPS data from a photo.
Gets GPS data from a photo. Contribute to macocci7/PHP-PhotoGps development by creating an account on GitHub.

Google Map への応用

https://www.google.com/maps/place/[緯度60進表記]+[経度60進表記]/@[緯度10進数].[経度10進数],17z/?authuser=0&entry=ttu

のように指定することで、Google Mapにピンを立てた状態で表示することができます。

例えば、

35°52'20.5"N 139°47'00.8"E · 〒343-0857 埼玉県越谷市新越谷1丁目 ミラクル北
〒343-0857 埼玉県越谷市新越谷1丁目 ミラクル北

このリンクを辿ると

このような表示になります。

コメント

タイトルとURLをコピーしました