Клуб API Карт

Использование спрайта для иконок?

Пост в архиве.

собственно, сабж...

заранее спасибо.

16 комментариев

А что именно вызывает затруднения?

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

вот спрайт:


как из него вырезать иконку для маркера?

вот marker.icon:

{"src":"","size":{"width":14,"height":19},"anchor":{"x":7,"y":18},"origin":{"x":0,"y":0},

"shadow":{"src":"","size":{"width":21,"height":24},"anchor":{"x":11,"y":21},"origin":{"x":128,"y":0}}}

не работает:

this.placeMark.options.set({ 'iconLayout' : 'default#imageWithContent',
'iconImageHref': this.model.sprite.src,
'iconContentSize': [ this.model.sprite.width, this.model.sprite.height],
'iconImageOffset': [ -marker.icon.anchor.x, -marker.icon.anchor.y],
'iconContentOffset': [ -marker.icon.origin.x, -marker.icon.origin.y],
'iconImageSize': [ marker.icon.size.width, marker.icon.size.height]});

  

 

Работа спрайтов идет через специальный css.

Так что вам придется самостоятельно создать лейаут для метки - использовать стандартный не получится.

 

По поводу css - вот нашла даже автогенерилку кода для спрайтов)

http://ruseller.com/service.php?rub=19&id=2154

спасибо, Марина.

кстати, хотел побольше узнать про технологию и алгоритмы кластеризации, которую вы используете. Может, есть уже статья про это?

Статьи пока нет. Недавно прошел апишник, на котором был доклад про кластеризатор. Пока в открытом доступе презентации с него, правда они без рассказа особой ценности не представляют. Скоро обещают выложить видео - наверняка будет пост в клубе.

я там был)

хотелось бы по-подробнее.

:) А какие именно подробности интересуют?

Насколько я знаю:

1. кластерер получает геообъекты

2. магия

3. Отображает

Про магию расчета для конкретного зума Вы  рссказывали:

1. Накладываем сетку кластеризации
2. Second pass - смотрим на пересечения на границах сетки

 

Меня интересует вот что:

1. Расчитвается ли все дерево при инициализации кластерера? Поясню. Вы говорили, что кластеры статичны. То есть расчитываются одиз раз с верхнего левого угла
2. Если да, Как Вы храните такое дерево?

 

ps offtopic

вот тут http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/IDomTile.xml

renderAt

 

renderAt(context, clientBounds, animate)

 

Добавляет тайл в родительский HTML-элемент.

Параметры:

ПараметрТип*Описание
contextHTMLElementРодительский HTML-элемент
clientBoundsObjectОбласть в клиентских координатах, которую должен занять тайл.
animateBooleantrue - анимировать рендеринг, false - нет.

а в коде:
  /**

* @ignore* Рендерит все тайлы из указанного storage-а*/_drawTiles: function (tiles, context) {var zoom = tiles.getTileZoom();tiles.each(function (tile, tileNumber) {tile.renderAt(context, this._layer.numberToClientBounds(tileNumber, zoom));}, this);},то есть параметра animate нету

С тайлами разберемся, спасибо за репорт.

 

По поводу кластеризатора.

При добавлении кластеризатора на карту (и потом при изменении зума) рассчитывается, в какую ячейку кластеризации попадает каждый геообъект, геообъекты сортируются по номеру тайла по оси x.

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

Для этих ячеек бинарным поиском находятся геообъекты, которые в них попадают (посколько все уже посчитано и отсортировано). Дальше формируются кластеры и добавляются на карту.

При изменении зума кластеризация полностью перестраивается, так как меняется сетка.

При сдвиге карты смотрим, не изменилась ли отображаемая область. Если какие-то тайлы кластеризации скрылись, мы проходим по соответствующим ячейкам и удаляем их (плюс удаляем объекты с карты). Если добавились тайлы - то проходим по новым ячейкам, и в них генерируем кластеры.

 

спасибо. все понятно. я делал практически также.

только по-другому))

> лейаут для метки
это надо ILayout. реализовывать? 

Либо реализовать ILayout, либо создать его с помощью фабрики templateLayoutFactory.

Спрайтовый оффсет сейчас принимают только канвасные метки, там за сдвиг спрайта отвечает imageShift

imageOffset в данном случае - сдвиг всей картинки относительно точки привязки.

дадада. уже нашел.

только вот про тени там не написано ;-)

у меня испольуется канвасные метки (кстати, работает overlay.staticGraphics.Placemark, а не overlay.staticGraphics.CanvasPlacemark как написано в доках) для подложки для хотспотов, а при срабатывании хотспота - ставится обычная метка типа Placemark. так вот плучается ерунда - для канваса теней нет, а для Placemark - спрайт не работает)))

Для канваса тень будет (но потом). Сейчас можно просто создать два канвасика :)

а использовать оверлеи всеже лучше через фабрики - geoObject.overlayFactory.staticGraphics.createOverlay(geometry,data,options)

класса overlay.staticGraphics.Placemark на самом деле нет - это алиас, и CanvasPlacemark тоже нет - он не доступен снаружи.

В результате в доке дырка :).

 

2 канвасика - не кошерно.

тени будут налезать на метки.

надо слои разные для меток и теней.