PHPプロ!TIPS+

1. 画像ファイルから位置情報を取り出そう

デジタルカメラで撮影された画像には、Exifというフォーマットでカメラの機種名や撮影日時などの情報が埋め込まれています。
また、GPS機能を内蔵しているカメラの場合、取得した位置情報を追記できるものもあります。

その位置情報を、PHP4および5のどちらでも使用できるExif拡張モジュールを使用して取得してみましょう。

Exif拡張モジュールは、XAMPPや各LinuxディストリビューションのPHPパッケージであれば、標準で使用できると思われますが、ご自身でコンパイルしてインストールされている方は、PHPのconfigure時に「--enable-exif」が指定されているかご確認ください。

では、以下が画像ファイルに埋め込まれたExif情報を表示するサンプルになります。

<?php
if (isset($_FILES)) {
  
// Exif情報の全取得
  
$exif = @exif_read_data($_FILES["imagefile"]["tmp_name"], 0true);

  if (
$exif) {
    
$exif_data "";
    
// Exif情報の解析
    
foreach ($exif as $key => $section) {
      foreach (
$section as $name => $value) {
        if (
is_array($value)) {
          foreach(
$value as $k => $v) {
            
$exif_data .= htmlspecialchars("$key.$name.$k$v"
ENT_QUOTES) . "<br />\n";
          }
        } else {
          
$exif_data .= htmlspecialchars("$key.$name$value"
ENT_QUOTES) . "<br />\n";
        }
      }
    }
  } else {
    
$exif_data "Exif情報がありません";
  }

}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Exif関数サンプル</title>
</head>
<body>
<h1>Exif関数サンプル</h1>
<form method="post" 
action="<?php echo $_SERVER['SCRIPT_NAME']; ?>
enctype="multipart/form-data">
  <input type="file" name="imagefile" />
  <input type="submit" value="送信" />
</form>
<div>
<?php echo $exif_data?>
</div>
</body>
</html>

試しに、某社の携帯電話で撮影した位置情報付の画像ファイルを選択して、送信してみましょう。
いろいろと表示されるExif情報を見てみると、「GPS」で始まる名称のものが位置情報の格納されているセクションになり、「GPSLongitude」に経度情報、「GPSLatitude」に緯度情報が入っているようです。

GPS.GPSLatitudeRef: N
GPS.GPSLatitude.0: 35/1
GPS.GPSLatitude.1: 17/1
GPS.GPSLatitude.2: 1244/100
GPS.GPSLongitudeRef: E
GPS.GPSLongitude.0: 139/1
GPS.GPSLongitude.1: 41/1
GPS.GPSLongitude.2: 4791/100
GPS.GPSMapDatum: WGS-84

※この名称は、位置情報を付与する機器によって異なることがありますので、ご注意ください。

あとは、GPSセクションがある場合に「$exif['GPS']['GPSLongitude']」と「$exif['GPS']['GPSLatitude']」の値を取得する処理を加えることで、この携帯電話で撮影したファイルから無事位置情報を取得できるようになります。

// GPSセクションがある場合
if (array_key_exists('GPS', $exif)) {
  // $exif['GPS']['GPSLongitude']を使用する測地系に変換して格納
  $lon = …… ;
  // $exif['GPS']['GPSLatitude']を使用する測地系に変換して格納
  $lat = …… ;
}

取得した位置情報を使って画像ファイルを地域ごとに整理したり、地図APIサービスを使って地図上に表示してみたりなど、いろいろと活用してみては如何でしょうか。

2. 携帯電話でGPSデータを取得してみよう

最近の携帯電話にはGPSの機能が付加されたものがたくさん出てきています。

携帯電話は、今年4月より発売される新機種から、GPSに対応することが総務省より義務付けられております。

今回はそんなGPS情報を携帯でWebから取得する方法をご紹介します。

1.au端末での取得方法

auのGPS携帯では、2つの位置情報取得方法があります。ひとつは、基地局から位置情報を取得する方法で簡易位置情報です。もうひとつはGPS衛星と基地局から位置情報を取得する方法です。

二つの方式の違いは位置情報の精度にちがいがあります。今回は精度が高い方式で取得する方法をご紹介します。また、GPS非対応機種では取得できません。ご注意ください。

それではさっそく、auの端末から位置情報を取得する方法を作成してみましょう。

■追記 KDDIではGPSのパラメータについて契約を結んだコンテンツプロバイダー以外に開示しておらず,以下の情報は筆者が独自に調査したものです。KDDIの公式な情報ではありませんので,自己の責任に基づきご利用ください。 [2008/08/21 19:16]

<a href="device:gpsone?url=[GPSを処理するスクリプトのURL]&ver=1&datum=0&unit=1">GPS情報の取得</a>
■戻り値の説明
ver   :GPSのバージョン 
datum  :測地系(0:WGS84 1:tokyo)
unit  :経度緯度の表記方法( 0:dd.mm.ss.sssの度分秒表記 1:dd.dddの度表記)
lat   :緯度
lon   :経度
alt   :高度 
time  :時間 YYYYMMDDHHiiss
smaj  :長軸半径誤差 
smin  :短軸半径誤差 
vert  :高度誤差 
majaa :誤差楕円長軸角度 
fm   :測位方法(数値が少ない程、精度が高いみたいです)

※戻り値はGETで返します

2.DoCoMo端末での取得方法

FOMAのGPS対応機種での取得方法になります。また、GPS非対応機種のFOMAでは取得できません。ご注意ください。

<a href="[GPSを処理するスクリプトのURL]" lcs>
■戻り値の説明
lat :緯度(全て±dd.mm,ss.sssの度分秒表記)
lon :経度(全て±dd.mm,ss.sssの度分秒表記)
geo :測地系 ( wgs84 tokyo )
x-acc:測位レベル (3:水平誤差<50m 2:50m≦水平誤差<300m 1:300m≦水平誤差)

※戻り値はGETで返します

3.SoftBank端末での取得方法

3GC型での簡易位置情報の取得方法になります。
3GC型以外では取得できません。ご注意ください

hrefの中身にlocationスキームを使用する。location:後は(cell:簡易位置情報 gps:S!GPSナビ auto:端末で優先された測位)のいずれかを指定します。

<a href="location:auto?url=[GPSを処理するスクリプトのURL]">
■戻り値の説明
pos  :N**.**.**.**E***.**.**.** 座標値(1/100秒単位で度分秒表記 N は北緯、Sは南緯、Eは東経、Wは西経)
geo  :wgs84 測地系(wgs84 tokyo itrf)
x-acr :精度(1:簡易位置情報(300m以上) 2:S!GPSナビ(50m~300m) 3:S!GPSナビ(50m以内))

※戻り値はGETで返します

4.WILLCOM端末での取得方法

位置情報検知サービスで位置情報を伝える仕組みを使用します。一部の機種では取得できません。(W-ZEROシリーズなど取得方法は以下の通りです。

<a href="http://location.request/dummy.cgi?my=[GPSを処理するスクリプトのURL]&pos=$location">

※「location.request/dummy.cgi?」はそのまま記述します。

■戻り値の説明
[GPSを処理するスクリプトのURL]?pos=N**.**.**.**E**.**.**.**
pos :座標値/緯度経度順、dd.mm.ss.sssの度分秒表記 (N は北緯、Sは南緯、Eは東経、Wは西経)

※戻り値はGETで返します

このように携帯電話のGPSを取得することによって、GPSをデータを使用したWebサービスを作成することが可能になります。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)