SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

EDN CodeZine出張所(AD)

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

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

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

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 位置に関する詳細情報の表示

次のページ
モーションセンサーを使う

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
EDN CodeZine出張所連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9663 2021/03/25 20:34

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング