mapbox-android-patterns について
Kotlin、Jetpack Compose、Viewシステムで地図アプリを開発するAndroid開発者向けに、Mapbox Maps SDK v11の連携パターンをまとめたスキルです。地図設定、注釈、位置表示、独自データ、操作に加え、性能とライフサイクルの指針も扱います。
主な機能
- 01Jetpack ComposeとViewシステムでの初期化
- 02マーカーと注釈の追加
- 03ユーザー位置表示とカメラ追従
- 04GeoJSON独自データの読み込み
- 05地図スタイルと操作の処理
- 06注釈の性能とライフサイクル管理
活用シーン
- 01AndroidアプリへのMapbox地図の組み込み
- 02場所を示すマーカーの追加
- 03地図上でのユーザー位置の表示
- 04地図上の要素タップやジェスチャーの処理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mapbox/ mapbox-agent-skills --skill mapbox-android-patternsインストール後、Claude Code で/mapbox-android-patternsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdevals/evals.jsonreferences/annotations.mdcamera-styles.mdcompose.mdcustom-data.mdinteractions.mdlocation-tracking.md詳細
Mapbox Android 統合パターン
Kotlin、Jetpack Compose、View システムを使用して Android に Mapbox Maps SDK v11 を統合するための公式パターンです。
次のような場合に使用してください:
- Android 用 Mapbox Maps SDK のインストールと設定
- マップへのマーカーやアノテーションの追加
- ユーザーの位置情報の表示と、カメラによる追跡
- マップへのカスタムデータ(GeoJSON)の追加
- マップスタイル、カメラ、またはユーザー操作の扱い
- フィーチャーの操作とタップの処理
公式リソース:
インストールとセットアップ
要件
- Android SDK 21+
- Kotlin または Java
- Android Studio
- 無料の Mapbox アカウント
ステップ 1:アクセストークンを設定する
app/res/values/mapbox_access_token.xml を作成します:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="mapbox_access_token" translatable="false"
tools:ignore="UnusedResources">YOUR_MAPBOX_ACCESS_TOKEN</string>
</resources>
トークンの取得: mapbox.com にサインインしてください。
ステップ 1b:インターネット権限(必須)
マップにはネットワークアクセスが必要です。これを AndroidManifest.xml に含めてください。エージェントはこれを省略し、後から位置情報の権限だけを列挙することがよくあります:
<uses-permission android:name="android.permission.INTERNET" />
ステップ 2:Maven リポジトリを追加する
settings.gradle.kts に追加します:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://api.mapbox.com/downloads/v2/releases/maven")
}
}
}
ステップ 3:依存関係を追加する
モジュールの build.gradle.kts に追加します:
android {
defaultConfig {
minSdk = 21
}
}
dependencies {
implementation("com.mapbox.maps:android:11.18.1")
}
Jetpack Compose の場合:
dependencies {
implementation("com.mapbox.maps:android:11.18.1")
implementation("com.mapbox.extension:maps-compose:11.18.1")
}
マップの初期化
Jetpack Compose パターン
基本的なマップ:
import androidx.compose.runtime.*
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Modifier
import com.mapbox.maps.extension.compose.*
import com.mapbox.maps.Style
import com.mapbox.geojson.Point
@Composable
fun MapScreen() {
MapboxMap(
modifier = Modifier.fillMaxSize()
) {
// Initialize camera via MapEffect (Style.STANDARD loads by default)
MapEffect(Unit) { mapView ->
// Set initial camera position
mapView.mapboxMap.setCamera(
CameraOptions.Builder()
.center(Point.fromLngLat(-122.4194, 37.7749))
.zoom(12.0)
.build()
)
}
}
}
装飾要素を含む場合:
MapboxMap(
modifier = Modifier.fillMaxSize(),
scaleBar = {
ScaleBar(
enabled = true,
position = Alignment.BottomStart
)
},
compass = {
Compass(enabled = true)
}
) {
// Style.STANDARD loads by default
}
View システムのパターン
レイアウト XML(activity_map.xml):
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.mapbox.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
アクティビティ:
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.mapbox.maps.MapView
import com.mapbox.maps.Style
import com.mapbox.geojson.Point
class MapActivity : AppCompatActivity() {
private lateinit var mapView: MapView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)
mapView = findViewById(R.id.mapView)
mapView.mapboxMap.setCamera(
CameraOptions.Builder()
.center(Point.fromLngLat(-122.4194, 37.7749))
.zoom(12.0)
.build()
)
mapView.mapboxMap.loadStyle(Style.STANDARD)
}
override fun onStart() {
super.onStart()
mapView.onStart()
}
override fun onStop() {
super.onStop()
mapView.onStop()
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
}
マーカーを追加する(ポイントアノテーション)
ポイントアノテーションは、マップ上に位置を示すための最も一般的な方法です。
Jetpack Compose:
MapboxMap(modifier = Modifier.fillMaxSize()) {
MapEffect(Unit) { mapView ->
// Load style first
mapView.mapboxMap.loadStyle(Style.STANDARD)
// Create annotation manager and add markers
val annotationManager = mapView.annotations.createPointAnnotationManager()
val pointAnnotation = PointAnnotationOptions()
.withPoint(Point.fromLngLat(-122.4194, 37.7749))
.withIconImage("custom-marker")
annotationManager.create(pointAnnotation)
}
}
// Note: Compose doesn't have declarative PointAnnotation component
// Markers must be added imperatively via MapEffect
View システム:
// Create annotation manager (once, reuse for updates)
val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()
// Create marker
val pointAnnotation = PointAnnotationOptions()
.withPoint(Point.fromLngLat(-122.4194, 37.7749))
.withIconImage("custom-marker")
pointAnnotationManager.create(pointAnnotation)
複数のマーカー:
val locations = listOf(
Point.fromLngLat(-122.4194, 37.7749),
Point.fromLngLat(-122.4094, 37.7849),
Point.fromLngLat(-122.4294, 37.7649)
)
val annotations = locations.map { point ->
PointAnnotationOptions()
.withPoint(point)
.withIconImage("marker")
}
pointAnnotationManager.create(annotations)
ユーザーの位置情報を表示する
ステップ 1:AndroidManifest.xml に権限を追加します:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
ステップ 2:権限をリクエストして位置情報を表示します:
// Request permissions first (use ActivityResultContracts)
// Show location puck
mapView.location.updateSettings {
enabled = true
puckBearingEnabled = true
}
パフォーマンスに関するベストプラクティス
アノテーションマネージャーを再利用する
// Don't create new managers repeatedly
// val manager = mapView.annotations.createPointAnnotationManager() // each call
// Create once, reuse
val pointAnnotationManager = mapView.annotations.createPointAnnotationManager()
fun updateMarkers() {
pointAnnotationManager.deleteAll()
pointAnnotationManager.create(markers)
}
アノテーションの更新をまとめて行う
// Create all at once
pointAnnotationManager.create(allAnnotations)
// Don't create one by one in a loop
ライフサイクルを管理する
// Always call lifecycle methods
override fun onStart() {
super.onStart()
mapView.onStart()
}
override fun onStop() {
super.onStop()
mapView.onStop()
}
override fun onDestroy() {
super.onDestroy()
mapView.onDestroy()
}
標準スタイルを使用する
// Standard style is optimized and recommended
Style.STANDARD
// Use other styles only when needed for specific use cases
Style.STANDARD_SATELLITE // Satellite imagery
トラブルシューティング
マップが表示されない
確認項目:
mapbox_access_token.xml内のトークン- トークンが有効であること(mapbox.com でテスト)
- Maven リポジトリが設定されていること
- 依存関係が正しく追加されていること
- マニフェストにインターネット権限があること
スタイルが読み込まれない
mapView.mapboxMap.subscribeStyleLoaded { _ ->
Log.d("Map", "Style loaded successfully")
// Add layers and sources here
}
パフォーマンスの問題
Style.STANDARDを使用する(推奨されており、最適化されています)- 表示範囲内のアノテーション数を制限する
- アノテーションマネージャーを再利用する
- スタイルの頻繁な再読み込みを避ける
- ライフサイクルメソッド(onStart、onStop、onDestroy)を呼び出す
- アノテーションの更新をまとめて行う
参照ファイル
特定のトピックについて詳しいパターンが必要な場合は、次の参照ファイルを読み込んでください。
references/compose.md-- Jetpack Compose:依存関係、トークンの設定、MapboxMap、クリック対応アノテーション、GeoJSON、MapEffectreferences/annotations.md-- Circle、Polyline、Polygon アノテーションのパターンreferences/location-tracking.md-- ユーザーの位置情報へのカメラ追従+現在地の一度だけの取得references/custom-data.md-- GeoJSON ソースとレイヤー:ライン、ポリゴン、ポイント、更新/削除references/camera-styles.md-- カメラ制御(設定、アニメーション、表示範囲への調整)+マップスタイル(組み込みおよびカスタム)references/interactions.md-- フィーチャーセットの操作、カスタムレイヤーのタップ、長押し、ジェスチャー