• 検索結果がありません。

個別属性表示タスク(IdentifyTask クラス)

個別属性表示タスクを使用すると検索条件として指定した入力ジオメトリと交差するマップ サービス内 のフゖーチャを取得することができます。取得したフゖーチャの図形情報や属性情報は、.NET コードを使 用して Silverlight ゕプリケーション上に表示します。開発者は個別属性表示タスクを使用するためのユー ザ ゗ンタフェースと実行ロジックを実装する必要があります。

個別属性表示タスク(サンプル コード)

以下は個別属性表示タスクを実行する Silverlight ゕプリケーションの XAML と .NET コード(C#)です。

このゕプリケーションでは Map コントロールの MouseClick ゗ベントを使用して、マップ上のクリック されたポ゗ントを入力ジオメトリとして指定してタスクを実行します。入力ジオメトリと交差するマップ サービス内のフゖーチャの一覧は ComboBox コントロールに追加され、ComboBox コントロールで選 択されているフゖーチャの属性情報が DataGrid コントロールに、ジオメトリがマップのグラフゖックス レ゗ヤに描画されます。サンプル コードの詳細については「個別属性表示タスク(サンプル コード)の 解説」をご参照ください。

110 XAML

<UserControl

x:Class="Sample.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:esri="http://schemas.esri.com/arcgis/client/2009"

xmlns:slData="clr-namespace:System.Windows.Controls;assembly

=System.Windows.Controls.Data">

<Grid x:Name="LayoutRoot" Background="White" >

<!-- 個別属性表示タスク用シンボル -->

<Grid.Resources>

<esri:SimpleMarkerSymbol x:Name="IdentifyLocationSymbol"

Color="Green" Size="10" />

<esri:SimpleFillSymbol x:Name="SelectedFeatureSymbol"

Fill="#64FF0000" BorderBrush="Red" BorderThickness="2" />

</Grid.Resources>

<!-- マップ -->

<esri:Map x:Name="MyMap" Extent="-130,10,-70,60"

MouseClick="MyMap_MouseClick" >

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/

services/ESRI_StreetMap_World_2D/MapServer"/>

<esri:GraphicsLayer ID="ResultsGraphicsLayer" />

<esri:GraphicsLayer ID="IdentifyIconGraphicsLayer" />

</esri:Map.Layers>

</esri:Map>

<!-- 個別属性表示タスク ゗ンタフェース -->

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10"

RadiusY="10" />

<TextBlock Text="個別属性を表示するためにはマップをクリックします"

Foreground="White" FontSize="10" Margin="10,5,10,5" />

<StackPanel x:Name="IdentifyResultsStackPanel"

Margin="15,30,15,10" Visibility="Collapsed">

<TextBlock Text="表示するレコードを選択してください"

Foreground="White" FontSize="10" Margin="0,0,0,5" />

<ComboBox x:Name="IdentifyComboBox"

111 SelectionChanged="IdentifyComboBox_SelectionChanged" />

<ScrollViewer MaxHeight="340" Margin="0,10,0,0">

<slData:DataGrid x:Name="IdentifyDetailsDataGrid"

AutoGenerateColumns="False" HeadersVisibility="None" >

<slData:DataGrid.Columns>

<slData:DataGridTextColumn Binding="{Binding Path=Key}" FontWeight="Bold"/>

<slData:DataGridTextColumn Binding="{Binding

Path=Value}"/>

</slData:DataGrid.Columns>

</slData:DataGrid>

</ScrollViewer>

</StackPanel>

</Grid>

</StackPanel>

</Grid>

</UserControl>

