· · 3 минут чтения

Кластеризация пинов наконец появилась в .NET MAUI Maps — Одно свойство, ноль проблем

.NET MAUI 11 Preview 3 добавляет нативную кластеризацию пинов в элемент управления Map. Одно свойство, отдельные группы кластеризации и обработка нажатий — всё встроено.

dotnet maui mobile maps dotnet-11
Эта статья также доступна на:English, Español, Deutsch, Français, Português, Italiano, 日本語, 中文, 한국어

Этот пост был переведён автоматически. Оригинальную версию можно найти здесь.

Знаете тот момент, когда загружаешь карту с сотней пинов и всё превращается в нечитаемое пятно? Да, именно так работали .NET MAUI Maps до сих пор. Больше нет.

David Ortinau только что объявил, что .NET MAUI 11 Preview 3 поставляется с кластеризацией пинов из коробки на Android и iOS/Mac Catalyst. И лучшая часть — включить её невероятно просто.

Одно свойство, чтобы править всеми

<maps:Map IsClusteringEnabled="True" />

Вот и всё. Близлежащие пины группируются в кластеры со значком количества. Приближаете — они раскрываются. Отдаляете — сворачиваются. Поведение, которое пользователи ожидают от любой современной карты — и теперь вы получаете его одним свойством.

Независимые группы кластеризации

Вот тут становится интересно. Не все пины должны группироваться вместе. Кофейни и парки — это разные вещи, и ваша карта должна это знать.

Свойство ClusteringIdentifier позволяет разделять пины на независимые группы:

map.Pins.Add(new Pin
{
    Label = "Pike Place Coffee",
    Location = new Location(47.6097, -122.3331),
    ClusteringIdentifier = "coffee"
});

map.Pins.Add(new Pin
{
    Label = "Occidental Square",
    Location = new Location(47.6064, -122.3325),
    ClusteringIdentifier = "parks"
});

Пины с одинаковым идентификатором кластеризуются вместе. Разные идентификаторы формируют независимые кластеры, даже если пины расположены рядом. Нет идентификатора? Группа по умолчанию. Чисто и предсказуемо.

Обработка нажатий на кластер

Когда пользователь нажимает на кластер, вы получаете событие ClusterClicked со всем необходимым:

map.ClusterClicked += async (sender, e) =>
{
    string names = string.Join("\n", e.Pins.Select(p => p.Label));
    await DisplayAlert(
        $"Cluster ({e.Pins.Count} pins)",
        names,
        "OK");

    // Suppress default zoom-to-cluster behavior:
    // e.Handled = true;
};

Аргументы события предоставляют Pins (пины в кластере), Location (географический центр) и Handled (установите в true, если хотите переопределить стандартное поведение масштабирования). Просто, практично, именно то, что ожидаешь.

Детали платформ, которые стоит знать

На Android кластеризация использует собственный алгоритм на основе сетки, который пересчитывается при изменении масштаба — без внешних зависимостей. На iOS и Mac Catalyst используется нативная поддержка MKClusterAnnotation из MapKit, что означает плавные, нативные для платформы анимации.

Это один из тех случаев, когда команда MAUI приняла правильное решение — опираться на платформу там, где это имеет смысл.

Почему это важно

Кластеризация пинов была одной из самых запрашиваемых функций в .NET MAUI (issue #11811), и неспроста. Каждое приложение, показывающее местоположения на карте — отслеживание доставки, поиск магазинов, недвижимость — нуждается в этом. Раньше приходилось реализовывать самостоятельно или подключать стороннюю библиотеку. Теперь это встроено.

Для нас, .NET-разработчиков, создающих кроссплатформенные мобильные приложения, это именно тот тип улучшения качества жизни, который делает MAUI по-настоящему практичным выбором для сценариев с активным использованием карт.

Начинаем

Установите .NET 11 Preview 3 и обновите рабочую нагрузку .NET MAUI. Пример Maps включает новую страницу Clustering, с которой можно поэкспериментировать прямо сейчас.

Создайте что-нибудь с этим — и дайте вашим картам наконец вздохнуть.

Поделиться:
Просмотреть исходный код этой статьи на GitHub ↗
← .NET Апрель 2026 Servicing — Патчи безопасности, которые стоит применить сегодня
Инструменты Azure MCP теперь встроены в Visual Studio 2022 — Расширение не требуется →