このページでは、Maps 3D SDK for Android を使用して Android アプリに基本的な 3D 地図を追加する方法の例について説明します。このページの手順では、 セットアップ ページの手順を完了し、 次のものが用意されていることを 前提としています。
- Maps 3D SDK for Android が有効になっている Google Cloud プロジェクト
- Maps 3D SDK for Android で使用するように構成された API キー
- Maps 3D SDK for Android で使用するように設定された Android Studio プロジェクト
これらの前提条件の詳細については、 セットアップをご覧ください。
パート 1: レイアウト ファイル(activity_main.xml)を更新して Map3DView コンポーネントを追加する
Map3DView コンポーネントは、アプリ内で 3D
地図をレンダリングするビューです。次の手順では、コンポーネントを追加し、カメラの位置や関連する属性など、地図の初期状態を構成します。
メイン アクティビティのレイアウト ファイルを開きます。通常は
app/src/main/res/layout/activity_main.xmlにあります。ルートの
ConstraintLayout(またはルート レイアウト要素)にmap3dXML 名前空間を追加します。xmlns:map3d="http://schemas.android.com/apk/res-auto"「Hello World!」と表示されるデフォルトの
<TextView>を削除します。レイアウトに
Map3DViewコンポーネントを追加します。カメラの位置やその他の属性をカスタマイズできます。<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:map3d="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.gms.maps3d.Map3DView android:id="@+id/map3dView" android:layout_width="match_parent" android:layout_height="match_parent" map3d:mapMode="hybrid" map3d:centerLat="38.544012" map3d:centerLng="-107.670428" map3d:centerAlt="2427.6" map3d:heading="310" map3d:tilt="63" map3d:range="8266" map3d:roll="0" map3d:minAltitude="0" map3d:maxAltitude="1000000" map3d:minHeading="0" map3d:maxHeading="360" map3d:minTilt="0" map3d:maxTilt="90" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
パート 2: MainActivity.kt を更新する
次の手順では、パート 1 で activity_main.xml ファイルに追加した Map3DView
コンポーネントを初期化し、コンポーネントのライフサイクル イベントを管理します。
Maps 3D SDK for Android では、一度に 1 つのアクティブな Map3DView
インスタンスのみがサポートされます。複数の Map3DView
インスタンスを同時に表示する(同じレイアウト、異なる表示アクティビティ、フラグメントなど)ことはサポートされていません。また、セカンダリ
ビューに黒い画面が表示されるなど、レンダリングの問題が発生する可能性があります。
さらに、すべての Map3DView は同じ地図の状態(
カメラの位置、追加されたマーカー、ポリゴンなど)を共有して反映します。これは、
手動でクリアしない限り、1
つの Map3DView が破棄(onDestroy を使用)されて別の が作成された場合でも保持されます。たとえば、Map3DView1 にマーカーを追加してから破棄して Map3DView2
を作成した場合、同じマーカーが Map3DView2 にも表示されます。
開発者の責任:
- 一度に 1 つのビュー:常に 1 つの
Map3DViewのみがビュー階層のアクティブな部分にあるようにします。 - 手動クリーンアップ: 1 つの
Map3DView(Map3DView1など)から別の(Map3DView2など)に切り替える場合は、古いインスタンス(Map3DView1)でonDestroy()を呼び出す必要があります。基盤となる地図の状態は共有されるため、Map3DView2が新しい状態または特定の状態から開始されるようにするには、Map3DView1によって設定された状態を手動でクリアする必要があります。これには、マーカーやオーバーレイの削除、OnMap3DViewReadyCallbackで取得したGoogleMap3Dオブジェクトを使用したカメラの位置のリセットなどが含まれます。
MainActivity.ktファイルを開きます。通常はapp/src/main/java/com/example/yourpackagename/MainActivity.ktにあります。Maps 3D SDK for Android に必要なインポートを追加します。
import android.util.Log import com.google.android.gms.maps3d.GoogleMap3D import com.google.android.gms.maps3d.Map3DView import com.google.android.gms.maps3d.OnMap3DViewReadyCallbackMainActivityクラスを変更してOnMap3DViewReadyCallbackを実装します。class MainActivity : AppCompatActivity(), OnMap3DViewReadyCallback {Map3DViewとGoogleMap3Dの変数を宣言します。private lateinit var map3DView: Map3DView private var googleMap3D: GoogleMap3D? = nullonCreateメソッドで、setContentView(...)とViewCompat.setOnApplyWindowInsetsListenerブロックの後にmap3DViewを初期化し、そのonCreateライフサイクル メソッドを呼び出して、地図を非同期でリクエストします。override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(R.layout.activity_main) ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets } map3DView = findViewById(R.id.map3dView) map3DView.onCreate(savedInstanceState) map3DView.getMap3DViewAsync(this) }onMap3DViewReadyメソッドとonErrorメソッドをオーバーライドします。これらのコールバックは、地図を使用できる状態になったとき、または初期化中にエラーが発生したときにトリガーされます。override fun onMap3DViewReady(googleMap3D: GoogleMap3D) { // Interact with the googleMap3D object here this.googleMap3D = googleMap3D // You can now make calls to the googleMap3D object, e.g., // googleMap3D.flyTo(camera { ... }) } override fun onError(error: Exception) { // Handle the error gracefully here (for example, show an error dialog or log the error). Log.e("MainActivity", "Error loading 3D map", error) }次のオーバーライドを
MainActivityに追加して、Activity からMap3DViewにライフサイクル イベントを転送します。override fun onStart() { super.onStart() map3DView.onStart() } override fun onResume() { super.onResume() map3DView.onResume() } override fun onPause() { map3DView.onPause() super.onPause() } override fun onStop() { map3DView.onStop() super.onStop() } override fun onDestroy() { map3DView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) map3DView.onSaveInstanceState(outState) } override fun onLowMemory() { super.onLowMemory() map3DView.onLowMemory() }
パート 3: Gradle を同期して実行する
アプリのレイアウトとアクティビティを更新したので、アプリをビルドして実行し、3D 地図ビューを表示できます。
プロジェクトを Gradle と同期するには、[File] > [Sync Project with Gradle Files] を選択します。
エミュレータまたは実機でアプリをビルドして実行するには、[Run] > [Run] を選択します。
すべて正しく構成されていれば、activity_main.xml で指定した座標付近に中心が設定された 3D 地図がアプリに表示されます。
地図の読み込みとエラーの状態
Maps 3D SDK for Android は、地図の状態を管理しながら、組み込みの視覚的なフィードバックを自動的に表示します。
- 読み込みオーバーレイ: 地図ビューが最初に初期化されたとき、または最初のビューポートを読み込んでいるときに、中央に進行状況インジケーターが表示されます。
- エラー オーバーレイ: 無効な API キー、ネットワーク エラー、サポートされていないデバイスでの実行など、重大なエラーが発生した場合は、スタイル設定されたエラーカードが表示されます。
これらの初期化エラーまたは読み込みエラーは、
onError(error:
Exception)
を
OnMap3DViewReadyCallback
実装内でオーバーライドすることで、プログラムでキャプチャできます。
地図のクリック イベントをリッスンする
地図のクリック イベントをリッスンするには、
setMap3DClickListener
で
GoogleMap3Dを呼び出します。
ユーザーが地図をクリックすると、
onMap3DClick
コールバックは、クリックしたポイントの
location
と
placeId
を提供する
Map3DClickEvent
オブジェクトを受け取り、Booleanを返します(デフォルトの
プレイス UI ウィジェットを非表示にする場合はtrue、表示する場合はfalse)。詳細については、
スポットを操作するをご覧ください。
次の例は、地図のクリック リスナーを設定する方法を示しています。
googleMap3D.setMap3DClickListener { event: Map3DClickEvent ->
Log.d(
"MainActivity",
"Clicked at ${event.location}, placeId: ${event.placeId}"
)
false
}
次のステップ
アプリに基本的な 3D 地図を追加したので、Maps 3D SDK for Android の 高度な機能( カメラパス アニメーション、 3D マーカー、 ポリゴンなど)について学習できます。