本ページのデモを見るには、ブラウザはGoogle Chromeを使用して下さい。
iPhone(アイフォン)やスマートフォンで、google mapを表示させたければ、jQtouchが手軽そうです。
◆jQtouch + Google Mapの作り方(方法)
しばらくiPhone(アイフォン)用のサイトをいじっていなかったので、見直しを兼ねて復習。
jQtouchライブラリも若干変更が出ているようですので、この機会に作りなおすことに。いずれにしても基本となるのは、jqtouchライブラリ
1.jQtouchライブラリ
jqtouch.comからjqtouch-1.0-b4-rcをダウンロード(保管)
2.準備
解凍して、フォルダごとFTPでサーバへアップ。これで準備完成。demosフォルダ⇒mainフォルダ内のindex.htmlがトップページ。スマートフォン側で表示されるのを確認(PCからは、Google Chromeで動作をチェックしながら作業 URL)。
3.先ずはGoogle Mapを表示させるページを作ります。
ローカルPC側のdemosフォルダ⇒ext_locationフォルダをまるまるコピーして、フォルダ名を「googlemap」に変更
4.トップページの作成
mainフォルダ内のindex.htmlファイルにエディター(Terapad)で先ほどコピーした「googlemap」フォルダ内のindex.htmlへページ移行できるように記述を追加します。
index.htmlファイルの300行あたりに<div id=”home” ・・・・>がありますので、これがスマートフォンサイトのトップページになります。ここに1行追加して、「googlemap」フォルダ内のindex.htmlへリンクさせます。
<div id="home" class="current">
<div class="toolbar">
<h1>jQTouch</h1>
<a class="button slideup" id="infoButton" href="#about">About</a>
</div>
<div class="scroll">
<ul class="rounded">
<li class="arrow"><a target="_webapp" href="../googlemap/">Google Map</a></li>
<li class="arrow"><a href="#ui">User Interface <small class="counter">5</small></a> </li>
<li class="arrow"><a href="#animations">Animations <small class="counter">7</small></a></li>
<li class="arrow"><a href="#ajax">AJAX <small class="counter">4</small></a></li>
<li class="arrow"><a href="#callbacks">Events <small class="counter">4</small></a></li>
<li class="arrow"><a href="#extensions">Extensions <small class="counter">4</small></a> </li>
<li class="arrow"><a href="#demos">Demos <small class="counter">2</small></a></li>
<li class="arrow"><a href="#themes">Themes <small class="counter">2</small></a></li>
</ul>
<h2>Links</h2>
これで、トップページの一番上にGoogle Mapへのリストが追加されました。
5.Google Map表示用ページの準備
今度は、以降先のgooglemapフォルダ内のindex.htmlファイルをいじって、トップページとつながるようにします。
このindex.htmlファイルには、「home」へ戻るボタンがありませんのでこれを追加して、スマホ画面左上に「home」ボタン、右上に「設定」ボタンを追加します。
homeボタンのtargeは、”_webapp” href=”../main/index.html#home”として、mainフォルダ内のindex.htmlファイル、かつ<div = home・・・>(トップページ)を指定します。また、タイトルも<h1>Google Map watchPosition/clearWatch</h1>に変更。
<div id="jqt"> <div id="getlocation"> <div class="toolbar"> <h1>Google MapwatchPosition/clearWatch</h1> <a class="back" target="_webapp" href="../main/index.html#home">Home</a> <a class="button flip" id="infoButton" href="#about">設定</a> </div> <ul> <li><a href="#map">View map</a></li> </ul> <div class="info"></div> </div>
FTPでアップロードして、動作をチェックします。
これでページ移管はOK。
6.Google Map表示用ページの作成開始
続いて、googlemapフォルダ内のindex.htmlファイルをいじって、Google Mapを表示させてみます。
google map関係のscriptは、以前に勉強して作成したデモがあるのでscriptをまるまる置き換えてしまいます(参照記事)。使うのは、「geolocation watchPosition and clearWatch Demo」、スマートフォンで現在位置を使用するマップ作成するのであれば、 watchPosition + clearWatch は不可欠です(参照記事)。
ただし、Google Gears Geolocation API は、”Google Gears API is no longer available. ”とのアナウンスがありましたので、関連する記述は取っ払い、座標収得は W3C Geolocationのみで行うように変更していきます。
まず、余計なscriptを全部取っ払い、bodyのみ記載して動作チェック。idは”mapdemo”に変更。
google mapフォルダ
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Google Map Demo</title> <style type="text/css" media="screen">@import "../../themes/css/jqtouch.css";</style> <script src="../../src/lib/zepto.min.js" type="text/javascript" charset="utf-8"></script> <script src="../../src/jqtouch.min.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript" charset="utf-8"> var jQT = new $.jQTouch({ icon: 'jqtouch.png', addGlossToIcon: false, startupScreen: 'jqt_startup.png', statusBar: 'black' }); </script> <style type="text/css" media="screen"> #map_canvas { height: 100%; background-color: rgba(255,255,255,.3); } </style> </head> <body> <div id="mapdemo"> <div id="getlocation"> <div class="toolbar"> <h1>watchPosition/clearWatch</h1> <a class="button flip" id="infoButton" href="#about">設定</a> <a class="back" target="_webapp" href="../main/index.html#home">Home</a> </div> <input type="button" value="現在位置を追跡" onclick="startLocationTracking()" style="width : 100%;" /> <div id="mylocation" align="center"> </div> <div id="map_canvas" > </div> <div id="inside" style="font-size : 12px;"><img src="http://waox.main.jp/maps/gif/Earth-06-june.gif" width="30" height="30" border="0" /></div> </div> </div> <div id="about"> <div class="toolbar"> <h1>地図の説明</h1> <a class="button flip" id="infoButton" href="#mapdemo">Back</a> </div> <div style="font-size: 1.0em; text-align: left; margin: 20px 20px 160px; font-family: Marker felt;"> <p style="color : white;"><b style="margin-bottom : 10px;">watchPosition+clearWatch</b></p> <p style="color : white;">geolocationのwatchPositionだけでは、現在地座標を追跡しつづけてしまうので、地図をドラッグしたら追跡を停止するようにdragendイベントをclearWatch()へ渡してみた。</p> <a style="margin:30px 10px;color:rgba(0,0,0,.9)" href="#mapdemo" class="whiteButton goback">Back</a> </div> </div> </body> </html>
動作確認。
/main/index.html#home ⇒ /googlemap/#mapdemo ⇒ /googlemap/#about ⇒ /googlemap/#mapdemo 、続いて/main/index.html#homeへ戻るためのhomeボタンを押すとここで問題発生、/main/index.html#homeではなく/googlemap/#aboutへリダイレクトされてしまう。何故?(解決しました)
さて、時間を食ったので先に進みます。
7.最後に、Googel Maps API V3を実装します。
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Google Map Demo</title> <style type="text/css" media="screen">@import "../../themes/css/jqtouch.css";</style> <script src="../../src/lib/zepto.min.js" type="text/javascript" charset="utf-8"></script> <script src="../../src/jqtouch.min.js" type="text/javascript" charset="utf-8"></script> <!--ここからGoogle Maps API v3 --> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" charset="utf-8"> var jQT = new $.jQTouch({ icon: 'jqtouch.png', addGlossToIcon: false, startupScreen: 'jqt_startup.png', statusBar: 'black' }); </script> <style> #inside{color : black; position: fixed; top: 90px; left:40px; padding:10px; background-color:transparent; /* 背景色 */ filter:alpha(opacity=85); -moz-opacity:0.8; opacity:0.8; } </style> <link rel="stylesheet" href="http://waox.main.jp/iPhone/css/iPhone-map.css" type="text/css" /> <script type="text/javascript"> //◆個別に指定する初期表示の設定 var zoom = 12; var mapTypeId = google.maps.MapTypeId.ROADMAP </script> <script type="text/javascript"> //<![CDATA[ var watchId=0; var initialLocation; var tokyo = new google.maps.LatLng(35.68971, 139.69168); var browserSupportFlag = new Boolean(); var map; var infowindow = new google.maps.InfoWindow(); var geowindow = new google.maps.InfoWindow(); var position; var ini; function initialize() { var myOptions = { disableDefaultUI: false,//◆API のデフォルトの UI 設定をオフ(無効)にしたい場合は”true” //◆ナビゲーションコントロール navigationControl: true, navigationControlOptions: { //◆通常 ズームコントロール //style: google.maps.NavigationControlStyle.DEFAULT, style: google.maps.NavigationControlStyle.SMALL, position: google.maps.ControlPosition.LEFT_TOP //◆Android ズームコントロール //style:google.maps.NavigationControlStyle.ANDROID, //position: google.maps.ControlPosition.BOTTOM_CENTER }, //◆マップタイプコントロール mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, //style: google.maps.MapTypeControlStyle.DEFAULT, //style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_RIGHT }, //◆スケールコントロール scaleControl: true, scaleControlOptions: { //◆指定無しの場合左下になる //position: google.maps.ControlPosition.RIGHT_TOP //position: google.maps.ControlPosition.TOP_CENTER //position: google.maps.ControlPosition.BOTTOM_CENTER }, zoom: zoom, mapTypeId: mapTypeId }; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); startLocationTracking(); } function startLocationTracking() { divblock('inside');//◆watchPosition gif表示 divblock('mylocation');//◆mylocation表示 //◆座標収得 W3C Geolocation if(navigator.geolocation) { browserSupportFlag = true; watchId = navigator.geolocation.watchPosition(function(position) { initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); map.setCenter(initialLocation); showCurrentLocation(position); //◆現在地マーカー var ini = new google.maps.Marker( { position:initialLocation, map: map, title: '現在位置', draggable: false, icon: 'http://waox.main.jp/maps/icon/car2.png', animation: google.maps.Animation.DROP }); }, function() { handleNoGeolocation(browserSupportFlag); }); } else { // Browser doesn't support Geolocation browserSupportFlag = false; handleNoGeolocation(browserSupportFlag); } google.maps.event.addListener(map, 'dragend', function() //◆地図を移動(ドラッグ)するとclearWatch { if (watchId > 0) { navigator.geolocation.clearWatch(watchId); divnone('inside');//◆watchPosition gif表示 divnone('mylocation');//◆mylocation表示 } }); } //◆現在地座標表示 function showCurrentLocation(position) { document.getElementById("mylocation").innerHTML = "Lat:" + position.coords.latitude.toFixed(7) + " , Lng:" + position.coords.longitude.toFixed(7) ; } function handleNoGeolocation(errorFlag) { if (errorFlag == true) { initialLocation = tokyo; contentString = "位置を特定できません。サポートされていないブラウザです。東京都庁を表示します。"; } else { initialLocation = tokyo; contentString = "位置を特定できません。サポートされていないブラウザです。東京都庁を表示します。"; } map.setCenter(initialLocation); geowindow .setContent(contentString); geowindow .setPosition(initialLocation); geowindow .open(map); } //div表示の切換え function divblock(id) { var ele = document.getElementById(id); ele.style.display = 'block'; } //div非表示の切換え function divnone(id) { var ele = document.getElementById(id); ele.style.display = 'none'; } window.onload=initialize; //]]> </script> </head> <body> <div id="mapdemo"> <div id="getlocation"> <div class="toolbar"> <h1>Google Map</h1> <a class="button flip" id="infoButton" href="#about">設定</a> <a class="button leftButton" target="_webapp" href="../main/index.html#home">Home</a> </div> <input type="button" value="現在位置を追跡" onclick="startLocationTracking()" style="width : 100%;" /> <div id="mylocation" align="center" style="color : white;"> </div> <div id="map_canvas" > </div> <div id="inside" style="font-size : 12px;"><img src="http://waox.main.jp/maps/gif/Earth-06-june.gif" width="30" height="30" border="0" /></div> </div> </div> <div id="about"> <div class="toolbar"> <h1>地図の説明</h1> <a class="button flip" id="infoButton" href="#mapdemo">Back</a> </div> <div style="font-size: 1.0em; text-align: left; margin: 20px 20px 160px; font-family: Marker felt;"> <p style="color : white;"><b style="margin-bottom : 10px;">watchPosition+clearWatch</b></p> <p style="color : white;">geolocationのwatchPositionだけでは、現在地座標を追跡しつづけてしまうので、地図をドラッグしたら追跡を停止するようにdragendイベントをclearWatch()へ渡してみた。</p> <a style="margin:30px 10px;color:rgba(0,0,0,.9)" href="#mapdemo" class="whiteButton goback">Back</a> </div> </div> </body> </html>
コピペ用
<!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Google Map Demo</title> <style type="text/css" media="screen">@import "../../themes/css/jqtouch.css";</style> <script src="../../src/lib/zepto.min.js" type="text/javascript" charset="utf-8"></script> <script src="../../src/jqtouch.min.js" type="text/javascript" charset="utf-8"></script> <!--ここからGoogle Maps API v3 --> <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <script type="text/javascript" charset="utf-8"> var jQT = new $.jQTouch({ icon: 'jqtouch.png', addGlossToIcon: false, startupScreen: 'jqt_startup.png', statusBar: 'black' }); </script> <style> #inside{color : black; position: fixed; top: 90px; left:40px; padding:10px; background-color:transparent; /* 背景色 */ filter:alpha(opacity=85); -moz-opacity:0.8; opacity:0.8; } </style> <link rel="stylesheet" href="http://waox.main.jp/iPhone/css/iPhone-map.css" type="text/css" /> <script type="text/javascript"> //◆個別に指定する初期表示の設定 var zoom = 12; var mapTypeId = google.maps.MapTypeId.ROADMAP </script> <script type="text/javascript"> //<![CDATA[ var watchId=0; var initialLocation; var tokyo = new google.maps.LatLng(35.68971, 139.69168); var browserSupportFlag = new Boolean(); var map; var infowindow = new google.maps.InfoWindow(); var geowindow = new google.maps.InfoWindow(); var position; var ini; function initialize() { var myOptions = { disableDefaultUI: false,//◆API のデフォルトの UI 設定をオフ(無効)にしたい場合は”true” //◆ナビゲーションコントロール navigationControl: true, navigationControlOptions: { //◆通常 ズームコントロール //style: google.maps.NavigationControlStyle.DEFAULT, style: google.maps.NavigationControlStyle.SMALL, position: google.maps.ControlPosition.LEFT_TOP //◆Android ズームコントロール //style:google.maps.NavigationControlStyle.ANDROID, //position: google.maps.ControlPosition.BOTTOM_CENTER }, //◆マップタイプコントロール mapTypeControl: true, mapTypeControlOptions: { style: google.maps.MapTypeControlStyle.DROPDOWN_MENU, //style: google.maps.MapTypeControlStyle.DEFAULT, //style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR, position: google.maps.ControlPosition.TOP_RIGHT }, //◆スケールコントロール scaleControl: true, scaleControlOptions: { //◆指定無しの場合左下になる //position: google.maps.ControlPosition.RIGHT_TOP //position: google.maps.ControlPosition.TOP_CENTER //position: google.maps.ControlPosition.BOTTOM_CENTER }, zoom: zoom, mapTypeId: mapTypeId }; map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); startLocationTracking(); } function startLocationTracking() { divblock('inside');//◆watchPosition gif表示 divblock('mylocation');//◆mylocation表示 //◆座標収得 W3C Geolocation if(navigator.geolocation) { browserSupportFlag = true; watchId = navigator.geolocation.watchPosition(function(position) { initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude); map.setCenter(initialLocation); showCurrentLocation(position); //◆現在地マーカー var ini = new google.maps.Marker( { position:initialLocation, map: map, title: '現在位置', draggable: false, icon: 'http://waox.main.jp/maps/icon/car2.png', animation: google.maps.Animation.DROP }); }, function() { handleNoGeolocation(browserSupportFlag); }); } else { // Browser doesn't support Geolocation browserSupportFlag = false; handleNoGeolocation(browserSupportFlag); } google.maps.event.addListener(map, 'dragend', function() //◆地図を移動(ドラッグ)するとclearWatch { if (watchId > 0) { navigator.geolocation.clearWatch(watchId); divnone('inside');//◆watchPosition gif表示 divnone('mylocation');//◆mylocation表示 } }); } //◆現在地座標表示 function showCurrentLocation(position) { document.getElementById("mylocation").innerHTML = "Lat:" + position.coords.latitude.toFixed(7) + " , Lng:" + position.coords.longitude.toFixed(7) ; } function handleNoGeolocation(errorFlag) { if (errorFlag == true) { initialLocation = tokyo; contentString = "位置を特定できません。サポートされていないブラウザです。東京都庁を表示します。"; } else { initialLocation = tokyo; contentString = "位置を特定できません。サポートされていないブラウザです。東京都庁を表示します。"; } map.setCenter(initialLocation); geowindow .setContent(contentString); geowindow .setPosition(initialLocation); geowindow .open(map); } //div表示の切換え function divblock(id) { var ele = document.getElementById(id); ele.style.display = 'block'; } //div非表示の切換え function divnone(id) { var ele = document.getElementById(id); ele.style.display = 'none'; } window.onload=initialize; //]]> </script> </head> <body> <div id="mapdemo"> <div id="getlocation"> <div class="toolbar"> <h1>Google Map</h1> <a class="button flip" id="infoButton" href="#about">設定</a> <a class="button leftButton" target="_webapp" href="../main/index.html#home">Home</a> </div> <input type="button" value="現在位置を追跡" onclick="startLocationTracking()" style="width : 100%;" /> <div id="mylocation" align="center" style="color : white;"> </div> <div id="map_canvas" > </div> <div id="inside" style="font-size : 12px;"><img src="http://waox.main.jp/maps/gif/Earth-06-june.gif" width="30" height="30" border="0" /></div> </div> </div> <div id="about"> <div class="toolbar"> <h1>地図の説明</h1> <a class="button flip" id="infoButton" href="#mapdemo">Back</a> </div> <div style="font-size: 1.0em; text-align: left; margin: 20px 20px 160px; font-family: Marker felt;"> <p style="color : white;"><b style="margin-bottom : 10px;">watchPosition+clearWatch</b></p> <p style="color : white;">geolocationのwatchPositionだけでは、現在地座標を追跡しつづけてしまうので、地図をドラッグしたら追跡を停止するようにdragendイベントをclearWatch()へ渡してみた。</p> <a style="margin:30px 10px;color:rgba(0,0,0,.9)" href="#mapdemo" class="whiteButton goback">Back</a> </div> </div> </body> </html>
これで完了。無事動作です。
◆Google Maps JavaScript API V3 サンプル
- JQtouch + Google Map (Map 目的地へのルート検索)
その他デモおよび記事は、「Google Map デモ」「API V3の使い方」のページに追加していきます。
◆Ref.
- jQTouch — Zepto/jQuery plugin for mobile web development
- jQtouch Demo (class挙動など)
- Google Groups – jQtouch (グループ内をキーワードで検索)
- MATTEO SPINELLI’SCUBIQ.ORG
◆Google Maps JavaScript API V3
スポンサードリンク
4 Comments.