個別属性表示タスクを使用すると検索条件として指定した入力ジオメトリと交差するマップ サービス内 のフゖーチャを取得することができます。取得したフゖーチャの図形情報や属性情報は、.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">