Оптимальное добавление множества меток

Open in CodeSandbox

ObjectManager - класс, позволяющий добавить на карту большое количество объектов без необходимости создавать и добавлять на карту метки по отдельности.

Объекты, добавленные в ObjectManager, располагаются в коллекции ObjectManager.objects. Кластеры, образованные из добавленных меток, добавляются в коллекцию ObjectManager.clusters. Визуальное отображение меток создается по требованию асинхронно. Визуальным отображением меток и кластеров являются объекты, реализующие интерфейс IOverlay. В частности, overlay.Placemark. Оверлеи помещаются в коллекции ObjectManager.objects.overlays и ObjectManager.clusters.overlays соответственно.

ObjectManager принимает описания меток в JSON формате. Метки могут кластеризоваться или показываться как есть. Если вы не используете кластеризацию, то метки будут показаны только в видимой области карты. Поскольку объекты хранятся в менеджере в виде JSON описаний и их визуальное отображение создается только по необходимости, этот способ добавления точек на карту работает быстрее, чем добавление меток на карту напрямую или через кластеризатор.

<!DOCTYPE html>
<html>
    <head>
        <title>Оптимальное добавление множества меток</title>
        <meta
            http-equiv="Content-Type"
            content="text/html; charset=utf-8"
        />
        <!--
        Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
        Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
    -->
        <script
            src="https://api-maps.yandex.ru/2.1/?lang=ru-RU&amp;apikey=<ваш API-ключ>"
            type="text/javascript"
        ></script>
        <script
            src="https://yandex.st/jquery/2.2.3/jquery.min.js"
            type="text/javascript"
        ></script>
        <script src="object_manager.js" type="text/javascript"></script>
        <style>
            html,
            body,
            #map {
                width: 100%;
                height: 100%;
                padding: 0;
                margin: 0;
            }
            a {
                color: #04b; /* Цвет ссылки */
                text-decoration: none; /* Убираем подчеркивание у ссылок */
            }
            a:visited {
                color: #04b; /* Цвет посещённой ссылки */
            }
            a:hover {
                color: #f50000; /* Цвет ссылки при наведении на нее курсора мыши */
            }
        </style>
    </head>
    <body>
        <div id="map"></div>
    </body>
</html>
ymaps.ready(init);

function init() {
    var myMap = new ymaps.Map(
            "map",
            {
                center: [55.76, 37.64],
                zoom: 10,
            },
            {
                searchControlProvider: "yandex#search",
            }
        ),
        objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: true,
            // ObjectManager принимает те же опции, что и кластеризатор.
            gridSize: 32,
            clusterDisableClickZoom: true,
        });

    // Чтобы задать опции одиночным объектам и кластерам,
    // обратимся к дочерним коллекциям ObjectManager.
    objectManager.objects.options.set("preset", "islands#greenDotIcon");
    objectManager.clusters.options.set(
        "preset",
        "islands#greenClusterIcons"
    );
    myMap.geoObjects.add(objectManager);

    $.ajax({
        url: "data.json",
    }).done(function (data) {
        objectManager.add(data);
    });
}