Карта со всеми точками — отделениями, магазинами, пунктами выдачи, офисами партнёров — одна из самых полезных страниц коммерческого сайта. Посетитель хочет увидеть, где ближайшая точка, а не листать таблицу адресов. Сложность начинается, когда точек не три, а триста или три тысячи: список в коде страницы разрастается, обновлять его неудобно, а браузер начинает тормозить. В Karty для этого есть наборы точек: список хранится у нас, а на страницу вставляется одна строка со ссылкой на него. В статье разберём, как это устроено, где какой вариант подходит и как не перегрузить карту.

Три типичных сценария

  • Страница «Где купить» или «Наши адреса». Все точки сети на одной карте с группировкой в кластеры. Посетитель приближает нужный город и кликает на метку, чтобы увидеть название.
  • Страница одной точки. У каждого магазина, клиники или участка своя страница, и на ней нужна карта с одной меткой. Заводить отдельный набор под каждую страницу не нужно — берётся нужная точка из общего набора.
  • Каталог тысяч организаций. Справочник судебных участков, школ, аптек, отделений почты: на сайте тысячи страниц, на каждой своя точка, и поддерживать это вручную невозможно. Такой справочник мы сами строили на базе одного набора из примерно шести тысяч адресов.

Как устроены наборы точек

Набор точек — это именованный список мест с координатами, который хранится в вашем личном кабинете. Создаётся он из таблицы адресов: вы загружаете список, система определяет координаты, вы проверяете спорные строки и нажимаете «Сохранить набор». Подробно этот процесс описан в статье «Массовый геокодинг адресов из Excel и CSV»; здесь сосредоточимся на том, что происходит дальше.

Сохранённый набор точек: готовый атрибут data-karty-points для вставки на сайт
Рис. 1. После сохранения кабинет показывает идентификатор набора в готовом виде: атрибутом data-karty-points для вставки без JavaScript и вызовом map.loadPoints(...) для кода.

Что даёт хранение набора у нас, а не в коде страницы:

  • изменили точку в кабинете — она обновилась на всех страницах, где показан набор; править сайт не нужно;
  • страница остаётся лёгкой: в ней нет массива из тысяч координат;
  • один набор используется на разных сайтах и страницах;
  • запрос набора не расходует квоту: платит только сама карта (тайлы), а набор ограничен лишь числом точек по тарифу.

Вставляем набор на страницу

Самый короткий вариант — без JavaScript. На странице нужны скрипт виджета и один блок:

<script src="https://kartrout.ru/widget/karty.js"></script>

<div style="width:100%;height:480px"
     data-karty-map
     data-karty-key="pk_live_ВАШ_КЛЮЧ"
     data-karty-lon="83.7636" data-karty-lat="53.3478" data-karty-zoom="10"
     data-karty-points="ИДЕНТИФИКАТОР_НАБОРА"></div>

То же самое через JavaScript, если нужно управлять картой из своего кода:

var map = Karty.map('map', { key: 'pk_live_ВАШ_КЛЮЧ', center: [83.7636, 53.3478], zoom: 10 });
map.loadPoints('ИДЕНТИФИКАТОР_НАБОРА').then(function (handle) {
  // handle.update(newItems) — заменить точки, handle.remove() — убрать слой
});

Два нюанса. Во-первых, карта сама не «приближается» к точкам: начальный центр и масштаб задаёте вы (center и zoom либо data-karty-lon, data-karty-lat, data-karty-zoom). Для сети в одном городе выберите центр города, для федеральной — центр страны и зум 3–4. Во-вторых, ключ должен быть привязан к вашему домену — иначе набор не загрузится (см. шаг про домены).

Кластеры: как карта остаётся читаемой

Тысяча меток на одной карте превращается в кашу. Поэтому при отдалении точки автоматически группируются в круги с числом внутри: «48» означает, что здесь сорок восемь точек. Клик по кругу приближает карту, а на конкретной точке показывается название. Кластеры рисуются как слой карты, а не как отдельные HTML-элементы, поэтому карта справляется с тысячами точек.

Кластеры меток на карте Барнаула: круги с числом точек внутри
Рис. 2. Демонстрация на 500 случайных точках по краю: (1) кластер с числом точек, (2) кнопки масштаба — при приближении круги распадаются на отдельные метки. Живой пример — на странице демо.

Кластеризацию можно отключить параметром cluster: false — это уместно, если точек всего пять-десять и нужны все метки сразу.

Почему не просто цикл addMarker?Метод addMarker() создаёт отдельный HTML-элемент на каждую точку. Для десятка меток это нормально, но уже на паре сотен браузер замедляется. Для наборов используйте setMarkers() или loadPoints() — они рисуют точки как слой карты.

Одна точка из набора на своей странице

Самый недооценённый приём. Если на сайте тысячи похожих страниц и на каждой нужна карта своей точки, не грузите набор целиком и не создавайте тысячу наборов. Укажите при загрузке свой ID для каждой строки (формат «ID; Название; Адрес») и запрашивайте на странице только нужную запись:

