マップ オブジェクト

マップは API で GoogleMap クラスと MapFragment クラスによって表されます。

コードサンプル

GitHub の ApiDemos リポジトリには、GoogleMap オブジェクトと SupportMapFragment の使い方を示したサンプルが含まれています。

Android アプリに地図を追加する

マップを追加するための基本的なステップは次のとおりです。

  1. (このステップは 1 回だけ実行する必要があります。)プロジェクト設定ガイドで説明するステップに従って、API を取得し、キーを取得して、必要な属性を自分の Android マニフェストに追加します。
  2. 地図を処理する ActivityFragment オブジェクトを追加します。最も簡単な方法は、<fragment> 要素を Activity のレイアウト ファイルに追加することです。
  3. OnMapReadyCallback インターフェースを実装し、onMapReady(GoogleMap) コールバック メソッドを使用して、GoogleMap オブジェクトに対するハンドルを取得します。GoogleMap オブジェクトは、マップ自体の内部表現です。マップの表示オプションを設定するには、GoogleMap オブジェクトを変更します。
  4. フラグメントで getMapAsync() を呼び出して、コールバックを登録します。

次に、各ステップの詳細を示します。

Fragment を追加する

<fragment> 要素をアクティビティのレイアウト ファイルに追加して、Fragment オブジェクトを定義します。この要素の中で、android:name 属性を "com.google.android.gms.maps.MapFragment" に設定します。これにより、MapFragment が自動的にアクティビティに追加されます。

次のレイアウト ファイルには <fragment> 要素が含まれています。

<?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="com.google.android.gms.maps.MapFragment"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

また、MapFragment をコード内の Activity に追加することもできます。これを行うには、新しい MapFragment インスタンスを追加してから、FragmentTransaction.add() を呼び出して、Fragment を現在の Activity に追加します。

 mMapFragment = MapFragment.newInstance();
     FragmentTransaction fragmentTransaction =
             getFragmentManager().beginTransaction();
     fragmentTransaction.add(R.id.my_container, mMapFragment);
     fragmentTransaction.commit();
    

マップコードを追加する

アプリ内でマップを操作するには、OnMapReadyCallback インターフェースを実装し、MapFragment または MapView オブジェクトでコールバックのインスタンスを設定する必要があります。このチュートリアルでは、アプリにマップを追加する最も一般的な方法である、MapFragment を使用します。その最初のステップは、コールバック インターフェースの実装です。

public class MainActivity extends FragmentActivity
        implements OnMapReadyCallback {
    ...
    }
    

ActivityonCreate() メソッドで、レイアウト ファイルをコンテンツ ビューとして設定します。たとえば、レイアウト ファイルの名前が main.xml の場合は、次のコードを使用します。

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ...
    }
    

FragmentManager.findFragmentById() を呼び出してフラグメントに対するハンドルを取得し、<fragment> 要素のリソース ID をそのハンドルに渡します。レイアウト ファイルをビルドすると、リソース ID R.id.map が自動的に Android プロジェクトに追加されます。

次に、getMapAsync() を使用して、フラグメントにコールバックを設定します。

MapFragment mapFragment = (MapFragment) getFragmentManager()
        .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
    

onMapReady(GoogleMap) コールバック メソッドを使用して、GoogleMap オブジェクトに対するハンドルを取得します。マップを使用できるようになると、コールバックがトリガーされます。これは、null ではない GoogleMap のインスタンスを提供します。GoogleMap オブジェクトを使用して、マップの表示オプションの設定や、マーカーの追加などを行えます。

@Override
    public void onMapReady(GoogleMap map) {
        map.addMarker(new MarkerOptions()
            .position(new LatLng(0, 0))
            .title("Marker"));
    }
    

マップ オブジェクト

Maps SDK for Android を使用すると、自分の Android アプリケーションで Google マップを表示できます。このようなマップは、モバイル Google マップ(GMM)アプリに表示されるマップと同じ外観を持ち、API によって同じ機能の多くが公開されます。GMM アプリケーションと Maps SDK for Android によって表示されるマップには、次のような 2 つの顕著な違いがあります。

  • API により表示されるマップタイルには、パーソナライズされたスマート アイコンなどのパーソナライズされたコンテンツは含まれません。
  • マップ上のすべてのアイコンをクリックできるわけではありません。たとえば、通過駅アイコンはクリックできません。ただし、ユーザーがマップに追加するマーカーはクリックできます。API には、さまざまなマーカー インタラクションのためのリスナー コールバック インターフェースが用意されています。

マッピング機能に加え、API では Android UI モデルと一貫性のある幅広いインタラクションもサポートされています。たとえば、ユーザー操作に応答するリスナーを定義して、マップとのインタラクションを設定できます。

マップ オブジェクトを操作する際に重要なクラスは GoogleMap クラスです。GoogleMap は、ご使用のアプリケーション内でマップ オブジェクトをモデル化します。UI 内では、マップは MapFragment または MapView オブジェクトで表されます。

GoogleMap によって、以下の操作が自動的に処理されます。

  • Google マップサービスに接続する。
  • マップ タイルをダウンロードする。
  • タイルを端末画面に表示する。
  • 移動やズームといった各種コントロールを表示する。
  • パン操作やズーム操作に対し、マップの移動やズームインまたはズームアウトで応答する。

これらの自動操作に加えて、API のオブジェクトとメソッドを使用してマップの動作を制御できます。たとえば、GoogleMap には、マップ上でのキーストロークやタップ操作に応答するコールバック メソッドがあります。GoogleMap に提供したオブジェクトを使用して、マップにマーカー アイコンを設定し、オーバーレイを追加することもできます。

MapFragment

Android Fragment クラスのサブクラスである MapFragment を使用すると、Android フラグメントにマップを配置できます。MapFragment オブジェクトはマップのコンテナとして機能し、GoogleMap オブジェクトへのアクセスを提供します。

View とは異なり、Fragment はアクティビティでのユーザー インターフェースの動作や部分を表すものです。1 つのアクティビティに複数のフラグメントを組み合わせて複数画面 UI をビルドしたり、複数のアクティビティでフラグメントを再利用したりできます。詳しくは、フラグメントに関する Android ドキュメントをご覧ください。

MapView

Android View クラスのサブクラス である MapView を使用すると、Android View にマップを配置できます。View は画面の長方形の領域を表し、Android アプリケーションとウィジェットの基本的な構成要素となるものです。MapFragment と同様に、MapView はマップのコンテナとして機能し、GoogleMap オブジェクトを通じて中核となるマップ機能を公開します。

完全なインタラクティブ モード で API を使用する場合、MapView クラスのユーザーはアクティビティ ライフサイクル メソッド(onCreate()onStart()onResume()onPause()onStop()onDestroy()onSaveInstanceState()onLowMemory())を MapView クラスの対応するメソッドに転送する必要があります。GitHub の ApiDemos リポジトリには、アクティビティ ライフサイクル メソッドを転送する方法を示したサンプルが含まれています。ライトモードで API を使用する場合、ライフサイクル イベントの転送は任意です。詳しくは、ライトモードのドキュメントをご覧ください。

マップタイプ

Maps SDK for Android 内では、さまざまなタイプのマップを使用できます。マップのタイプによって、マップの全体的な表現が制御されます。たとえば、地図帳には通常、境界を示すことに焦点を置いた政治的な地図が含まれていますし、道路地図には、ある都市や地域のすべての道路が示されています。

Maps SDK for Android により、次の 4 つのタイプのマップと、マップをまったく表示しないオプションが提供されます。

標準
通常の道路地図。道路、一部の人工の地物、河川など重要な自然の対象物を表示します。道路や対象物のラベルも表示されます。
ハイブリッド
航空写真データに道路地図を加えたもの。道路や対象物のラベルも表示されます。
航空写真
航空写真データ。道路や対象物のラベルは表示されません。
地形
地形学的データ。このマップには、色、等高線とラベル、起伏を表す陰影が含まれます。一部の道路とラベルも表示されます。
なし
タイルがありません。マップは、タイルがロードされない空のグリッドとしてレンダリングされます。

マップタイプを変更する

マップのタイプを設定するには、GoogleMap オブジェクトの setMapType() メソッドを呼び出し、GoogleMap で定義されているタイプ定数のいずれかを渡します。たとえば、航空写真マップを表示するには、以下のようにします。

GoogleMap map;
    ...
    // Sets the map type to be "hybrid"
    map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    

以下の画像は、同じ場所の標準、ハイブリッド、地形マップを比較したものです。

MapType の比較

インドアマップ

ズームレベルを高くすると、空港、ショッピング モール、大規模小売店、通過駅といった屋内空間の構内図がマップに表示されます。インドアマップと呼ばれるこれらの構内図は、「標準」と「航空写真」マップタイプ(GoogleMap.MAP_TYPE_NORMALGoogleMap.MAP_TYPE_SATELLITE)で表示されます。これは、ユーザーがズームインすると自動的に有効になり、マップがズームアウトされると徐々に非表示になります。

サポート終了のお知らせ: 今後のリリースでは、インドアマップは normal マップタイプでのみ利用できます。それ以降、インドアマップは satelliteterrain または hybrid マップではサポートされなくなります。インドアマップのサポートが終了しても、isIndoorEnabled() は引き続き、従来どおり setIndoorEnabled() で設定された値を返します。デフォルトでは、setIndoorEnabledtrue です。上記のマップタイプでインドアマップのサポートを終了する時期については、リリースノートでお知らせします。

インドアマップの例

API でインドアマップを使用する

API でのインドアマップの機能の概要は次のとおりです。

  • GoogleMap.setIndoorEnabled(false) を呼び出して、インドアマップを無効にできます。 デフォルトでは、インドアマップは有効になっています。インドアマップは、一度に 1 つのマップでのみ表示されます。デフォルトでは、アプリに最初に追加したマップが表示されます。異なるマップにインドアマップを表示するには、最初のマップでインドアマップを無効にしてから、2 番目のマップで setIndoorEnabled(true) を呼び出します。
  • デフォルトのレベルピッカー(階数ピッカー)を無効にするには、GoogleMap.getUiSettings().setIndoorLevelPickerEnabled(false) を呼び出します。 詳しくは、マップを操作するをご覧ください。
  • GoogleMap 上のインターフェースである OnIndoorStateChangeListener を使用すると、新しい建物がフォーカスされたか、建物内で新しいレベルがアクティブになったときに、リスナーを呼び出すように設定できます。詳しくは、マップを操作するをご覧ください。
  • GoogleMap.getFocusedBuilding() は、現在フォーカスされている建物を表示します。次に IndoorBuilding.getActiveLevelIndex() を呼び出して、現在アクティブなレベルを確認できます。IndoorBuilding オブジェクトと IndoorLevel オブジェクトで使用可能なすべての情報については、リファレンス ドキュメントをご覧ください。

基本地図のスタイル設定はインドアマップには影響しません。

構内図を追加する

インドアマップ(構内図)は、特定の場所でのみご利用いただけます。アプリケーションでハイライトしたい建物の構内図データが提供されていない場合は、以下の方法で表示できます。

  • Google マップに直接構内図を追加します。この場合、Google マップのユーザー全員が、その構内図を使用できるようになります。
  • 構内図をマップで地面オーバーレイまたはタイル オーバーレイとして表示します。この場合、アプリケーションのユーザーのみが構内図を表示できるようになります。

交通状況レイヤ

マップ上に交通量情報を重ねて表示することができます。これにより、ユーザーは地域の交通状況を視覚的に把握できるようになります。交通状況レイヤのオンとオフを切り替えるには setTrafficEnabled() メソッドを呼び出し、交通状況レイヤがオンになっているかどうかを確かめるには isTrafficEnabled() メソッドを呼び出します。次の例は、マップ上に交通状況レイヤがどのように表示されるかを示しています。

Google マップに表示される交通状況レイヤ

初期状態を設定する

Maps API を使用すると、アプリケーションのニーズに合わせてマップの初期状態を設定できます。設定できる項目は次のとおりです。

  • カメラ位置。位置、ズーム、方向指定、チルトを含みます。カメラの位置指定について詳しくは、カメラとビューをご覧ください。
  • マップタイプ。
  • ズームボタンやコンパスを画面に表示するかどうか。
  • ユーザーがカメラを操るために使用できる操作。
  • ライトモードを有効にするかどうか。ライトモード マップは、完全な API により提供される機能のサブセットをサポートするマップのビットマップ画像です。

マップの初期状態を設定するには、XML を使用するか(アクティビティのレイアウト ファイルにマップを追加した場合)、プログラムで設定します(プログラムでマップを追加した場合)。

XML 属性を使用する

このセクションでは、XML レイアウト ファイルを使用してアプリケーションにマップを追加している場合に、マップの初期状態を設定する方法について説明します。

Maps API では、MapFragment または MapView の一連のカスタム XML 属性が定義されています。ユーザーはこれを使用して、レイアウト ファイルから直接マップの初期状態を設定できます。次の属性が現在定義されています。

  • mapType。これを使用すると、表示するマップのタイプを指定できます。有効な値は、nonenormalhybridsatelliteterrain です。
  • cameraTargetLatcameraTargetLngcameraZoomcameraBearingcameraTilt。これらを使用すると、カメラの初期位置を指定できます。 カメラの位置とそのプロパティについて詳しくは、こちらをご覧ください。
  • uiZoomControlsuiCompass。これらを使用すると、マップにズーム コントロールとコンパスを表示するかどうかを指定できます。詳しくは、UiSettings をご覧ください。
  • uiZoomGesturesuiScrollGesturesuiRotateGesturesuiTiltGestures。 これらを使用すると、マップとのインタラクションのために、どの操作を有効または無効にするかを指定できます。詳しくは、UiSettings をご覧ください。
  • zOrderOnTop。マップビューのサーフェスを、ウィンドウの上に重ねて配置するかどうかを制御します。詳しくは、SurfaceView.setZOrderOnTop(boolean) をご覧ください。なお、この設定は、マップに表示できるその他すべてのビュー(ズーム コントロールや現在地ボタンなど)に適用されます。
  • useViewLifecycleMapFragment でのみ有効です。この属性は、マップのライフサイクルを、フラグメントのビューまたはフラグメント自体のいずれに紐付けするかを指定します。詳しくは、こちらをご覧ください。
  • liteModetrue の値を指定すると、マップがライトモードに設定されます。ライトモード マップは、完全な API により提供される機能のサブセットをサポートするマップのビットマップ画像です。この属性のデフォルト値は false です。

XML レイアウト ファイル内でこれらのカスタム属性を使用するには、まず次の名前空間宣言を追加する必要があります。任意の名前空間を選択でき、map である必要はありません。

xmlns:map="http://schemas.android.com/apk/res-auto"
    

次に、標準の Android 属性の場合と同様に、map: プレフィックスを付けた属性をレイアウト コンポーネントに追加できます。

次の XML コード スニペットは、カスタム オプションを指定して MapFragment を設定する方法を示しています。同じ属性を MapView にも適用できます。

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:map="http://schemas.android.com/apk/res-auto"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      android:id="@+id/map"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      map:cameraBearing="112.5"
      map:cameraTargetLat="-33.796923"
      map:cameraTargetLng="150.922433"
      map:cameraTilt="30"
      map:cameraZoom="13"
      map:mapType="normal"
      map:uiCompass="false"
      map:uiRotateGestures="true"
      map:uiScrollGestures="false"
      map:uiTiltGestures="true"
      map:uiZoomControls="false"
      map:uiZoomGestures="true"/>
    

プログラムで行う場合

このセクションでは、プログラムでアプリケーションにマップを追加している場合に、マップの初期状態を設定する方法について説明します。

MapFragment(または MapView)をプログラムで追加した場合は、オプションを指定して GoogleMapOptions オブジェクトを渡すことで、マップの初期状態を設定できます。使用可能なオプションは、XML で使用できるオプションとまったく同じです。GoogleMapOptions オブジェクトは、次のように作成します。

GoogleMapOptions options = new GoogleMapOptions();
    

続けて、次のようにオブジェクトを設定します。

options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
        .compassEnabled(false)
        .rotateGesturesEnabled(false)
        .tiltGesturesEnabled(false);
    

マップの作成時にこれらのオプションを適用するには、次のいずれかを行います。

マップのパディング

このビデオでは、マップのパディングの例を示しています。

Google マップは、コンテナ要素(通常は MapView または MapFragment)により定義された領域全体に表示されるように設計されています。マップの表示と動作には、コンテナの寸法によって定義される部分もあります。

  • カメラのターゲットは、パディングされた領域の中心を反映します。
  • マップ コントロールの位置は、マップの端からの相対位置で指定されます。
  • 著作権表示や Google ロゴなどの法的情報は、マップの下端に沿って表示されます。

GoogleMap.setPadding() メソッドを使用して、マップの四辺にパディングを追加できます。マップは引き続きコンテナ全体に表示されますが、テキストとコントロールの配置、マップの操作、カメラの移動は、より狭い空間にマップが配置されているかのように行われます。これにより、次のような変化があります。

  • API 呼び出しや、(コンパス、現在地、ズームボタンなどの)ボタン押下によるカメラの移動は、パディングされた領域を基準にして行われます。
  • getCameraPosition() は、パディングされた領域の中心を返します。
  • Projection.getVisibleRegion() は、パディングされた領域を返します。
  • - UI コントロールには、特定のピクセル数で、コンテナの端からのオフセットが指定されます。

パディングは、マップの一部と重なる UI を設計するときに役立ちます。たとえば、以下の画像では、マップの上端と右端に沿ってパディングが追加されています。マップ コントロールと法的テキストは、緑色で示されているパディングされた領域の端に沿って表示されますが、マップは引き続き、青色で示すように、コンテナ全体にわたって表示されます。この例では、マップ コントロールを目立たなくすることなく、マップの右側にメニューをフローティングさせることができます。

マップのパディング

マップをローカライズする

MapViewMapFragment をアプリに追加すると、ユーザーのデバイスの設定や位置に基づいて、マップ上のテキスト要素が適切な言語で表示されます。resConfigs 項目を Gradle ファイルに追加すると、アプリの使用言語を、サポートされているすべての言語のサブセットに制限できます。これは、使用されていない言語を取り除くのに便利であるのに加え、アプリのバイナリサイズも抑えられます。例:

defaultConfig {
        resConfigs "en", "fr", "es", "zh", "de", "ja", "ru", "ko", "pt", "in"
    }
    

詳しくは、Android アプリのローカライズをご覧ください。