以前作成したツールPHP-PhotoGpsをversion1.5.6にアップデートしました。
以前の記事で書いた時は、緯度・経度・高度のみの機能でしたが、機能追加でいろいろできるようになっています。
特徴
JPEGファイルのEXIFデータからGPS情報を読み取ります。
リモートファイル(HTTP/HTTPS)もサポートしています。
緯度・経度は10進数、60進数の出力切替ができます。
方向を示す矢印画像も生成できます。
スピードや日付、時刻などを認識しやすい形式で出力します。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/php_photogps_1_5_6_01.png)
出力フォーマットの調整もできます。
サポートしている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」で始まるもの全てを取得し、配列として返します。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/php_photogps_1_5_6_02.png)
緯度・経度・高度の取得
$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レスポンスとして画像を出力できます。
スピードの取得
$pg->speed() // スピード: 12.453799890651
$pg->speedS() // スピード: 12.45km/h
「GPSSpeedRef」の値によって単位が決まります。
GPSSpeedRef | 単位 | 備考 |
K | km/h | 時速キロメートル |
M | mph | 時速マイル |
N | knot | ノット |
日付・時刻の取得
$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の日付書式パラメータを使います。
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');
で配列として取得するとができます。
![](https://macocci7.net/blog/wp-content/uploads/2024/02/php_photogps_1_5_6_04.png)
配列を基に表にしたものはこちらを参照してください。
Google Map への応用
https://www.google.com/maps/place/[緯度60進表記]+[経度60進表記]/@[緯度10進数].[経度10進数],17z/?authuser=0&entry=ttu
のように指定することで、Google Mapにピンを立てた状態で表示することができます。
例えば、
このリンクを辿ると
![](https://macocci7.net/blog/wp-content/uploads/2024/02/php_photogps_1_5_6_03.png)
このような表示になります。
コメント