О! Большое спасибо за картинку (и за документацию ещё раз ). После надо будет наваять полную инструкцию по поднятию своего 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 и тыкнув в “Зарегистрировать ваше приложение”.
Спасибо, будет интересно почитать, если чего, добавлю что смогу.
Обзавелся намедни 8-ми гигами памяти, поэтому буду перестраивать сервер на amd64 в следующем году
Также как написал Zverik, можно зарегистрировать локальный JOSM
Подскажите, кто нибудь пробовал настраивать обновление тайлов мапника (т.е. не с полной перерисовкой всех тайлов).
Вот я пробовал взять список от osm2pgsql ключ -o (при загрузке .osc в базу) и тот список скормить мапнику. Но список тайлов не полный и какой-то кривой.
Может я что то не так делаю или есть другой способ?
Доброго времени суток, уважаемые господа! Наткнулся на форум в поисках решения задачи создания локального осм-сервера и организации маршрутизации. Поднял 2 сервиса - OSM и YOURS - на локальном линуховом серваке. В принципе работает нормально. Но карту ещё нужно заполнить большим количеством данных.
2 сервиса поднял потому, что редактировать карту можно через опенстритмап, а маршрутизацию организовать через YOURS. НО! ВОзникает вопрос: каким образом я смогу экспортировать заполненную карту с локального сервера ОСМ? Т.е. можно ли будет создать (экспортировать) что-то типа своего planet.osm.bz2?
В этой теме ранее обсуждалось редактирование мап с созданием дополнительных слоёв. Вот как можно будет объединить новые данные с уже имеющимися и экспортировать их?
Может кто подскажет что …
Да.
osmosis --read-apidb host=“localhost” database=“имя_базы_данных_osm” user=“openstreetmap” password=“XXXXX” validateSchemaVersion=no --write-xml file=имя_базы_данных_osm_dump.osm
Что вы хотите? Слои или экспорт ваших данных в ОСМ?
Слои - это покрутить tilecache или mod_tile, чтобы создавались два и более слоя (соответственно тайлы в соответствующие директории будут складываться). Потом чем-нибудь эти слои показывать (страничка с openlayers).
Если же объединять свои данные, то выгрузка данных в osm (см. выше про osmosis), потом загрузить в josm и выгрузить в openstreetmap, если исходная лицензия позволяет…
Участники темы, подскажите пожалуйста насчет редактора iD для osm, задача стоит та же (что в теме), только вот
редактор бы желательно iD,
когда захожу на локальный сервер osm,там есть: правка ->Править с помощью iD, ругается конечно говорит не настроен iD.
вопрос, как настроить iD редактор к локальному серверу?
Three of the built-in applications communicate via the API, and therefore need OAuth consumer keys configured. These are:
Potlatch 2
iD
The website itself (for the Notes functionality)
For example, to use the Potlatch 2 editor you need to register it as an OAuth application.
Do the following:
Log into your Rails Port instance - e.g. http://localhost:3000
Click on your user name to go to your user page
Click on "my settings" on the user page
Click on "oauth settings" on the My settings page
Click on 'Register your application'.
Unless you have set up alternatives, use Name: "Local Potlatch" and URL: "http://localhost:3000"
Check the 'modify the map' box.
Everything else can be left with the default blank values.
Click the "Register" button
On the next page, copy the "consumer key"
Edit config/application.yml in your rails tree
Uncomment and change the "potlatch2_key" configuration value
Restart your rails server
Для ID, нужно, в моём случае в настройках Rails-сервера:
/opt/osm/openstreetmap-website/config/application.yml
# Default editor
default_editor: "id"
# OAuth consumer key for Potlatch 2
potlatch2_key: "iGeAIqSSqcWQHD7cvQmXjWe2Fl2iYU2b3iIvjMQ4"
# OAuth consumer key for the web site
oauth_key: "iGeAIqSSqcWQHD7cvQmXjWe2Fl2iYU2b3iIvjMQ4"
# OAuth consumer key for iD
id_key: "iGeAIqSSqcWQHD7cvQmXjWe2Fl2iYU2b3iIvjMQ4"