Клуб API Карт

Заголовок не указан

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

Делаю карту, на которой будет отображаться порядка 100 маркеров. При этом хочу, чтобы масштаб выбирался таким образом, чтобы было видно не менее 75% и не более 85% всех точек.

 

Делаю это следующим образом: вначале нахожу ограничивающий прямоугольник (brect), затем, если набирается более 85% точек, то brect уменьшается на 80%, иначе увеличивается на 110%. Вопрос сходимости алгоритма отдельный, сейчас его не рассматриваем. В результате работы алгоритма получается brect, удовлетворяющим указанным критериям.

 

Но если сделать map.setBounds(brect), то результат непредсказуем, поскольку aspect ratio у карты и у brect отличаются, и zoom у карты принимает только целые значения. И в результате могут показываться от 75% до 100% всех точек. Таким образом, для поиска оптимального brect я должен знать, каким будет brect если установить его карте. При этом вызовы map.setBounds(rect); rect = map.getBounds() делать нельзя, потому что а) карта ещё не инициализирована - для инициализации нужно знать центр и zoom, а я как раз их и вычисляю, и б) это медленно и вызовет подгрузку ненужных тайлов

Проблему решила бы функция util.bounds.getBoundsByCenterAndZoomAndContainerSize, в которую передавался бы полученный на основании brect центр и зум и размеры области, на которой будет отрисована карта.

 

Что делать, как быть?

3 комментария

map.options.avoidFractionalZoom ?

во-первых, результат получается размытым и некрасивым http://clip2net.com/s/29ULM , что делает такой режим непригодным к использованию.

во-вторых, я не понимаю, как эта опция инициализации карты отвечает на мой вопрос.

в-третьих, цитирую, "aspect ratio у карты и у brect" отличаются.

а если в brect использовать пропорции контейнера карты? 

алгоримт правда получается сложноват:

1. берем первые 2 точки

2. строим mbr

3. расширяем mbr по аспекту контейнера карты и кратному зуму.

4. проверяем все точки на вхождение в получившийся прямоугольник

5. если меньше 75% - добавляем токи - п.1

до этого надо построить mbr всех точек, найти центр и отсортировать точки по удалености от центра.

по идее, не более 23 итераций)))

можно упростить и начинать с 14 зума, например

кстати, не используйте геокоординаты, только  пиксельные. фукнции перерасчета можно выдрать из api и использовать до загрузки карты.

этим съэкономите много ресусов.