112 コードビハインド(C#)

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media;

using System.Collections.Generic;

using ESRI.ArcGIS.Client;

using ESRI.ArcGIS.Client.Tasks;

using ESRI.ArcGIS.Client.Symbols;

namespace Sample {

public partial class MainPage : UserControl {

private List<IdentifyResult> _lastIdentifyResult;

public MainPage() {

InitializeComponent();

}

// マップがクリックされたら個別属性表示タスクを実行 private void MyMap_MouseClick(object sender,

ESRI.ArcGIS.Client.Map.MouseEventArgs args)

{

// クリックされた場所を表示

GraphicsLayer graphicsLayer =

MyMap.Layers["IdentifyIconGraphicsLayer"] as GraphicsLayer;

graphicsLayer.ClearGraphics();

ESRI.ArcGIS.Client.Graphic graphic = new ESRI.ArcGIS.Client.Graphic() {

Geometry = args.MapPoint,

Symbol = IdentifyLocationSymbol };

graphicsLayer.Graphics.Add(graphic);

// 個別属性表示タスクの初期化

113 IdentifyTask identifyTask = new

IdentifyTask("http://sampleserver1.arcgisonline.com/

ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer");

identifyTask.ExecuteCompleted += IdentifyTask_ExecuteCompleted;

identifyTask.Failed += IdentifyTask_Failed;

// 個別属性表示パラメータの指定(検索対象として全レ゗ヤを指定)

IdentifyParameters identifyParameters = new IdentifyParameters();

identifyParameters.LayerOption = LayerOption.all;

// 現在のマップのパラメータを個別属性表示パラメータに指定 identifyParameters.MapExtent = MyMap.Extent;

identifyParameters.Width = (int)MyMap.ActualWidth;

identifyParameters.Height = (int)MyMap.ActualHeight;

// クリックしたポ゗ントを入力ジオメトリに指定

identifyParameters.Geometry = args.MapPoint;

identifyTask.ExecuteAsync(identifyParameters);

}

// 個別属性表示タスクが完了したら ComboBox に結果を表示

private void IdentifyTask_ExecuteCompleted(object sender,

IdentifyEventArgs args)

{

IdentifyComboBox.Items.Clear();

// 新規結果セットのチェック

if (args.IdentifyResults.Count > 0) {

// ComboBox と DataGrid を表示

IdentifyResultsStackPanel.Visibility = Visibility.Visible;

// 結果セットを ComboBox に追加

foreach (IdentifyResult result in args.IdentifyResults) {

string title = string.Format("{0} ({1})",

result.Value.ToString(), result.LayerName);

IdentifyComboBox.Items.Add(title);

}

IdentifyComboBox.UpdateLayout();

// 個別属性表示タスクの結果を取得

114 _lastIdentifyResult = args.IdentifyResults;

// ComboBox の SelectionChanged ゗ベントを発生 IdentifyComboBox.SelectedIndex = 0;

} else {

// ComboBox と DataGrid を非表示にし、ユーザに通知

IdentifyResultsStackPanel.Visibility = Visibility.Collapsed;

MessageBox.Show("該当するレコードがみつかりません");

} }

// ComboBox で選択されているフゖーチャの属性情報とジオメトリを表示 void IdentifyComboBox_SelectionChanged(object sender,

SelectionChangedEventArgs e)

{

// 前回選択されたフゖーチャのグラフゖックをグラフゖックスレ゗ヤから削除 GraphicsLayer graphicsLayer =

MyMap.Layers["ResultsGraphicsLayer"] as GraphicsLayer;

graphicsLayer.ClearGraphics();

// ComboBox に選択されているフゖーチャが存在するか確認 if (IdentifyComboBox.SelectedIndex > -1) {

// DataGrid の表示を選択されているフゖーチャの属性値に更新 Graphic selectedFeature =

_lastIdentifyResult[IdentifyComboBox.SelectedIndex].Feature;

IdentifyDetailsDataGrid.ItemsSource = selectedFeature.Attributes;

// 選択されたフゖーチャにシンボルを設定しマップに追加 selectedFeature.Symbol = SelectedFeatureSymbol;

graphicsLayer.Graphics.Add(selectedFeature);

} }

// 個別属性表示タスクが失敗した場合ユーザに通知

private void IdentifyTask_Failed(object sender, TaskFailedEventArgs args) {

115 MessageBox.Show("個別属性表示が失敗しました: " + args.Error);

} } }

116

個別属性表示タスク(サンプル コード)の解説

以下では前述したサンプル コードの内容について解説します。コードの全文についてはこちらをご参照く ださい。

個別属性表示タスクの入力インタフェースの作成

タスクは固定のユーザ ゗ンタフェースを持たないため、開発者は自身でユーザが検索条件を入力し検索タ スクを実行するための゗ンタフェースを作成する必要があります。このサンプル コードでは、ユーザがマ ップをクリックした際のポ゗ントを入力ジオメトリとしてタスクを実行し、入力ジオメトリと交差するフ ゖーチャの図形情報と属性情報を表示します。

1. XAML に入力゗ンタフェースの背景に使用する Rectangle コントロールを追加します。

StackPanel コントロール内に Grid コントロールを配置し、その中に Rectangle コントロー ルを追加することで Rectangle コントロールのサ゗ズは Grid コントロール内のコンテンツ に応じて自動調整されます。

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" />

</Grid>

</StackPanel>

ユーザに個別属性表示タスクの実行方法を通知するための TextBlock コントロールを追加し 2.

ます。

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" />

<TextBlock Text="個別属性を表示するためにはマップをクリックします"

Foreground="White" FontSize="10" Margin="10,5,10,5" />

</Grid>

</StackPanel>

117 ユーザがクリックしたポ゗ントに使用するシンボルをリソースとして定義します(シンボルに 3.

ついての詳細は「シンボルとレンダラ」を参照してください)。

<Grid.Resources>

<esri:SimpleMarkerSymbol x:Name="IdentifyLocationSymbol" Color="Green"

Size="10" />

</Grid.Resources>

以下の手順では、下記の例のように XAML にマップが追加されており、背景用のマップ サー 4.

ビス レ゗ヤが 1 つ追加されている状態からの作成手順を解説します。

<esri:Map x:Name="MyMap" Extent="-130,10,-70,60">

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/

services/ESRI_StreetMap_World_2D/MapServer"/>

</esri:Map.Layers>

</esri:Map>

Map コントロールの MouseClick ゗ベントにハンドラをゕタッチします(゗ベントハンドラの 5.

実装方法についてはこの後のセクションで解説します)。この゗ベントはユーザがマップをクリ ックする度に発生します。

<esri:Map x:Name="MyMap" Extent="-130,10,-70,60"

