Web版スマホ簡易ナビ(3/5)

2点間の方角を取得

次は、Google Maps APIを利用して、2点間の方角を取得します。

2点間の方角の取得には、
google.maps.geometry.spherical.computeHeading(from, to)
を使用します。

fromには始点の緯度・経度情報、toには終点の緯度・経度情報を、Google MapsのlatLngオブジェクトで指定します。

【サンプル2】

地点1:
地点2:


★結果★

「大坂城」から見た「道頓堀戎橋」の方角は、南西 227度 ですって。
度数は、北を0度として時計回りで表しています。(0〜359度)

【サンプル2ソース】
 2点間の方角を取得
<div>
  地点1:<input type="text" id="addressInput1" value="大坂城" style="width: 200px">
  <br />
  地点2:<input type="text" id="addressInput2" value="道頓堀戎橋" style="width: 200px">
  <br />
  <input type="button" value="方角取得" onclick="getHeading();">
  <br /><br />
  ★結果★<br />
  <input type="text" id="headingInfo" style="width: 250px">
</div>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?libraries=geometry&key=xxxxxxxxxx"></script>
<!--「key=xxxxxxxxxx」にはGoogleで取得したAPIキーを記述します -->

<script type="text/javascript">
var latLng = new Array();  //緯度・経度情報
var result = new Array();  //取得結果
var timerId;  //タイマーID

//方角取得
function getHeading() {
  latLng = new Array(2);
  result = new Array(2);
  
  document.getElementById('headingInfo').value = "";
  
  //地点1の緯度・経度取得
  getIdoKeido(1);
  //地点2の緯度・経度取得
  getIdoKeido(2);
  
  //緯度・経度取得は非同期処理のため、取得結果をタイマーでチェック
  timerId = setInterval(function(){
    if (result[1] == false || result[2] == false) {
    //緯度・経度取得失敗
      clearInterval(timerId);
      return;
    }
    if (latLng[1] != undefined && latLng[2] != undefined) {
    //地点1と地点2の緯度・経度取得成功
      //★2点間の方角を取得
      var heading = google.maps.geometry.spherical.computeHeading(latLng[1], latLng[2]);
      
      //北から東向きの方角は真北を0として時計回り180度まで。
      //北から西向きの方角は真北を0として反時計回りマイナス180度まで。
      
      if (heading > 0) {
        //わかりやすいようにマイナス値の場合は360度プラス
        heading = heading + 360;
      }
      
      //方角記号(8方向)を判定
      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').value = NESW + " " + parseInt(heading) + "°";
      clearInterval(timerId);
    }
  }, 100);
}

//緯度・経度取得
function getIdoKeido(point) {
  var addressInput = document.getElementById('addressInput' + point).value;
  var geocoder = new google.maps.Geocoder();
  
  geocoder.geocode(
    {
      address: addressInput
    },
    function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
      //緯度・経度取得成功
        //latLngオブジェクト(緯度・経度情報)を保存
        latLng[point] = results[0].geometry.location;
        result[point] = true;
      }
      else {
      //緯度・経度取得失敗
        alert(addressInput + ":住所が見つかりませんでした。");
        result[point] = false;
      }
    });
}
</script>

あなたへのおすすめ記事