« C言語はじめました!OSC2008 Nagoya »

第11回高蔵寺SE勉強会

第11回高蔵寺SE勉強会

パーマリンク 2008/08/10 23:00:00 著者: kumaold メール
カテゴリ: 仕事, 勉強会など

OSC2008から帰った翌日、早速第11回高蔵寺SE勉強会でした。

色々あって1ヶ月ぶりなわけですが、今回宿題を最後まで放置してました。

さて、今回の宿題はこちら。

[出題者]あつ
[言語]CakePHP
[お題]世の中の誰かが作ったコンポーネントをつかってみよう。
ただし、自分自身が今まで使ったことの無いものに限る。 (1)

[出題者]あつ
[言語]PHP(CakePHP)
[お題]WEBサービスを利用して、サイトを作ってみよう。 (2)

勝手に番号を付けました。まずは(1)の方から。

なんか探してみたら為替レートコンポーネント?なるものがありました。

使ってみましたって感じですが、indexではクロス円レート、convertでは2つの通貨を渡すとそのレート計算できるようにしてみました。(ex.convert/USD/JPY)

マイナーな通貨ペアのレート計算にも使えます。

手抜きでサーセンw

class TestsController extends AppController
{
    var $name = 'Tests';
    var $components = array('CompCurrency');
    
    function index()
    {
        $fromCurrency = array('USD', 'EUR', 'AUD', 'NZD', 'CAD', 'HKD', 'CHF', 'ZAR', 'TRY', 'NOK', 'MXN', 'ISK', 'KRW');
        $toCurrency   = 'JPY';
        
        foreach ($fromCurrency as $from) {
            $result[$from] = $this->CompCurrency->convert(1, $from, $toCurrency);
        }
        $this->set(compact('result'));
    }
    
    function convert($from, $to)
    {
        $this->set('result', $this->CompCurrency->convert(1, $from, $to));
    }
}



(2)の方は少し真面目に実用的なものにしてみました。

以前から製作中の地域HPコンテンツの一環で、携帯の位置情報を活用してみるサンプルも兼ねてます。

携帯の位置情報測位には各キャリア毎に仕様が違い、GPS測位と基地局測位ではまた別なため数種類のページを用意する必要がありました。

それを解決できるAPIがありました!Cirius Lab.の『GeoForm API』です。


これに簡単なパラメータを渡すと、向こうでキャリア毎に測位ページを生成し、結果をGETで返してくれるので手間要らずです。


それを使って、1回の位置情報測位だけで位置情報を用いた携帯サイトを横断的に使える便利なものを作ってみました。

LocationsController

class LocationsController extends AppController
{
    var $name = 'Locations';
    var $uses = null;
    var $components = array('CompLocation');
    var $helpers = array('Html');
    
    function index()
    {
        //位置情報が取得されていないとき
        if (!isset($this->params['url']['lat'])) {
            $userAgent = urlencode($_SERVER['HTTP_USER_AGENT']);
            $returnURI = urlencode('http://kumazaki.kashimo.co.jp/CakePHP/locations/');
            $APIkey    = '1234567890abcdefghijklmnopqrstuvwxwz';
            
            $locationAPI = "http://api.cirius.co.jp/v1/geoform/xhtml?ua={$userAgent}&return_uri={$returnURI}&api_key={$APIkey}&datum=wgs84";
            $this->set(compact('locationAPI'));
        } else {
            $lat     = $this->params['url']['lat'];        //緯度
            $lon     = $this->params['url']['lon'];        //経度
            $address = $this->params['url']['address'];    //住所
            
            //緯度経度をdd.dddd形式→dd.mm.ss形式変換
            $latDMS = $this->CompLocation->degree2dms($lat);
            $lonDMS = $this->CompLocation->degree2dms($lon);
            
            $siteURL = array(
                'Yahoo!地図'    => "http://maps.mobile.yahoo.co.jp/mpl?lat={$lat}&lon={$lon}",
                'Livedoor地図'  => "http://map.m.livedoor.com/map/?lat=N{$latDMS}&lng=E{$lonDMS}",
                'BIGLOBE地図'   => "http://map.mobile.biglobe.ne.jp/i/search/area.jsp?1=1&mla={$lat}&mlo={$lon}",
                'Yahoo!地域情報'=> "http://local.mobile.yahoo.co.jp/p/local/location?guid=ON&lat={$latDMS}&lon={$lonDMS}&geo=wgs84",
                'Yahoo!路線情報'=> "http://trans.mobile.yahoo.co.jp/p/transit/main/gps?guid=ON&lat={$latDMS}&lon={$lonDMS}&geo=wgs84",
                'Yahoo!グルメ'  => "http://gourmet.mobile.yahoo.co.jp/gps?guid=ON&lat={$latDMS}&lon={$lonDMS}&geo=wgs84",
                'ぐるなび'      => "http://mobile.gnavi.co.jp/search/search_near_result.php?lat={$latDMS}&lon={$lonDMS}&geo=wgs84&x-acc=2",
                '楽天トラベル'  => "http://web.tabimado.net/portal/i/m_sch_co.ll?lat={$latDMS}&lon={$lonDMS}&geo=wgs84",
                'ホットペッパー'=> "http://hpr.jp/K/K001.jsp?lat={$latDMS}&lon={$lonDMS}&geo=wgs84",
                '郵便局'        => "http://map.japanpost.jp/m/map.php?red=1&company=3001&nl={$lat}&el={$lon}&scl=250000&prev=place",
                '道の駅'        => "http://www.asiato.net/cgi-bin/michieki/latf_df.cgi?lat=%2B{$latDMS}&lon=%2B{$lonDMS}&geo=wgs84",
                'ゲームセンター'=> "http://www.ge-sen.com/gps.php?lat={$latDMS}&lon={$lonDMS}&geo=wgs84"
            );
            
            $this->set(compact('siteURL', 'latDMS', 'lonDMS', 'address')); 
        }
    }
}


CompLocationComponent

class CompLocationComponent extends object
{
    /* 緯度経度を度分秒(dms)形式に変換
     *
     * @return string location[dd.mm.ss]
     * @param $degree float location[dd.dddd]
     */
    function degree2dms($degree)
    {
        $n = 1000;
        $u = floor($degree*3600*$n + 0.5);
        $s = (int)($u/$n) % 60;
        $m = (int)($u/60/$n) % 60;
        $d = (int)($u/3600/$n);
        $u %= $n;
        return sprintf("%d.%02d.%02d.%s", $d,$m,$s,$u);
    }
}

中身は、見てのとおりAPIから帰ってきたものを解析した各サイトのパラメータに渡しているだけです。

コンポーネントでは135.80000度→135°48'00"という変換をしてます。

WGS84→Tokyoの変換はこの際面倒なので無視。


これをベースに色々組み合わせてコンテンツを制作しようと思います。


GPSのための実用プログラミングGPSのための実用プログラミング
坂井 丈泰

東京電機大学出版局 2007-01
売り上げランキング : 115572

Amazonで詳しく見る
type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2008%2F08%2F10%2Fcnn11a_el_e_mamosea_afmaf" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年4月
 << <   > >>
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

検索

XMLフィード

16ブログ     blog tool