CodeZine(コードジン)

特集ページ一覧

Delphiでデバイス機能をこってり使いつつマルチデバイス対応してみる

iOS/Android向けにコンポーネントでGPSや加速度センサーを簡単に使う

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2016/09/15 14:00

目次

位置情報の詳細を入手する

 アプリでは、地図上に現在位置を表示するだけでなく、詳細な緯度経度や住所情報などを取得して記録したり、関連する情報を検索したりしたいでしょう。

 そこで、今度は位置情報に関する詳細な情報を表示するようにしてみましょう。

TGeocoder

 位置情報から詳細な住所情報などを取得するのに使うのが、TGeocoderです。TGeocoderにはジオコーディング(住所から緯度経度を得る)と逆ジオコーディング(緯度経度から住所を得る)の2つの機能があります。これもTMapViewと同様にプラットフォームごとの実装をコンポーネントがカプセル化しているので、アプリケーション側は単にTGeocoderを利用するだけでiOS、Androidの両方で動くコードが作れます。

 ただしTGeocoderはコンポーネントではなくクラスで提供されているので、TGeocoderを使う場合はイベントハンドラの実装に加えてクラスやプロシジャーの宣言をコードで行います。

TListItemを使って複数の情報をリスト表示する

 取得した情報を表示するには、簡単なコンポーネントであればTLabelなどがあります。しかし、今回は表示項目数が多いとレイアウト調整の手間が掛かりそうなので、TListBoxを使用することにします。

 TListBoxは、複数の項目を持ちます。各表示項目はListBoxItemプロパティです。複数のListBoxItemを作成することで、項目を増やすことができます。

 この操作は、図のように構造ペインのメニューで行うことができます。

図5 ListBoxItemの追加

GeocodeReverseEventを実装する

 次に、TGeocoderを使って現在位置の詳細情報を取得する処理を記述します。TGeocoderの処理は以下の3か所に記述します。

1. フォームのprivate宣言部

 private宣言部に以下のようにFGeocoderオブジェクトとイベントハンドラのプロシジャーの宣言を記述します(太字箇所)。

private
 { private宣言 }
 FGeocoder: TGeocoder;
 Procedure OnGeocodeReverseEvent(const Address: TCivicAddress);

2. LocationSensorのOnLocationChangedイベントへの追加

 OnLocationChangedで取得した位置情報をTGeocoderに引き渡す処理を以下のように記述します(太字箇所)。

procedure TForm1.LocationSensor1LocationChanged(Sender: TObject;
  const OldLocation, NewLocation: TLocationCoord2D);
begin
  // 地図の現在位置情報を書き換える。
  MapView1.Location := TMapCoordinate.Create(
    NewLocation.Latitude, NewLocation.Longitude );
 
  // 現在の緯度経度に対応する住所を取得するための一連の処理。
  if not Assigned(FGeocoder) then
  begin
    if Assigned(TGeocoder.Current) then
      FGeocoder := TGeocoder.Current.Create;
    if Assigned(FGeocoder) then
      FGeocoder.OnGeocodeReverse := OnGeocodeReverseEvent;
  end;
   
  if Assigned(FGeocoder) and not FGeocoder.Geocoding then
    FGeocoder.GeocodeReverse(NewLocation);
end;

3. OnGeocodeReverseEventイベントに対応するイベントハンドラの作成

OnGeocodeReverseEventイベントが発生したら、取得できた住所情報を表示するための処理を記述します。

procedure TForm1.OnGeocodeReverseEvent( const Address: TCivicAddress );
begin
  // 緯度経度から現在位置の住所が取得できた場合は表示を更新する。
  ListBoxItem1.ItemData.Detail := Address.AdminArea;
  ListBoxItem2.ItemData.Detail := Address.CountryCode;
  ListBoxItem3.ItemData.Detail := Address.CountryName;
  ListBoxItem4.ItemData.Detail := Address.FeatureName;
  ListBoxItem5.ItemData.Detail := Address.Locality;
  ListBoxItem6.ItemData.Detail := Address.PostalCode;
  ListBoxItem7.ItemData.Detail := Address.SubAdminArea;
  ListBoxItem8.ItemData.Detail := Address.SubLocality;
  ListBoxItem9.ItemData.Detail := Address.SubThoroughfare;
  ListBoxItem10.ItemData.Detail := Address.Thoroughfare;
end;

 以上で、図のように詳細な情報が表示されるようになります。

図6 位置に関する詳細情報の表示

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • EDN編集部(イーディーエヌ編集部)

    エンバカデロ・デベロッパーネットワーク(EDN)は、ソフトウェア開発者とデータベース技術者のための技術情報サイトです。Delphi、C++Builderをはじめとする開発ツールやER/Studioなどのデータベースツールに関連する技術記事、ビデオなどを提供しています。EDN編集部は、EDN記事と連携...

バックナンバー

連載:EDN CodeZine出張所

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5