Delphi/C++Builderで現在の緯度経度を取得し、さらに現在位置の地図を表示する方法についてご説明します。
Table of Contents
サマリ
-
iOSやAndroidで現在の緯度経度を知ることができます。
-
地図表示には TMapView を用いる方法と、Webブラウザ経由で地図サイトを表示する方法があります。
以下の内容は、Youtube で公開済みの How to ビデオの内容に添って説明いたします。
また、本件については下記ページょの情報も併せてお読みください。
http://docwiki.embarcadero.com/RADStudio/ja/モバイル_チュートリアル:位置センサを使用する(iOS_および_Android)
使用するコンポーネント
-
TLocatioinSensor
-
TWebBrowser
-
TListBox
- ListBoxItem
緯度経度の取得
Delphi/C++Builderでは、LocationSensorのコンポーネントを用いて現在の緯度経度を知ることができます。緯度経度はGPS測位による実測に加えて近隣のWiFiアクセスポイントからも決定できますが、実際の位置決定は個々のOSの機能に基づいて行なわれます。
そして測位された緯度経度は、onLocationChanged のイベントで取得できます。
![TLocationSensorのイベント設定](https://community.embarcadero.com/uploads/10818/20170612/slide55.png
)
なお、TLocationSensor をフォームに配置した時点では、プロパティの Active が False の状態です。アプリ起動時点で TLocationSensor を有効にしたい場合は、Active = True に設定しておきます。
![TLocationSensorのプロパティ設定](https://community.embarcadero.com/uploads/10818/20170612/slide125.png
)
現在位置の地図表示(Webブラウザ使用)
LocationSensor で取得した緯度経度を用いて地図表示するWebページを TWebBrowser で表示させれば、アプリケーション内で地図表示ができます。
例えば Googleマップでは、指定した緯度経度の地図を以下のようなURLで表示可能です。
https://maps.google.com/maps?q=(Latitude-value),(Longitude-value)
では、このような処理を行うコードをDelphi/C++で実装してみることにしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<span class="hljs-function"><span class="hljs-keyword" style="color:#000080;font-weight:bold;">procedure</span> <span class="hljs-title" style="color:#0000ff;font-weight:bold;">TForm1</span>.<span class="hljs-title" style="color:#0000ff;font-weight:bold;">LocationSensor1LocationChanged</span><span class="hljs-params">(Sender: TObject; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">const</span> OldLocation, NewLocation: TLocationCoord2D)</span>;</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">var</span> GoogleMapURL_Base: <span class="hljs-keyword" style="color:#000080;font-weight:bold;">String</span>; GoogleMapURL: <span class="hljs-keyword" style="color:#000080;font-weight:bold;">String</span>; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">begin</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 特定の緯度経度の地図をGoogleMaps で開くためのURL</span> GoogleMapURL_Base := <span class="hljs-string" style="color:#0000ff;font-weight:bold;">'https://maps.google.com/maps?q=%s,%s'</span>; <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 緯度経度の情報を整形してListBoxに出力する</span> lbLatitude.ItemData.Detail := Format( <span class="hljs-string" style="color:#0000ff;font-weight:bold;">'%2.6f'</span>, [NewLocation.Latitude] ); lbLongitude.ItemData.Detail := Format( <span class="hljs-string" style="color:#0000ff;font-weight:bold;">'%3.6f'</span>, [NewLocation.Longitude] ); <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 緯度経度の情報を含めたURLを生成してTWebBrowserで開く</span> GoogleMapURL := Format( GoogleMapURL_Base, [ lbLatitude.ItemData.Detail, lbLongitude.ItemData.Detail ] ); WebBrowser1.Navigate(GoogleMapURL); <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<span class="hljs-keyword" style="color:#000080;font-weight:bold;">void</span> __fastcall TForm1::LocationSensor1LocationChanged(TObject *Sender, <span class="hljs-keyword" style="color:#000080;font-weight:bold;">const</span> TLocationCoord2D &OldLocation, <span class="hljs-keyword" style="color:#000080;font-weight:bold;">const</span> TLocationCoord2D &NewLocation) { <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 特定の緯度経度の地図をGoogleMaps で開くためのURL</span> String GoogleMapsURL_Base =<span class="hljs-string" style="color:#0000ff;font-weight:bold;">"https://maps.google.com/maps?q=%s,%s"</span>; <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 緯度経度の情報を整形してListBoxに出力する</span> lbLatitude->ItemData->Detail = String().<span class="hljs-built_in" style="color:#000080;font-weight:bold;">sprintf</span>(L<span class="hljs-string" style="color:#0000ff;font-weight:bold;">"%2.6f"</span>, NewLocation.Latitude); lbLongitude->ItemData->Detail = String().<span class="hljs-built_in" style="color:#000080;font-weight:bold;">sprintf</span>(L<span class="hljs-string" style="color:#0000ff;font-weight:bold;">"%3.6f"</span>, NewLocation.Longitude); <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 緯度経度の情報を含めたURLを生成してTWebBrowserで開く</span> TVarRec vr[] = { lbLatitude->ItemData->Detail, lbLongitude->ItemData->Detail }; WebBrowser1->Navigate(Format(GoogleMapsURL_Base, vr, <span class="hljs-number">2</span>)); } |
その他の補足事項
今回の説明では Google マップをブラウザで表示させているだけですが、もっと高機能な処理を行いたい場合は Google Maps API の利用を検討してください。
特に、今回のビデオでは説明を省略しているのですが、
TMapView のコンポーネントを用いれば、iOSとAndroidでOS標準機能n地図を用いたアプリが実装できます。ただしAndroid向けのビルドでは、Google Maps Android API の APIキーが必要です
これについては、下記2つのURLを併せてご参照ください。
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/Google_マップを使用できるよう_Android_アプリケーションを構成する
https://developers.google.com/maps/documentation/android-api/signup?hl=ja
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition