位置情報の詳細を入手する
アプリでは、地図上に現在位置を表示するだけでなく、詳細な緯度経度や住所情報などを取得して記録したり、関連する情報を検索したりしたいでしょう。
そこで、今度は位置情報に関する詳細な情報を表示するようにしてみましょう。
TGeocoder
位置情報から詳細な住所情報などを取得するのに使うのが、TGeocoderです。TGeocoderにはジオコーディング(住所から緯度経度を得る)と逆ジオコーディング(緯度経度から住所を得る)の2つの機能があります。これもTMapViewと同様にプラットフォームごとの実装をコンポーネントがカプセル化しているので、アプリケーション側は単にTGeocoderを利用するだけでiOS、Androidの両方で動くコードが作れます。
ただしTGeocoderはコンポーネントではなくクラスで提供されているので、TGeocoderを使う場合はイベントハンドラの実装に加えてクラスやプロシジャーの宣言をコードで行います。
TListItemを使って複数の情報をリスト表示する
取得した情報を表示するには、簡単なコンポーネントであればTLabelなどがあります。しかし、今回は表示項目数が多いとレイアウト調整の手間が掛かりそうなので、TListBoxを使用することにします。
TListBoxは、複数の項目を持ちます。各表示項目はListBoxItemプロパティです。複数の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;
以上で、図のように詳細な情報が表示されるようになります。