Flutter
出典:ArcGIS Maps SDK for Flutter - Tutorials - Display a map
マップを表示する
このチュートリアルでは ArcGIS Maps SDK for Flutter を使用して、マップとベースマップ レイヤーを表示する方法を紹介します。

マップには、地理データのレイヤーが含まれています。マップには、ベースマップ レイヤーと、オプションで 1 つ以上のデータ レイヤーを追加できます。
このチュートリアルでは、地形図ベースマップ レイヤーを使用して、富士山付近を表示する地図を作成します。
前提条件
このチュートリアルを実施するには、以下が必要です。
- API キーにアクセスするための ArcGIS 開発者アカウント。アカウントをお持ちでない場合は、サインアップ(無料)してください。アカウントの作成方法は「開発者アカウントの作成」をご覧ください。
- 開発環境がシステム要件を満たしており、Flutter の開発環境 が整っていることを確認します。
- Flutter 用の IDE。VS Code を推奨しています。
認証の設定
このチュートリアルで使用するセキュアな ArcGIS ロケーション サービスにアクセスするには、ArcGIS Location Platform または ArcGIS Online アカウントを使用して、API キー認証を実装する必要があります。
このチュートリアルで使用するセキュアなリソースにアクセスする権限を持つ、新しい API キーのアクセス トークンを作成します。
- API キーの作成のチュートリアルを完了し、以下の権限を持つ API キーを作成します。
- Privileges
- Location services > Basemaps
- Privileges
- API キーのアクセス トークン をコピーし、安全な場所に貼り付けます。これは後のステップで使用します。
開発またはダウンロード
このチュートリアルを完了するには、2 つの選択肢があります。
オプション 1:コードを開発する
新しい Flutter アプリを作成する
VS Code を開き、Welcome タブで [Open Folder…] を選択します。プロジェクトの場所を選んでください。
[View] > [Terminal] に進みます。
ターミナル ウィンドウで以下のコマンドを使い、display_a_map という新しい Flutter アプリを作成します。 必要なターゲット プラットフォームと 組織名 com.example.app を設定します。
flutter create -e display_a_map --platforms ios,android --org com.example.app
ArcGIS Maps SDK for Flutter を追加する
arcgis_maps パッケージに依存関係を追加します。
- VS Code のターミナルで、ディレクトリーを新しいプロジェクトに変更します。
cd display_a_map - 以下のコマンドを実行します。
dart pub add arcgis_maps - 以下のコマンドを実行します。
flutter pub upgrade - 最後に、以下のコマンドを実行します。
dart run arcgis_maps install
プラットフォーム固有の構成
プロジェクトの
android/app/build.gradle.ktsファイルを編集して、最小要件を更新します。build.gradle.ktsandroid { namespace = "com.example.app.display_a_map" compileSdk = 36 //変更 ndkVersion = "27.0.12077973" //変更 compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } defaultConfig { // TODO: 任意のアプリケーション ID を指定します (https://developer.android.com/studio/build/application-id.html). applicationId = "com.example.app.display_a_map" // アプリケーションの要件に合わせて次の値を更新します。 // 詳細については https://flutter.dev/to/review-gradle-config を参照してください。 minSdk = 28 //変更 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName }android/app/src/main/AndroidManifest.xmlに、オンライン リソースにアクセスするためのパーミッションを追加します。AndroidManifest.xml<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <!-- 追加 --> <application android:label="display_a_map" android:name="${applicationName}" android:icon="@mipmap/ic_launcher">
ios/Podfileファイルを編集して iOS 17.0 を最小に設定します。 行のコメントを解除し、バージョン番号を更新します。podfile# Uncomment this line to define a global platform for your project platform :ios, '17.0' #変更Runtimecorepod とarcgis_maps_ffipod をRunnerターゲット セクションに追加します。podfiletarget 'Runner' do use_frameworks! use_modular_headers! #変更開始 pod 'Runtimecore', :podspec => '../arcgis_maps_core/ios/Runtimecore.podspec' pod 'arcgis_maps_ffi', :podspec => '../arcgis_maps_core/ios/arcgis_maps_ffi.podspec' #変更終了 flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do inherit! :search_paths end endpod updateを使用して Pods を設定します。cd ios && pod update && cd ..
開発者資格情報を設定する
アプリ ユーザーが ArcGIS の位置情報サービスにアクセスできるようにするには、認証の設定 ステップで作成した開発者資格情報を使用して、リソースへのリクエストを認証します。
VS Codeで、
lib/main.dartを開きます。arcgis_mapsパッケージをインポートします。main.dartimport 'package:flutter/material.dart'; import 'package:arcgis_maps/arcgis_maps.dart'; //追加.main()関数で、ArcGISEnvironment.apiKey の値をアクセス トークンに設定します。main.dartvoid main() { ArcGISEnvironment.apiKey = ''; // アクセス トークンをここに記入します。 //追加 runApp(const MainApp()); }
runApp()内でMaterialAppをインスタンス化し、名前付き引数homeにMainAppのインスタンスを設定します。main.dartvoid main() { ArcGISEnvironment.apiKey = ''; // アクセス トークンをここに記入します。 ArcGISEnvironment.apiKey = apiKey; //追加 runApp( const MaterialApp(home: MainApp()) //変更 ); }
マップを追加する
地形図ベースマップ レイヤーを含む地図を作成します。 地図は富士山の付近とします。
テンプレート
MainAppクラス定義をリファクタリングして、StatefulWidgetを拡張します。StatelessWidgetキーワードにマウス カーソルを合わせて右クリックし、[Refactor…] から、[Convert to StatefulWidget] を選択してコードをリファクタリングします。ArcGIS Maps SDK for Flutter で作業していると、データの変更に応じて UI を更新するなど、アプリケーションの状態の更新が必要になることがよくあります。 ステートフル ウィジェットを実装することで、アプリはこのような状況に対応できます。 ステートレス ウィジェットの実装を使用して、単に地図を表示することも可能です。Display map サンプルをご確認ください。
main.dartclass MainApp extends StatefulWidget { //変更 const MainApp({super.key}); // 変更開始 @override State<MainApp> createState() => _MainAppState(); // 変更終了 } //追加開始 class _MainAppState extends State<MainApp> { @override Widget build(BuildContext context) { return const MaterialApp( home: Scaffold( body: Center( child: Text('Hello World!'), ), ), ); } } //追加終了_MainAppStateクラスの build メソッド内で返されるMaterialAppウィジェットを削除します。 このコードは Flutter create テンプレートによって生成されたもので、次項でマップを含むウィジェットを返すコードに置き換えられます。main.dartclass MainApp extends StatefulWidget { const MainApp({super.key}); @override State<MainApp> createState() => _MainAppState(); } class _MainAppState extends State<MainApp> { @override Widget build(BuildContext context) { // 削除開始 return const MaterialApp( home: Scaffold( body: Center( child: Text('Hello World!'), ), ), ); // 削除終了 } }_MainAppStateクラスの内部で、最後のクラス メンバー変数_mapViewControllerを定義し、ArcGISMapViewクラスのcreateController()を呼び出してArcGISMapViewControllerで初期化します。ArcGIS マップ ビュー コントローラーは、
ArcGISMapで定義された 2 次元 (2D) 地理コンテンツを表示するユーザー インタフェース コントロールです。main.dartclass _MainAppState extends State<MainApp> { final _mapViewController = ArcGISMapView.createController(); //追加 @override Widget build(BuildContext context) { } }build メソッド内で
Scaffold、Column、Expandedからなるウィジェット ツリーにArcGISMapViewウィジェットを追加します。 引数名controllerProviderをクラス メンバー変数_mapViewControllerに設定し、onMapViewReady引数を次に定義する引数と同じ名前の新しいメソッドに設定します。Scaffoldウィジェットは基本的なマテリアル デザインのビジュアル レイアウト構造を提供し、Columnウィジェットは子ウィジェットを垂直配列で表示します。ArcGISMapViewウィジェットは、サイズが制限されたウィジェット内でのみ使用できます。 サイズが制限されていない状態で使用すると、アプリケーションは例外をスローします。 たとえば、ArcGISMapViewをColumnウィジェット内で使用すると、サイズが制限されないため、このような例外が発生します。 代わりに、チュートリアルのこのステップで説明するように、ArcGISMapViewをExpandedウィジェットでラップして、適切な境界を提供することができます。main.dartclass _MainAppState extends State<MainApp> { final _mapViewController = ArcGISMapView.createController(); @override Widget build(BuildContext context) { //追加開始 return Scaffold( body: Column( children: [ Expanded( child: ArcGISMapView( controllerProvider: () => _mapViewController, onMapViewReady: onMapViewReady, ), ), ], ), ); //追加終了 } }_MainAppState内で、何も返さない新しいメソッドonMapViewReady()を定義します。main.dartclass _MainAppState extends State<MainApp> { final _mapViewController = ArcGISMapView.createController(); @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded( child: ArcGISMapView( controllerProvider: () => _mapViewController, onMapViewReady: onMapViewReady, ), ), ], ), ); } //追加開始 void onMapViewReady() { } //追加終了 }新しいメソッド内で、final 変数
mapを定義し、ArcGIS Topographic ベースマップ スタイルを持つArcGISMapインスタンスに初期化します。basemapStyleParams:BasemapStyleParametersをインスタンス化し、specificLanguage を日本語に変更します。basemap: ArcGIS Topographic ベースマップ スタイルと 生成したbasemapStyleParamsでBasemapをインスタンス化します。map:basemapでArcGISMapをインスタンス化します。
main.dartclass _MainAppState extends State<MainApp> { final _mapViewController = ArcGISMapView.createController(); @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded( child: ArcGISMapView( controllerProvider: () => _mapViewController, onMapViewReady: onMapViewReady, ), ), ], ), ); } void onMapViewReady() { //追加開始 final basemapStyleParams = BasemapStyleParameters(); basemapStyleParams.specificLanguage = "ja"; //ベースマップの言語を日本語に設定 final basemap = Basemap.withStyle(BasemapStyle.arcGISTopographic, parameters: basemapStyleParams); //ベースマップに設定を適用 final map = ArcGISMap.withBasemap(basemap); //設定したベースマップでマップを生成 //追加終了 } }ArcGIS マップ ビュー コントローラーの
arcGISMapプロパティーをmapに設定します。 さらに、setViewpoint()を呼び出して、富士山にズームします。main.dartclass _MainAppState extends State<MainApp> { final _mapViewController = ArcGISMapView.createController(); @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ Expanded( child: ArcGISMapView( controllerProvider: () => _mapViewController, onMapViewReady: onMapViewReady, ), ), ], ), ); } void onMapViewReady() { final basemapStyleParams = BasemapStyleParameters(); basemapStyleParams.specificLanguage = "ja"; //ベースマップの言語を日本語に設定 final basemap = Basemap.withStyle(BasemapStyle.arcGISTopographic, parameters: basemapStyleParams); //ベースマップに設定を適用 final map = ArcGISMap.withBasemap(basemap); //設定したベースマップでマップを生成 //追加開始 _mapViewController.arcGISMap = map; _mapViewController.setViewpoint( Viewpoint.withLatLongScale( latitude: 35.360626, longitude: 138.727363, scale: 200000.0, ), ); //追加終了 } }
アプリを実行する
- Android エミュレーター、iOS シミュレーター、または物理的なデバイスが設定され、実行されていることを確認します。
- VS Codeで、[Run] > [Run Without Debugging] を選択します。
富士山を中心に、地形図のベースマップ層が表示された地図が表示されます。地図ビューをピンチ、ドラッグ、またはダブルタップして、地図を閲覧してください。
または、以下の手順に従ってチュートリアルの解答をダウンロードすることもできます。
オプション 2:完成したソリューションをダウンロードする
- こちらをクリックしファイルをダウンロードし、コンピュータ内の任意の場所に解凍してください。
- VS Code で、プロジェクトを開いてください。
ダウンロードしたソリューションには認証情報が含まれていないため、認証の設定 セクションで作成した開発者資格情報を追加する必要があります。
ソリューションに開発者資格情報を設定する
アプリ ユーザーが ArcGIS の位置情報サービスにアクセスできるようにするには、認証の設定 ステップで作成した開発者資格情報を使用して、リソースへのリクエストを認証します。
VS Codeで、
lib/main.dartを開きます。main()関数で、ArcGISEnvironment.apiKey の値をアクセス トークンに設定します。main.dartvoid main() { ArcGISEnvironment.apiKey = ''; // アクセス トークンをここに記入します。 //追加 runApp(const MainApp()); }
アプリを実行する
以下の手順に従ってアプリケーションを実行してください。
VS Codeのターミナルで、次のコマンドを実行してください。
flutter pub upgrade実行します。
dart run arcgis_maps installAndroid エミュレーター、iOS シミュレーター、または物理的なデバイスが設定され、実行されていることを確認します。
VS Codeで、[Run] > [Run Without Debugging] を選択します。
富士山を中心に、地形図のベースマップ層が表示された地図が表示されます。地図ビューをピンチ、ドラッグ、またはダブルタップして、地図を閲覧してください。
アプリの動作が確認できたら ArcGIS の セキュリティーと認証について学びましょう!