前提
この記事では以下を前提としています。
- Mapbox のアカウントは作成済みとする
- Flutter のバージョンは 3.19.0
- Dart のバージョンは 3.3.0
- 「mapbox_maps_flutter」のバージョンは 1.0.0
- 開発環境は macOS Sonoma 14.0
本記事で使用する Mapbox 公式のmapbox_maps_flutter
パッケージは現在も活発に開発が進められているようなので、この記事の内容が古くなってしまう可能性高いです。あらかじめご了承ください。
この記事のゴール
この記事では以下のように Flutter で Mapbox を使って日本語での地図表示するところまでをゴールとします。
なお、Mapbox 公式の Flutter 用パッケージは以下になります。
mapbox_maps_flutter 1.0.0
The Mapbox Maps SDK Flutter Plugin is an officially developed solution from Mapbox that enables use of our latest Maps SDK product (v11.2.0).
pub.dev
また、本記事で使用するコードは以下の Mapbox 公式のリポジトリ内にあるサンプルコードをもとにしています。
Mapbox アクセストークンについて
まずはじめに、Flutter で Mapbox を使用するためには、Mapbox のアクセストークンが必要です。そして Mapbox のアクセストークンは、パブリックトークンとシークレットトークンの2つがあります。パブリックトークンについては、以下の様に Mapbox の管理画面にログインした後に表示されるダッシュボード画面にあるDefault public token
が該当します。このpk.
から始まるパブリックトークンを後程 Flutter アプリ内で使用します。
もしデフォルトのパブリックトークンではなく、専用のパブリックトークンを作成したい場合は、次節でシークレットトークンの作成と合わせて説明します。
Mapbox のシークレットトークンを作成する
続いてパブリックトークンとは別に Mapbox の管理画面からシークレットトークンを作成する必要があります。ブラウザから Mapbox の管理画面にログインすると、以下の様にCreate a token
ボタンがあるのでこれをクリックします。以下ではすでに2つ別のアクセストークンを作成済みですが、初めての場合はDefault public token
のみが表示されていると思います。
Create a token
をクリックすると、以下の様な画面が表示されるので、Token name
のName
には任意の名前を入力し、Token scopes
には Flutter アプリで許可したい項目をチェックします。
なお、Mapbox 公式の Flutter 用パッケージであるmapbox-maps-flutter
を使うためには、Secret scopes
内にあるDOWNLOADS:READ
はチェック必須項目となります。
パブリックトークンとシークレットトークンについて
もしここでSecret scopes
に何もチェックを入れず、Public scopes
にのみチェックが入った状態で作成するとシークレットトークンではなく、パブリックトークンが作成されます。
Token name
とToken scopes
の設定が完了したら、ページ最下部にあるCreate token
ボタンをクリックして作成します。
Create token
ボタンをクリックしてアクセストークンを作成すると、以下の様にパスワード確認ダイアログが表示されるので、Mapbox アカウントのパスワードを入力してSubmit
ボタンをクリックします。
Submit
ボタンをクリックすると以下の様にアクセストークン一覧が表示され、その中にいま作成したアクセストークンのシークレットトークン(sk
から始まる文字列)が表示されます。このシークレットトークンを、コピー用のアイコンをクリックしてコピーしておきます。なお、シークレットトークンは一度しか表示されず二度と表示できないので、コピーして適切なところに保存するように注意してください。このシークレットトークンを後程使用します。
Mapbox 管理画面のダッシュボードに戻ると、以下の様に作成したアクセストークンが追加表示されていることを確認できます。
以上で、Mapbox のアクセストークンの作成は完了です。
シークレットトークンを PC に設定する
mapbox-maps-flutter
を通して Mapbox の SDK を使用するには、PC 自体に前節で取得したシークレットトークンを設定する必要があります。設定と言っても PC の特定パスにファイルを1つ作成するだけになります。iOS と Android 用それぞれについて以降に記載します。なお、
この手順も公式のドキュメントに記載されている内容です。
Android 用の設定
PC(私の場合は macOS) のパス~/.gradle/gradle.properties
に以下の内容のファイルを作成します。sk.abcdefghijklmnopqrstuvwxyz0123456789
は取得したシークレットトークンに置き換えてください。
SDK_REGISTRY_TOKEN=sk.abcdefghijklmnopqrstuvwxyz0123456789
iOS 用の設定
PC(私の場合は macOS) のパス~/.netrc
に以下の内容のファイルを作成します。sk.abcdefghijklmnopqrstuvwxyz0123456789
は取得したシークレットトークンに置き換えてください。
machine api.mapbox.com
login mapbox
password sk.abcdefghijklmnopqrstuvwxyz0123456789
以上で Android 用、iOS 用それぞれの設定が完了しました。最後に次節で権限の設定を行います。
権限を設定する
Mapbox を使うために、Android と iOS それぞれで権限を設定する必要があります。
Android の権限設定
Flutter プロジェクトルートにあるandroid/app/src/main/AndroidManifest.xml
に以下を追記します。
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 以下2つをMapbox用に追記 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<application
android:label="mapbox_maps_example"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
<activity
android:name=".MainActivity"
android:exported="true"
<!-- ...以降省略... -->
iOS の権限設定
Runner/Info.plist
に以下を追記します。
<key>NSLocationWhenInUseUsageDescription</key>
<string>マップ機能のために位置情報を使用します。</string>
以上で Flutter アプリからmapbox-maps-flutter
パッケージを使って Mapbox の SDK を使用する準備が整いました。
mapbox_maps_flutter を Flutter プロジェクトに追加する
以下を実行して、mapbox_maps_flutter
パッケージを Flutter プロジェクトに追加します。
$ flutter pub add mapbox_maps_flutter
pubspec.yaml
に以下のように追加されます。1.0.0
は執筆時点での最新バージョンです。
dependencies:
mapbox_maps_flutter: ^1.0.0
Flutter で Mapbox の地図を表示する
あとは以下の様にすることで Mapbox の地図を Flutter アプリ内で表示することができます。以下はflutter create
を実行して生成されるlib/main.dart
に Mapbox 用のウィジェットを追加、編集したものです。以下の 13-14 行目にて地図の日本語表示を指定しています。
import 'package:flutter/material.dart';
import 'package:mapbox_maps_flutter/mapbox_maps_flutter.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// Mapboxのパブリックトークンを設定する
// 実際には環境変数やシークレットマネージャーなどを使って設定する
const mapboxAccessToken = "pk.ey12334678901234567890.....";
// Mapboxのアクセストークンを設定する
MapboxOptions.setAccessToken(mapboxAccessToken);
// 日本語表示にする
MapboxMapsOptions.setLanguage("ja");
runApp(const MyApp());
// runApp(MaterialApp(home: MapWidget()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: FullMap());
}
}
class FullMap extends StatefulWidget {
const FullMap();
@override
State createState() => FullMapState();
}
class FullMapState extends State<FullMap> {
MapboxMap? mapboxMap;
// MapboxMapのマップが作成された時に呼び出される関数
_onMapCreated(MapboxMap mapboxMap) {
// Mapboxのマップ用のコントローラーを取得する
this.mapboxMap = mapboxMap;
// マップのカメラを設定する
// 以下はマップの初期状態として、東京駅周辺を中心に表示する例
mapboxMap.setCamera(CameraOptions(
center:
Point(coordinates: Position(139.7586677640881, 35.67369269880291))
.toJson(),
zoom: 14,
pitch: 0));
}
@override
Widget build(BuildContext context) {
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
return Scaffold(
appBar: AppBar(title: Text("Mapbox Maps Example")),
body: MapWidget(
key: ValueKey("mapWidget"),
onMapCreated: _onMapCreated,
));
}
}
以上でflutter run
を実行してアプリを起動すれば冒頭に載せた日本語地図が表示されるはずです。
まとめ
Flutter で Mapbox を使って日本語地図を表示しました。本記事では表示するところまでですが、よくあるマップの機能としてピンを立てたり、地名検索してマップを移動したりできます。また、地図のスタイルを変更することもできるので、興味があれば公式ドキュメントを参照してみてください。