Страница 1 из 1

OpenLayers: вынос контроллеров за пределы карты

Добавлено: 10 ноя 2010, 10:35
Mavka
MousePosition, LayerSwitcher, OverviewMap и др.
Для большинства информационных контроллеров существует стандартный метод - при создании в options указать аттрибут div. Пусть на странице есть два элемента div, один для карты, второй для контроллера:

Код: Выделить всё

<body>
    <div id="map"></div>
    <div id="info"></div>
</body> 
Указываем их при создании карты:

Код: Выделить всё

map = new OpenLayers.Map('map', {
    div: $('map'),
    controls: [
        new OpenLayers.Control.MousePosition({div: $('info')})
    ]
}); 
Для карты (map) указывать div не обязательно, она сама найдет элемент с id='map'.

Scale
Элемент div указывается отдельно, вне общего блока параметров:

Код: Выделить всё

new OpenLayers.Control.Scale('scale', {geodesic: true}) 
Permalink
Нужен не div, а ссылка на тэг <a>:

Код: Выделить всё

<a href="" id="perm">Постоянная ссылка</a>
new OpenLayers.Control.Permalink('perm') 

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 12 ноя 2010, 10:05
Denis Rykov
Отличная инструкция! Меня вот что смущает - почему в API OpenLayers не описан параметр div для контролов наряду с остальными параметрами, а всего лишь вставлено замечание "it is possible to add a control to an external div by passing the div in the options parameter". Почему бы просто не добавить div в список доступных свойств контролов. Или тут есть какая-то логика?

И еще, в файле style.css описан, например, класс div.olControlMousePosition. А в каком именно месте происходит создание объекта div.olControlMousePosition? И могу ли я как-то вставлять свой текст в объект map на подобии того как это делает контрол MousePosition?

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 12 ноя 2010, 10:21
Mavka
Обнаружил интересную штуку. Идем на dev.openlayers.org. Смотрим:
  1. API documentation
  2. Developer Documentation
Тысяча чертей!!! По второму пункту гораздо более полная информация. Сравните: лажа и классный хабр. Дьявол, меняю ссылки в закладках. На^W^W Зачем они так сделали?

Если 'div' не задан, то он создается или при инициализации (некоторые контроллеры) или в классе-прародителе в методе draw при первом появлении на экране (в частности MousePosition). Чтобы добавить текст на карту нужно создать свой div (например, с помощью OpenLayers.Util.createDiv), задав абсолютное позиционирование. Возможно, придется поиграть с z-индексом, что бы быть на самом верхнем уровне.

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 12 ноя 2010, 13:00
Denis Rykov
Точно! А я оказывается всё это времся использовал этот лажовый док из первого пункта. Более того, если зайти на страницу, то в разделе OpenLayers JavaScript API Documentation можно увидеть 4 разные ссылки на API.

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 03 дек 2010, 11:05
Denis Rykov
Mavka писал(а):Чтобы добавить текст на карту нужно создать свой div (например, с помощью OpenLayers.Util.createDiv), задав абсолютное позиционирование. Возможно, придется поиграть с z-индексом, что бы быть на самом верхнем уровне.
Так точно, а чтобы добавить div на карту, нужно воспользоваться методом appendChild:

Код: Выделить всё

var progressBar = OpenLayers.Util.createDiv("progress-bar",new OpenLayers.Pixel(50,10),new OpenLayers.Size(56,21),"./images/ajax-loader.gif",null,null,null,null);
progressBar.style.zIndex = 2000;
progressBar.style.visibility = "hidden";
map.div.appendChild(progressBar); 

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 06 окт 2011, 06:31
Denis Rykov
Функция $() - я так понимаю аналог document.getElementById(), а собственно $() - где описана?

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 06 окт 2011, 10:03
dobeer
Думаю она описана в Prototype JavaScript Framework, который включен в библиотеку OL. С Prototype не приходилось общаться но насколько я понимаю она схожа с библиотекой JQuery, и там есть аналогичная функция, своего рода обертка для объектов. document.getElementById() только выберает элемент по его id, а функции $() можно передавать различные CSS-селекторы и получитьобъект всех элементов HTML попадающих под критерий и далее работать с ними с помощью различных методов объекта.

Re: OpenLayers: вынос контроллеров за пределы карты

Добавлено: 06 окт 2011, 10:08
Denis Rykov
Похоже Prototype тут не причём, в Util.js нашлось:

Код: Выделить всё

if(typeof window.$  === "undefined") {
    window.$ = OpenLayers.Util.getElement;
}