Клуб API Карт

Пересекание меток

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

UPD. Ниже речь идет о метках, а не о балунах.


Уважаемые разработчики, добрый вечер.

Столкнулся с такой ситуацией: на карте много меток и сосредоточены они в нескольких областях таким образом, что большая часть информация перекрывается другими метками.

Как решение, мне подумалось, что было бы неплохо добавить свойство в метку (такого рода как tile, например), указывающее, что метка должна быть вынесен в незанятое место (не должна перекрывать другие метки и они ее не должны перекрывать). Соответственно, внешний вид метки должен быть не как будто карта разговаривает со зрителем в стиле комикса, а что-то вроде кружочка (квадратика) в геоточке, прямоугольник с содержанием иконки - setIconContent (скругленный или нет) и линия, соединяющая один из углов прямоугольника и кружочек (квадратик).


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


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


P.S. Для моего конкретного случая, как вариант, можно было бы создать несколько стилей меток (с текстом сверху, с текстом, снизу, справа и слева или по направлениям СВ,СЗ, ЮЗ, ЮВ) и как-то все укомпоновать ручонками, но главная загвоздка в том, что метки набиваются в карту роботом и определить заранее какие будут соседи конкретной метки (чтобы привязать ей сдвиг от геоточки) я не в силах. Также всегда есть возможность добавления новых меток. Если я ошибаюсь, рад быть поправленным.

10 комментариев
Александр Новиков
28 января 2016, 07:59
Не совсем понял, о чем вы все таки пишете... о метках или о балунах. Но концепция карт от Яндекса - на карте в один момент времени может быть открыт только один балун. Остальное от лукавого. Для меток и для балунов есть возможность создавать свою реализацию. А там уже можете делать что душе угодно. За подробностями в документацию и примеры.
Вопрос о метках.

В остальном я все еще надеюсь на более конструктивный ответ нежели отсыл ко всей документации.
Александр Новиков
28 января 2016, 07:59
Вот отсюда начните: http://api.yandex.ru/maps/jsapi/doc/ref/reference/iplacemarklayout.xml Сам я с данной задачей не сталкивался пока, но знаю что она реализуема
Благодарю, видел.

Вы действительно не поняли задачи. Задача состоит в том, чтобы метка могла «знать» про все остальные метки этой же карты. И размещать себя в зависимости от этих данных.
в этом нет ничего сложного - раз уж ВЫ создаете эти метки вы ТОЧНО знаете где они находятся и какой текст в них показывается.
Расчитать линейные размеры после этого просто.

Произвести нормирование отображения, чтобы метки не пересекались - уже сильно сложнее.
Сверстать балуны так чтобы их "хвостики" могли произвольным образом извиваться и атачиться к разным концам  - опять же сильно сложнее.

Ваша задача, с первой точки зрения, решения не имеет.
Если у вас появиться четкое понимание алгоритмов работы требуемого решения - чтож, в этом случае никакой проблемы уже не будет вообще.
Но именно в этом и проблема
Нда, с таким настроем войну не выиграть :) Сильно сложнее, это насколько сильно? Про хвостики балунов — я в сообщении расписал, что может быть имеет смысл использовать другой тип представления (точка + линия + прямоугольник). Проблема в том, что у страха глаза велики, а не в том, что тут сложное алгоритмизирование. Алгоритмически как раз тут не сложно.Просто, я могу это сделать исключительно для себя, а можно попросить разработчиков и сделать это для всех. Если у них на это время хватит. Я допускаю, что возможны упрощения, например, метка не может быть больше определенных размеров, а ее содержимое усекается. По поводу точных алгоритмов, например, такой: просматриваются для размещения метки позиции в восьми направлениях (по розе ветров), если ни в одном из них разместить не удается, тогда, радиус увеличивается на одну единицу и просматривается еще раз. Первое что приходит на ум, если подольше посидеть, то их можно еще миллион придумать :) С сеткой еще есть вариант. С графом. Да, реально, куча вариантов.
проблемы возникают когда для отображения одной надписи надо не только ее поставить на нужное место, но для этого нужно еще подвинуть другие
общая задача балансировки графа - изуверская чтука
обычно просто сводиться по нужный дизайн\задачу с некими приближениями

в вашем случае я бы предложил.
1.определять кластеры маркеров - тоесть обьединять два-три маркера в один
2.при наведении мышки на какую либо строяку в списке  этого маркера - показывать( полигоном?) место его фактического расположения

подумать как это должно выглядить в динамике( добавление\удаление маркеров ) и при зуме

после выполнения этого можно и красивости прикрутить

но в любом случае - это прийдется делать вам своими ручками, без учета\поддержки яндекс карт.
ИМХО якарты не могут и не должны предоставлять такой функционал
Может вам лучше группировать близлежащие метки?
Пример реализации: probki.autoradio.ru.

Проще группировать значки без текста, потому что тогда точно известны линейные размеры значка.

В настоящее время отсутствует решение, для задачи, подобной вашей. Мы учтем ваше пожелание. Однако, сразу разочарую, что в ближайшее время ничего такого не планируется.

Быть может вы реализуете, а потом поделитесь в нашем клубе своей разработкой?
Благодарю за ответ. Правда, ссылка пока не работает. Если приму решение реализовать самостоятельно, в описанной форме, конечно поделюсь. Однако, универсальности гарантировать не смогу. :)
Ошибся в адресе, вот валидная ссылка:
http://probki.avtoradio.ru/