создание своего OSM-сервера, как прокси

Как раз там и нужно, у меня в строке 1009


... sphericalMercator:true,url:'http://geo.local.s-s-s.ru/${z}/${x}/${y}.png',clone:function(obj){if(obj==null){obj=new OpenLayers.Layer.OSM(this.name,this.url,this.getOptions());}

в OpenStreetMap.js


    /**
     * Constructor: OpenLayers.Layer.OSM.Mapnik
     *
     * Parameters:
     * name - {String}
     * options - {Object} Hashtable of extra options to tag onto the layer
     */
    initialize: function(name, options) {
        var url = [
            "http://geo.local.s-s-s.ru/${z}/${x}/${y}.png"
/*
*            "http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",
*            "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",
*            "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"
*/

Я ничего не перекомпилировал, изменения вступают сразу

Неясно, для чего исправлять родные классы, если есть Layer.XYZ, например:

    var tah = new OpenLayers.Layer.XYZ(
        "Osmarender",
        "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
        {
            numZoomLevels: 18,
            sphericalMercator: true
        }
    );

    var osmde = new OpenLayers.Layer.XYZ(
        "OpenStreetMap.de",
        "http://tile.openstreetmap.de/tiles/osmde/${z}/${x}/${y}.png",
        {
            numZoomLevels: 18,
            sphericalMercator: true
        }
    );

Т.е. в public/openlayers/OpenLayers.js (там вообще какая-то каша) ничего править не надо, а нужно добавить создание своего layer-а, вот только куда?
Нарисовал в OpenStreetMap.js, как вы показали - не работает, т.е. нового layer-а с именем “OpenStreetMap.de” в меню не появилось…

map.addLayers([osmde, tah]);

Дак куда добавлять?
Добавил в rails/public/openlayers/OpenStreetMap.js в конец файла следующее:

var osmde = new OpenLayers.Layer.XYZ(
OpenStreetMap.de”,
http://tile.openstreetmap.de/tiles/osmde/${z}/${x}/${y}.png”,
{
numZoomLevels: 18,
sphericalMercator: true
}
);

map.addLayers([osmde]);

Запустил сервер rails - нового слоя “OpenStreetMap.de” не появилось.

Что я делаю не так?

П.С. Вся документация по OpenLayers говорит о том, как добавить js-код на свою html-страничку, чтобы показывать карту, про связку rails+openlayers так и не нашёл :frowning:

Сделал как вы написали (поправил и в OpenLayers.js) работает так же как и до внесения изменений в OpenLayers.js. С изменениями в OpenLayers.js и без изменений в OpenLayers.js - только лишь с правкой url в OpenStreetMap.js на слое Mapnik отображает нагенерированные мной тайлы, но вот в таком виде:

и вот так, если поближе:

Хотя в генераторе тайлов (mapnik) прописано генерировать весь мир mapnik/generate_tiles.py:
bbox = (-180.0,-90.0, 180.0,90.0)

А по факту получается сгенерировало только америку - сгенерировало только на основе данных линии моря и рек (взятых из world_boundaries). А Россию, которая и есть в базе - не показывает, хотя если подбирать координаты через tilecache, то Россия есть:

Может быть дело в проекции или Что-то другое?

  1. тайлы надо генерировать в EPSG:3857, а не EPSG:4326;
  2. схема нумерации тайлов - не TMS, а Google.

Разумеется, не надо пихать куда попало, необходимо иметь элементарное программистское предсталение о происходящем.

//
    map = new OpenLayers.Map('map', options);

    var mapnik = new OpenLayers.Layer.OSM();
    map.addLayers([mapnik]);

    var tah = new OpenLayers.Layer.XYZ(
        "Osmarender",
        "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png",
        {
            numZoomLevels: 18,
            sphericalMercator: true
        }
    );

    var osmde = new OpenLayers.Layer.XYZ(
        "OpenStreetMap.de",
        "http://tile.openstreetmap.de/tiles/osmde/${z}/${x}/${y}.png",
        {
            numZoomLevels: 18,
            sphericalMercator: true
        }
    );

    map.addLayers([osmde, tah]);

Море примеров есть тут: http://openlayers.org/dev/examples/

Ну так, что “это дело” теперь отображается вместо мапника ОСМ, я правильно понял?

Т.е. теперь нужно разобраться что и как нагенерил мапник 2.0 (видимо там не только в шрифтах разница :slight_smile: )

Таких описаний - уйма. Вот например про tilecache-сервер:
http://openlayers.org/dev/examples/tilecache.html
Все они сводятся к простому - у вас есть html-страничка и вот теперь мы на неё с помощью подключаемого OpenLayers.js-скрипта выведем карту, которую будем брать по таким-то ссылкам…
Но в моём случае - есть rails-сервер, в котором всё как-то внутри генериться и отдаётся пользователю. При этом есть настройки OpenLayers, которые не влияют на отдаваемую рельсами пользователю страничку. Не влияет добавление нового слоя, а вот изменение ссылки в описании для Mapnik - да, влияет… Но мне надо добавить свои слои. И вот вопрос, как добавлять свои слои в rails-сервере?

Может быть я чего упорно не могу понять и сложить 2+2? Прошу тогда не гневаться на недогадливость :slight_smile:

Как я понимаю: в случае простой html-странички: создаём html, подцепляем к ней OpenLayers.js, пишем мелкий код из примера со ссылкой на наш tilecache-сервер и всё.
В случае же рельсов: rails-сервер берёт конфиги из openlayes (который установлен как часть rails-сервера), создаёт на лету html, который и отдаёт пользователю, подключившемуся на 3000-й порт, который слушает rails-сервер.
В конфиге openlayers (OpenStreetMap.js) должен быть прописан нужный слой, который ссылается на соответствующий tilecache сервер, запущенный по соседству и отдающий тайлы по схеме нумерации Google, сгенерированные Mapnik-ом в EPSG:3857.
Так?

Ага, отдаёт то, что Мапник нагенерил. Это точно :slight_smile:

Mapnik2, генерю конфиг:
./generate_xml.py --host localhost --user postgres --dbname gis --symbols ./symbols/ --world_boundaries …/world_boundaries/ --port 5432 --password ‘xxxxx’ --epsg=‘3857’
Ругается на 3857, говорит не знает такой. Правлю generate_xml.py чтобы проверка знала, генерит.
Потом конвертирую в версию 2:
upgrade_map_xml.py osm.xml osm2.xml
Валится в сегфолт. на 4326 не валится.
Ладно, генерю для 4326, думаю руками osm2.xml поправлю.
Читаю xml:

далее:

надо и тут, я думаю, переправить. Вопрос на что? Понятно, что я тыкаюсь как слепой котёнок.

Подскажите пожалуйста в какую сторону копать? Может книжка какая?

По части схемы нумерации тайлов - это в tilecache-сервере?

Там стояло:


[osm]
type=Mapnik
mapfile=/opt/osm/mapnik/mapnik/osm2.xml
spherical_mercator=true
tms_type=google
metatile=yes

Что-то тема затихла, как продвигается дело?

Пока разгребал текучку на работе. Вот, всё думаю опять навалиться :slight_smile:

Почитать бы ещё чего тематического…

Ок, пишите что да как… интересно…
Могу описать свой опыт - хау-ту создать и поддерживать актуальность базы для рендеринга данных локального osm-сервера? Ничего нового в этом нет опусе не будет, переработанные статьи из вики…

Т.е. практически та же задача, что и у меня?
Было бы здорово!

Начеркал :slight_smile: http://wiki.openstreetmap.org/wiki/User:S-s-s_wiki/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0_%D0%B0%D0%BA%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D0%9E%D0%A1%D0%9C

Спасибо! Надеюсь поможет потом.
Сейчас база есть, мапник рендерится.

Поковырялся, наваял страничку по документации из OpenLayer. Базовую карту (http://labs.metacarta.com/wms/vmap0) через локальный tilecache показывает (basic в конфиге tilecache-a).
Со своей (osm в конфиге tilecache-a) проблемы - показывает только воду. “Мир воды”… :wink:

Причём, если захожу на:
http://osm.rs.int/tilecache/tilecache.cgi/1.0.0/osm/0/0/0.png - вода.
Если же гляжу картинку на файловой системе, которую срендерил мапник в: /opt/osm/mapnik/mapnik/tiles/0/0/0.png

то там весь мир в одной картинке - и суша и океаны…
Почистил кэш tilecache-а (tmp/tilecache) - толку ноль.

Конфигурация tilecache-а:


[cache]
type=Disk
base=/tmp/tilecache

[osm]
type=MapnikLayer
mapfile=/opt/osm/mapnik/mapnik/osm2.xml

[basic]
type=WMS
url=http://labs.metacarta.com/wms/vmap0

По идее, даже если проекция какая-то не та, то базовую (0/0/0.png) картинку-то должен показывать на последнем масштабе, или нет?

К слову, в tilecache-е пришлось в некоторых файлах поменять mapnik на mapnik2. Иначе валилось с ошибкой.

Как создать рабочий конфиг для mapnik2 в EPSG:3857?


./generate_xml.py_def --host localhost --user postgres --dbname gis --symbols ./symbols/ --world_boundaries ../world_boundaries/ --port 5432 --password 'xxxxxx' --epsg='3857'
Usage: generate_xml.py_def [template xml] <output xml> <parameters>

Full help:
 $ generate_xml.py_def -h (or --help for possible options)

Read 'osm.xml' and modify '/inc' files in place, pass dbname and user, accept empty string for other options
 $ generate_xml.py_def --dbname osm --user postgres --accept-none

Read template, save output xml, and pass variables as options
 $ generate_xml.py_def osm.xml my_osm.xml --dbname spain --user postgres --host ''

generate_xml.py_def: error: Sorry only supported projections are: [900913, 4326]

Править generate_xml.py, чтобы поддерживал? Поправил, - при генерации тайлов - падает в корку:


MAPNIK_MAP_FILE="osm.xml" MAPNIK_TILE_DIR="tiles/" ./generate_tiles.py
render_tiles( (-180.0, -90.0, 180.0, 90.0) osm.xml tiles/ 0 5 World )
Ошибка сегментирования

Говорили нужно конвертировать с помощью:


upgrade_map_xml.py osm.xml osm3.xml
Upgrading "osm.xml" to "osm3.xml"...
Ошибка сегментирования

Вопрос: Как заставить mapnik2 генерировать тайлы в проекции EPSG:3857? Это возможно вообще?

generate_xml пользоваться не надо. Сделай чистый чекаут и просто поправь пароль-логин где-то в inc/ - конфиг из OSM SVN сразу готов к бою.

Проекция EPSG:3857 - проекция с долгой историей. 900913 - это она же.

А зачем было исправлять 85-й с чем-то градус на 90? Верни назад, полюса на карте не видно же.

Не трогать ничего лишнего. Оно всё по-дефолту именно на это настроено, в т.ч. на osm.org.

Спасибо!

Хм, так по умолчанию стояло… Выставил 85.

Виноват! Оказывается osm.xml у меня лежал какой-то кривой с неверной проекцией, а я думал, что он переписывается с помощью generate_xml.py…

Однако, взял свежий мапник:


svn info
Path: .
URL: http://svn.openstreetmap.org/applications/rendering/mapnik
Repository Root: http://svn.openstreetmap.org
Repository UUID: b9d5c4c9-76e1-0310-9c85-f3177eceb1e4
Revision: 27140

  1. прописал данные для доступа к базе в:
    ./inc/datasource-settings.xml.inc

  2. Запускаю:


MAPNIK_MAP_FILE="osm.xml" MAPNIK_TILE_DIR="tiles/" ./generate_tiles.py
render_tiles( (-180.0, -90.0, 180.0, 90.0) osm.xml tiles/ 0 5 World )
### Map properties warning: 'bgcolor','minimum_version' are invalid, acceptable values are:
'background-color,background-image,srs,buffer-size,paths-from-xml,minimum-version,font-directory,maximum-extent,base'
### Font properties warning: 'face_name' is invalid, acceptable values are:
'face-name'
Traceback (most recent call last):
  File "./generate_tiles.py", line 214, in <module>
    render_tiles(bbox, mapfile, tile_dir, 0, 5, "World")
  File "./generate_tiles.py", line 135, in render_tiles
    renderer = RenderThread(tile_dir, mapfile, queue, printLock, maxZoom)
  File "./generate_tiles.py", line 64, in __init__
    mapnik.load_map(self.m, mapfile, True)
RuntimeError: Failed to find font face '' in FontSet 'book-fonts' in map 'osm.xml'

osm.xml - тот, что идёт из svn-а, в корне mapnik-a…

Если же всё же сделать, как советовали выше:


upgrade_map_xml.py osm.xml osm2.xml

часть вывода:


Changing face_name to face-name
Changing face_name to face-name
Changing face_name to face-name

После этих манипуляций вроде что-то сгенерировалось и даже показывается в рельсах! :slight_smile: