Циклическое отображение карты OpenLayers

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Циклическое отображение карты OpenLayers

Сообщение bratok »

Такая проблема: использую openlayers 2.10, пока не могу использовать более актуальную версию, это ограничение установлено не мной.
Мне необходимо, что бы при увеличении масштаба отображался весь мир, при этом карта не обрезалась, а дополнялась с боков, как это сделано в Yandex или Google.
Если использовать более свежую версии библиотеки, то это происходит по умолчанию, при этом код не меняется вообще.
Что необходимо что бы добиться этого эффекта на openalyers 2.10 и возможно ли это?
Заранее спасибо, уже везде искал, ответа пока нет.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Циклическое отображение карты OpenLayers

Сообщение Denis Rykov »

Конечно можно. Для этого используется свойство слоя wrapDateLine, но как можно увидеть для XYZ-based слоёв поддержка этого свойства появилась только в 2.11, смотрим что там добавили и переносим себе в проект . Пример циклического отображения слоя OSM с использованием OpenLayers 2.10:

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


var lat = 0;
var lon = 0;
var zoom = 0;

OpenLayers.Layer.OSM.prototype.getURL = function (bounds) {
var res = this.map.getResolution();
var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
var z = this.map.getZoom() + this.zoomOffset;

if (this.wrapDateLine) {
var limit = Math.pow(2, z);
x = ((x % limit) + limit) % limit;
}

var url = this.url;
var s = '' + x + y + z;
if (url instanceof Array) {
url = this.selectUrl(s, url);
}

var path = OpenLayers.String.format(url, {'x': x, 'y': y, 'z': z});

return path;
}

function init(){
map = new OpenLayers.Map("map", {
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
maxResolution: 156543.0399,
numZoomLevels: 19,
units: 'm',
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326")
});
osm = new OpenLayers.Layer.OSM("Simple OSM Map", null, {wrapDateLine: true});
map.addLayer(osm);

var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
map.setCenter(lonLat, zoom);
}

ДЕМО
Spatial is now, more than ever, just another column- The Geometry Column.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

наконец-то, внятный ответ. Спасибо огромное, буду пробовать.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

Спасибо, помогло.
Вопрос в продолжение темы: можно ли подменить отображение пустых областей, по умолчанию они белые, а можно сделать по аналогии с Яндексом с надписями?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Циклическое отображение карты OpenLayers

Сообщение Denis Rykov »

Можно либо задать бэкграунд всей карте, либо настроить бэкграунд для отсутствующих тайлов. Первый вариант добавил в демо:

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


<style type="text/css">
#map { background: #fff url(./images/dark-tile.gif) repeat; }
</style>
Spatial is now, more than ever, just another column- The Geometry Column.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

Спасибо за помощь и быстрые ответы. Тему можно закрыть.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

Denis Rykov писал(а):Можно либо задать бэкграунд всей карте, либо настроить бэкграунд для отсутствующих тайлов. Первый вариант добавил в демо:

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


<style type="text/css">
#map { background: #fff url(./images/dark-tile.gif) repeat; }
</style>
Нужно немного не это, так как при таком подходе, при перемещении карты ,во время загрузки областей видно этот бакграунд, и это не очень хорошо. А хочется как на http://www.openstreetmap.org/, там лупа отображается только с краю карты, там где ее (карты) уже не должно быть.
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Циклическое отображение карты OpenLayers

Сообщение Denis Rykov »

Как-то так:

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

.olImageLoadError {
background: url(./images/missing-tile.png) no-repeat scroll 0 0 transparent !important;
opacity: 1.0 !important;
}

Демо обновил, в хроме работает, в ff почему-то нет.
Spatial is now, more than ever, just another column- The Geometry Column.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

Denis Rykov писал(а):Как-то так:

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

.olImageLoadError {
background: url(./images/missing-tile.png) no-repeat scroll 0 0 transparent !important;
opacity: 1.0 !important;
}

Демо обновил, в хроме работает, в ff почему-то нет.
Это не верное решение проблемы.
Отображение картинок включается опцией displayOutsideMaxExtent = true, но я не могу понять, как правильно ее использовать
т.е. я создаю слой, так

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

 var s=new OpenLayers.Layer.OSM('sss',["http://tile.openstreetmap.org/${z}/${x}/${y}.png"], {
    displayOutsideMaxExtent:!0,
    wrapDateLine:!0
  });
При отображении за пределами карты должна отобразиться картинка, но ее нет. Точнее тег img есть, но src = http://c.tile.openstreetmap.org/2/3/-1.png, но такого файла нет. Как правильно указать настройки при создании слоя, чтобы отобразить картинку за пределами карты?
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Циклическое отображение карты OpenLayers

Сообщение Denis Rykov »

Неверное? Вы привели пример openstreetmap.org - там сделано аналогичным образом. При загрузке не существующего тайла соответствующему div-у присваивается класс olImageLoadError и именно определив свойство background этого класса мы и загружаем необходимое нам изображение. И не лучше ли писать значения атрибутов логического типа явно (true, false) вместо !0, вообще первый раз такое вижу.
Spatial is now, more than ever, just another column- The Geometry Column.
bratok
Интересующийся
Сообщения: 24
Зарегистрирован: 04 июн 2012, 22:36
Репутация: 0

Re: Циклическое отображение карты OpenLayers

Сообщение bratok »

Denis Rykov писал(а):Неверное? Вы привели пример openstreetmap.org - там сделано аналогичным образом.
Абсолютно верно, эти параметры взяты именно из openstreetmap.org.
Denis Rykov писал(а): При загрузке не существующего тайла соответствующему div-у присваивается класс olImageLoadError и именно определив свойство background этого класса мы и загружаем необходимое нам изображение.
Здесь не верно ( по крайней мере у меня в брузере). При том коде, который я указал выше, загружаются не div, а img. У них действительно присутствует класс olImageLoadError, это видно здесь
наличие класса olImageLoadError
наличие класса olImageLoadError
map1.jpg (104.1 КБ) 11182 просмотра
но если двигать карту влево или в право, не перезагружая страницу, то это класс исчезает
это видно здесь
отсутствие класса olImageLoadError
отсутствие класса olImageLoadError
map2.jpg (111.06 КБ) 11182 просмотра
Если же displayOutsideMaxExtent установить в false, то картинки за пределами карты вообще не загружаются.
Т.о. наличие класса olImageLoadError не гарантирует правильное отображение, кроме того в некоторых браузерах на месте не найденной картинки, будет отображаться иконка отсутствия картинки, что не красиво.
Denis Rykov писал(а): И не лучше ли писать значения атрибутов логического типа явно (true, false) вместо !0, вообще первый раз такое вижу.
Возможно и лучше (я пробовал разные способы), но я сделал просто копипаст из кода openstreetmap.org, на самом деле способ указания значения флага не влияет на решение проблемы, главное чтобы значение было правильным.

Поэтому вопрос остается открытым: какие параметры при создании слоя нужно указать, что бы отобразить картинки с ошибками за пределами карты?
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость