※本記事は、連載記事「.NET SDK アプリ構築」の第 8 回目の記事です。
前回 (第7回) の記事では、地図上に表示している物件データを物件の築年数を使用してフィルター表示をする方法を紹介しました。今回は、ArcGIS Online のジオプロセシング サービスを利用して、指定した位置から徒歩 で 10 分以内に到達できる範囲を算出する方法を紹介します。
到達圏とは
ある地点から特定の条件でアクセス可能なすべての道路およびその領域を指します。
ArcGIS Runtime SDK for .NET では、ArcGIS Online や ArcGIS for Server のジオプロセシング サービスを利用して、道路ネットワークを考慮した到達圏を算出できます。

到達圏解析機能を実装するための手順の概要
ArcGIS Runtime SDK for .NET を使用して、ArcGIS Online や ArcGIS for Sever のジオプロセシング サービスを利用した到達圏解析を実行するには Geoprocessor クラスを使用します。
到達圏解析を実装するための手順は以下の通りです。
1.Geoprocesseeor クラスを初期化します。
Geoprocessor serviceAreaGp = new Geoprocessor("ジオプロセシング サービスの URL"); 2.到達圏解析用のパラメーターを作成します。
GPInputParameter parameter = new GPInputParameter(); parameter.GPParameters.Add(new GPFeatureRecordSetLayer("facilities", e.Location)); parameter.GPParameters.Add(newGPString("break_values","10")); parameter.GPParameters.Add(new GPString("env:outSR", "102100")); parameter.GPParameters.Add(new GPString("travel_mode", "Walking")); 3.到達圏解析を実行します。
GPJobInfo result = await serviceAreaGp.SubmitJobAsync(parameter);
4.解析結果に対して地図上に表示するなどの処理を実行します。
GPParameter resultData = await serviceAreaGp.GetResultDataAsync(result.JobID, "Service_Areas"); //取得した結果に対する処理を実行
では上記の処理の流れを、サンプル アプリケーションのソース コードの Step_8 プロジェクトを参照しながら確認していきます。
解析ボタンとクリアボタンへのクリック イベント ハンドラーの追加
到達圏解析の機能を実装する前に、ユーザーが到達圏解析の機能を呼び出せるように、UI 機能を追加しておきます。Step_8 プロジェクトではすでに MainWindow.xaml に追加されている解析ボタンとクリアボタンに、ボタンをクリックした際のイベント ハンドラ-が追加されているので確認します。
[MainWindow.xaml]
<!--到達圏解析メニュー--> <TextBlock Grid.Column="0" Grid.Row="1" Text="到達圏解析:" VerticalAlignment="Center" HorizontalAlignment="Right" /> <StackPanel x:Name="analyzePanel" Grid.Column="1" Grid.Row="1" Orientation="Horizontal"> <Button x:Name="analyzeButton" Content="解析" Height="25" Width="75" Click="analyzeButton_Click" /> <Button x:Name="clearResultButton" Content="クリア" Height="25" Width="75" Margin="10,0,0,0" Click="clearResultButton_Click" /> </StackPanel>
解析ボタン(analyzeButton)には、analyzeButton_Click イベント ハンドラ-、クリアボタン(clearResultButton)には、clearResultButton _Click イベント ハンドラ-が追加されています。また MainWindow.xaml.cs にも追加されたイベント ハンドラ-に対応する関数が追加されています。
到達圏解析の結果表示用レイヤーの追加
到達圏解析の結果を地図上に表示(描画)するためのレイヤーを追加します。
まず、到達圏解析結果表示用レイヤーが、到達圏解析の中心点(ポイント データ)と到達圏解析の結果(ポリゴン データ)の表示に使用するためのシンボルをアプリケーションのリソースとして定義します。
[MainWindow.xaml]
<Grid.Resources> <!--住所検索結果用シンボル--> <esri:SimpleMarkerSymbol x:Key="redMarkerSymbol" Style="Circle" Size="12" Color="Red" /> <!--住所検索結果用レンダラ--> <esri:SimpleRenderer x:Key="redMarkerRenderer" Symbol="{StaticResource redMarkerSymbol}" /> <!--到達圏解析中心位置用シンボル--> <esri:SimpleMarkerSymbol x:Key="greenMarkerSymbol" Style="Cross" Size="12" Color="Green" /> <!--到達圏エリア用シンボル--> <esri:SimpleFillSymbol x:Key="greenFillSymbol" Color="#3300FF00" /> </Grid.Resources>到達圏の中心点には、SimpleMarkerSymbol クラスを使用して緑色でサイズが 12 の十字のシンボルを定義します。一方、到達圏解析の結果ポリゴンには、SimpleFillSymbol クラスを使用して薄い緑色のシンボルを定義します。
到達圏解析結果表示用レイヤーが使用するシンボルを定義したら、Map クラスに到達圏解析結果表示用レイヤーを追加します。
[MainWindow.xaml]
<!--マップ--> <esri:Map InitialViewpoint="15539982.3500528, 4257132.45180773, 15545386.0541707, 4262306.70411199"> <!--背景地図レイヤ--> <esri:ArcGISTiledMapServiceLayer ID="BaseMap" ServiceUri=" http://services.arcgisonline.com/arcgis/rest/services/World_Topo_Map/MapServer " /> <!--物件フィーチャレイヤ--> <esri:FeatureLayer ID="BuildingLayer"> <esri:FeatureLayer.FeatureTable> <esri:ServiceFeatureTable OutFields="*" ServiceUri="{StaticResource BuildingLayerURL}" /> </esri:FeatureLayer.FeatureTable> </esri:FeatureLayer> <!--到達圏解析結果表示用グラフィックスレイヤ--> <esri:GraphicsLayer ID="ServiceAreaResultLayer" /> <!--住所検索結果表示用グラフィックスレイヤ--> <esri:GraphicsLayer ID="GeocodingResultLayer" Renderer="{StaticResource redMarkerRenderer}" /> </esri:Map>メンバー変数の定義
MainWindow.xaml.cs に到達圏解析機能で使用する以下の 4 つのメンバー変数を定義します。
- SERVICE_AREA_GP_URL
ArcGIS Online の到達圏解析ジオプロセシング サービスの URLです。ArcGIS for Developers の開発者はこのクラウド サービスを利用して到達圏解析を実行することができます。 - serviceAreaGp
到達圏解析を実行するための Geoprocessror クラスです。 - serviceAreaResultLayer
到達圏解析の結果を表示するための GraphicsLayer クラスです。 - serviceAreaGraphic
到達圏解析の結果グラフィック(Graphic クラス)です。
[MainWindow.xaml.cs]
//ArcGIS Online 到達圏解析ジオプロセシング サービスの URL private const string SERVICE_AREA_GP_URL = " http://logistics.arcgis.com/arcgis/rest/services/World/ServiceAreas/GPServer/GenerateServiceAreas "; private Geoprocessor serviceAreaGp; //到達圏解析用のジオプロセシング タスク private GraphicsLayer serviceAreaResultLayer; //到達圏解析結果表示用のグラフィックスレイヤ private Graphic serviceAreaGraphic; //到達圏グラフィック
到達圏解析の結果表示用レイヤーの取得
メンバー変数として定義した serviceAreaResultLayer から MainWindow.xaml で Map クラスに追加した GraphicsLayer クラスを参照し、コードビハインドから Map クラス内の到達圏結果表示用レイヤーにアクセスできるようにしておきます。 Step_2 プロジェクトで追加した mainMapView_Loaded イベント ハンドラ-内において、すべてのレイヤーが読み込まれた後に到達圏解析結果表示用レイヤーを取得します。
[MainWindow.xaml.cs]
private async void mainMapView_Loaded(object sender, RoutedEventArgs e) { //マップ内のすべてのレイヤが読み込まれるまで待機 await mainMapView.LayersLoadedAsync(); //住所検索結果表示用のグラフィックスレイヤを取得 geocodeResultGraphicsLayer = mainMapView.Map.Layers["GeocodingResultLayer"] as GraphicsLayer; //物件フィーチャレイヤを取得 buildingLayer = mainMapView.Map.Layers["BuildingLayer"] as FeatureLayer; //到達圏解析結果表示用のグラフィックスレイヤを取得 serviceAreaResultLayer = mainMapView.Map.Layers["ServiceAreaResultLayer"] as GraphicsLayer; //マップ操作が可能な状態に変更 isMapReady = true; }以上で到達圏解析を実行するための準備が整ったので、次の手順からは前述した到達圏解析機能を実装する手順を確認していきます。
Geoprocessor クラスの初期化
コンストラクター内でメンバー変数として定義した Geoprocessor クラスを初期化します。初期化時のパラメーターとして ArcGIS Online の到達圏解析ジオプロセシング サービスの URL を指定します。Geoprocessor クラスが到達圏解析のリクエストを発行する際にこの URL が使用されます。
[MainWindow.xaml.cs]
public MainWindow() { InitializeComponent(); //ArcGIS Online への認証方法の指定 IdentityManager.Current.ChallengeHandler = new ChallengeHandler(PortalSecurity.Challenge); //住所検索用のジオコーディング タスクを初期化 onlineLocatorTask = new OnlineLocatorTask(new Uri(WORLD_GEOCODE_SERVICE_URL)); //到達圏解析用のジオプロセシング タスクを初期化 serviceAreaGp = new Geoprocessor(new Uri(SERVICE_AREA_GP_URL)); }到達圏の解析ボタンクリック時の処理
本アプリケーションでは、解析 ボタンのクリック後、マップをタップした箇所から到達圏解析を実行します。解析ボタンのクリック時には、マウス カーソルの形状変更やマップ ビュータップ時のイベント ハンドラを設定する処理などを行います。マップビュー タップイベントは次のステップで追加します。
[MainWindow.xaml.cs]
/// <summary> /// 到達圏解析の解析ボタンクリック時の処理 /// </summary> private void analyzeButton_Click(object sender, RoutedEventArgs e) { //マップが準備できていなければ処理を行わない if (!isMapReady) return; //前回の到達圏解析の結果をクリア ClearAnalysisResult(); //解析ボタンを非表示 analyzePanel.Visibility = System.Windows.Visibility.Collapsed; //解析手順のメッセージを表示 analyzeTextBox.Visibility = System.Windows.Visibility.Visible; //マップビュータップ時のイベントハンドラを設定 mainMapView.MapViewTapped += mainMapView_MapViewTapped; //カーソルを十字に変更 mainMapView.Cursor = Cursors.Cross; }マップビュータップイベントの作成
前述の通り、解析の実行はマップ ビューで任意の地点をタップした際に行います。そのため、まずマップビュータップ時の処理をハンドリングするイベントを追加します。
[MainWindow.xaml.cs]
/// <summary> /// マップビュータップ時の処理 /// </summary> private async void mainMapView_MapViewTapped(object sender, Esri.ArcGISRuntime.Controls.MapViewInputEventArgs e) { }ここからマップ ビュータップイベント内の動作について説明していきます。
マップビューでタップした箇所にポイントを作成
マップ ビュータップ時の最初の処理として、タップした位置からグラフィックスポイントを作成します。
[MainWindow.xaml.cs]
/// <summary> /// マップビュータップ時の処理 /// </summary> private async void mainMapView_MapViewTapped(object sender, Esri.ArcGISRuntime.Controls.MapViewInputEventArgs e) { //解析手順のメッセージを非表示 analyzeTextBox.Visibility = System.Windows.Visibility.Collapsed; //プログレスバーを表示 analyzeProgressBar.Visibility = System.Windows.Visibility.Visible; //マップビュータップ時のイベントハンドラを解除 mainMapView.MapViewTapped -= mainMapView_MapViewTapped; //カーソルを矢印に変更 mainMapView.Cursor = Cursors.Arrow; //クリックした位置からグラフィックを作成 Graphic clickPoint = new Graphic(e.Location) { Symbol = layoutRoot.Resources["greenMarkerSymbol"] as SimpleMarkerSymbol, ZIndex = 2 }; //到達圏解析結果表示用のグラフィックスレイヤにクリック位置のグラフィックを追加 serviceAreaResultLayer.Graphics.Add(clickPoint); }MapViewTapped イベントを利用することで、イベントの戻り値としてマップ ビュー上でタップされた位置情報(MapViewInputEventArgs クラスの Location プロパティ)を簡単に取得することができます。今回はグラフィックスを作成するため、Graphic クラスのコンストラクタに引数として指定しています。グラフィックスのシンボルは mainwindows.xaml で定義したリソースを参照しています。また Zindex プロパティは、同一レイヤーに格納する個々のグラフィックスに対して、表示順序の優先順位を指定することができます。ここではタップされた位置が到達圏解析結果のグラフィックスなどより上に表示されるように Zindex プロパティを設定しています。
最後に、作成したグラフィックスを到達圏解析の結果を表示するためのグラフィックス レイヤーに追加しています。
到達圏解析用パラメータの作成
マップビュータップイベント内の次の操作として、到達圏解析を行うためのパラメーターを作成します。
ArcGIS Online のジオプロセシング サービスを実行するには、それぞれのジオプロセシング サービスに適したパラメーターが必要となります。今回使用する到達圏解析ジオプロセシング サービスの実行には、到達圏の範囲や移動手段の指定が必要です。
ArcGIS Runtime SDK for .NET でジオプロセシング サービスのパラメーターを作成するには、GPInputParameter クラスを使用します。GPInputPrameter クラスの GPParameters プロパティに必要な数だけのパラメーターを追加していきます。
[MainWindow.xaml.cs]
//到達圏解析用パラメーターの作成 GPInputParameter parameter = new GPInputParameter(); parameter.GPParameters.Add(new GPFeatureRecordSetLayer("facilities", e.Location)); //解析の中心点 parameter.GPParameters.Add(new GPString("break_values", "10")); //到達圏の範囲(10分) parameter.GPParameters.Add(new GPString("env:outSR", "102100")); //結果の空間参照(Web メルカトル) parameter.GPParameters.Add(new GPString("travel_mode", "Walking")); //"徒歩"で到達できる範囲を解析到達圏解析の実行
到達圏解析を SubmitJobAsync メソッドを使用して実行します。SubmitJobAsync メソッドの引数には「到達圏解析用のパラメーター」のステップで定義した到達圏用のパラメーター(変数名:parameter)を指定します。SubmitJobAsync メソッドは非同期メソッドのため、「async」および「await」キーワードが必要となります。
[MainWindow.xaml.cs]
//到達圏の解析を開始 GPJobInfo result = await serviceAreaGp.SubmitJobAsync(parameter);
解析結果の処理
ArcGIS Online のジオプロセシング サービスを利用して解析を行った場合は、ArcGIS Online に解析結果を確認し、正常に解析が成功した場合のみ、その後の処理に進む必要があります。解析結果のステータスは GPJobInfo クラスの JobStatus プロパティで確認できます。
正常に処理が完了していたら、GetResultDataAsync メソッドを用いて結果を取得し、到達圏解析結果レイヤのグラフィックを結果グラフィックとして取得します。最後に、到達圏解析結果表示用のグラフィックスレイヤにグラフィックを追加します。
[MainWindow.xaml.cs]
//到達圏の解析結果が"成功"、"失敗"、"時間切れ"、"キャンセル"のいずれかになるまで //2秒ごとに ArcGIS Online にステータスを確認 while (result.JobStatus != GPJobStatus.Succeeded && result.JobStatus != GPJobStatus.Failed && result.JobStatus != GPJobStatus.TimedOut && result.JobStatus != GPJobStatus.Cancelled) { result = await serviceAreaGp.CheckJobStatusAsync(result.JobID); await Task.Delay(2000); } //到達圏解析の結果が成功した場合は結果を表示 if (result.JobStatus == GPJobStatus.Succeeded) { //到達圏解析の結果を取得 GPParameter resultData = await serviceAreaGp.GetResultDataAsync(result.JobID, "Service_Areas"); //到達圏解析結果レイヤのグラフィックを結果グラフィックとして取得 GPFeatureRecordSetLayer gpLayer = resultData as GPFeatureRecordSetLayer; serviceAreaGraphic = gpLayer.FeatureSet.Features[0] as Graphic; //グラフィックにシンボルを設定 serviceAreaGraphic.Symbol = layoutRoot.Resources["greenFillSymbol"] as SimpleFillSymbol; //結果グラフィックが解析の中心点のグラフィックより下に表示されるように表示順序を設定 serviceAreaGraphic.ZIndex = 1; //到達圏解析結果表示用のグラフィックスレイヤにグラフィックを追加 serviceAreaResultLayer.Graphics.Add(serviceAreaGraphic); }マップ ビュータップイベント内の動作はここまでとなります。最後に解析結果を削除する操作を追加します。
到達圏解析結果クリアボタンクリック時の処理
[クリア] ボタンは、到達圏解析の結果を削除するボタンとして使用しますが、解析の結果を削除するシーンは [クリア] ボタンのクリック時以外にもあります。そのため、解析結果を削除するメソッド(ClearAnalystResult)を定義し、再利用できるようにします。
到達圏解析結果クリアボタンのクリック時には、作成した ClearAnalystResult メソッドを実行します。
[MainWindow.xaml.cs]
/// <summary> /// 到達圏解析結果クリアボタンクリック時の処理 /// </summary> private void clearResultButton_Click(object sender, RoutedEventArgs e) { //到達圏解析結果のクリア ClearAnalysisResult(); } /// <summary> /// 到達圏解析結果のクリア /// </summary> private void ClearAnalysisResult() { //到達圏グラフィックをクリア serviceAreaGraphic = null; //到達圏解析結果表示用グラフィックスレイヤのグラフィックをクリア serviceAreaResultLayer.Graphics.Clear(); //物件レイヤのフィーチャの選択をすべてクリア buildingLayer.ClearSelection(); }アプリケーションの実行
アプリケーションを実行し、[解析] ボタンをクリックし、マップ上で任意の箇所をタップします。タップした位置からの到達圏解析結果が表示されることを確認します。

関連リンク
ArcGIS Runtime SDK for .NET サンプル アプリ構築:
ESRIジャパン Web サイト:
Esri 社(米国) Web サイト: