- 2点間の距離を取得
- 2点間の方角を取得
- 現在位置を取得
さぁ、必要な機能が揃いました。
これらを組み合わせて、いよいよWeb版スマホ簡易ナビを完成させます。
完成品はこちら!
⇒Web版スマホ簡易ナビ
【Web版スマホ簡易ナビソース】
<div style="text-align:center;">
目的地:<input type="text" id="addressInput" value="大坂城" style="width: 150px">
<input type="button" value="ナビ開始" onclick="naviStart()">
</div>
<div id="distanceInfo"
style="width:100%; height:60px; font-size:60px; text-align:center;"></div>
<div id="headingInfo"
style="width:100%; height:50px; font-size:30px; text-align:center; padding-top:20px;"></div>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=geometry&key=xxxxxxxxxx"></script>
<script type="text/javascript">
var latLng = new Array();
var watchId;
function naviStart(){
latLng = new Array(2);
document.getElementById("distanceInfo").innerHTML = "";
document.getElementById("headingInfo").innerHTML = "";
stopWatchPosition(watchId);
getIdoKeido();
}
function getIdoKeido() {
var addressInput = document.getElementById('addressInput').value;
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
{
address: addressInput
},
function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
latLng[1] = results[0].geometry.location;
startWatchPosition();
}
else {
alert(addressInput + ":住所が見つかりませんでした。");
}
});
}
function startWatchPosition(){
if (navigator.geolocation) {
watchId = navigator.geolocation.watchPosition(successCallback, errorCallback,
{ maximumAge: 3000, timeout: 30000, enableHighAccuracy: true });
} else {
alert("ブラウザがGeolocationに対応していません。");
}
}
function successCallback(position) {
latLng[2] = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
if (latLng[1] != undefined && latLng[2] != undefined) {
var distance = google.maps.geometry.spherical.computeDistanceBetween(latLng[2], latLng[1]) / 1000;
document.getElementById("distanceInfo").innerHTML = distance.toFixed(3) + "km";
var heading = google.maps.geometry.spherical.computeHeading(latLng[2], latLng[1]);
if (heading < 0) {
heading = heading + 360;
}
var NESW = "";
if (heading >= 337.5 || heading < 22.5) {
NESW = "N";
} else if (heading >= 22.5 && heading < 67.5) {
NESW = "NE";
} else if (heading >= 67.5 && heading < 112.5) {
NESW = "E";
} else if (heading >= 112.5 && heading < 157.5) {
NESW = "SE";
} else if (heading >= 157.5 && heading < 202.5) {
NESW = "S";
} else if (heading >= 202.5 && heading < 247.5) {
NESW = "SW";
} else if (heading >= 247.5 && heading < 292.5) {
NESW = "W";
} else if (heading >= 292.5 && heading < 337.5) {
NESW = "NW";
}
document.getElementById('headingInfo').innerHTML = NESW + " " + parseInt(heading) + "°";
}
}
function errorCallback(error) {
alert("Geolocationが利用できません");
}
function stopWatchPosition(){
navigator.geolocation.clearWatch(watchId);
}
</script>
次回予告!
Web版スマホ簡易ナビを、ドラゴンレーダー風にカスタマイズしちゃいます!