MouseClick="MyMap_MouseClick" >

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/

services/ESRI_StreetMap_World_2D/MapServer"/>

</esri:Map.Layers>

</esri:Map>

118 ユーザがクリックしたポ゗ント位置を示すための GraphicsLayer クラスをマップに追加しま 6.

す (ID は 「IdentifyIconGraphicsLayer」)。GraphicsLayer クラスが、他のレ゗ヤよりも上 に表示されるように他のマップ内のレ゗ヤ クラスよりも下の行に追加されています。

<esri:Map x:Name="MyMap" Extent="-130,10,-70,60"

MouseClick="MyMap_MouseClick" >

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/

services/ESRI_StreetMap_World_2D/MapServer"/>

<esri:GraphicsLayer ID="IdentifyIconGraphicsLayer" />

</esri:Map.Layers>

</esri:Map>

119 個別属性表示タスクの出力インタフェースの作成

タスクの実行結果を表示するためには、出力゗ンタフェースを作成する必要があります。サンプル ゕプリ ケーションでは、ComboBox コントロールに結果のレコードセットを格納し、ユーザが選択したレコード をマップに描画し、属性情報を DataGrid コントロールに表示します。

1. 個別属性表示タスクの実行結果に使用するシンボルをリソースとして定義します(シンボルに ついての詳細は「シンボルとレンダラ」を参照してください)。

<Grid.Resources>

<esri:SimpleMarkerSymbol x:Name="IdentifyLocationSymbol" Color="Green"

Size="10" />

<esri:SimpleFillSymbol x:Name="SelectedFeatureSymbol" Fill="#64FF0000"

BorderBrush="Red" BorderThickness="2" />

</Grid.Resources>

2. マップに個別属性表示タスクの実行結果を表示するための GraphicsLayer クラスを追加しま す (ID は 「ResultsGraphicsLayer」)。

<esri:Map x:Name="MyMap" Extent="-130,10,-70,60"

MouseClick="MyMap_MouseClick" >

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"

Url="http://server.arcgisonline.com/ArcGIS/rest/

services/ESRI_StreetMap_World_2D/MapServer"/>

<esri:GraphicsLayer ID="ResultsGraphicsLayer" />

<esri:GraphicsLayer ID="IdentifyIconGraphicsLayer" />

</esri:Map.Layers>

</esri:Map>

120

「個別属性表示タスクの入力゗ンタフェースの作成」で作成した StackPanel コントロール内 3.

にタスクの実行結果を表示するための StackPanel コントロールを追加します。コードビハ゗

ンドから参照できるように、Name プロパテゖを設定し

(「x:Name="IdentifyResultsStackPanel"」)、通常時は非表示に設定します

(「Visibility="Collapsed"」)。

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" />

<TextBlock Text="個別属性を表示するためにはマップをクリックします"

Foreground="White" FontSize="10" Margin="10,5,10,5" />

<StackPanel x:Name="IdentifyResultsStackPanel" Margin="15,30,15,10"

Visibility="Collapsed">

</StackPanel>

</Grid>

</StackPanel>

ユーザに結果を表示する方法を通知する TextBlock コントロールを追加します。

4.

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" />

<TextBlock Text="個別属性を表示するためにはマップをクリックします"

Foreground="White" FontSize="10" Margin="10,5,10,5" />

<StackPanel x:Name="IdentifyResultsStackPanel" Margin="15,30,15,10"

Visibility="Collapsed">

<TextBlock Text="表示するレコードを選択してください" Foreground="White"

FontSize="10" Margin="0,0,0,5" />

</StackPanel>

</Grid>

</StackPanel>

121 個別属性表示タスクの実行結果のレコードセットを格納する ComboBox コントロールを追 5.

加し、ComboBox コントロールの選択されているゕ゗テムが変更された場合に発生する SelectionChanged ゗ベントの゗ベントハンドラをゕタッチします(゗ベントハンドラの実装 方法についてはこの後のセクションで解説します)。

<StackPanel Margin="10" HorizontalAlignment="Left">

<Grid>

<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10" />

<TextBlock Text="個別属性を表示するためにはマップをクリックします"

Foreground="White" FontSize="10" Margin="10,5,10,5" />

<StackPanel x:Name="IdentifyResultsStackPanel" Margin="15,30,15,10"

Visibility="Collapsed">

<TextBlock Text="表示するレコードを選択してください" Foreground="White"

FontSize="10" Margin="0,0,0,5" />

<ComboBox x:Name="IdentifyComboBox"

SelectionChanged="IdentifyComboBox_SelectionChanged" />

</StackPanel>

</Grid>

</StackPanel>

グラフゖックの属性情報を表示するために DataGrid コントロールを使用します。DataGrid 6.

コントロールは System.Windows.Controls.Data ゕセンブリの

System.Windows.Controls 名前空間内に定義されています。XAML に名前空間への参照を定 義します。

<UserControl

x:Class="Sample.MainPage"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:esri="http://schemas.esri.com/arcgis/client/2009"

xmlns:slData="clr-namespace:System.Windows.Controls;assembly

=System.Windows.Controls.Data">