Monacaでは、スマートフォンやタブレットの持つセンサーから値を取得してアプリ開発に利用することができます。
今回はGPS(グローバル・ポジショニング・システム)などから位置情報の値を取得し、緯度と経度を表示します。また、緯度と経度を元にWebAPI問合せを行って住所の取得を行います。
Monacaで学ぶはじめてのプログラミング(初版)利用者向けの注意事項
- Goolgeの位置情報APIを利用するためには開発者登録が必須となったため、現在は『農研機構』のAPIを使う方法をメインで紹介しています。
諸注意
- 位置情報ではモバイル端末のハードウェア機能を呼び出すため、MonacaIDEのプレビューでは動作しません。
- スマートフォンやタブレットにデバッガーアプリ(Monaca for Study)をインストールして動かしてください。
- 位置情報は主にGPSから求められますが、Wifiや携帯基地局の情報から推定される場合もあります。
- 呼び出しにはアプリ内で準備が必要なため、deviceready イベントを考慮する必要があります。
サンプルアプリ
位置情報取得アプリ(農研機構WebAPI版)をダイレクトインポートする
位置情報を呼び出す方法
navigator.geolocation.getCurrentPosition( 完了時に実行する関数, エラー時に実行する関数);
navigator.geolocation.getCurrentPosition()命令はGPS やネットワーク情報などを元に現在地の場所を推定し、緯度と経度の情報を取得する命令です。
この命令はCordovaを利用しているため、MonacaIDEのプレビューでは動作せず、Monacaデバッガーの利用が必須となります。
document.addEventListener("deviceready", function() {
// 現在地情報を取得する
navigator.geolocation.getCurrentPosition(onSuccess, onError);
});
// 現在地取得に成功した場合の処理
function onSuccess(position){
// 緯度
var latitude = position.coords.latitude;
// 経度
var longitude = position.coords.longitude;
document.writeln(" 緯度:" + latitude);
document.writeln(" 経度:" + longitude);
}
// 現在地取得に失敗した場合の処理
function onError(error){
alert(error.message);
}
解説
アプリを起動するとすぐに13 行目のdeviceready イベントが発生します。15 行目で現在地
情報を取得する命令を実行し、問題なく取得を行うことができたら19 行目の成功時に実行
する関数が呼び出されます。緯度と経度はそれぞれ引数の中の「coords.latitude」と「coords.longitude」の中にセットされています。
緯度・経度から住所への変換(農研機構版)
端末から緯度経度情報を取得するだけでは少し寂しいので、外部のWebAPIと連携したアプリにも挑戦してみましょう。
今回は、農研機構の「簡易逆ジオコーディングサービス」という位置情報に関するプログラムを利用して緯度・経度から住所への変換を行います。
なお、iOSではWebAPIをを呼び出す際に「CORS 対応」が必須となります。同サービスは2020年11月現在、CORS 対応しておりiOS で動作が確認できました。
document.addEventListener("deviceready", function() {
// 現在地情報を取得する
navigator.geolocation.getCurrentPosition(onSuccess, onError);
});
// 現在地取得に成功した場合の処理
function onSuccess(position){
// 緯度取得
var latitude = position.coords.latitude;
// 経度取得
var longitude = position.coords.longitude;
// 表示
document.writeln(" 緯度:" + latitude);
document.writeln(" 経度:" + longitude);
// 逆ジオコーディングを実行
var url = "https://aginfo.cgk.affrc.go.jp/ws/rgeocode.php?json&"
+ "lat=" + latitude
+ "&lon=" + longitude;
console.log(url);
fetch(url)
.then(function(response) {
return response.json();
})
.then(function(address) {
var address = " 住所:"
+ address.result.prefecture.pname
+ address.result.municipality.mname
+ address.result.local[0].section;
alert(address);
});
}
// 現在地取得に失敗した場合の処理
function onError(error){
alert(error.message);
}
解説
「簡易逆ジオコーディングサービス」に緯度経度を渡すと、住所が返却されます。詳細は以
下のWeb サイトを確認してください。
簡易逆ジオコーディングサービス
なお、番地情報は、実態と異なる場合があり、またプライバシーにも関わることがありま
すので、特に慎重に扱って下さい。
緯度・経度から住所への変換(Google Maps版)
別途アカウント登録とAPIキー発行が必要となりますが、Google MapsのAPIを使うことで様々な機能を呼び出すことができます。
参考のために、呼び出し方の例を紹介します。
位置情報 API | Google Maps Platform | Google Cloud
サンプルコード
まず、Google MapsのAPIライブラリをAPIキー付きで呼び出します。
<script src="https://maps.googleapis.com/maps/api/js?key=********"></script>
次にJavaScriptで緯度経度を取得して、Googleのgeocode()命令に情報を渡します。
document.addEventListener("deviceready", function() {
// 現在地情報を取得する
navigator.geolocation.getCurrentPosition(onSuccess, onError);
});
function onSuccess(position){
// 緯度
var latitude = position.coords.latitude;
// 経度
var longitude = position.coords.longitude;
document.writeln(" 緯度:" + latitude);
document.writeln(" 経度:" + longitude);
// Google Maps API を実行
var geo = new google.maps.Geocoder();
var param = {location: new google.maps.LatLng(latitude, longitude)};
geo.geocode(param, function(result) {
address = result[0].formatted_address;
alert(address);
});
}
// 現在地取得に成功した場合の処理
function onError(error){
alert(error.message);
}