「今っぷ!」ソースコード
今回のWebアプリ「今っぷ!」のソースコードは以下のとおりです。
<あなたのアプリケーションID>の部分は、ご自身で取得されたアプリケーションIDに書き換えてください。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no"> <title>今っぷ!</title> <style type="text/css"> html, body { width: 100%; height: 100%; } html, body, div{ margin: 0; padding: 0; } div.panel { font-size: 9pt; z-index: 2; overflow: hidden; color: #fff; background-color: #000; border-radius: 8px; position: absolute; left:3px; top: 3px; opacity: 0.8; } </style> <script type="text/javascript" src="http://js.api.olp.yahooapis.jp/OpenLocalPlatform/V1/jsapi?appid=<あなたのアプリケーションID>"></script> <script src="http://code.jquery.com/jquery-1.8.3.js"></script> <script type="text/javascript"> var map; //地図オブジェクト var stylemaplayer; //スタイル地図レイヤー var RouteSearchlayer; //経路探索レイヤー var altitude_API=0; //標高情報 var altitude_GPS=0; //標高情報 var state="bold"; //地図の状態 var now_latitude=35.66572; //現在地の緯度 var now_longitude=139.73100; //現在地の経度 var icon; //現在地マーカー用アイコン var my_marker; //現在地マーカー var APPID=" <あなたのアプリケーションID> "; //アプリケーションID var weather_result=null; //気象情報の結果 var eat_time=false; //ローカルサーチ対象時間内かどうか //回転が起こった際の再描画 window.onresize = function() { map.updateSize(); } window.onload = function() { //地図の初期状態 map = new Y.Map("map",{configure : {scrollWheelZoom : true}}); //スクロールによるzoom機能を設定 stylemaplayer = new Y.StyleMapLayer("bold"); var layerset = new Y.LayerSet("スタイル地図", [stylemaplayer]); map.addLayerSet("stylemap",layerset); map.bind("moveend", function(){change_center(true);}); map.drawMap(new Y.LatLng(now_latitude,now_longitude), 15 , "stylemap"); //現在地用のアイコンの登録 icon = new Y.Icon('http://i.yimg.jp/images/map/yolp/misc/107_pin07.png',{iconAnchor : new Y.Point(54,50)}); map.addControl(new Y.CenterMarkControl()); my_marker = new Y.Marker(new Y.LatLng(now_latitude,now_longitude), {icon: icon}); map.addFeature(my_marker); get_GPS(); //現在地の取得 setInterval(change_center, 1000*60*5); //時間による地図の再描画 } //地図の状態を変更 var change_center= function(move){ var latitude =now_latitude; var longitude =now_longitude; if(move){ latitude =map.getCenter().lat(); longitude = map.getCenter().lng(); //地図がmoveで移動したときのみGPSの高度情報を初期化 if(now_latitude!=latitude || longitude!=now_longitude){ altitude_GPS=0; } } //時刻の取得 var now_totaldate = new Date(); var hour = String(now_totaldate.getHours()); var min = String(now_totaldate.getMinutes()); document.getElementById("time").innerHTML="更新時刻 : "+hour+"時"+min+"分"; //時間の表示 //地図の更新 reverseGeo(latitude,longitude); getWeather(latitude,longitude); getAltitude(latitude,longitude,hour); //時刻によるローカルサーチ; if(((hour >= 11) && (hour < 13)) || ((hour >= 18) && (hour < 21))){ eat_time=true; if(!RouteSearchlayer){ local_search("飲食店",latitude,longitude); }else{ map.addLayer(RouteSearchlayer); } } else if(eat_time){ eat_time=false; map.clearFeatures(); my_marker = new Y.Marker(new Y.LatLng(now_latitude,now_longitude), {icon: icon}); map.addFeature(my_marker); } } //地図の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; } //GPS情報の取得 var get_GPS = function(){ navigator.geolocation.getCurrentPosition( function(result){ //現在地情報の更新 latitude=result.coords.latitude; longitude=result.coords.longitude; now_latitude=result.coords.latitude; now_longitude=result.coords.longitude; if(result.coords.altitude){ altitude_GPS=result.coords.altitude; } //地図と現在地の更新 map.panTo(new Y.LatLng(now_latitude,now_longitude),false); map.removeFeature(my_marker); my_marker = new Y.Marker(new Y.LatLng(now_latitude,now_longitude), {icon: icon}); map.addFeature(my_marker); }, function(){}, {enableHighAccuracy: true,timeout: 5000}); } //各種APIの利用 //リバースジオコーダ var reverseGeo=function(lat,lon){ var geocoder = new Y.GeoCoder(); geocoder.execute( { latlng : new Y.LatLng(lat,lon) }, function(result){ //リバースジオコーディング結果を表示 if (result.features[0] && result.features[0].property.Address) { document.getElementById('position').innerHTML = "中心位置 : "+result.features[0].property.Address; }else{ document.getElementById('position').innerHTML = "中心位置 : 該当なし"; } }); } //ローカルサーチ 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]); } }); } //気象情報 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) ? "雨雲レーダー情報 : あり" : "雨雲レーダー情報 : なし"); } } }); } //標高情報 var getAltitude=function(lat,lon,hour) { // タイムシフト値が0の場合のみ取得する var url = "http://alt.search.olp.yahooapis.jp/OpenLocalPlatform/V1/getAltitude"; var coordinates = lon + "," + lat; var param = { appid : APPID, output : "json", coordinates : coordinates }; $.ajax({ "url" : url, "data" : param, "dataType" : "jsonp", "success" : function(result){ var feature = result.Feature[0]; if ((result.ResultInfo.Count > 0)) { altitude_API=feature.Property.Altitude; document.getElementById("altitude").innerHTML="標高 : "+altitude_API+"m"; //標高の表示 } change_style(hour); } }); } //経路探索 var root_search=function(g_latlon){ if(RouteSearchlayer){ map.removeLayer(RouteSearchlayer); } var latlons= [new Y.LatLng(now_latitude, now_longitude),g_latlon ]; var config={ "useCar":"false", "useTollway":"false" }; RouteSearchlayer = new Y.RouteSearchLayer(); map.addLayer(RouteSearchlayer); RouteSearchlayer.execute(latlons,config); } //探索した経路削除用関数 var remove_root=function(){ if(RouteSearchlayer){ RouteSearchlayer.clearRoute(); RouteSearchlayer=null; } } </script> </head> <body> <div id="map" style="width:100%; height:100%"></div> <div class="panel"> <div id="time" style="padding: 2px;"></div> <div id="position" style="padding: 2px;"></div> <div id="map_kind" style="padding: 2px;"></div> <div id="altitude" style="padding: 2px;"></div> <div id="weather" style="padding: 2px;"></div> <input type="button" value="現在地更新" onclick="get_GPS()"> <input type="button" value="ルートの削除" onclick="remove_root()"> </div> </body> </html>
上記ソースコードは、GitHubよりダウンロードが可能です。
また、コードを簡潔に記述するために、jQueryを利用しています。jQueryの詳しい仕様についてはhttp://jquery.com/などを参考にしてください。
では次項から、各パートの解説をしていきます。