60
61 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">
<Grid x:Name="LayoutRoot" Background="White">
<!-- クエリタスクの実行結果用シンボル -->
<Grid.Resources>
<esri:SimpleFillSymbol
x:Name="ResultsFillSymbol" Fill="#500000FF"
BorderBrush="Blue" BorderThickness="1" />
</Grid.Resources>
<!-- マップ -->
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock Text="{Binding [STATE_NAME]}"
FontWeight="Bold" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="人口密度 (2007): " />
<TextBlock Text="{Binding [POP07_SQMI]}" />
</StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
<!-- クエリ タスク ンタフェース -->
62 <Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10"
RadiusY="10" Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
<TextBox x:Name="QueryTextBox" Width="150" Margin="15,22,0,0"
Text="POP07_SQMI > 500" />
<Button x:Name="QueryButton" Content="実行" Margin="168,23,0,0"
Click="QueryButton_Click" />
</Canvas>
</Grid>
</UserControl>
63 コードビハインド
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using ESRI.ArcGIS.Client;
using ESRI.ArcGIS.Client.Tasks;
using ESRI.ArcGIS.Client.Symbols;
namespace Sample {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
// 実行ボタンがクリックされたらクエリ タスクを実行
private void QueryButton_Click(object sender, RoutedEventArgs e) {
// クエリ タスクの初期化
QueryTask queryTask = new
QueryTask("http://sampleserver1.arcgisonline.com/ArcGIS/rest/" + "services/Demographics/ESRI_Census_USA/MapServer/5");
queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;
queryTask.Failed += QueryTask_Failed;
// クエリ タスクの入力パラメータ:
図形情報、州名(STATE_NAME)、人口密度(POP07_SQMI)を返す
Query query = new Query();
query.ReturnGeometry = true;
query.OutFields.AddRange(new string[] { "STATE_NAME", "POP07_SQMI" });
// TextBox のテキストを検索条件に設定 query.Where = QueryTextBox.Text;
queryTask.ExecuteAsync(query);
64 }
// クエリ タスクが完了したら結果を描画
private void QueryTask_ExecuteCompleted(object sender,
ESRI.ArcGIS.Client.Tasks.QueryEventArgs args)
{
// 前回の結果をクリゕ
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as
GraphicsLayer;
graphicsLayer.ClearGraphics();
// 新しい結果を検証
FeatureSet featureSet = args.FeatureSet;
if (featureSet.Features.Count > 0) {
// 結果をマップに追加
foreach (Graphic resultFeature in featureSet.Features) {
resultFeature.Symbol = ResultsFillSymbol;
graphicsLayer.Graphics.Add(resultFeature);
} } else {
MessageBox.Show("該当するフィーチャが見つかりません");
} }
// クエリ タスク失敗時の処理
private void QueryTask_Failed(object sender, TaskFailedEventArgs args) {
MessageBox.Show("クエリが失敗しました: " + args.Error);
} } }
65
クエリ タスク(サンプル コード)の解説
以下では前述したサンプル コードの内容について解説します。コードの全文についてはこちらをご参照く ださい。
クエリ タスクの入力インタフェースの作成
タスクは固定のユーザ ンタフェースを持たないため、開発者はユーザが検索条件を入力しクエリ タス クを実行するためのンタフェースを作成する必要があります。このサンプル コードでは、検索条件を入 力するための TextBox コントロール、タスクを実行するための Button コントロールを作成します。
ゕプリケーションの XAML コードにンタフェースを保持する Canvas コントロールを追加 1.
します。
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" ></Canvas>
ンタフェースの背景に使用する Rectangle コントロールを追加します。
2.
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
</Canvas>
ユーザに使用方法を通知する TextBlock コントロールを追加します。
3.
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
</Canvas>
検索条件を入力する TextBox コントロールを追加します。
4.
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
<TextBox x:Name="QueryTextBox" Width="150" Margin="15,22,0,0" />
</Canvas>
66 既定の検索条件を指定します。
5.
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
<TextBox x:Name="QueryTextBox" Width="150" Margin="15,22,0,0"
Text="POP07_SQMI > 500" />
</Canvas>
クエリ タスクを実行するための Button コントロールを追加します。
6.
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
<TextBox x:Name="QueryTextBox" Width="150" Margin="15,22,0,0"
Text="POP07_SQMI > 500" />
<Button x:Name="QueryButton" Content="実行" Margin="168,23,0,0" />
</Canvas>
Button コントロールがクリックされた際のベント ハンドラをゕタッチします(ハンドラの 7.
実装方法については「クエリ タスク実行ロジックの実装」で解説します)。
<Canvas HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="0,15,7,0" Width="250" >
<Rectangle Fill="#CC5C90B2" Stroke="Gray" RadiusX="10" RadiusY="10"
Width="250" Height="55" />
<TextBlock Text="検索条件を入力して実行ボタンをクリックします"
Foreground="White" FontSize="10" Margin="10,5,0,0" />
<TextBox x:Name="QueryTextBox" Width="150" Margin="15,22,0,0"
Text="POP07_SQMI > 500" />
<Button x:Name="QueryButton" Content="実行" Margin="168,23,0,0"
Click="QueryButton_Click" />
</Canvas>
67 クエリ タスクの出力インタフェースの作成
タスクの実行結果を表示するためには出力ンタフェースを作成する必要があります。サンプル ゕプリケ ーションでは、マップにグラフゖックス レヤを追加し、タスクの結果を描画します。また、結果のグラ フゖックの属性情報を表示するためにグラフゖックス レヤにマップ チップを追加します。
1. 検索結果に使用するシンボルをリソースとして定義します(シンボルについての詳細は「シン ボルとレンダラ」を参照してください)。
<Grid.Resources>
<esri:SimpleFillSymbol x:Name="ResultsFillSymbol" Fill="#500000FF"
BorderBrush="Blue" BorderThickness="1" />
</Grid.Resources>
2. これ以降の手順では、下記の例のように XAML にマップが追加されており、背景用のマップ サ ービス レヤが 1 つ追加されている状態から、出力ンタフェースを作成する手順の解説を します。
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<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>
68 マップに結果を表示するためのグラフゖックス レヤとして GraphicsLayer クラスを追加し 3.
ます (ID は「MyGraphicsLayer」)。GraphicsLayer クラスが 他のレヤよりも上に表示さ れるように他のマップ内のレヤよりも下の行に追加されています。
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
GraphicsLayer クラスの MapTip プロパテゖを設定します。MapTip プロパテゖには、レヤ 4.
のマップ チップの背景と枠線を定義することができます。以下に示す例では Grid コントロー ル内に StackPanel コントロールと Border コントロールを配置して単純な長方形のマップ チップを作成しています。マップ チップの背景色は Grid コントロールの Background プロ パテゖに指定し、枠線色は Border コントロールの BorderBrush プロパテゖに指定します。
マップ チップのコンテナをこのように定義すると、マップ チップの内容に応じてコンテナの サズは自動的に変更され、以下の手順ではコンテナ内に米国の州名と州の人口密度が表示さ れるように設定を行います。
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
69 </esri:Map.Layers>
</esri:Map>
州名を保持するための TextBlock コントロールを追加します。
5.
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock FontWeight="Bold" />
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
70 追加した TextBlock コントロールの Text プロパテゖにグラフゖックの Attributes プロパ 6.
テゖをバンドします。グラフゖックの Attributes プロパテゖは フゖールド名としての Key と属性値としての Value のペゕのコレクションです。ここでは「STATE_NAME」を Key と して指定し、STATE_NAME フゖールドの属性値を Text プロパテゖにバンドします。
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock Text="{Binding [STATE_NAME]}" FontWeight="Bold" />
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
71 人口密度のラベルと値を格納する StackPanel コントロールを追加します。
7.
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock Text="{Binding [STATE_NAME]}" FontWeight="Bold" />
<StackPanel Orientation="Horizontal">
</StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
72 人口密度のラベルを表示する TextBlock コントロールを追加します。
8.
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock Text="{Binding [STATE_NAME]}" FontWeight="Bold" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="人口密度 (2007): " />
</StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
73 人口密度の値を表示する TextBlock コントロールを追加し、Text プロパテゖに
9.
POP07_SQMI 列の属性値とバンドします。
<esri:Map x:Name="MyMap" Extent="-80.05,36.93,-68.79,43.18" >
<esri:Map.Layers>
<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
Url="http://server.arcgisonline.com/ArcGIS/rest/
services/ESRI_StreetMap_World_2D/MapServer"/>
<esri:GraphicsLayer ID="MyGraphicsLayer">
<esri:GraphicsLayer.MapTip>
<Grid Background="LightYellow">
<StackPanel>
<TextBlock Text="{Binding [STATE_NAME]}" FontWeight="Bold" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="人口密度 (2007): " />
<TextBlock Text="{Binding [POP07_SQMI]}" />
</StackPanel>
</StackPanel>
<Border BorderBrush="Black" BorderThickness="1" />
</Grid>
</esri:GraphicsLayer.MapTip>
</esri:GraphicsLayer>
</esri:Map.Layers>
</esri:Map>
74 クエリ タスク実行ロジックの実装
この手順では、クエリ タスクの実行ロジックを実装します。クエリ タスクの実行ロジックは、1) タスク の実行、2) 実行結果の表示、3) エラー制御の 3 つのパートに分けることができます。
以下ではこの 3 つの実行ロジックを Silverlight ゕプリケーションの メンページのコードビハンド フゔル(例:MainPage.xaml.cs)に記述します。コードビハンドでは、XAML に定義されたエレメ ントを x:name 属性や ID プロパテゖを使用して参照し利用します。以下の手順では、XAML に前述し た「クエリ タスク入力ンタフェースの作成」および「クエリ タスク出力ンタフェースの作成」の手 順に記述されているオブジェクトが定義されているものとして解説を行います。
クエリ タスクの実行
タスクを実行するにはまず、タスクを初期化しクエリを実行するレヤを指定します。そして、タスクが 完了した際のベントハンドラを記述し、タスクの入力パラメータを指定して、タスクを実行するメソッ ドを呼び出します。以下では、これらのステップをコードビハンド フゔルに記述する方法を解説しま す。
1. コードビハンドに、XAML に定義した検索実行ボタン(QueryButton)の Click ベントの
ベントハンドラを記述します。
private void QueryButton_Click(object sender, RoutedEventArgs e) {
}
2. Click ベントのベントハンドラ内で QueryTask クラスを初期化します。QueryTask クラ スのコンストラクタにはクエリを実行する対象のマップ サービス レヤの Url を指定します。
ArcGIS for Server のサービス レヤの URL は ArcGIS for Server の ArcGIS REST Services Direcotry で確認することができます。以下の例では、Esri 社がホストするサンプル サーバにホストされている米国州のマップ サービス レヤの Url を指定しています。
private void QueryButton_Click(object sender, RoutedEventArgs e) {
QueryTask queryTask = new QueryTask("http://sampleserver1.arcgisonline.com/
ArcGIS/rest/services/" + "Demographics/ESRI_Census_USA/MapServer/5");
}