OpenLayers con mi propio servidor de datos OSM

9

He pasado por el proceso de configurar mi propia base de datos OSM / servidor de mosaico configurando PostGIS, importando la instantánea de datos Planet.osm (tomó unos días) y configurando Mapnik / cascadenik, etc. Puedo renderizar manualmente el mío Muestra de mosaicos con generate_image.pyy puedo producir manualmente mosaicos con generate_tiles.py. He pasado una cantidad de tiempo decente generando mi propia plantilla de estilo personalizada usando cascadenik y generando mosaicos a partir de ella, con lo que estoy bastante contento.

Mi nuevo problema es configurar un mapa resbaladizo de muestra con OpenLayers para ejecutar en el mismo servidor ...

Lo tengo algo configurado y funcionando; configura Apache, mod_python, TileCache, etc. Representa los mosaicos en el mapa resbaladizo, pero creo que tengo todos los parámetros jodidos en OpenLayers. Esto es lo que tengo actualmente (que representa lo que parece un océano vacío en todos los niveles de zoom):

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

Siento que algo está mal con los parámetros de opciones de capa, pero no puedo encontrar una buena documentación que describa los parámetros estándar que se usarán para mostrar mosaicos OSM generales representados por Mapnik ...

¿Hay algo obvio que me falta que pueda causar este problema?

Aquí también está todo lo que tengo en tilecache.cfg:

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

Respuestas:

8

Una nota: recomiendo mod_wsgi sobre mod_python. Y es importante usar Apache prefork con mod_python o (idealmente) mod_wsgi en modo daemon con hilos = 1 y procesos = N (donde N se corresponde mejor con el número de procesadores lógicos). mod_wsgi en modo demonio se puede usar con Apache prefork o trabajador. La razón de esto es que TileCache almacena en caché el objeto mapnik.Map y, por lo tanto, no debe compartirse entre subprocesos. Mapnik core es perfectamente seguro para subprocesos, pero las aplicaciones de servidor multiproceso necesitan crear una instancia de un objeto mapnik.Map por subproceso. Mod_tile y Paleoserver son ejemplos de aplicaciones que admiten el procesamiento multiproceso de esta manera, pero TileCache no lo admite. Sin embargo, ejecutar el modo demonio TileCache + Mapnik + mod_wsgi con hilos = 1 es una buena ruta,

En cuanto a la configuración de su capa, intente agregar "serviceVersion":

var tms = new OpenLayers.Layer.TMS ("TileCache Mapnik Layer", url, {serviceVersion: "1.0.0", layername: "osm", type: "png"});

Dane Springmeyer
fuente
¡Gracias! Eso solucionó el problema, pero ahora setCenter no funciona: creo que irá al nivel de zoom correcto, pero está centrado en ll = (0, 0) (fuera de África) ... Posiblemente un problema con metros frente a dec. . grados? Además, gracias por el consejo re: mod_wsgi. Lo configuraré de esa manera y veré si puedo obtener un mejor rendimiento. Estoy corriendo en una máquina virtual con 6 núcleos y 12 GB de RAM, por lo que debería ser suficiente para un procesamiento rápido / almacenamiento en caché.
colemanm
2
Las coordenadas OSM están en metros, por lo que deberá establecer el centro en metros proyectados. Ver docs.openlayers.org/library/… .
Christopher Schmidt el
Gracias, parece que ese fue mi problema: cuando uso setCenter con coordenadas en metros funciona.
colemanm