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

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

サンプル・プログラム

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

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

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

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

0218:     //Googleマップ表示
0219:     $res = getGPS($exif$latitude$longitude);
0220:     if ($res) {
0221:         $html = drawGMap($latitude$longitude, 10);
0222:         $outfp = fopen($Tempfname, 'w');
0223:         fwrite($outfp$html);
0224:         fclose($outfp);
0225:         wb_set_location(wb_get_control($windowIDC_GMAP_HTML), $Tempfname);
0226:     } else {
0227:         wb_set_location(wb_get_control($windowIDC_GMAP_HTML), 'cmd:blank');
0228:         put_error($windowERROR_NOTGPS);
0229:     }

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

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

0258: /**
0259:  * Googleマップを描く
0260:  * @param double $latitude  中心座標:緯度(世界測地系)
0261:  * @param double $longitude 中心座標:経度(世界測地系)
0262:  * @return string Googleマップのコード
0263: */
0264: function drawGMap($latitude$longitude$zoom) {
0265:     $encode = 'UTF-8';
0266:     $title = TITLE;
0267: 
0268: $code =<<< EOD
0269: <!DOCTYPE html>
0270: <html lang="ja">
0271: <head>
0272: <meta charset="{$encode}">
0273: <title>{$title}</title>
0274: <meta name="author" content="studio pahoo" />
0275: <meta name="copyright" content="studio pahoo" />
0276: <meta name="ROBOTS" content="NOINDEX,NOFOLLOW" />
0277: <meta http-equiv="pragma" content="no-cache">
0278: <meta http-equiv="cache-control" content="no-cache">
0279: <meta http-equiv="X-UA-Compatible" content="IE=edge">
0280: </head>
0281: <body>
0282: <script type="text/javascript" src="http://maps.google.com/maps/api/js" charset="utf-8"></script>
0283: <script type="text/javascript">
0284: <!--
0285: google.maps.event.addDomListener(window, 'load', function() {
0286: var mapdiv = document.getElementById('gmap_spot');
0287: var myOptions = {
0288:     zoom: {$zoom},
0289:     center: new google.maps.LatLng({$latitude}, {$longitude}),
0290:     mapTypeId: google.maps.MapTypeId.ROADMAP,
0291:     mapTypeControl: false,
0292:     scaleControl: true
0293: };
0294: var icon_shadow = new google.maps.MarkerImage('http://www.pahoo.org/common/i_baloon_shadow.png',
0295:     new google.maps.Size(70, 64),
0296:     new google.maps.Point(0, 0),
0297:     new google.maps.Point(7, 64)
0298: );
0299: var map = new google.maps.Map(mapdiv, myOptions);
0300: var marker = new google.maps.Marker({
0301:     position: new google.maps.LatLng({$latitude}, {$longitude}),
0302:     map: map,
0303:     shadow: icon_shadow,
0304:     title: '',
0305:     zIndex: 999
0306: });
0307: });
0308: -->
0309: </script>
0310: <div id="gmap_spot" style="width:720px; height:370px;"></div>
0311: </body>
0312: </html>
0313: 
0314: EOD;
0315: 
0316:     return $code;
0317: }

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

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

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

コンパイル

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

参考サイト

(この項おわり)
header