OpenLayers z moim własnym serwerem danych OSM

9

Przeszedłem proces konfigurowania własnego serwera bazy danych / kafelków OSM, konfigurując PostGIS, importując migawkę danych Planet.osm (zajęło to kilka dni), konfigurując Mapnik / cascadenik itp. Mogę ręcznie renderować własny przykładowe płytki za pomocą generate_image.pyi mogę ręcznie tworzyć zestawy płytek za pomocą generate_tiles.py. Sporo czasu spędziłem na generowaniu własnego szablonu niestandardowego stylu za pomocą cascadenik i generowaniu z niego kafelków, z czego jestem całkiem zadowolony.

Moim nowym problemem jest skonfigurowanie przykładowej śliskiej mapy z OpenLayers do uruchomienia na tym samym serwerze ...

Mam to nieco skonfigurowane i działa; setup Apache, mod_python, TileCache itp. Renderuje kafelki na śliską mapę, ale myślę, że mam wszystkie parametry spieprzone w OpenLayers. Oto, co aktualnie mam (co renderuje coś, co wygląda jak pusty ocean na wszystkich poziomach powiększenia):

<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>

Wydaje mi się, że coś jest nie tak z parametrami opcji warstw, ale nie mogę znaleźć dobrej dokumentacji opisującej standardowe parametry do wyświetlania ogólnych kafelków OSM renderowanych przez Mapnik ...

Czy brakuje mi czegoś oczywistego, co spowodowałoby ten problem?

Oto wszystko, co mam w tilecache.cfg:

[cache]
type=Disk
base=/tmp/tilecache
[osm]
type=Mapnik
spherical_mercator=true
mapfile=/home/user/mapfile.xml
colemanm
źródło

Odpowiedzi:

8

Jedna uwaga: polecam mod_wsgi zamiast mod_python. Ważne jest, aby użyć albo apache prefork z mod_python, albo (najlepiej) mod_wsgi w trybie demona z wątkami = 1 i procesami = N (gdzie N najlepiej pasuje do liczby procesorów logicznych). Mod_wsgi w trybie demona może być używany z preforkami lub procesami roboczymi Apache. Powodem tego jest to, że TileCache buforuje obiekt mapnik.Map i dlatego nie powinien być dzielony między wątkami. Rdzeń Mapnika jest całkowicie bezpieczny dla wątków, ale aplikacje serwerowe wielowątkowe muszą utworzyć instancję obiektu mapnik.Map dla każdego wątku. Mod_tile i Paleoserver to przykłady aplikacji obsługujących wielowątkowe renderowanie w ten sposób, ale TileCache tego nie obsługuje. Jednak uruchomienie trybu demona TileCache + Mapnik + mod_wsgi z wątkami = 1 jest dobrą trasą,

Jeśli chodzi o konfigurację warstwy, spróbuj dodać „serviceVersion”:

var tms = new OpenLayers.Layer.TMS („Warstwa TileCache Mapnik”, adres URL, {serviceVersion: „1.0.0”, nazwa warstwy: „osm”, typ: „png”});

Dane Springmeyer
źródło
Dzięki! To rozwiązało problem, ale teraz setCenter nie działa - myślę, że osiąga właściwy poziom powiększenia, ale jest wyśrodkowany na ll = (0, 0) (poza Afryką) ... Prawdopodobnie problem z miernikami vs. . stopni? Dziękujemy również za radę dotyczącą: mod_wsgi. Skonfiguruję to w ten sposób i sprawdzę, czy mogę uzyskać lepszą wydajność. Pracuję na maszynie wirtualnej z 6 rdzeniami i 12 GB pamięci RAM, więc powinno wystarczyć na szybkie renderowanie / buforowanie.
colemanm
2
Współrzędne OSM są w metrach, więc będziesz musiał ustawić środek w rzutowanych metrach. Zobacz docs.openlayers.org/library/… .
Christopher Schmidt
Dzięki, wygląda na to, że to był mój problem - przy użyciu setCenter ze współrzędnymi w metrach działa.
colemanm