○GoogleMapを使用して2点間の距離を測定
アプリケーションイメージ
スタート地点、ゴール地点を指定して、2点間の距離を測定するアプリイメージ画面です。
順に、
○1番目:起動後の画面
○2番目:スタート地点、ゴール地点を指定後の画面
スタート地点(青)、ゴール地点(緑)のマーカが表示される
○3番目:距離測定を指定後の画面
infoウィンドウに「住所」「緯度経度」「距離」が表示される
今回作成したアプリの仕様
○機能仕様
スタート、ゴールを地図上で指定して、その間の距離を地図上に表示します。
○入力仕様
①スタート地点の指定:地図上をクリックして、スタート地点を指定する。
②ゴール地点の指定:まず「ゴール地点」ボタンを押下する
③次に、ゴール地点の指定:地図上をクリックして、ゴール地点を指定する。
④最後に、「距離測定」ボタンを押下する。
○出力仕様
①スタート地点が指定されたら、青色のマーカを表示する、タイトルは「スタート地点」。
またスタート地点の「緯度経度」を表示する。
②ゴール地点が指定されたら、青色のマーカを表示する、タイトルは「スタート地点」。
またゴール地点の「緯度経度」を表示する。
③「ゴール地点」ボタンが押下されたら、内部モードを「ゴール地点モード」に設定する。
④距離測定ボタンが押下されたら、以下の情報を表示する。
○ストート地点、ゴール地点の住所を表示する。
○ストート地点、ゴール地点の距離を計算する。
○距離情報を表示する。
○ストート地点、ゴール地点のinfoウィンドウを表示(住所/緯度経度)。
○ストート地点、ゴール地点を直線でつなぐ(大園[青線]、メルカトル[赤線])。
他サイトでの実装方法
参考までに、他のサイトでの距離測定アプリの結果を記載します。
私の自宅から駅までの距離は、以下でした:
今回アプリの結果: 779m
G社アプリの結果: 755m
C社アプリの結果: 702m
○G社アプリ(左図):GoogleMap:https://www.google.co.jp/maps/@35.3626947,139.5789324,15z 地図上で右クリックして「距離を計算」を選択する、あとは経路を順次クリックするだけ。
○C社アプリ(右図):地図をなぞって距離を計算:https://keisan.casio.jp/keisan/googleMap.php?km=&m=map&lang=&is_pc=1 地図上で、経路を順次クリックするだけ。
おまけ、少々専門的な話、地球は丸かった!
【青い線】 最短距離 (大圏コース)
地球の大圏上に沿った、船や航空機の航路。二地点間の最短距離となる。大圏コース。
【赤い線】 普通のPolyline(メルカトル図法上での最短距離)
少々専門的な話となりますが、大圏コース(最短距離)とメルカトル図法上での最短距離について:
参考URL: 大圏コース(たいけんコース、Great circle route)とは
実はこのアプリでは、「大圏コース」は青い線で、「メルカトル図法上での最短距離」は赤い線で表示しています。
日本国内では、この効果は地図上では重なって表示されないので、「東京」から「パキスタン」までの距離を測定して、効果を調べました。
東京からパキスタンまでの距離を測定:
今回のアプリ: 6,445Km
Google地図: 6,493Km
アプリのソースコード
◯geometryライブラリ使用宣言
◯マーカー表示:marker(title, latlng, color) マーカーはスタート地点/ゴール地点を区別しやすいように、各々青色/緑色とした。
//マーカを表示する function marker(title, latlng, color) { // alert("color="+color); if ( color == "blue" ) { var icon = "http://maps.google.com/mapfiles/ms/icons/blue-dot.png"; } else { var icon = "http://maps.google.com/mapfiles/ms/icons/green-dot.png"; } var gmarker = new google.maps.Marker({ position: latlng, // 緯度・経度は地図の中心 icon: icon, title: title // ツールチップ }); // マーカーを地図の中心に表示 gmarker.setMap(map); }◯2点間の距離測定:distance() 「google.maps.geometry.spherical.computeDistanceBetween」関数を使用した
//スタート地点からゴールまでの距離を測定 function distance() { // 距離 var distance = google.maps.geometry.spherical.computeDistanceBetween(START, GOAL); document.getElementById('distance').value = distance; // 吹き出しに表示 //スタート地点 getAddress(START, ""); //ゴール地点 getAddress(GOAL, distance); // 最短距離 (大圏コース) new google.maps.Polyline({ geodesic: true, path: [START, GOAL], map: map, strokeColor: 'blue' }); // 普通のPolyline(メルカトル図法上での最短距離) new google.maps.Polyline({ path: [START, GOAL], map: map, strokeColor: 'red' }); //}); }◯緯度経度から住所を取得する:getAddress(latlng, distance)
//緯度経度から住所を取得する function getAddress(latlng, distance) { // ジオコーダのコンストラクタ var geocoder = new google.maps.Geocoder(); // geocodeリクエストを実行。 // 第1引数はGeocoderRequest。緯度経度⇒住所の変換時はlatLngプロパティを入れればOK。 // 第2引数はコールバック関数。 geocoder.geocode({ latLng: latlng }, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { // results.length > 1 で返ってくる場合もありますが・・・。 if (results[0].geometry) { // 住所を取得(日本の場合だけ「日本, 」を削除) var address = results[0].formatted_address.replace(/^日本、/, ''); if ( distance != "" ) { new google.maps.InfoWindow({ content: "測定距離: " + distance+ " m◯全ソースを記載します。
" + address + "
(Lat, Lng) = " + latlng, position: latlng, map: map }); document.getElementById('address1').value = address; } else { new google.maps.InfoWindow({ content: address + "
(Lat, Lng) = " + latlng, position: latlng, map: map }); document.getElementById('address2').value = address; } } ★以下省略する★
・スタート地点を指定するには「スタート地点」ボタンを押下してから、地図上でクリックして下さい
・ゴール地点を指定するには「ゴール地点」ボタンを押下してから、地図上でクリックして下さい
緯度: 経度: 住所:
緯度: 経度: 住所:
m
利用料金について
詳細は、以下のURLを参照:
https://cloud.google.com/maps-platform/pricing/sheet?hl=ja
料金について、一部抜粋します:
従量課金制で、使用分に対してのみ料金が発生します。毎月 $200 分は無料でご利用いただけます(その月の使用分から $200 を差し引いた金額がお客様の請求先アカウントに課金されます)。また、費用が予想外に増加するのを防ぐため、使用量の上限を設定することもできます。現在の API の使用量については、Google Cloud Platform Consoleでご確認いただけます。毎月のお支払いの見積もりについては、料金と使用量の一覧をご利用ください。詳しい料金情報については、Google Maps Platformの課金をご覧ください。
◯現在の API の使用量:Google Cloud Platform Console
https://console.cloud.google.com/google/maps-apis/overview?hl=ja&project=exec-api&folder=&organizationId=
◯料金と使用量の一覧:
https://cloud.google.com/maps-platform/pricing?hl=ja#matrix
◯詳しい料金情報:Google Maps Platform
https://developers.google.com/maps/billing/gmp-billing?hl=ja&_ga=2.259070794.1333406052.1614127372-60283103.1613794066
料金実績について
2020年9月&10月の実績値を示す。
料金について:
大雑把に言うと、10000回呼出しで、200ドル(無料の範囲)近く使うと思われます。
※無料の範囲で、330回/1日、API呼出が可能、100人/1日までは無料の範囲と想定されます。
※これは単なる目安の数字です、根拠はありません。()内は呼出回数
呼出すAPIの種類 | 9月 | 10月 | 1回の料金 |
---|---|---|---|
Maps API Dynamic Maps | ¥221(298) | ¥256(346) | 0.74円 |
Places API Places – Nearby Search | ¥180(53) | ¥101(30) | 3.38円 |
Geocoding API Geocoding | – | ¥43(81) | 0.53円 |
Places API Atmosphere Data | ¥32(61) | ¥20(38) | 0.52円 |
Places API Find Place | ¥36(20) | ¥16(9) | 1.80円 |
Places API Places Detailsace | ¥14(8) | ¥14(8) | 1.75円 |
Directions API Directions | – | ¥3(5) | 0.60円 |
Places API Contact Data | ¥19(59) | – | 0.32円 |
9月は¥462円、10月は¥502円の請求、もちろん$200ドル以内なので、実際の請求金額は、0円です。
例えば、
「「Nearby Search」検索等」のアプリでは、4.1円/1回でした。
「FindPlac&Details」のアプリでは、4.3円/1回でした。
APIキーの隠蔽について
GoogleMapAPIは、有料なのでAPIキーが漏れないようにすることが、大事です。
勿論、コンソールでの上限設定等は、必須ですが、キーの隠蔽も重要だと思います。
APIキーの隠蔽方法について、検討しました。
CGI(PHP)を使用して、APIキーを見えないようにします
windows.onloadイベントで非同期にGoogleMapsAPIをロードする
なお、キー自身は、環境変数に事前に設定する(httpd.confに記述)
GoogleMapAPIのロード処理は、共通関数で実施する(/mapapi.php)
○APIキーはapacheの設定ファイル(httpd.conf)で、環境変数として定義した:
#環境変数の設定:APIKEY
SetEnv GOOGLE_MAPS_API_KEY AIzaSyBQEpcpiaKeqI……….
○メインのmap.phpから,mapapi.jsをincludeする
○mapapi.jsは「onload」時に、apikey.phpを起動する
○apikey.phpにて、APIキーを環境変数から取得する
○apikey.phpは、MapsAPIのURLにキーを追加してMapsAPIをロード
著者:志村佳昭(株式会社トリニタス 技術顧問)