UltraGeographicMap では、同一シリーズ内の各シェープに個別の色を指定することができません。この記事では、クリックされたシェープのデータをもとに新しい GeographicShapeSeries を作成してシリーズコレクションに追加し、シェープを重ねて表示することで、クリックした部分だけ色を変える方法を紹介します。
UltraGeographicMap の設定
まず、シェープ系列となる GeographicShapeSeries を作成して UltraGeographicMap の Series コレクションに追加します。あわせて、シェープのクリックを検知するために 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.Item が ShapefileRecord の場合、元の地図シェープがクリックされたと判断できます。クリックされたシェープの座標データ(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; }
}
実行結果
地図上のシェープをクリックすると、クリックしたシェープだけがピンク色でハイライト表示されます。ハイライトされたシェープを再度クリックすると、追加したシリーズが削除され元の表示に戻ります。
