2015年9月2日水曜日

google mapを使ってjavascriptでルート検索をしてみる

PC故障によってしばらく更新できませんでした・・
復活したので中断前にちょこっとやっていたgoogle mapルート検索について
書こうと思います。
サンプルはJR東京駅から皇居の車でのルートを表示し
マーカーおよび吹き出しを表示させるものとなります。
吹き出し表示を紹介をしているとこでクリックするたびに吹き出しが
多重化してるサンプルを見かけますが今回は多重化しないようにしています。



htmlは1行で済みます!楽ですねぇ
  <div id="map"></div>  

javascriptは少し長いです。
でも条件指定などが長いだけ。
    var From = "JR東京駅"; //出発点
    var To = "皇居";  //行き先
    //マップオブジェクトを生成します。
    var myMap = new google.maps.Map(document.getElementById("map"), {
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      scrollwheel: true, //マウスホイールスクロールを有効にする
      scaleControl: true //スケールコントロールを有効にする
    });
    
    //マーカークリック時の吹き出し表示
    function attachMessage(marker, msg, inf) {
      google.maps.event.addListener(marker, 'click', function () {
        inf.open(myMap, marker);
      });
    }
    //マップ生成、条件指定
    new google.maps.DirectionsService().route({
      //出発点
      origin: From,
      //行き先
      destination: To,
      //移動方法(電車は動かないっぽい)
      travelMode: google.maps.DirectionsTravelMode.DRIVING, 
      //途中通過したいポイントを使用するしない
      optimizeWaypoints: true,
      //通過点を指定する(緯度経度か文字列)
      //waypoints[]
      //高速道路を使用しない場合はTrue
      avoidHighways: false, 
      //有料区間を使用しない場合はTrue
      avoidTolls: false, 
      //代替ルート有無(動かない??)
      provideRouteAlternatives: false, 
      //最適化された最短距離にする。
      optimizeWaypoints: true, 
      //もちろんメートル法
      unitSystem: google.maps.DirectionsUnitSystem.METRIC,
      //交通情報を考慮するか否か
      durationInTraffic:true
    }, function (result, status) {
      //同期処理
      var mapdisp = markers(result, status);
      
      //markers関数内のはじめに出てくるyeildまで実行
      mapdisp.next();
      setTimeout(function () {
       //markers関数内の2個目に出てくるyeildまで実行
        mapdisp.next();
       //markers関数内の3個目に出てくるyeildまで実行
        mapdisp.next();
      }, 500);
    });
    //functionに*が付いていること
    function* markers(result, status) {
      //ルート取得成功したら
      if (status == google.maps.DirectionsStatus.OK) {
        //ルート表示
        var directionsRenderer = new google.maps.DirectionsRenderer();
        directionsRenderer.setDirections(result);
        directionsRenderer.draggable = true;
        directionsRenderer.setMap(myMap);
        yield; //処理一時中断ポイント
        
        //吹き出しデータ生成
        var data = new Array();
        
        //出発点の吹き出しの中身はhtml表示可能 iframeなども指定可能
        contentString = "
" + From + "
" + result.routes[0].legs[0].start_address + "
" data.push({ position: new google.maps.LatLng(result.routes[0].legs[0].start_location.G, result.routes[0].legs[0].start_location.K ), content: contentString }); //同じく行き先の吹き出しを生成 contentString = "
" + To + "
" + result.routes[0].legs[0].end_address + "
" data.push({ position: new google.maps.LatLng(result.routes[0].legs[0].end_location.G, result.routes[0].legs[0].end_location.K), content: contentString }); //マーカー+吹き出し生成 for (i = 0; i < data.length; i++) { //吹き出しオブジェクト var infowindow = new google.maps.InfoWindow({ content: data[i].content }); //マーカーオブジェクト var myMarker = new google.maps.Marker({ position: data[i].position, map: myMap, //animation: google.maps.Animation.DROPもあり animation: google.maps.Animation.BOUNCE }); //マップに表示 attachMessage(myMarker, data[i].content, infowindow); yield; //処理一時中断ポイント } } }

本家のサンプル     を参考にすると他にもいろいろ楽しそうなのがありそうです



2015年8月2日日曜日

cssでのMENU表示

Menuでいいやつがないかと探してたところ lopan.jp   
にCSSでできる良さそうなのが載っていましたので試してみました。

Sample

詳細な説明は link先     にわかりやすくまとめられていますので、そちらで確認してください。
ポイントはチェックの使い方と メニュー内容は見えない位置に配置している点でしょうか
見えない位置というのは、ブラウザの外の左側に配置しておくというもの

もし、ここでそのまま使用すると記事の左ではなく
ブラウザ左上隅に表示されてしまい記事とは関係ないような位置表示になります
これを解決するためiframeをつかって表示させてます
iframeなしで任意の場所でメニューを出すなら、ブラウザ上部とかのほうがいいかもしれません
でもワイド画面を考えると左右の余裕があるので左右も捨てがたいんですよね

あとはメニュー表示した際に内容もスライドしたい場合は contents以下に記載するとよいです
      <div class="contents">
      移動させたい内容はここに記載!
      </div>
    


2015年7月26日日曜日

またcodropsに載っている画像の上で動くCSSを試してみる

また楽しそうなのが codrops     にあったのでやってみました
サンプルは左右ボタンがずれてます;
おそらく何かのCSSが影響してしまってる気がしますが
Blogger以外で試してみたところ綺麗に表示されてました

SAMPLE
  • Landscape.1

  • Eclipse

  • Shishi-odoshi

  • Landscape.2

  • Illumination

  • Mt.Daisen

  • Cosmos

cssとjsを複数読み出す必要があります
    <head>
      <link rel="stylesheet" type="text/css" href="css/slicebox.css" />
      <link rel="stylesheet" type="text/css" href="css/custom.css" />
      <script type="text/javascript" src="js/modernizr.custom.46884.js"></script>
    </head>
    <body>
    <div class="wrapper" >
      <ul id="sb-slider" class="sb-slider">
        <li>
          <a href="画像アドレス1" target="_blank" imageanchor="1" >
            <img border="0" src="画像アドレス1" />
          </a>
          <div class="sb-description">
            <h3>画像説明1</h3>
          </div>
        </li>
        <li>
          <a href="画像アドレス2" target="_blank" imageanchor="1" >
            <img border="0" src="画像アドレス2" />
          </a>
          <div class="sb-description">
            <h3>画像説明2</h3>
          </div>
        </li>
        <div id="nav-arrows" class="nav-arrows">
          <a href="#" style= "opacity: 0.4;">Next</a>
          <a href="#" style= "opacity: 0.4;">Previous</a>
        </div>
      </ul>
    </div>
    </body>
    
あとはjavascriptですがbody部の閉じ括弧前で以下を記載します。
jqueryは1.8.2以降であれば大丈夫と思われます。
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script type="text/javascript" src="jquery.slicebox.js"></script>
    <script type="text/javascript">
    $(function () {
      var Page = (function () {
        var $navArrows = $('#nav-arrows').hide(),
          $shadow = $('#shadow').hide(),
          slicebox = $('#sb-slider').slicebox({
            onReady: function () {
              $navArrows.show();
              $shadow.show();
            },
            orientation: 'r',
            cuboidsRandom: true,
            disperseFactor: 30
          }),
          init = function () {
            initEvents();
          },
          initEvents = function () {
            // add navigation events
            $navArrows.children(':first').on('click', function () {
              slicebox.next();
              return false;
            });
            $navArrows.children(':last').on('click', function () {
              slicebox.previous();
              return false;
            });
          };
        return {
          init: init
        };
      })();
      Page.init();
    });
    </script>