PHPで撮影場所をマッピング(Windowsアプリ版)

(1/1)
PHP で Exif 情報を表示する(Windows アプリ版)」では、デジカメで撮影した JPEG画像に含まれる Exif 情報を表示するプログラムをつくった。
今回は、Exif 情報の中にある位置情報(GPS 情報)を Google マップにマッピングするようにプログラムを拡張する。

なお、後述するように、2018 年(平成 30 年)7 月からGoogle Maps API キーが必須となったため、本プログラムについては実行型プログラムを同梱していない。各自でキーを入手し、コンパイルしてほしい。

サンプル・プログラムの実行例

PHPでWindowsアプリ開発:撮影場所をマッピング

準備:Google Maps APIキーの入手

0023: //GoogleMaps APIキー;各自でキーを取得のこと
0024: //https://cloud.google.com/maps-platform/
0025: define('GOOGLE_API_KEY', '*******************************');

2018 年(平成 30 年)7 月 16 日から、Google Maps API を呼び出すのにキーが必要になった。キーは無料で入手できるが、Google アカウント を持っていること前提になる。
Google Maps Platform」にアクセスし、Google アカウントを使ってログインする。次に、右上の「スタートガイド」か左下の「使ってみる」をクリックすると、キー入手方法を知ることができる。
キーを入手したら、定数 GOOGLE_API_KEY に代入する。

プログラムの解説:HTMLコントロール

0443: //HTMLControlの設定
0444: wb_create_control($windowHTMLControl, 'GoogleMap', 10, 280, 750, 400, IDC_GMAP_HTML);

Google マップを表示するために、HTML コントロールを使用する。

0224:     //Googleマップ表示
0225:     $res = getGPS($exif$latitude$longitude);
0226:     if ($res) {
0227:         $html = drawGMap($latitude$longitude, 10);
0228:         $outfp = fopen($Tempfname, 'w');
0229:         fwrite($outfp$html);
0230:         fclose($outfp);
0231:         wb_set_location(wb_get_control($windowIDC_GMAP_HTML), $Tempfname);
0232:     } else {
0233:         wb_set_location(wb_get_control($windowIDC_GMAP_HTML), 'cmd:blank');
0234:         put_error($windowERROR_NOTGPS);
0235:     }

HTML へ URL を渡すには、は WinBinder関数 wb_set_location を利用する。

プログラムの解説:マッピング

0264: /**
0265:  * Googleマップを描く
0266:  * @param double $latitude  中心座標:緯度(世界測地系)
0267:  * @param double $longitude 中心座標:経度(世界測地系)
0268:  * @return string Googleマップのコード
0269: */
0270: function drawGMap($latitude$longitude$zoom) {
0271:     $encode = 'UTF-8';
0272:     $title  = TITLE;
0273:     $id     = 'gmap_spot';
0274:     $key    = GOOGLE_API_KEY;
0275:     $type   = 'ROADMAP';
0276: 
0277: $code =<<< EOD
0278: <!DOCTYPE html>
0279: <html lang="ja">
0280: <head>
0281: <meta charset="{$encode}">
0282: <title>{$title}</title>
0283: <meta name="author" content="studio pahoo" />
0284: <meta name="copyright" content="studio pahoo" />
0285: <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
0286: <meta http-equiv="pragma" content="no-cache">
0287: <meta http-equiv="cache-control" content="no-cache">
0288: <meta http-equiv="X-UA-Compatible" content="IE=edge">
0289: </head>
0290: <body>
0291: <script src="https://maps.googleapis.com/maps/api/js?key={$key}&amp;callback=initMap&amp;region=JP" async defer></script>
0292: <script>
0293: function initMap() {
0294:     var map = new google.maps.Map(document.getElementById('{$id}'), {
0295:         center: new google.maps.LatLng({$latitude}, {$longitude}),
0296:         zoom: {$zoom},
0297:         mapTypeId: google.maps.MapTypeId.{$type},
0298:         mapTypeControl: true,
0299:         scaleControl: true
0300:     });
0301:     var marker = new google.maps.Marker({
0302:         position: new google.maps.LatLng({$latitude}, {$longitude}),
0303:         map: map,
0304:         title: '',
0305:         zIndex: 999
0306:     });
0307: }
0308: </script>
0309: <div id="gmap_spot" style="width:720px; height:370px;"></div>
0310: </body>
0311: </html>
0312: 
0313: EOD;
0314: 
0315:     return $code;
0316: }

マッピングには Google マップ API を使う。「PHP で最寄りのネットができるホテルを検索する」で作ったユーザー関数 drawGMap をアレンジしている。

0446: //テンポラリ・ファイルの設定
0447: $path = getenv('TEMP');
0448: //環境変数TEMPあり
0449: if (file_exists($path)) {
0450:     $Tempfname = tempnam($path, 'gmp');
0451: //環境変数TEMPなし
0452: else {
0453:     $path = TEMPPATH;
0454:     @mkdir($path);
0455:     if (! file_exists($path))    exit(1);
0456:     $Tempfname = realpath(tempnam($path, 'gmg'));
0457: }

drawGMap は、ローカルディスクに一時的にセーブし、それを WinBinder関数 wb_set_location で参照する。
一時ファイルの保存先は、環境変数 TEMP が定義されていれば、組み込み関数  getenv  で取得し、無ければユーザー定数 TEMPPATH で定義したフォルダを作成し、そこに一時ファイルとして作成する。
プログラム終了時に組み込み関数  unlink  を使って削除することをお忘れなく。

コンパイル

コマンドラインから "bamcompile photomapwin.bcp" を実行する。コンパイルが完了すると、"photomapwin.exe" が生成される。"photomapwin.exe" は、DLL 不要で、単独で動作する EXE プログラムである。

参考サイト

(この項おわり)
header