OpenLayers с моим собственным сервером данных OSM

9

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

Моя новая проблема заключается в настройке образца скользкой карты с OpenLayers для запуска на том же сервере ...

У меня это настроено и работает; настройка 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
colemanm
источник

Ответы:

8

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

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

var tms = new OpenLayers.Layer.TMS ("TileCache Mapnik Layer", url, {serviceVersion: "1.0.0", имя слоя: "osm", тип: "png"});

Датчанин спрингмейер
источник
Спасибо! Это решило проблему, но теперь setCenter не работает - я думаю, что он достигает правильного уровня масштабирования, но он центрирован на ll = (0, 0) (за пределами Африки) ... Возможно, проблема с метрами против dec , градусы? Также спасибо за совет re: mod_wsgi. Я настрою это таким образом и посмотрю, смогу ли я получить лучшую производительность. Я использую виртуальную машину с 6 ядрами и 12 ГБ оперативной памяти, поэтому для быстрого рендеринга / кэширования должно быть достаточно.
Коулманм
2
Координаты OSM указаны в метрах, поэтому вам нужно будет установить центр в проецируемых метрах. См. Docs.openlayers.org/library/… .
Кристофер Шмидт
Спасибо, похоже, это была моя проблема - при использовании setCenter с координатами в метрах это работает.
Коулманм