Циклическое отображение карты OpenLayers
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Циклическое отображение карты OpenLayers
Такая проблема: использую openlayers 2.10, пока не могу использовать более актуальную версию, это ограничение установлено не мной.
Мне необходимо, что бы при увеличении масштаба отображался весь мир, при этом карта не обрезалась, а дополнялась с боков, как это сделано в Yandex или Google.
Если использовать более свежую версии библиотеки, то это происходит по умолчанию, при этом код не меняется вообще.
Что необходимо что бы добиться этого эффекта на openalyers 2.10 и возможно ли это?
Заранее спасибо, уже везде искал, ответа пока нет.
Мне необходимо, что бы при увеличении масштаба отображался весь мир, при этом карта не обрезалась, а дополнялась с боков, как это сделано в Yandex или Google.
Если использовать более свежую версии библиотеки, то это происходит по умолчанию, при этом код не меняется вообще.
Что необходимо что бы добиться этого эффекта на openalyers 2.10 и возможно ли это?
Заранее спасибо, уже везде искал, ответа пока нет.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Циклическое отображение карты OpenLayers
Конечно можно. Для этого используется свойство слоя 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.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
наконец-то, внятный ответ. Спасибо огромное, буду пробовать.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
Спасибо, помогло.
Вопрос в продолжение темы: можно ли подменить отображение пустых областей, по умолчанию они белые, а можно сделать по аналогии с Яндексом с надписями?
Вопрос в продолжение темы: можно ли подменить отображение пустых областей, по умолчанию они белые, а можно сделать по аналогии с Яндексом с надписями?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Циклическое отображение карты OpenLayers
Можно либо задать бэкграунд всей карте, либо настроить бэкграунд для отсутствующих тайлов. Первый вариант добавил в демо:
Код: Выделить всё
<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.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
Спасибо за помощь и быстрые ответы. Тему можно закрыть.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
Нужно немного не это, так как при таком подходе, при перемещении карты ,во время загрузки областей видно этот бакграунд, и это не очень хорошо. А хочется как на http://www.openstreetmap.org/, там лупа отображается только с краю карты, там где ее (карты) уже не должно быть.Denis Rykov писал(а):Можно либо задать бэкграунд всей карте, либо настроить бэкграунд для отсутствующих тайлов. Первый вариант добавил в демо:
Код: Выделить всё
<style type="text/css">
#map { background: #fff url(./images/dark-tile.gif) repeat; }
</style>
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Циклическое отображение карты OpenLayers
Как-то так:
Демо обновил, в хроме работает, в ff почему-то нет.
Код: Выделить всё
.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.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
Это не верное решение проблемы.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
});
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Циклическое отображение карты OpenLayers
Неверное? Вы привели пример openstreetmap.org - там сделано аналогичным образом. При загрузке не существующего тайла соответствующему div-у присваивается класс olImageLoadError и именно определив свойство background этого класса мы и загружаем необходимое нам изображение. И не лучше ли писать значения атрибутов логического типа явно (true, false) вместо !0, вообще первый раз такое вижу.
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Интересующийся
- Сообщения: 24
- Зарегистрирован: 04 июн 2012, 22:36
- Репутация: 0
Re: Циклическое отображение карты OpenLayers
Абсолютно верно, эти параметры взяты именно из openstreetmap.org.Denis Rykov писал(а):Неверное? Вы привели пример openstreetmap.org - там сделано аналогичным образом.
Здесь не верно ( по крайней мере у меня в брузере). При том коде, который я указал выше, загружаются не div, а img. У них действительно присутствует класс olImageLoadError, это видно здесь но если двигать карту влево или в право, не перезагружая страницу, то это класс исчезаетDenis Rykov писал(а): При загрузке не существующего тайла соответствующему div-у присваивается класс olImageLoadError и именно определив свойство background этого класса мы и загружаем необходимое нам изображение.
это видно здесь Если же displayOutsideMaxExtent установить в false, то картинки за пределами карты вообще не загружаются.
Т.о. наличие класса olImageLoadError не гарантирует правильное отображение, кроме того в некоторых браузерах на месте не найденной картинки, будет отображаться иконка отсутствия картинки, что не красиво.
Возможно и лучше (я пробовал разные способы), но я сделал просто копипаст из кода openstreetmap.org, на самом деле способ указания значения флага не влияет на решение проблемы, главное чтобы значение было правильным.Denis Rykov писал(а): И не лучше ли писать значения атрибутов логического типа явно (true, false) вместо !0, вообще первый раз такое вижу.
Поэтому вопрос остается открытым: какие параметры при создании слоя нужно указать, что бы отобразить картинки с ошибками за пределами карты?
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость