SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術

状況に応じて地図の様子が自動で変わる!
YOLPで作る簡単便利地図アプリ 「今っぷ!」

スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術(8)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ローカルサーチを利用する関数の作成

 ローカルサーチを使って、与えられた座標情報周辺の店舗情報を取得し、地図上に表示する関数を作成します。JavaScriptマップAPIにはローカルサーチ用のクラスY.LocalSearchが用意されていますので、それを使用します。

//ローカルサーチ
var local_search=function(keyword,lat,lon){
    var local = new Y.LocalSearch();
    var cid = "d8a23e9e64a4c817227ab09858bc1330";        //カセットID
    var options = {"dist":"1","results":10,"lat":lat,"lon":lon};
    local.search(keyword, cid, options,
    function(result){
        map.clearFeatures();
        my_marker = new Y.Marker(new Y.LatLng(now_latitude,now_longitude), {icon: icon});
        map.addFeature(my_marker);
        //マーカーを立てる。
        for(var i=0; i < result.features.length; i++){
            result.features[i].bind("click",function(){root_search(this.getLatLng())} );
            map.addFeature(result.features[i]);
        }
    });
}

 cidでは、検索対象のデータ(以下、カセット)のIDを指定しています。今回は電話帳カセットを使用します。YOLPには他にもさまざまなカセットがあり、YOLPカセットギャラリーで利用可能なものが公開されておりますので、ぜひご覧ください。

 また、optionsの指定によって指定された位置から1km圏内の10件以内を結果として取得しています。

 検索結果の表示はマーカーで行い、その作成の際に先ほど作成したroot_search関数をbindメソッドでクリックイベントとして登録しておきます。これでマーカーをクリックすると、そこまでの経路を表示してくれるようになります。

地図の状態を変更する関数の作成

 現在時刻や現在地の高度に応じて地図を変更する関数を作成します。この関数は、高度の確認・現在時刻の確認をそれぞれ順に行い、変化があった場合のみ再描画を行います。また、変更時には、現在の地図の状態に関する情報を表示します。

//地図のstyle変更関数
var change_style=function(hour){

    var style_name=state;

    //時刻による地図のスタイルの指定
    if((hour < 4) || (hour >= 20)){
            style_name = "midnight";        //ミッドナイトに変更
    }else if((hour >=16) && (hour < 20)){
            style_name = "orange";          //オレンジに変更
    }else if((hour >= 4) && (hour < 10)){
            style_name = "blue";           //ブルーに変更
    }else{
            style_name = "bold";            //ボールドに変更
    }
    //地形図の判定
    if(altitude_API>500){
        style_name = "topographic";
    }
    //GPSの高度情報から地図を切り替え(航空写真の判定)
    if((altitude_GPS-altitude_API) > 20 ){
        style_name = "photo";
    }

    // 地図の変更
    if (state !== style_name) {
        if (state === "photo") {
            map.setConfigure("hybridPhoto",false);
            stylemaplayer.base = style_name;
            map.setLayerSet("stylemap");
        } else if (style_name === "photo") {
            map.setConfigure("hybridPhoto",true);
            map.setLayerSet(Y.LayerSetId.PHOTO);
        } else {
            stylemaplayer.base = style_name;
            stylemaplayer.redraw();
        }
        state = style_name;
    }

    // 表示の変更
    var display_name = "";
    switch (style_name) {
    case "blue":
        display_name = "ブルー";
        break;
    case "bold":
        display_name = "ボールド";
        break;
    case "orange":
        display_name = "オレンジ";
        break;
    case "midnight":
        display_name = "ミッドナイト";
        break;
    case "topographic":
        display_name = "地形図";
        break;
    case "photo":
        display_name = "航空写真";
        break;
    break;
    }
    document.getElementById("map_kind").innerHTML="現在の地図 : " + display_name;
}

 まず、時刻に応じて地図のスタイルを変更しています。今回は朝・昼・夕方・夜のそれぞれに対して、ブルー・ボールド・オレンジ・ミッドナイトを使用してみました。YOLPではこの他にも鉄道路線図や行政色分け図など、さまざまな地図のスタイルを用意しています。スタイルの種類についてはこちらを参照してください。次に、グローバル変数に保存されている標高APIから取得した高度altitude_APIに応じて、地形図に変更します。続いて、altitude_APIとグルーバル変数に保存されているGPSから取得した高度altitude_GPSの値を比較して、航空写真に変更します。最後に、決定した地図の状態に変更し、その状態を表す情報を更新しています。

気象情報の取得と雨雲レーダーの追加

 気象情報APIを利用して指定した位置の降水強度予測値を取得し、雨雲レーダーレイヤーを地図に表示する関数を作成します。この関数は、降水強度予測値の取得が成功したタイミングで雨雲レーダーレイヤーを表示します。また雨雲レーダーレイヤーの有無に関する表示を変更します。

//気象情報
var getWeather=function(lat,lon) {
    var url = "http://weather.olp.yahooapis.jp/v1/place";
    var coordinates = lon + "," + lat;
    var param = {
        appid       : APPID,
        output      : "json",
        coordinates : coordinates
    };
    $.ajax({
        "url"       : url,
        "data"      : param,
        "dataType"  : "jsonp",
        "success"   : function(result){
                          weather_result=result.Feature[0];
                          //雨雲レーダーの追加
                          if(weather_result){
                              var rainy = false;
                              for (var i = 0; i < 7; i ++) {
                                  if(weather_result.Property.WeatherList.Weather[i].Rainfall > 0.1){
                                      rainy = true;
                                      break;
                                  }
                              }
                              map.setConfigure('weatherOverlay', rainy);
                              document.getElementById("weather").innerHTML = ((rainy) ? "雨雲レーダー情報 : あり" : "雨雲レーダー情報 : なし");
                          }
                      }
    });
}

 この関数では、与えられた時刻から1時間以内に指定した場所に0.1mm以上の雨が降る場合に雨雲レーダーレイヤーを表示し、それ以外の場合では非表示にしています。

次のページ
標高の取得と地図の状態の変更

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
スマホアプリ開発の最新トレンド! ぜったい外せない位置情報活用術連載記事一覧

もっと読む

この記事の著者

船井 一(ヤフー株式会社)(フナイ ハジメ(ヤフーカブシキガイシャ))

2012年ヤフー入社。「Yahoo! Open Local Platform(略称:YOLP)」のJavaScriptマップAPIの開発を担当。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6969 2013/02/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング