OpenLayers: подложка CloudMade

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

OpenLayers: подложка CloudMade

Сообщение Mavka » 29 ноя 2010, 10:58

Если ничего не путаю, то это OSM. Есть over 9000 стилей карты, все посмотреть можно здесь.
В наличии фирменные биндинги для OpenLayers.
  1. Terms of Use
  2. Скачиваем дополнение к OpenLayers (а заодно и файл с примером)
  3. Читаем, все просто:

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

    var cloudmade = new OpenLayers.Layer.CloudMade("CloudMade", {
        key: 'BC9A493B41014CAABB98F0471D759707',
        styleId: 1
    }); 
  4. API Key регистрируется здесь. На localhost у меня работало с любым ключом, более того и без библиотеки напрямую читать тайлы тоже можно. Но в принципе, зарегистрироваться несложно.
  5. Чтобы изменить стиль отправляемся назад к списку
  6. Выбираем понравившийся и нажимает 'Fullscreen'
  7. По открывшейся большой карте щелкаем правой кнопкой и ищем "Информацию об изображении" (в Опера - "Свойства изображения"):

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

    http://pts.cloudmade.com/BC9A493B41014CAABB98F0471D759707/999/256/14/8185/5447.png?1253694114     
    "BC9A493B41014CAABB98F0471D759707" - это API Key, нам не нужен. А следующее число "999" и есть styleId.
Также предлагают сервисы геокодирования и прокладки маршрутов. В том самом примере они есть.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

Re: OpenLayers: подложка CloudMade

Сообщение Mavka » 02 дек 2010, 20:41

У меня не получается урезать количество зумов. Для слоя использовали класс OpenLayers.Layer.TMS, у него как у Google нельзя просто сказать minZoomLevel: 3 (убрать первые три обзорных масштаба где земля целиком умещается на карту).

Читал Configuring ZoomLevels in OpenLayers. Для TMS рекомендуют составить serverResolutions и resolutions. Сделал (опять же убрал первые 3 зума):

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

var topo_5 = new OpenLayers.Layer.CloudMade('CloudMade', {
    key: 'b94a8892585b40cc93b70c7c48d390c6', styleId: 1,
    serverResolutions: [
        156543.0339,          78271.51695,           39135.758475,
        19567.8792375,        9783.93961875,         4891.969809375,
        2445.9849046875,      1222.99245234375,      611.496226171875,
        305.7481130859375,    152.87405654296876,    76.43702827148438,
        38.21851413574219,    19.109257067871095,    4.777314266967774,
        2.388657133483887,    1.1943285667419434,    0.5971642833709717
    ],
    resolutions: [
        19567.8792375,        9783.93961875,         4891.969809375,
        2445.9849046875,      1222.99245234375,      611.496226171875,
        305.7481130859375,    152.87405654296876,    76.43702827148438,
        38.21851413574219,    19.109257067871095,    4.777314266967774,
        2.388657133483887,    1.1943285667419434,    0.5971642833709717
    ]
}); 
Центр карты улетает за край мира, ставит 0-й зум (земли повторяется раза 4) и судя по MousePosition теряются координаты (при переходе через dateline долгота продолжает расти).

Есть идеи?
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

Re: OpenLayers: подложка CloudMade

Сообщение Mavka » 15 дек 2010, 18:19

Грязный трюк:

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

map.events.register('zoomend', map, functiom() {
    if (this.resolution > 19567.8792375) {
        this.zoomIn();
    }
}); 
Т.е. сначала происходит уменьшение, а потом я его возвращаю обратно.
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Рецепты»