PHPの絵文字変換ライブラリ「MobilePictogramConverter」が1.2.0にバージョンアップ
    このエントリをはてなブックマークに登録

2008/1/31 木曜日 matsui Posted in PHP, ソフト紹介 No Comments »

以前ご紹介させていただいた、PHPで作られた3キャリア対応絵文字変換ライブラリ「MobilePictogramConverter」が、2008/1/30付けで1.2.0にバージョンアップしたようです。

→ PHPとか MobilePictogramConverter 1.2.0 リリースのお知らせ [hatena.ne.jp]

 

2ヶ月半ぶりのバージョンアップとなり、主な内容は、

変更

  1. ライセンスをLGPLからMITへ変更
  2. 各絵文字変換ロジックを大幅に変更

修正

  1. i-mode絵文字を変換する際に発生していたエラーを修正
  2. EZweb絵文字を変換する際に、一部マルチバイト文字が絵文字と誤判断されていたバグを修正

とのことです。
バグ修正も含んでいるので、利用している方は早めにバージョンアップした方が良さそうです。
また、ライセンスがMITライセンスになったことで、仕事にも使いやすくなりましたね。

上記の開発Blogには作者のコメントも載っており、
「本年度もMPCの開発はガツガツ進めて行きます。」
とのことですから、期待しましょう。

 

関連:



携帯からGoogleMapで指定の場所を表示する方法(住所指定方式)
    このエントリをはてなブックマークに登録

2008/1/30 水曜日 matsui Posted in PHP 8 Comments »

先日ご紹介した、AsialBlogの「携帯でGoogleMapを手軽に表示するPHPクラス」という記事なのですが、読み返すと次のような注意書きが記載されていました。

最後に使用する際には、GoogleMapの利用規約に記述されている規約に違反しないようにお気をつけください。

コメント欄にもNGの可能性があるといったような微妙なコメントが寄せられています。
しかしPCのように、携帯でも任意の場所の地図を表示したい場合は多いと思います。

何とか規約に反しない方法は無いかと思い、次のようなプログラムを考えてみました。

<?php
$address = '札幌市北区北6条西4丁目';

$url = 'http://www.google.co.jp/m/lcb';
$query = '?mp=1&source=m&id=%s&ie=Shift_JIS&action=setloc&loc=%s';

// IDを取得
ini_set('user_agent','DoCoMo');
$tmp = file_get_contents($url);
preg_match_all('/ name="id" value="([0-9a-f]{32})"/', $tmp, $arr);
$id = $arr[1][0];

// ページを移動
$location = $url . sprintf($query, $id, urlencode($address));
header('Location: ' . $location);
?>

※プログラムはシフトJISで記述してください

基本は地図検索のキーワードとして住所を渡しているだけです。
番地まで指定してやれば、かなり正確に場所を指すことができます。

ただそれだけだとIDが指定されていないため、表示後の画面が正しく動作しません。
そのため、一度file_get_contentsでIDを取得しています。

わざわざGoogleに接続しなくても、例えば「$id = md5(time() . microtime());」といったように、32文字の文字列を作成してやれば動作するような気がするのですが、天文学的な確率ですがIDが重なる等の問題が起きてGoogle側に迷惑をかけてもいけないので、Google側で生成したIDを取得する処理をかませています。

20080130-gmap.jpg

メリットとしては、画像表示方式と違い、拡大縮小や移動ができること。
デメリットとしては座標指定ではないために、あまり細かい位置は指定できないということです。

処理の流れ的には検索フォームから住所で検索するのとあまり変わらないのですが、やはり規約違反なんでしょうかね。。。
どなたか詳しい方がいましたら教えてください。
また、このページの情報をご利用の方もGoogleの規約に違反しないようお気をつけください。

 

関連:



Asial blogに携帯からGoogleMapを表示するためのPHPクラスが公開されています
    このエントリをはてなブックマークに登録

2008/1/22 火曜日 matsui Posted in PHP, 記事紹介・リンク No Comments »