<div style="width:100%;height:320px"
     data-karty-map data-karty-key="pk_live_ВАШ_КЛЮЧ"
     data-karty-lon="{{ точка.lon }}" data-karty-lat="{{ точка.lat }}" data-karty-zoom="15"
     data-karty-points="ИДЕНТИФИКАТОР_НАБОРА"
     data-karty-focus="{{ точка.id }}"></div>

Сервер вернёт ровно одну точку независимо от того, сколько их в наборе: тысяча или сто тысяч записей не делают запрос тяжелее. Шаблонные переменные в примере — условные; подставьте свои поля из CMS или базы. Координаты центра можно взять из таблицы результата (колонки lat и lon, которые отдаёт «Скачать результат»), загрузив их в свою базу один раз.

На практике это означает, что карты на тысяче страниц справочника работают от одного набора, а исправление ошибочной точки делается в одном месте — в кабинете.

Редактирование точек без правок сайта

В «Мои наборы точек» нажмите «Точки» у нужного набора. Откроется таблица с названиями и координатами; у каждой строки есть карандаш (открывает мини-карту, где можно сдвинуть точку в нужное место) и корзина (удалить). Кнопка «Добавить точку» ставит новую точку по клику на карте — она появится с названием «Новая точка». Названия и адреса массово меняются иначе: загрузкой обновлённого списка кнопкой «Обновить». Так что быстрые правки положения делаются в таблице, а изменения текста — через обновление списка.

Мои наборы точек: раскрытая таблица точек набора с координатами и кнопками редактирования
Рис. 3. «Мои наборы точек»: (1) показать или скрыть таблицу точек, (2) «Обновить» — загрузить новую версию списка (сравнение по ID, неизменившиеся адреса бесплатны), (3) карандаш сдвигает точку на карте, корзина удаляет её.

Набор можно привязать к проекту (выпадающий список «Без проекта») — так наборы и ключи одного сайта лежат вместе, а разные сайты не смешиваются.

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

  • Название точки показывается в окошке при клике. Оно выводится как обычный текст, не как HTML, — это сделано намеренно: если набор содержит данные из чужого источника, злонамеренная разметка в названии не сработает.
  • Тема карты выбирается в конструкторе встраивания: на светлой подложке метки читаются лучше всего, на тёмной — эффектнее выглядит ночной режим сайта.
  • Тепловая карта. Если важна не каждая точка, а концентрация (где больше всего заказов или клиентов), используйте map.setHeatmap(...): она рисуется целиком в браузере и не расходует квоту.

Сколько точек можно хранить и во что это обходится

ТарифЦена за 30 днейТочек в наборахСобственных стилей карты
Базовый299 ₽1001
Старт1 490 ₽1 0001
Бизнес4 990 ₽10 0005
Масштаб14 900 ₽100 00020

Лимит точек — «потолок» на одновременно хранимые записи, а не месячная квота: он не обнуляется. Если вы понизите тариф и точек окажется больше лимита, ничего не удаляется — кабинет предупредит, что добавлять новые можно только после сокращения. Квота геокодинга нужна лишь при первой загрузке и при изменении адресов; сам показ набора на сайте её не тратит.

Для сети из десятков точек хватит «Базового», для региональной сети и справочника районного масштаба — «Старта», для справочников на тысячи и десятки тысяч записей — «Бизнеса» и выше.

Контрольный список перед запуском

  1. Все спорные строки в «Очереди уточнения» разобраны, а на карте набора нет точек вдали от нужного региона.
  2. Ключ — publishable, домены сайта (включая www) указаны.
  3. Задан осмысленный center и zoom: посетитель сразу видит свой регион.
  4. Названия точек понятны без адреса: «Магазин на Ленина, 61», а не «Точка 14».
  5. На странице есть текстовый список адресов под картой — он нужен посетителям и поисковикам, которые не выполняют JavaScript.

Частые вопросы

Сколько точек можно показать на одной карте?

Ограничение — по тарифу: 100 точек на «Базовом», 1 000 на «Старте», 10 000 на «Бизнесе» и 100 000 на «Масштабе». На стороне браузера тысячи точек не создают проблем, потому что рисуются слоем карты и группируются в кластеры.

Тратит ли показ набора точек квоту?

Нет, запрос набора не расходует квоту. Тратится только сама карта (тайлы) и, при первой загрузке и изменении адресов, геокодинг.

Как показать на странице только одну точку из большого набора?

При загрузке задайте свой ID для каждой строки и укажите его в атрибуте data-karty-focus или параметре focus метода loadPoints. Сервер вернёт ровно одну точку независимо от размера набора.

Можно ли исправить положение точки без правок сайта?

Да. В разделе «Мои наборы точек» откройте таблицу точек и сдвиньте нужную на карте. Изменение сразу видно на всех страницах, где показан набор.

Что будет, если я понижу тариф, а точек больше лимита?

Ничего не удаляется: существующие точки останутся, но добавлять новые можно только после того, как их станет меньше лимита нового тарифа. Кабинет присылает уведомление об этом.