Клуб API Карт

MouseEnter при наведении на точку в активной области

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

Здравствуйте. По умолчанию в активных областях генерируется событие MouseEnter. Пробую обрабатывать событие при помощи observe, там пробую подавлять событие при помощи preventMapEvent() - но вижу, что js-описание подгружается раньше, чем моя обработка события. Подскажите, пожалуйтста, на каком этапе тогда необходимо подавлять событие, чтобы не было лишнего обращения к js-описанию на сервере при наведении мыши на точку?

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

вам нужно написать свой YMaps.Hotspots.ObjectSource

вернее отнаследоваться от него и перекрыть метод requestObjects

который собственно и ходит за данными, передавая их в callback

то есть там я смогу сделать обработку, чтобы js-описание подгружалось по клику, а не при наведении? я правильно понимаю?

 

Скорее что не понимаете.

Попытаюсь объяснить:

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

Она дает выигрыш в производительности для геоинформационных сервисов с большим количеством объектов на карте.

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

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

Получив, описание геометрии АПИ "рисует" над тайлом невидимую область, поверх растеризованной на тайле картинки, на которой становится возможным "ловить" события мыши, например, при наведении менять курсор, а при клике на ней подгружать какие-то дополнительные данные и отображать их.

 

Вы же хотите не подгружая информацию о геометрии растеризованных объектов, обрабатывать на них клики, что конечно невозможно, поскольку АПИ не знает где эти клики надо слушать.

 

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

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

Но дает значительный выигрыш при большом количестве объектов,

за счет кеширования, т.к. вариант с viewport загрузкой нельзя кешировать и даже незначительный сдвиг пользователем карты (на миллиметр) приведет к повторной загрузке тех же самых данных.

Еще один плюс состоит в том что загрузка js-данных о геометрии не производится при показе этого тайла, а производится при первоначальном наведении на него мыши, что также позволяет съекономить и загружать только данные для тех тайлов, на которые пользователь навел курсор, а не для всех видимых на карте.

Надеюсь, что понятно объяснил.

Спасибо за подробнейший ответ. Не особо искал причину и вопрос не совсем по теме, но все же хотелось бы у вас узнать, быть может знаете: не в курсе, за счет чего подгрузка большой kml  с данными, используя API google не так сильно влияет на производительность и работу браузера, в отличие от подгрузки kml или ymapsml-файла большого размера, используя API карт яндекса? Спасибо за качественную работу

это надо измерять

создать 2 страницы с гугл и яндекс картами

подгружающими один и тот же большой kml-файл

тогда будет видно что, где и насколько влияет на производительность

 

Sergey Konstantinov
28 января 2016, 05:19

Вы можете разделить загрузку кратких описаний (только геометрия + ид объектов) и полных описаний объекта так, чтобы полные описания грузились только по наведению/по клику на геообъект. Для этого вам нужно переопределить методы requestHintData (подгрузка данных по наведению) либо requestBalloonData (по клику), как, например, в этом примере.

Сделать так, чтобы список объектов в тайле не грузился по наведению курсора на тайл можно, но это бессмыссленно, т.к. убивает принцип работы слоёв активных областей.

 

Спасибо, понял, как это работает. Кстати, опять же, не углублялся в проблему и не знаю, из-за чего это происходит - но используя нарезку тайлов, как в http://api.yandex.ru/maps/jsapi/doc/mod/tasks/how-to-use-twirl-util.xml, столкнулся с проблемой - чуть выше Москвы и по всей параллели появилась пустая полоса(т.е. резкое отсечение меток, выше и ниже полосы метки есть, в самой полосе - пусто). Случайно помогло задание в ymapsml-файле квадратного размера иконки. Может решение и искуственное, является костылем - но проблема такая была