Спасибо! Надеюсь поможет потом.
Сейчас база есть, мапник рендерится.
Поковырялся, наваял страничку по документации из OpenLayer. Базовую карту (http://labs.metacarta.com/wms/vmap0) через локальный tilecache показывает (basic в конфиге tilecache-a).
Со своей (osm в конфиге tilecache-a) проблемы - показывает только воду. “Мир воды”…
openstreetmap - основная - в неё загружаются пользовательские данные редактирования.
osm_test - тестовая, говорят, что она перезатирается при инициализации - для внутренних нужд?
osm - production - зачем она?
Проинициализировал пустую базу openstreetmap, добавил туда парочку объектов (через josm, который подключается к локальным рельсам).
Теперь задача срендерить с неё слой mapnik-ом. Но мапник хочет базу postgis.
Т.е. данные нужно перегонять из одной базы (openstreetmap) в базу postgis (gis) и потом уже натравливать на неё mapnik?
Я нигде не видел четкого описания для чего она, но было бы логично иметь отдельную базу для резервного копирования, выгрузок дампов и прочих задач, несвязанных с наполнением первичными данными.
О! Большое спасибо за картинку (и за документацию ещё раз ). После надо будет наваять полную инструкцию по поднятию своего rails-сервера… Со всеми возможными подводными камнями.
Почему-то generate_tyles.py валились с ошибкой:
render_tiles( (131.980255, 43.098925999999999, 131.985131, 43.102438999999997) osm2.xml tiles/ 10 16 Vladivostok )
Postgis Plugin: SRID warning, using srid=-1
Traceback (most recent call last):
File "./generate_tiles_vlad.py", line 218, in <module>
render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom, "Vladivostok")
File "./generate_tiles_vlad.py", line 135, in render_tiles
renderer = RenderThread(tile_dir, mapfile, queue, printLock, maxZoom)
File "./generate_tiles_vlad.py", line 64, in __init__
mapnik.load_map(self.m, mapfile, True)
RuntimeError: :
ERROR: relation "planet_osm_polygon" does not exist
LINE 4: from planet_osm_polygon
^
Full sql was: 'SELECT * FROM
(select way,aeroway,amenity,landuse,leisure,man_made,military,"natural",power,tourism,name,highway,
case when religion in ('christian','jewish') then religion else 'INT-generic'::text end as religion
from planet_osm_polygon
where landuse is not null
or leisure is not null
or aeroway in ('apron','aerodrome')
or amenity in ('parking','university','college','school','hospital','kindergarten','grave_yard')
or military in ('barracks','danger_area')
or "natural" in ('field','beach','desert','heath','mud','wood','sand','scrub')
or power in ('station','sub_station','generator')
or tourism in ('attraction','camp_site','caravan_site','picnic_site','zoo')
or highway in ('services','rest_area')
order by z_order,way_area desc
) as leisure
LIMIT 0'
(encountered during parsing of layer 'landcover' in map 'osm2.xml')
Оказалось, что данные нужно заливать в gis-базу не командой:
Сейчас осталось разобраться как правильно туда прописать отображение моего отрендеренного слоя, чтобы по галочке он включался и отключался в rails-сервере…
An error occurred: can't find resolution index for 0.000343. Available resolutions are:
[156543.03390000001, 78271.516950000005, 39135.758475000002, 19567.879237500001, 9783.9396187500006, 4891.9698093750003, 2445.9849046875001, 1222.9924523437501, 611.49622617187504, 305.74811308593752, 152.87405654296876, 76.43702827148438, 38.21851413574219, 19.109257067871095, 9.5546285339355475, 4.7773142669677737, 2.3886571334838869, 1.1943285667419434, 0.59716428337097172, 0.29858214168548586]
Кусок карты примерно один и тот же. Обращался к wms из тестового примера на OpenLayers.js, при подстановке туда другого слоя (base, который в конфиге tilecache-а ссылается на http://labs.metacarta.com/wms/vmap0 ) - карта отображается.
В гугле (http://osgeo-org.1803224.n2.nabble.com/Configuration-of-TileCache-and-OpenLayers-td1837117.html) нашёл решение:
Нужно вычесть от одной координаты слоя другую (брать из bbox в generate_tiles.py), поделить это на 512 и получим maxResolution. Прописываем bbox и maxResolution в html-ку из которой обращаемся к tilecache-у, а так же прописываем bbox слоя в конфиг tilecache-а для этого слоя.
Попробовал - не получилось.
Вопрос - правильное ли это решение, если да - где я ошибся, если нет - то какое правильное?
Пробовал сгенерить “базовую карту”:
options = OpenLayers.Util.extend({
maxExtent: new OpenLayers.Bounds(-20037508.34,
-20037508.34,20037508.34,20037508.34),
maxResolution: 156543.0339,
units: "m",
projection: "EPSG:900913",
transitionEffect: "resize"
}, options);
var map = new OpenLayers.Map('map', options);
И уж после этого к нему подключать слои wms:
var drsk = new OpenLayers.Layer.WMS( "drsk",
"http://gpw.rs.int/tilecache/tilecache.cgi?",
{ layers: 'drsk',
transparent: 'true',
format: 'png'} );
map.addLayer(drsk);
Или прямое отображение картинок:
var osm = new OpenLayers.Layer.XYZ(
"osm",
"http://gpw.rs.int/tilecache/tilecache.cgi/1.0.0/osm/${z}/${x}/${y}.png",
{
numZoomLevels: 16,
sphericalMercator: true
}
);
map.addLayers([osm]);
Вот только опять возникло пара вопросов:
Когда обращаюсь к своим данным как к WMS - tilecache нагружает postgres. Причём не слабо. Зачем? Если же через XYZ - то напрямую и postgres не трогает.
Только для WMS, если поставить параметр (transparent: ‘true’), то он будет подключаться “галочкой” (в интерфейсе) в довесок к слою, который “основной”. Но при этом он полностью закрывает основной слой. Т.е.е если на моём слое всего пара элементов на карте, то при тыканье “галки” - вся карта исчезает и рисуется только мой слой. А надо бы, чтобы он был полупрозрачен и оба слоя отображались одновременно. Это возможно? В примерах на openlayers.org что-то не могу найти…
Есть вот этот пример: http://openlayers.org/dev/examples/all-overlays-google.html
Но тут как раз с наложением и перекрытием. Т.е. два слоя одновременно не видны, даже если включить оба.
Теперь всё это дело прикрутить бы к rails-серверу.
Как говорили выше, все изменения нужно добавлять в файл rails/public/openlayers/OpenStreetMap.js
Хорошо, заходим туда, смотрим. Там записи для слоёв. Если поменять источник данных (ссылки на тайлы для какого-либо слоя), то rails-сервер отображает мои тайлы для этого слоя (где меняли). Всё работает, всё нормально.
Но задача как раз создать свои слои, задать их имя, прозрачность и т.д. именно в rails-сервере. Всё то, что может OpenLayers. На тестовом примере (отдельная html-ка с js) я это обкатал - там работает.
Делаю копию класса из исходного (в том же файле: rails/public/openlayers/OpenStreetMap.js)
Дописываю в конец файла, обновляю страничку rails-сервера - ноль эмоций. Никаких новых вкладочек слоёв не появилось… Судя по всему ещё нужно куда-то прописывать. По всей ветке мне сказали только про этот файл. grep-ом погрепал весь rails-сервер - куча упоминаний про тот же osmarender. Попереправлял и там - не помогло…
Как правильно это делать? Должно же быть просто как-то (без переписывания кода rails-сервера).
Думаю, что без ковыряния кода rails-сервера и добавления в него своего класса ничего не получится. Видимо rails-сервер не предназначен для использования в нем произвольных , собственных слоев.
Для отображения своих слоев-классов нужно использовать обычный tile-сервер c OpenLayers, а rails-сервер только для ввода данных. Ну или подменять один из классов rails-сервера.
Все имхо.
Более тщательно почитал документацию по TileCache и выяснил, что:
This TileCache client supports multiple different rendering backends. Each rendering backend also supports the ability to draw ‘metatiles’, where a large tile is rendered, and then chopped into smaller tiles using the Python Imaging library.
MapServer -- render a tile using Python mapscript.
Mapnik -- render a tile using the mapnik Python bindings.
Cascading WMS -- fetch a tile from a remote WMS service. (Uses urllib to fetch tiles.)
Оказывается, что он не просто отдаёт тайлы, которые до этого нагенерировал мапник, а рендерит тайлы “на лету”, может быть даже через вызов мапника, складывает их себе в кэш и потом раздаёт по сети тем, кто спрашивает. Но в результате получается это несколько медленно. При масштабировании странички на сервере ворох процессов postgres, всё тормозит и в конечном счёте карта не отрисовывается. А тем временем тайлы у меня уже сгенерированы скриптом лежат в директории и никому (tilecache) они не нужны.
Как правильно отдавать статически сгенерированные тайлы? Mod_tile вроде так же работает как TileCache… Или нет?
По части работы сервера ещё возник вопрос по заливке треков. В логи сыпется следующиее:
[2011-12-27 13:23:25.471812 #4304] Rendered layouts/_inbox (11.2ms)
[2011-12-27 13:23:25.484420 #4304] Completed in 1276ms (View: 47, DB: 7) | 200 OK [osm.rs.int/user/semenov/traces]
[2011-12-27 13:25:05.134008 #13432] Message: getpresets
[2011-12-27 13:25:05.492383 #13432] GPX Import daemon wake @ Tue Dec 27 13:25:05 +1100 2011.
[2011-12-27 13:25:05.502572 #13432] ^[[4;36;1mSQL (0.2ms)^[[0m ^[[0;1mSET client_min_messages TO 'panic'^[[0m
[2011-12-27 13:25:05.502914 #13432] ^[[4;35;1mSQL (0.2ms)^[[0m ^[[0mSET standard_conforming_strings = on^[[0m
[2011-12-27 13:25:05.503245 #13432] ^[[4;36;1mSQL (0.2ms)^[[0m ^[[0;1mSET client_min_messages TO 'notice'^[[0m
[2011-12-27 13:25:05.506491 #13432] ^[[4;35;1mTrace Load (2.6ms)^[[0m ^[[0mSELECT * FROM "gpx_files" WHERE ("gpx_files"."inserted" = 'f' AND "gpx_files"."visible" = 't') ORDER BY id^[[0m
[2011-12-27 13:25:05.516928 #13432] ^[[4;36;1mUser Load (1.2ms)^[[0m ^[[0;1mSELECT * FROM "users" WHERE ("users"."id" = 1) ^[[0m
[2011-12-27 13:25:05.521183 #13432] GPX Import importing 05.gpx (4) from semenov@rsprim.ru
[2011-12-27 13:25:05.650165 #13432] ^[[4;35;1mTracepoint Load (0.8ms)^[[0m ^[[0mSELECT * FROM "gps_points" WHERE (gpx_id = 4) LIMIT 1^[[0m
[2011-12-27 13:25:05.671793 #13432] ^[[4;36;1mSQL (0.3ms)^[[0m ^[[0;1mBEGIN^[[0m
[2011-12-27 13:25:05.673946 #13432] ^[[4;35;1mTrace Load (0.6ms)^[[0m ^[[0mSELECT * FROM "gpx_files" WHERE ("gpx_files"."id" = 4) ^[[0m
[2011-12-27 13:25:05.693795 #13432] ^[[4;36;1mSQL (0.0ms)^[[0m ^[[0;1mPGError: ERROR: column "id" does not exist
LINE 1: ....000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"
^
: INSERT INTO "gps_points" ("latitude", "gpx_id", "timestamp", "altitude", "tile", "longitude", "trackid") VALUES(431105060, 4, '2011-10-28 22:28:03.000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"^[[0m
[2011-12-27 13:25:05.694364 #13432] ^[[4;35;1mSQL (0.2ms)^[[0m ^[[0mROLLBACK^[[0m
[2011-12-27 13:25:05.694599 #13432] PGError: ERROR: column "id" does not exist
LINE 1: ....000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"
^
: INSERT INTO "gps_points" ("latitude", "gpx_id", "timestamp", "altitude", "tile", "longitude", "trackid") VALUES(431105060, 4, '2011-10-28 22:28:03.000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"
Ну и шлётся письмо вида:
Subject: [OpenStreetMap] GPX Import failure^M
Mime-Version: 1.0^M
Content-Type: text/plain; charset=utf-8^M
Auto-Submitted: auto-generated^M
^M
Привет,
Это выглядит как ваш файл GPX
05.gpx
с описанием
комета
и без меток.
сбой импорта. Произошла ошибка:
PGError: ERROR: column "id" does not exist
LINE 1: ....000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"
^
: INSERT INTO "gps_points" ("latitude", "gpx_id", "timestamp", "altitude", "tile", "longitude", "trackid") VALUES(431105060, 4, '2011-10-28 22:28:03.000000', -39.941, 3891507807, 1319433050, 0) RETURNING "id"
В результате gpx не импортируется rails-сервером.
И ещё вопрос. Potlach2 не сохраняет правку - тупит на Autorization Requered. Я так понимаю он хочет авторизоваться по OAuth. То ли сам Potlach2 надо зарегистрировать, сказав по какому он адресу работает, то ли пользователи должны иметь учётку OAuth вне локальной сети - непонятно.
В Rails Port для третьей версии rails поменялся формат базы данных - в частности, названия полей id. Если у тебя rails2, нужно использоваться осмозис 0.39, иначе - 0.40.
Потлатч нужно зарегистрировать, зайдя на сайте в свои настройки OAuth и тыкнув в “Зарегистрировать ваше приложение”.