Framework7でモバイルWebを開発するとHTML5/JavaScript/CSSを使ってiOSやMaterialデザインのネイティブに近いUIを作ることができます。またW3Cが策定しているHTML5のデバイスAPIを活用すれば、ネイティブのAPIをコールしなくてもHTML5経由でハードウェアの制御を行うこともできます。簡単なところからGeolocation APIで緯度経度情報を取得して遊んでみようと思います。
参考
- HTML5 compatibility on mobile and tablet browsers with testing on real devices
- Mobile ♥ JavaScript Hardware Access & Device APIs
- デバイスAPIはどこまで使える?最新事情を紹介
デモアプリ
リポジトリはこちらです。デモはこちらから実行できます。日本国内だと現在位置の緯度経度から計算できる国コードはJP、通貨コードはJPYだけなのであまりおもしい結果が出ませんが、任意の緯度・経度を手動で入力すれば逆ジオコーディングで位置情報から国コードや通貨コードを取得することができます。
緯度・経度を入力する
緯度経度をGeolocation APIを使わずにフォームへ手動入力してみます。「位置を入力する」タブからテスト用にアゼルバイジャンの緯度・経度を設定します。
- 緯度: 40.406605
- 経度: 49.804306
フォームに入力したデータはForm DataにあるようにJSON形式で取得することができます。
<form id="my-form" class="list-block"> |
「入力値を使う」ボタンをタップするとapp.formToJSON
からJSON形式でフォームの値を取得できます。
$$('.form-to-json').on('click', function(){ |
緯度・経度の現在位置を取得
W3CのGeolocation APIを使います。navigator.geolocation.watchPositionの場合はデバイスの位置が変わる度に位置情報を取得しているため、電池の消耗が激しそうです。
画面のボタンを押したときだけnavigator.geolocation.getCurrentPositionを使い現在の位置情報を取得するようにします。
$$('#location_btn').on('click', function () { |
逆ジオコーディング
「現在位置を使う」または「位置を入力する」のタブから取得した緯度・経度情報を使って逆ジーコーディングをします。
国コードの取得
Google Maps Javascript API Google Maps Javascript API の逆ジオコーディングを使います。
function getCountryNameCode(latLng, callback) { |
address_component.types[0] == "country"
のときに、address_component.short_name
に国コードが入っています。
- long_name: 日本
- short_name: JP
参考
- Getting street,city and country by reverse geocoding using google
- Parse json from google maps reverse geocode?
通貨コードの取得
通貨コードはGoogle Maps APIの逆ジオコーディングでも取得できなかったので、Open KnowledgeのFrictionless Open DataからComprehensive country codes: ISO 3166, ITU, ISO 4217 currency codes and many moreの変換表を使うことにします。データをJSON形式でダウンロードします。
日本を例にすると国コードや通貨コードの他にもFIFAやIOCなど様々な日本のコードが定義されています。
"name":"Japan","name_fr":"Japon","ISO3166-1-Alpha-2":"JP","ISO3166-1-Alpha-3":"JPN","ISO3166-1-numeric":"392","ITU":"J","MARC":"ja","WMO":"JP","DS":"J","Dial":"81","FIFA":"JPN","FIPS":"JA","GAUL":"126","IOC":"JPN","currency_alphabetic_code":"JPY","currency_country_name":"JAPAN","currency_minor_unit":"0","currency_name":"Yen","currency_numeric_code":"392","is_independent":"Yes"} |
- ISO3166-1-Alpha-2: JP
- currency_alphabetic_code: JPY
Expressで簡単なAPIサーバーを用意して、ここからダウンロードしたJSONデータをクエリするようにしました。
クライアントサイドからはGoecoderから取得したshort_name(JP)を条件にしてサーバーサイドのAPIを実行します。
var q = '/api/currency/' + countryShortName; |
サーバーサイドのapp.jsでは引数のISO3166-1-Alpha-2(JP)からcurrency_alphabetic_code(JPY)をlodashの_.findを使ってクエリします。
; |
為替レート
メニューの「為替レート」をタップします。取得した通貨コードを使ってYQLから為替レートをを取得してみます。この例ではアゼルバイジャン・マナトの為替レートです。
1ドル、1ユーロ、1円の現地通貨のレートをYQLのyahoo.finance.xchange
からクエリします。
function currencyRate() { |