Клуб API Карт

Конструктор/редактор Яндекс.Карт

Пост в архиве.
Внезапно потребовалось выводить на странице виджет Яндекс.Карт с какими-то накладываемыми слоями. Проблема заключалась в необходимости дать пользователю редактировать эти слои. Быстрый поиск редакторов накладываемых примитивов дал только конструктор схем проезда от Яндекса и какой-то убогий php'шный конструктор карт (к тому же ещё и платный). А редактор был нужен. По этому пришлось сесть и быстренько написать. Соответственно, делюсь кодом, на случай, если у кого возникнет такая же проблема. Код, как всегда, непричёсан и прекрасно документирован на С.
21 комментарий
Посмотрел в браузере! Огроменное спасибо. Очень понравилось. Посмотрю в ближайшем будущем код, и отпишусь подробнее.

(new YMaps.SearchControl(...)).onAddToMap(this.map, ...); ?

что не так?
Sergey Konstantinov
28 января 2016, 07:56
this.map.addControl(new YMaps.SearchControl())

Напрямую методы onAddToMap/onRemoveFromMap вызывать не стоит.
а чем это грозит? Пример выше взят, можно сказать, непосредственно из документации на http://api.yandex.ru/maps/
Пруфлинк?
и что? Так почему "Напрямую методы onAddToMap/onRemoveFromMap вызывать не стоит."? Чем это грозит?

Есть приложение, карта и контрол. onAddToMap — часть интерфейса между картой и контролом, о чём внешнее приложение не должно знать. Формально ничего не сломается, если вызывать onAddToMap напрямую, однако это нарушает принцип инкапсуляции.

Кстати, вы так и не привели пример из документации, где onAddToMap используется напрямую.


однако это нарушает принцип инкапсуляции

Да ну? Если нужно было спрятать реализацию воспользовались б паттерном обработчика событий, вызывающегося из контекста map (без передачи map в явном виде). А так выглядит как запроектированный интерфейс для добавления одного и того же контрола к разным картам.


Кстати, вы так и не привели пример из документации, где onAddToMap используется напрямую.
внимательно смотрим на мой ответ:

 

Пример выше взят, можно сказать, непосредственно из документации
На редкость бессмысленный оборот. Можно сказать, а можно и не сказать, ага.
ответ программиста: насколько точный, настолько же бессмысленный :)
Дело, конечно, ваше: следовать рекомендациям разработчиков API (twirl-team), или нет. Правда, непонятно, почему остальные контролы у вас подключаются через map.addControl? Если уж вы раздаёте свой код, приведите его к консистентному виду.

Чтобы привести его к нормальному виду нужно предпринять несколько шагов: сделать конструкторы всех необходимых элементов DOM внутри скрипта, вынести стили, назначить нормальное именование классов, вынести resource bundle для локализации, оформить лицензионное соглашение (предварительно слинковав с лицензией яндекса) и т.д.

Вы уверены, что я должен тратить своё рабочее время, чтобы замутить полноценный open-source проект? В посте нигде не сказано, что я предлагаю готовый продукт, а не полуфабрикат на тему "возьмите и допилите под себя". Тем более прямо сказано:

 

Код, как всегда, непричёсан и прекрасно документирован на С.

 

Я так и не понял как получить код готовой карты со слоями :(
Посмотрите метод export в редакторе. Там написан пример получения JSON для отправки на сервер и пример вставки этого JSON в просмотрщик.

не могу разобраться что к чему.


            if (confirm('сохранить слой "' + name + '"?')) {
                var layer = context.exportLayer(name);
                var out = JSON.stringify(layer);
                //TODO////////////////////////////////////////////
                //TODO// place you storing procedure here:
                YMaps.jQuery("#tools .layerContent").val(out);
                alert(out);
                //TODO////////////////////////////////////////////
                //TODO// as sample: adding layer to layer viewer:
                layers.add(layer);
                layers.showLayerList();
            }


я так понял надо вот этот кусок смотреть.


как вывести out в textarea например?


у меня появляется вопрос "сохранить слой ... ?", нажимаю ДА, после этого появляется еще одно уведомление "undefined". слой появляется сверху в предпросмотре.

Вывести в текстареа:

 YMaps.jQuery('#textAreaID').val(out)

добавил
YMaps.jQuery('#oou').val(out);


и в самом низу


   



над прямо.


не выводит в эту текстарею.

а что выдаёт в файрбаге JSON.stringify(layer) ?