2026年4月、.NET MAUI (Multi-platform App UI) はさらなる進化を遂げました。

今回リリースされた .NET MAUI 11 Preview 3 において、多くの開発者が待ち望んでいた「マップのピンクラスタリング機能」がついに 標準でサポート されました。

これまで、地図上に数十、あるいは数百ものピンを表示しようとすると、ピン同士が重なり合い、ユーザーが特定の情報を選択することが困難になるという課題がありました。

この問題に対し、これまではサードパーティ製のライブラリを使用したり、複雑なカスタムロジックを実装したりする必要がありましたが、最新の .NET MAUI 11 ではプロパティを1つ設定するだけで、洗練された地図UIを実現できます。

本記事では、この注目の新機能であるピンクラスタリングの導入方法から詳細なカスタマイズ手法までを詳しく解説します。

ピンクラスタリングとは何か

ピンクラスタリングは、地図のズームレベルに応じて、近接する複数のピンを 1つのグループ (クラスタ) にまとめて表示する機能 です。

地図を縮小 (ズームアウト) しているときは、複数の地点が1つのクラスタマーカーとして表示され、そこに含まれるピンの数がバッジとして示されます。

逆に地図を拡大 (ズームイン) していくと、クラスタが解体され、個別のピンが表示されるようになります。

この機能は、GitHubのIssue (#11811) において長らく要望されていたものであり、特に不動産検索アプリや店舗案内、観光ガイドといった 大量の地点データを扱うアプリケーション にとっては必須の機能といえます。

視認性が大幅に向上するだけでなく、ネイティブレベルでのスムーズなアニメーションによって、ユーザーエクスペリエンスを一段上のものへと引き上げます。

クラスタリングの有効化

.NET MAUI 11 Preview 3 以降、クラスタリング機能を有効にするのは非常に簡単です。

Map コントロールに新しく追加された IsClusteringEnabled プロパティを True に設定するだけで完了します。

XAMLでの実装例

以下のように、地図の定義に1行追加するだけで、自動的に近接するピンがグループ化されます。

XML
<!-- xmlns:maps="http://schemas.microsoft.com/dotnet/2021/maui/maps" の定義が必要です -->
<maps:Map IsClusteringEnabled="True" />

これだけで、Android、iOS、および Mac Catalyst の各プラットフォームにおいて、ネイティブの最適化されたクラスタリング動作が開始されます。

カテゴリごとのクラスタリング管理

すべてのピンを1つのルールでまとめたい場合もあれば、データの種類に応じて個別にクラスタリングしたい場合もあります。

例えば、「カフェ」のピンと「公園」のピンが近くにあるとき、これらを混ぜずに カテゴリごとに独立してクラスタリング したいというニーズです。

これを実現するために、 Pin クラスには新しく ClusteringIdentifier プロパティが導入されました。

ClusteringIdentifier の活用

同じ識別子を持つピン同士は同じグループとしてまとめられ、異なる識別子を持つピンは、たとえ地理的に近くても別々のクラスタを形成します。

C#
// カフェカテゴリのピンを追加
map.Pins.Add(new Pin
{
    Label = "スターバックス コーヒー",
    Location = new Location(35.6812, 139.7671),
    ClusteringIdentifier = "coffee" // 識別子を指定
});

// 公園カテゴリのピンを追加
map.Pins.Add(new Pin
{
    Label = "日比谷公園",
    Location = new Location(35.6733, 139.7556),
    ClusteringIdentifier = "park" // 別の識別子を指定
});

この識別子を使い分けることで、ユーザーにとってより情報の整理された地図画面を提供できるようになります。

なお、識別子を指定しない場合は、デフォルトのグループとして扱われます。

クラスタタップ時のインタラクション

ユーザーが数字の表示されたクラスタマーカーをタップした際、デフォルトではそのエリアを拡大表示するズーム動作が行われます。

しかし、アプリの要件によっては、クラスタに含まれる情報のリストを表示したり、独自のアクションを実行したりしたい場合があります。

このようなケースに対応するため、 ClusterClicked イベントが用意されています。

ClusterClicked イベントの実装

イベント引数である ClusterClickedEventArgs を通じて、クラスタに含まれるピンのリストや、クラスタの中心座標にアクセスできます。

C#
map.ClusterClicked += async (sender, e) =>
{
    // クラスタに含まれるすべてのピンのラベルを取得
    string pinNames = string.Join("\n", e.Pins.Select(p => p.Label));

    // 情報をダイアログで表示
    await DisplayAlert(
        $"クラスタの内容 ({e.Pins.Count} 個のピン)",
        pinNames,
        "閉じる");

    // e.Handled を true にすると、デフォルトのズーム動作をキャンセルできます
    // e.Handled = true;
};

e.Handled プロパティを適切に制御することで、標準動作を残しつつ追加の処理を行ったり、あるいは標準動作を完全に上書きしたりといった柔軟なカスタマイズが可能です。

プラットフォーム別の動作仕様

今回のピンクラスタリング機能は、各プラットフォームの特性を最大限に活かして実装されています。

開発者はプラットフォームごとの差異を意識せずに利用できますが、内部的な動作の違いを知っておくことはデバッグにおいて役立ちます。

プラットフォーム実装方式特徴
Androidグリッドベース・アルゴリズム外部依存なし。ズームレベルの変化に合わせてグリッド単位で再計算を行う。
iOS / Mac CatalystNative MKClusterAnnotationApple の MapKit に組み込まれたネイティブ機能を利用。滑らかなアニメーションが特徴。

Android では Google Maps の標準機能を活用しつつ、一貫した動作を提供するためのカスタムアルゴリズムが採用されています。

一方、Apple プラットフォームでは MapKit のネイティブサポート を直接利用しているため、OS標準の地図アプリに近い、非常にスムーズなユーザー体験が得られます。

開発環境の準備

.NET MAUI 11 Preview 3 の新機能を試すには、開発環境を最新の状態に更新する必要があります。

  1. .NET 11 Preview 3 SDK のインストール
  2. .NET MAUI ワークロードの更新 (コマンドラインから dotnet workload install maui を実行)
  3. Windows環境であれば、最新の Visual Studio 2026 Insiders の利用を推奨

また、Visual Studio Code を使用している場合は、 C# Dev Kit 拡張機能を最新版にアップデートすることで、.NET 11 ベースの開発がスムーズに行えます。

まとめ

.NET MAUI 11 Preview 3 で導入されたピンクラスタリング機能は、地図を活用するモバイル・デスクトップアプリの品質を飛躍的に向上させるアップデートです。

「プロパティ1つで有効化できる手軽さ」「識別子やイベントによる高度なカスタマイズ性」 を兼ね備えており、実用的なビジネスアプリケーションからホビーアプリまで幅広く活用できるでしょう。

2026年の .NET エコシステムは、クロスプラットフォーム開発において、より洗練された UI コンポーネントの標準提供に注力しています。

今回のマップ機能の強化もその一環であり、今後も地図関連の機能拡充が期待されます。

まずは最新のプレビュー版をインストールして、お手元のプロジェクトでクラスタリングの利便性を体感してみてください。