
このページでは、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:mode="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 を使用)されて別の Map3DView が作成されても保持されます。たとえば、Map3DView1 にマーカーを追加してから、それを破棄して Map3DView2 を作成した場合、同じマーカーが Map3DView2 にも存在します。
デベロッパーの責任:
- 一度に 1 つのビュー: 任意の時点で、ビュー階層のアクティブな部分に
Map3DViewが 1 つだけ存在するようにします。 - 手動クリーンアップ: 1 つの
Map3DView(Map3DView1など)から別のMap3DView(Map3DView2など)に切り替える場合は、古いインスタンス(Map3DView1)でonDestroy()を呼び出す必要があります。基盤となる地図の状態は共有されるため、Map3DView2が新しい状態または特定の状態から開始されるように、Map3DView1によって設定された状態を手動でクリアする必要があります。これには、マーカーやオーバーレイなどの削除、OnMap3DViewReadyCallbackで取得したGoogleMap3Dオブジェクトを使用したカメラ位置のリセットが含まれます。
通常は
app/src/main/java/com/example/yourpackagename/MainActivity.ktにあるMainActivity.ktファイルを開きます。Maps 3D SDK for Android に必要なインポートを追加します。
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メソッドをオーバーライドします。このコールバックは、マップを使用できる状態になるとトリガーされます。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.cameraController.flyTo(camera { ... }) }次のオーバーライドを
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] を選択します。
すべてが正しく構成されていれば、アプリに 3D 地図が表示され、activity_main.xml で指定した座標付近が中心に表示されます。
次のステップ
アプリに基本的な 3D 地図を追加したので、カメラパス アニメーション、3D マーカー、ポリゴンなど、Maps 3D SDK for Android のより高度な機能を試してみましょう。
地図のクリック イベントをリッスンする
地図上のクリック イベントをリッスンするには、GoogleMap3D.setMap3DClickListener を使用します。このリスナーは、ユーザーが地図をクリックしたときにトリガーされ、クリックされたポイントの位置情報とプレイス ID を提供します。
次の例は、地図のクリック リスナーを設定する方法を示しています。
googleMap3D.setMap3DClickListener { location, placeId ->
lifecycleScope.launch(Dispatchers.Main) {
if (placeId != null) {
Toast.makeText(this@MainActivity, "Clicked on place with ID: $placeId", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@MainActivity, "Clicked on location: $location", Toast.LENGTH_SHORT).show()
}
}
}
クリック ハンドラは Main(または UI)スレッドで実行されないことに注意してください。UI を変更する場合(トースト メッセージの表示など)は、メインスレッドに切り替える必要があります。Kotlin の場合は、lifecycleScope.launch(Dispatchers.Main) を使用してこれを行うことができます。