25
Марина Степанова, разработчик интерфейсов API Яндекс.Карт APIшник Яндекс.Карт , Москва, 26 апреля 2012 Много объектов на карте

Марина Степанова "Много объектов на карте"

  • Upload
    yandex

  • View
    2.332

  • Download
    2

Embed Size (px)

DESCRIPTION

APIшник Яндекс.Карт, Москва, 26.04.2012 Рассказ Марины Степановой (разработчика интерфейсов API Яндекс.Карт) о способах отображения большого количества объектов на карте, а также о новом кластеризаторе, который теперь есть в API 2.0.

Citation preview

Page 1: Марина Степанова "Много объектов на карте"

Марина Степанова,разработчик интерфейсов API Яндекс.Карт

APIшник Яндекс.Карт, Москва, 26 апреля 2012

Много объектов на карте

Page 2: Марина Степанова "Много объектов на карте"

Техническое задание:

1

показать на карте очень много объектов

Page 3: Марина Степанова "Много объектов на карте"

Решение:

2

for (var i = 0; i < 9000; i++) { map.geoObjects.add(myObjects[i]); }

Page 4: Марина Степанова "Много объектов на карте"

Что получим:

3

Page 5: Марина Степанова "Много объектов на карте"

1. Показать на карте очень много объектов

2. И чтобы еще все работало

Техническое задание 2:

4

Page 6: Марина Степанова "Много объектов на карте"

5

Хотспоты

Page 7: Марина Степанова "Много объектов на карте"

6

RenderedGeometry: { type: "Polygon", coordinates: [ [ [-315, 280], [32, 442], [141, 208] ] ] }

Page 8: Марина Степанова "Много объектов на карте"

1. Пользователь двигает мышкой

2. Смотрим на позицию курсора

3. Подгружаем данные (если нужно)

4. Проверяем, куда попадает курсор

5. Если в объект, кидаем на нем событие

6. Ловим событие на слое и показываем хинт

Как это работает?

7

Page 9: Марина Степанова "Много объектов на карте"

— Узкое место — загрузка данных

— Активный объект ищется быстро

— Грузится только 1 нужный тайл

— Пока новые данные не пришли, старые

— не удаляются

— Нужна серверная часть

Особенности

8

Page 10: Марина Степанова "Много объектов на карте"

9

Page 11: Марина Степанова "Много объектов на карте"

Все работает, но...

10

!"#$%&'", ($)*+ )*),&"(%$- &" '"#$. /)0'12

Page 12: Марина Степанова "Много объектов на карте"

Сделайте мне красиво!

11

Page 13: Марина Степанова "Много объектов на карте"

12

Кластеризатор

Page 14: Марина Степанова "Много объектов на карте"

— Постоянная картинка

— Быстро

— Эстетично

Чего хотелось

13

Page 15: Марина Степанова "Много объектов на карте"

Мы выбирали алгоритм

14

Page 16: Марина Степанова "Много объектов на карте"

Грид-кластеризация

15

— Постояно

— Не всегда красиво

— Зато быстрее некуда

Page 17: Марина Степанова "Много объектов на карте"

16

for var (i = 0; i < 9000; i++) { map.geoObjects.add(objects[i]); }

var clusterer = new ym.Clusterer(); clusterer.add(objects); map.geoObjects.add(clusterer);

Без кластеризатора —

3 строчкиС кластеризатором —

3 строчки

Page 18: Марина Степанова "Много объектов на карте"

17

Page 19: Марина Степанова "Много объектов на карте"

Балун кластера

18

Page 20: Марина Степанова "Много объектов на карте"

Наводим красоту —

19

для близко стоящих кластеров вводим отступ

margin = 5 margin = 20

Page 21: Марина Степанова "Много объектов на карте"

Легко создавать свои макеты

20

Page 22: Марина Степанова "Много объектов на карте"

Задание стиля меток кластера

21

var clusterIcons = [{ href: 'heart.png', size: [40, 40], offset: [-20, -20] }, { href: ‘heart.png', size: [60, 60], offset: [-30, -30] }], clusterNumbers = [100], clusterer = new ym.Clusterer({ margin: [20], clusterIcons: clusterIcons, clusterNumbers: clusterNumbers }); clusterer.add(myPlacemarks); map.geoObjects.add(clusterer);

Page 23: Марина Степанова "Много объектов на карте"

22

Переопределение центра кластеров —метки имеют разный весvar clusterer = new ymaps.Clusterer(); clusterer.createCluster = function(center, geoObjects) { var x = 0, y = 0, k = 0; for (var i = 0, l = geoObjects.length; i < l; i++) { var coordinates = geoObjects[i].geometry.getCoordinates(), properties = geoObjects[i].properties, weight = properties.get(‘weight’); x += coordinates[0] * weight; y += coordinates[1] * weight; k += weight; } var newCenter = [x / k, y / k], createCluster = clusterer.prototype.createCluster; return createCluster.call(this, newCenter, geoObjects); }

Page 24: Марина Степанова "Много объектов на карте"

Каждому свое

23

Хотспоты Кластеры

Нужно отобразить все данные + −

Нужно, чтобы клиентская часть была максимально быстрой

+ −

Нужно разгрузить карту визуально − +

Нужно сделать быстро и просто

− +

Page 25: Марина Степанова "Много объектов на карте"

Вопросы?

Марина Степанова

[email protected]