Maps for WPF
レイヤー

Maps コントロールは、多くのレイヤーで用意されています。 マップは複数のレイヤーを格納できます。

MapItemsLayer は、マップ上に項目を表示する最も簡単な方法です。これは ItemsControlを継承するため、UIElement オブジェクトまたは汎用データオブジェクトの追加を直接サポートします。また、それらのオブジェクトをビジュアル項目に変換するために、DataTemplate が使用されます。 MapItemsLayer に追加される要素は、MapCanvasクラスのLongLatProperty フィールドを使って配置されます。

サンプルを紹介します。

 <c1:C1Maps>
        <c1:C1Maps.Layers>
            <c1:MapItemsLayer>
                <Ellipse Width="20" Height="20" Fill="Red"
                     c1:MapCanvas.LongLat="-79.9247, 40.4587"
                     c1:MapCanvas.Pinpoint="10, 10"/>
            </c1:MapItemsLayer>
        </c1:C1Maps.Layers>
    </c1:C1Maps>

これは、XAML で Maps コントロールを作成し、その Layers コレクションに MapItemsLayer を追加します。Layers コレクションにはレイヤをいくつでも追加でき、それらのレイヤは重ねて表示されます。

A map image showcasing the layering feature of Maps control.

この項目レイヤには、1つの項目として、緯度/経度(40.4587, -79.9247)の位置に楕円を追加しています。これらの数値は、XAML では逆になっていることに注意してください。これは、LatLong 値が、経度に対応する X 値と緯度に対応する Y 値から成る Point 構造体で表されるためです(これは、マップと X/Y 軸の通常の配置に一致しています)。

この例では、MapCanvas クラスのPinpointProperty 添付プロパティが使用されていることもわかります。このプロパティは、要素上のどのポイントを LatLong プロパティで設定された地理座標に置くかを設定します。この例では、楕円の中央が LatLong 位置に来るように、Pinpoint が(10, 10)に設定されています。

2番目の例を紹介します。今回は、コードで C1Maps コントロールを作成し、そのコントロールにデータを設定します。次のクラスを使用します。

public class Place
 {
     public string Name { get; set; }
     public Point LongLat { get; set; }
 }
And here is the example code:
var map = new C1Maps();
 var itemsLayer = new MapItemsLayer
 {
     ItemsSource = new[]
     {
         new Place {
             Name = "ComponentOne",
                     LongLat = new Point(-79.92476,  40.45873), },
         new Place {
             Name = "Greenwich Park",
                     LongLat = new Point(  0.00057,  51.47617), },
     },
     ItemTemplate = itemTemplate
 };
 map.Layers.Add(itemsLayer);

ItemsSource に Place クラスのインスタンスを格納し、ItemTemplate を Page のリソースで定義された次の DataTemplate に設定します。

<DataTemplate x:Key="itemTemplate">
        <StackPanel Orientation="Horizontal"
                c1:MapCanvas.LongLat="{Binding LongLat}"
                c1:MapCanvas.Pinpoint="5, 5">
            <Ellipse Fill="Red" Width="10" Height="10" />
            <TextBlock Text="{Binding Name}" Foreground="White" />
        </StackPanel>
 </DataTemplate>

この DataTemplate は、MapCanvas.LatLong を項目で定義された LatLong にバインドし、TextBlock に Place の Name を表示します。

ItemTemplate と ItemsSource を使用すると、データベースから簡単にデータをロードできます。データオブジェクトのコレクションを返す Web サービスを設定し、コレクションを ItemsSource として設定し、適切な値をバインドする DataTemplate を作成するだけです。

関連トピック