出典:ArcGIS Maps SDK for .NET - Tutorials - Display a map
このチュートリアルでは ArcGIS Maps SDK for .NET を使用して、マップとベースマップ レイヤーを表示する方法を紹介します。
マップには、地理データのレイヤーが含まれています。マップには、ベースマップ レイヤーと、オプションで 1 つ以上のデータ レイヤーを追加できます。マップ ビューを使用し、場所とズーム レベルを設定することで、マップの特定の領域を表示できます。
このチュートリアルでは、地形 ベクタータイル ベースマップ レイヤーを使用して、富士山付近を表示する地図を作成します。
このチュートリアルのトピックの背景情報については、Mapping API and location services guide の Maps (2D) と ベースマップ を参照してください。
このチュートリアルを実施するには、以下が必要です。
必要に応じて、ArcGIS Maps SDK for .NET をインストールして、Visual Studio プロジェクト テンプレート (Windows のみ) とオフラインにコピーされた NuGet パッケージを利用することもできます。
ArcGIS Maps SDK for .NET は、Windows Presentation Framework (WPF)、Universal Windows Platform (UWP)、Windows UI Library (WinUI)、.NET MAUI 向けのアプリをサポートしています。 このチュートリアルの説明は、Visual Studio for Windows を使用して WPF .NET プロジェクトを作成する手順を説明します。
.NET API アプリを開発できるプラットフォームは、開発環境に応じて異なります。例えば、Visual Studio for Mac を使用する場合、WP Fと UWP のプロジェクトは利用できません。詳しくは、システム要件をご覧ください。
WPF アプリケーション
と入力すると、テンプレートを見つけることができます。DisplayAMap
任意のフォルダーを選択
.NET 8.0 (長期的なサポート)
を選択します。Visual Studio for Windows で開発する場合、ArcGIS Maps SDK for .NET には、サポートされる .NET プラットフォームごとにプロジェクト テンプレート セットが用意されています。これらのテンプレートは、Model-View-ViewModel(MVVM)デザイン パターンに従っています。ArcGIS Maps SDK for .NET Visual Studio Extension をインストールして、テンプレートを Visual Studio に追加します(Windows のみ)。詳細については、インストールとセットアップを参照してください。
このチュートリアルの手順は、WPF for .NET(Visual Studio 2022 以降が必要)を使用してアプリケーションを作成することに特化しています。サポートされている他の .NET プラットフォームでアプリを完成させるには、ArcGIS Maps SDK for .NET プロジェクト テンプレートの 1 つからプロジェクトを作成できます。Visual Studio テンプレートの 1 つから開始する場合、ガイドに記載されているコードとプロジェクトに含まれるコードにいくつかの違いがあることがあります。
ArcGIS Maps SDK for .NET プロジェクト テンプレートの 1 つからプロジェクトを作成した場合、必要な NuGet パッケージが既にプロジェクトに追加されています。
NuGet パッケージをインストールして、API への参照を追加します。
nuget.org
(右上)が選択されていることを確認します。Visual Studio エラー リストに The 'Esri.ArcGISRuntime.WPF' nuget package cannot be used to target 'net8.0-windows'. Target 'net8.0-windows10.0.19041.0' or later instead.
のようなエラーが表示される場合があります。その場合は、次の手順に従って対処してください。
*
ソリューション エクスプローラーで、ツリー ビューの DisplayAMap プロジェクト エントリを右クリックし、[プロジェクト ファイルの編集] を選択します。
<TargetFramework>
要素を net8.0-windows10.0.19041.0
(またはそれ以上)で更新します。
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
プロジェクト ファイル (DisplayAMap
) を保存して閉じます。
ArcGIS Online でホストされているサービス、Web マップ、および Web シーンにアクセスするには アクセストークンが必要です。
まだ取得していない場合は、ArcGIS Location Platform のダッシュボードに移動してAPI キーを取得します。作成方法は「API キーの取得」をご覧ください。 このチュートリアルでは、ロケーション サービスのベースマップの権限が有効になっている API キーが必要です。
以下では、この API キーを使用します。
ソリューション エクスプローラーで、App.xaml のノードを展開し、App.xaml.cs をダブルクリックして開きます。
App クラスで、OnStartup()
関数のオーバーライドを追加して、ArcGISRuntimeEnvironment
で ApiKey
プロパティを設定します。
API キーは、このチュートリアルの便宜上、コードに直接格納されていますが、ソース コードに API キーを格納することは、ベスト プラクティスではありません。
App.xaml.cs
public partial class App : Application
{
// 追加開始
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// 注: API キーをソース コードに保存することはベスト プラクティスではありません。
// API キーは、チュートリアルの便宜上、ここで参照されています。
Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.ApiKey = "API キー";
}
// 追加終了
}
App.xaml.cs
ファイルを保存して閉じます。
このアプリは、以降のすべてのチュートリアルで使用する基盤を構築するためのものです。堅固な設計で構築することをお勧めします。
Model-View-ViewModel (MVVM) デザイン パターンは、ユーザー インターフェイス要素 (および関連するコード) をアプリの基礎となるロジックから分離するアーキテクチャを提供します。このパターンでは、モデル
はアプリで消費されるデータを表し、ビュー
はユーザー インターフェースであり、ビューモデル
にはモデルとビューをバインド (結合) するロジックが含まれます。このようなパターンに必要な追加のフレームワークは、小規模なプロジェクトでは大変な作業に思えるかもしれませんが、プロジェクトの複雑さが増すにつれて、堅固な設計を行うことでコードの保守性と柔軟性が大幅に向上します。
MVVM で設計された ArcGIS アプリでは、通常、マップ ビューがメインのビュー コンポーネントになります。クラスの多くは、モデルの役割を果たします (データをマップ、レイヤー、グラフィックス、フィーチャなどとして表します)。 ビュー モデル コンポーネントには、ArcGIS オブジェクトを操作するためのロジックを追加したり、ビューに表示するためのデータを提供したりするため、記述するコードの多くはここになります。
すべての ArcGIS Maps SDK for .NET プロジェクト テンプレートは、MVVM デザインパターンを使用しています。
プロジェクトのビュー モデルを定義する新しいクラスを追加します。
MapViewModel.cs
と名前を付けます。必要な using
ステートメントをビュー モデルに追加します。
MapViewModel.cs
using System;
using System.Collections.Generic;
using System.Text;
// 追加開始
using Esri.ArcGISRuntime.Mapping;
using System.ComponentModel;
using System.Runtime.CompilerServices;
// 追加終了
MapViewModel クラスに INotifyPropertyChanged
インターフェイスを実装します。
このインターフェイスは、ビュー モデルのプロパティが変更されたことをクライアント (ビュー) に通知するために使用される PropertyChanged
イベントを定義します。
MapViewModel.cs
namespace DisplayAMap
{
// 変更前
// internal class MapViewModel
// 変更後
internal class MapViewModel : INotifyPropertyChanged
{
}
}
MapViewModel
クラス内に、PropertyChanged
イベントを実装するコードを追加します。
ビュー モデルのプロパティが変更されると、OnPropertyChanged の呼び出しにより、このイベントが発生します。
MapViewModel.cs
class MapViewModel : INotifyPropertyChanged
{
// 追加開始
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
// 追加終了
}
ビュー モデルに Map
オブジェクトを公開する Map
という新しいプロパティを定義します。
プロパティが設定されると、OnPropertyChanged
を呼び出します。
MapViewModel.cs
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
// 追加開始
private Map? _map;
public Map? Map
{
get { return _map; }
set
{
_map = value;
OnPropertyChanged();
}
}
// 追加終了
}
MapViewModel
クラスに SetupMap
という関数を追加します。この関数は、新しいマップを作成して Map
プロパティを設定します。
マップは、地形 ベクタータイル ベースマップを使用します。ベースマップのデフォルトのラベル表示は英語のため、日本語に変更します。
MapViewModel.cs
private Map _map;
public Map Map
{
get { return _map; }
set
{
_map = value;
OnPropertyChanged();
}
}
// 追加開始
private void SetupMap()
{
//ベースマップのラベルを日本語で表示します。
BasemapStyleParameters bsp = new BasemapStyleParameters();
bsp.SpecificLanguage = System.Globalization.CultureInfo.CreateSpecificCulture("ja");
Basemap basemap = new Basemap(BasemapStyle.ArcGISTopographic, bsp);
//地形 ベクタータイル ベースマップを使用して新しいマップを作成します。
Map = new Map(basemap);
}
// 追加終了
}
MapViewModel
が新規にインスタンス化された際に、SetupMap
関数を呼び出すコンストラクターを追加します。
MapViewModel newMapVM = new MapViewModel();
のようなコードを書くと、クラス コンストラクターが実行されます。これはクラスが初期化された時に実行する必要があるコードを追加するのに良い場所です。
MapViewModel.cs
class MapViewModel : INotifyPropertyChanged
{
// 追加開始
public MapViewModel()
{
SetupMap();
}
// 追加終了
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
これで MapViewModel
が完成しました。
MVVM デザイン パターンを使用する利点は、ビュー モデルのコードを再利用できることです。API はプラットフォーム間でほぼ標準的な API サーフェスを持っているため、1つのアプリ用に作成した ビュー モデル
のコードは、通常、サポートされているすべての .NET プラットフォームで動作します。
次に、プロジェクトに ビュー
を設定して、ビュー モデルを使用します。
MapView
コントロールは、マップを表示するために使用します。 マップ ビューをプロジェクトの UI に追加し、MapViewModel
で定義したマップを使用するように設定します。
必要な XML 名前空間とリソースを追加します。
MainWindow.xaml
を開き、XAML ビューに切り替えます。MainWindow.xaml
<Window x:Class="DisplayAMap.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DisplayAMap"
<!--追加開始-->
xmlns:esri="http://schemas.esri.com/arcgis/runtime/2013"
<!--追加終了-->
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<!--追加開始-->
<Window.Resources>
<local:MapViewModel x:Key="MapViewModel" />
</Window.Resources>
<!--追加終了-->
<Grid>
</Grid>
MapView
コントロールを MainWindow.xaml
に追加し、MapViewModel
にバインドします。
MainMapView
という名前の MapView
コントロールを定義する XAML を追加します。MapViewModel
リソースを使用しコントロールの Map
プロパティを設定します。MainWindow.xaml
<Window.Resources>
<local:MapViewModel x:Key="MapViewModel" />
</Window.Resources>
<Grid>
<!--追加開始-->
<esri:MapView x:Name="MainMapView" Map="{Binding Map, Source={StaticResource MapViewModel}}" />
<!--追加終了-->
</Grid>
ウィンドウの読み込み時にマップ ビューの視点 (ビュー ポイント) を設定します。富士山を中心にマップを表示するための、位置と縮尺を定義します。
MainWindow.xaml.cs
を開きます。 これは、MainWindow.xaml
に関連付けられたコードと、それが定義するユーザー インターフェイス要素を含むコード ビハインド ファイルです。
必要な using ステートメントを追加します。
MainWindow.xaml.cs
using System.Windows.Navigation;
using System.Windows.Shapes;
// 追加開始
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
// 追加終了
namespace DisplayAMap
{
MainWindow
のコンストラクターで、新しい Viewpoint
を定義するコードを追加し、マップ ビューに適用します。
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
// 追加開始
// マップの中心位置として設定する MapPoint を作成
MapPoint mapCenterPoint = new MapPoint(138.727363, 35.360626, SpatialReferences.Wgs84);
// マップの視点を決める Viewpoint を設定
MainMapView.SetViewpoint(new Viewpoint(mapCenterPoint, 200000.0));
// 追加終了
}
[デバッグ] メニュー > [デバッグの開始] をクリックして (またはキーボードの <F5> キーを押して) アプリを実行します。
富士山を中心に、地形 ベクタータイル ベースマップ レイヤーが追加されたマップが表示されます。マップ ビュー上でマウス ホイールをダブルクリック、ドラッグ、およびスクロールして、マップを操作します。
完成版のプロジェクトはこちらからダウンロードできます (マップの表示場所は本チュートリアルで設定した場所とは異なります)。
「Web マップの作成」のガイドで Web マップを作成している場合は、作成した Web マップも基本的に同じステップで表示できます。
Visual Studio で、マップを表示するのステップで作成したプロジェクトの MapViewModel.cs を開きます。
必要な using ステートメントを追加します。
MapViewModel.cs
using Esri.ArcGISRuntime.Portal;
using System.Threading.Tasks;
MapViewModel.cs 内の SetupMap 関数を下記のように書き換えます。
MapViewModel.cs
private async Task SetupMap()
{
// ArcGIS ポータルを作成します。URI を指定しない場合は "www.arcgis.com" を使用します。
ArcGISPortal portal = await ArcGISPortal.CreateAsync();
// アイテム ID を使用して、Web マップをポータル アイテムとして取得します。
PortalItem mapItem = await PortalItem.CreateAsync(portal, "Web マップの ID");
// ポータル アイテムからマップを作成します。
Map map = new Map(mapItem);
// マップを表示するには、マップ ビューにバインドされている MapViewModel.Map プロパティを設定します。
this.Map = map;
}
アプリの動作が確認できたら ArcGIS の セキュリティと認証について学びましょう!