OpenLayers з власним сервером даних OSM


9

Я пройшов процес налаштування власної бази даних / сервера плиток OSM, встановивши PostGIS, імпортувавши знімок даних Planet.osm (зайняв кілька днів), а також встановив Mapnik / cascadenik тощо. Я можу вручну зробити власне зразок плитки з, generate_image.pyі я можу вручну виготовити набори плиток за допомогою generate_tiles.py. Я витрачаю пристойну кількість часу на створення власного шаблону користувальницького стилю, використовуючи каскадник і генеровані з нього плитки, чим я цілком задоволений.

Мій новий випуск - налаштування зразкової ковзної карти з OpenLayers для роботи на одному сервері ...

У мене це дещо налаштовано і працює; setup Apache, mod_python, TileCache та ін. Це відображає плитки на слизькій карті, але я думаю, що у мене параметри всі вкручені в OpenLayers. Ось що я зараз отримав (що робить те, що виглядає як порожній океан на всіх рівнях збільшення):

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script src="http://openlayers.org/api/OpenLayers.js"></script> 
    <script type="text/javascript">
        var map;

        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")
                } );

                layer = new OpenLayers.Layer.TMS( "OSM", "/tilecache/tilecache.py/", {layername: 'osm', type: 'png'} );
                map.addLayer(layer);
                map.addControl(new OpenLayers.Control.PanZoomBar());
                map.setCenter(new OpenLayers.LonLat(-82.686195, 27.84788), 12)
        }
        </script> 
  </head>
<body onload="init()">
    <div id="map"></div>
</body>
</html>

Я відчуваю, що з параметрами параметрів шару щось не так, але я не можу знайти гарну документацію, що описує стандартні параметри, які використовуються для відображення загальних плиток OSM, наданих Mapnik ...

Чи є щось очевидне, що я пропускаю, що могло б викликати цю проблему?

Ось і все, що я маю в tilecache.cfg:

[cache]
type=Disk
base=/tmp/tilecache
[osm]
type=Mapnik
spherical_mercator=true
mapfile=/home/user/mapfile.xml

Відповіді:


8

Одна примітка: я рекомендую mod_wsgi над mod_python. І важливо використовувати або Apache prefork з mod_python, або (в ідеалі) mod_wsgi в демон-режимі з потоками = 1 та процесами = N (де N найкраще відповідає кількості логічних процесорів). mod_wsgi в демон-режимі може використовуватися або Apache prefork, або робочим. Причиною цього є те, що TileCache кешує об’єкт mapnik.Map, і тому його не слід розділяти між потоками. Ядро Mapnik ідеально безпечно для потоків, але багатопотокові серверні програми повинні створити екземпляр об’єкта mapnik.Map на потік. Mod_tile і Paleoserver - приклади програм, які підтримують багатопотокове відображення таким чином, але TileCache цього не підтримує. Однак запуск режиму демона TileCache + Mapnik + mod_wsgi з потоками = 1 є прекрасним маршрутом,

Що стосується конфігурації вашого шару, спробуйте додати "serviceVersion":

var tms = new OpenLayers.Layer.TMS ("Шаблон Mapnik TileCache Mapnik", URL, {serviceVersion: "1.0.0", ім'я шару: "osm", тип: "png"});


Дякую! Це вирішило проблему, але тепер setCenter не працює - я думаю, що він переходить до правильного рівня масштабування, але він зосереджений у ll = (0, 0) (від Африки) ... Можливо, проблема з вимірювачами проти dec . градусів? Також дякую за пораду щодо: mod_wsgi. Я встановив це так і побачу, чи зможу я покращити продуктивність. Я працюю в VM з 6 ядрами і 12 ГБ оперативної пам’яті, тому це повинно бути достатньо для швидкої візуалізації / кешування.
colemanm

2
Координати ОСМ знаходяться в метрах, тому вам доведеться встановити центр у проектованих метрах. Див docs.openlayers.org/library / ... .
Крістофер Шмідт

Дякую, схоже, це була моя проблема - при використанні setCenter з координатами в метрах це працює.
colemanm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.