先日もご紹介したばかりのAsial blogに、ケータイでGoogleMapを手軽に表示するための、PHPクラスのサンプルコードが公開されています。

→ Asial blog 携帯でGoogleMapを手軽に表示するPHPクラス [asial.co.jp]

 

ご存知の通りGoogleMapは、PC版ではJavaScriptを使って表示していますが、ケータイではJavaScriptが利用できないため、画像として出力することで地図を表示させています。

それでは実際にAsial blogにあるコードを利用して、ケータイから地図を表示してみましょう。

(1) 「GoogleMobileMapView.php」を作成
Asial blog上のGoogleMobileMapViewクラスをコピペして、PHPファイルを作ります。
ファイル名は「GoogleMobileMapView.php」としました。
サンプルコードはPHP5用なので、PHP4で動くように次の箇所を修正しました。
・「private」「public」などを取り除く
・クラス変数(5~8行目)の前に「var」を付ける

(2) 表示用のプログラム「index.php」を作る
こちらはサンプルを元に少し修正しました。
(ドコモの場合はGIF、その他の場合はPNGを出力するようにしました)
修正後のコードは次の通りです。

<?php
// GoogleMobileMapViewクラスの読み込み
require_once ("./GoogleMobileMapView.php");

// マーカーの座標を指定
$points = array();
$points[] = array(
	'latitude' => 43068637,
	'longitude' => 141350795,
	'iconid' => 15
);

// DoCoMoはGIF、それ以外はPNG
if (preg_match('/^DoCoMo/', $_SERVER['HTTP_USER_AGENT'])) {
	$img_format = '1';
} else {
	$img_format = '2';
}

// 表示サイズ、ズームを設定
$img_arr = array(
	'w' => 220,
	'h' => 300,
	'z'=> 2,
	'image_format' => $img_format
);

// 表示処理
$gmap = new GoogleMobileMapView();
$gmap->setUrl(43068637, 141350795, $img_arr, $points);
$gmap->viewPicture();
?>

(3) ケータイからindex.phpを表示する

ketaigmap.jpg

ばっちり表示されてます。
素晴らしいですね。
マーカーの座標も配列で複数指定できるようです。

なお、このGoogleMapの表示に使っているAPIについての解説は、こちらが詳しいとのことです。

→ anoncom.Lab. Google mapの地図画像を携帯から利用する方法2 [anoncom.net]

 

関連:



ケータイで取得した位置情報を世界測地系に変換するサンプル
    このエントリをはてなブックマークに登録

2007/12/25 火曜日 matsui Posted in PHP 3 Comments »

先日ご紹介した「ケータイで取得した位置情報をGoogleMap形式に変換するサンプル」に引き続き、GPSの座標変換系の話です。

ケータイから取得できる座標には日本測地系と世界測地系とがあります。
ドコモの場合、iモードのGPS機能、オープンiエリアともに世界測地系になるようです。
auやソフトバンクは、パラメータで取得する形式を指定できるようです。
なおウィルコムは日本測地系で座標を返すようです。

GoogleMapは世界測地系を利用しているため、日本測地系の座標の場合は変換の必要があります。
変換用のサンプルプログラムは次の通りです。

 

日本測地系(度分秒形式)→世界測地系(ミリ秒形式)の変換サンプル

// 取得した座標(日本測地系)
$ido = '+43. 2. 58. 956';
$keido = '+141. 22. 36. 912';

// 度分秒形式からGoogleMapに対応したミリ秒形式に変換する
list($g_ido, $g_keido) = convertLocationForGMap($ido, $keido);

// 世界測地系に変換する
list($wgs_ido, $wgs_keido) = convertLocationToWGS84($g_ido, $g_keido);

echo '緯度=' . $wgs_ido . '<br>';
echo '経度=' . $wgs_keido . '<br>';

/**
 * 緯度・経度変換メソッド
 * 緯度・経度を度分秒形式からミリ秒形式に変換する
 * @param	string	$ido	緯度(度分秒形式)
 * @param	string	$keido	経度(度分秒形式)
 * @return	array		array([変換後の緯度], [変換後の経度])
 */
