UltraGeographicMap では、同一シリーズ内の各シェープに個別の色を指定することができません。この記事では、クリックされたシェープのデータをもとに新しい GeographicShapeSeries を作成してシリーズコレクションに追加し、シェープを重ねて表示することで、クリックした部分だけ色を変える方法を紹介します。

UltraGeographicMap の設定

まず、シェープ系列となる GeographicShapeSeries を作成して UltraGeographicMapSeries コレクションに追加します。あわせて、シェープのクリックを検知するために SeriesMouseLeftButtonDown イベント(デザイナーが生成する InitializeComponent 内で購読されます)を利用します。

private GeographicShapeSeries? shapeSeries1;

private void Form1_Load(object sender, EventArgs e)
{
    this.shapeSeries1 = new GeographicShapeSeries();
    // シェープファイルの読み込み処理は省略
    this.ultraGeographicMap1.Series.Add(this.shapeSeries1);
}

SeriesMouseLeftButtonDown イベントの処理

SeriesMouseLeftButtonDown イベントの e.ItemShapefileRecord の場合、元の地図シェープがクリックされたと判断できます。クリックされたシェープの座標データ(Points)だけを持つ新しい GeographicShapeSeries を作成し、ピンク系のブラシ・アウトラインを指定して Series.Add でコレクションに追加すると、元のシェープの上にハイライト用のシェープが重ねて表示されます。一方、すでにハイライト済みのシェープ(e.Item が独自データ型)が再度クリックされた場合は、対応するシリーズを検索して Series.Remove で取り除き、ハイライトを解除します。

private void ultraGeographicMap1_SeriesMouseLeftButtonDown(object sender, ChartMouseButtonEventArgs e)
{
    if (e.Item is ShapefileRecord record)
    {
        var data = new List<MyDataItem>
        {
            new MyDataItem { Points = record.Points }
        };

        var seriesName = record.Fields.FirstOrDefault().Value?.ToString();

        if (string.IsNullOrEmpty(seriesName))
            return;

        var series = new GeographicShapeSeries
        {
            Name = seriesName,
            DataSource = data,
            ShapeMemberPath = nameof(MyDataItem.Points),
            Brush = Brushes.Pink,
            Outline = Brushes.Red
        };

        ultraGeographicMap1.Series.Add(series);
        return;
    }

    if (e.Item is MyDataItem)
    {
        var foundSeries = ultraGeographicMap1.Series
            .FirstOrDefault(series => series.Name == e.Series.Name);

        if (foundSeries != null)
        {
            ultraGeographicMap1.Series.Remove(foundSeries);
        }
    }
}

public class MyDataItem
{
    public List<List<Infragistics.Win.DataVisualization.Point>> Points { get; set; }
}

実行結果

地図上のシェープをクリックすると、クリックしたシェープだけがピンク色でハイライト表示されます。ハイライトされたシェープを再度クリックすると、追加したシリーズが削除され元の表示に戻ります。

製品について

Ultimate UI for Windows Forms