« 2006年12月16日 | メイン | 2006年12月18日 »

2006年12月17日

Simple FON Maps

Simple FON Maps

Simple FON Maps というサービスを公開しました。その名の通り FON Maps をシンプルに表示するサービスです。オフィシャルは、情報量が多すぎて重いので…。

Simple FON Maps では、稼動している FON AP を中心に表示しています。

・緑色のマーカー

Green Marker Green Marker with Star

FON Access Points with Activity in the last hour

1時間以内にアクティブになった FON AP です。

・黄色のマーカー

Yellow Marker Yellow Marker with Star

All other FON Access Points

今までに1度でもアクティブになった FON AP です。

・スター付き

Green Marker with Star Yellow Marker with Star

アクセスポータルのカスタマイズ

接続した後に表示されるトップページをカスタマイズしている FON AP です。ゲスト接続が可能である可能性が高いです。すなわち、ユーザ登録していなくても FON を楽しめる AP ですね。

マーカーをクリックすると、その FON AP の登録住所などを表示します。マルチバイト文字(日本語)が含まれる場合も極力表示します。日本語で住所登録すると、マップへの登録が出来ないはずなんだけど…。

マーカー画像は、適当に作成しました。色合いが悪いかも…。

検索ボックスでは、住所などからそのポイントに飛ぶことが出来ます。例えば「天王台1-1-1」を検索すれば、筑波大学(つくば市)に移動します。「筑波大学」と検索すると東京キャンパスに移動してしまう…。この検索は Google Maps API に Geocoder を利用しています。

ステータスバーは勘で利用してもらえればいいのだけど、少しだけ説明を。

Found APs は、マップ内に存在する FON AP の数を表示します。探索を停止したい場合は、左のチェックボックスを OFF にしてください。探索したい場所までマップをスクロールする場合に便利かと思います。探索は、スクロールが停止した瞬間に行われるので、連続移動する場合にとても重くなるので。

ポイントクリアは、描画されたマーカーをクリアします。描画数が多い場合は、キャッシュするほうが描画に時間がかからなくていい感じなのですが、マップのスクロールが若干重くなります。チェックが ON になっている場合は、毎回、描画前に前回のマーカーをクリアします。

表示は、探索したマーカーの表示処理を行います。探索結果が多い場合、描画に時間がかかることが予想されるので、チェックを OFF にすれば手動で描画することが出来ます。また、キャッシュしている場合を想定して New APs として、新たに描画された AP の数が分かるようになっています。

まー。デフォルト設定でそれなりに使えるかと。マウスのスクロールによるズームの変更が可能です。

FON Maps や Simple FON Maps のリンクも出していますので、他の人に教える場合や定期的にチェックする場合は活用してくださいな。

バックグラウンドでは get_fon_ap.cgi というプログラムで FON Maps と通信を行っています。オフィシャルの FON Maps が利用している JSON 形式のデータを変換する処理などを行っています。そのうち勝手 API として公開するかも。

では。より良い FON ライフをお過ごしください。

5ヶ月ぶりのサービス公開ですね。腕がなまり過ぎです…。

【関連記事】
FON ルータ La Fonera を設置しました (2006年12月16日)
FON (2006年12月05日)

【関連情報】
・Simple FON Maps
 http://labs.ceek.jp/fon/
・FON Maps
 http://maps.fon.com/

23:49 | コメント (6) | トラックバック | Development

世界測地系の座標計算

Google Maps を使ったウェブアプリを書いていたので、その派生物(関数)を。

# IN: latitude(from), longitude(from), latitude(to), longitude(to)
# OUT: distance(meter)
sub dist {
    my ($lat_1, $lon_1, $lat_2, $lon_2) = @_;
    my $pi = atan2(1, 1) * 4;
    my $radius = 6378140;

    $lat_1 = $lat_1 * $pi / 180;
    $lon_1 = $lon_1 * $pi / 180;
    $lat_2 = $lat_2 * $pi / 180;
    $lon_2 = $lon_2 * $pi / 180;

    my $deg = sin($lat_1) * sin($lat_2) + cos($lat_1) * cos($lat_2) * cos($lon_2 - $lon_1);

    my $dist = $radius * (atan2(-$deg, sqrt(-$deg * $deg + 1)) + $pi / 2);

    return $dist;
}

2点の座標から距離を計算します。地球を真球と仮定して計算するので誤差が生じます。2点の座標があまりにも離れている場合は、その誤差が大きくなります。地球は、経線と赤道では赤道の方が長いです。

# IN: latitude(central), longitude(central), distance(meter)
# OUT: SouthWestLat, SouthWestLng, NorthEastlat, NorthEastLng
sub bounds {
    my ($lat, $lon, $dist) = @_;
    my $pi = atan2(1, 1) * 4;
    my $radius = 6378140;

    my $deg_lat = ($dist / $radius) * (180 / $pi);
    my $deg_lon = ($dist / $radius) * (180 / $pi) / cos($lat * $pi / 180);

    my $sWLat = $lat - $deg_lat;
    my $sWLng = $lon - $deg_lon;
    my $nELat = $lat + $deg_lat;
    my $nELng = $lon + $deg_lon;

    return $sWLat, $sWLng, $nELat, $nELng;
}

座標と距離から、その座標を囲む線(4点)を求めます。こちらも前記同様に誤差が出ます。

Google Maps API に getBounds という関数があり、この関数では getSouthWest と getNorthEast が取り出せ、それぞれから lat と lng を取り出すことが出来ます。この関数は、表示しているマップの端(南西と北西)の座標を取り出しているわけです。この関数を距離からエミュレートしたかったのです。

ラジアンなどをすっかり忘れていたおかげで、とても時間がかかりました…。そもそも正しいかどうかすら分からない。国内の座標を使う限りでは、それなりに正しい結果が出るようだけど。

後者は、なかなか便利なんだけどいかがでしょうか?多分 CPAN を探せば見つかるだろうけど。

23:16 | コメント (0) | トラックバック | Programming

24時間ぶりに食事を

お腹が破裂しそう。ということで、昨日(16日)の食事内容です。

昼は、マクドに行きました。読書読書。子供が15人くらいレジに並んでいてげんなり。

夜は、友人を食事に誘ったら、これからチキンライス!とか意味の分からないことを言われました。カッとなってプログラミングをずっとやっていたら、食事するの忘れてました。おわっとる。

マクドナルド (昼)
 マックチキン, ナゲット, ポテト, コーラ

22:59 | コメント (0) | トラックバック | Meal