function convertLocationForGMap($ido, $keido) {
	// 度分秒形式からGoogleMapに対応した形式に変換する
	$keido_arr = explode('.', $keido);
	$ido_arr = explode('.', $ido);
	$g_keido = trim($keido_arr[0]) + trim($keido_arr[1]) / 60
		+ (trim($keido_arr[2]) + trim($keido_arr[3]) / 1000) / 3600;
	$g_ido = trim($ido_arr[0]) + trim($ido_arr[1]) / 60
		+ (trim($ido_arr[2]) + trim($ido_arr[3]) / 1000) / 3600;

	return array($g_ido, $g_keido);
}

/**
 * 世界測地系変換メソッド
 * 座標を世界測地系に変換する
 * @param	string	$g_ido		緯度(GoogleMap形式)
 * @param	string	$g_keido	経度(GoogleMap形式)
 * @return	array		array([変換後の緯度], [変換後の経度])
 */
function convertLocationToWGS84($g_ido, $g_keido) {
	// 世界測地系に変換する
	$wgs84_keido = $g_keido - $g_ido * 0.000046038
			- $g_keido * 0.000083043 + 0.010040;
	$wgs84_ido = $g_ido - $g_ido * 0.00010695
			+ $g_keido * 0.000017464 + 0.0046017;

	return array($wgs84_ido, $wgs84_keido);
}

なお、変換式はこちらを参考にさせていただきました。

 

関連:



ケータイで取得した位置情報をGoogleMap形式に変換するサンプル
    このエントリをはてなブックマークに登録

2007/12/21 金曜日 matsui Posted in PHP 2 Comments »

ケータイで位置情報(緯度・経度)を取得すると、度分秒表記(xx時xx分xx秒形式)で座標が返ってくるケースがほとんどです。
しかし、GoogleMapなどの地図サービスはミリ秒表記(xxx.xxxxxx形式)を使っていることが多いので、変換が必要になります。

今回は座標をGoogleMapで使えることを目的として、度分秒形式からミリ秒形式へ変換するPHPのサンプルをご紹介します。

 

ケータイ(度分秒形式)→GoogleMap(ミリ秒形式)への変換サンプル

// GPSで取得した座標の例
$ido = '+43.3.14.112';
$keido = '+141.22.35.364';

// 度分秒形式からGoogleMapに対応したミリ秒形式に変換する
list($g_ido, $g_keido) = convertLocationForGMap($ido, $keido);

echo '緯度=' . $g_ido . '<br>';
echo '経度=' . $g_keido . '<br>';

/**
 * 緯度・経度変換メソッド
 * 緯度・経度を度分秒形式からミリ秒形式に変換する
 * @param	string	$ido	緯度(度分秒形式)
 * @param	string	$keido	経度(度分秒形式)
 * @return	array		array([変換後の緯度], [変換後の経度])
 */
function convertLocationForGMap($ido, $keido) {
	// 度分秒形式からGoogleMapに対応した形式に変換する
	$keido_arr = explode('.', $keido);
	$ido_arr = explode('.', $ido);
	$g_keido = trim($keido_arr[0]) + trim($keido_arr[1]) / 60
	 + (trim($keido_arr[2]) + trim($keido_arr[3]) / 1000) / 3600;
	$g_ido = trim($ido_arr[0]) + trim($ido_arr[1]) / 60
	 + (trim($ido_arr[2]) + trim($ido_arr[3]) / 1000) / 3600;

	return array($g_ido, $g_keido);
}

trimをかけているのは、端末やサービスの違いによっては、座標の間にスペースが入ることがあるためです。

なお、利用するキャリアやサービスによっては、取得する座標が日本測地系で取れてしまうことがあります。

GoogleMapは世界測地系ですので、座標データが日本測地系の場合は変換が必要になります。
このあたりの説明と変換サンプルは、また後日ご紹介したいと思います。

※追記
日本測地系→世界測地系の記事を作成しました。こちらです。

 

関連: