OpenLayers avec mon propre serveur de données OSM

9

J'ai suivi le processus de configuration de ma propre base de données OSM / serveur de tuiles en configurant PostGIS, en important l'instantané de données Planet.osm (a pris quelques jours) et en configurant Mapnik / cascadenik, etc. Je peux rendre manuellement le mien échantillons de tuiles avec generate_image.pyet je peux produire manuellement des ensembles de tuiles avec generate_tiles.py. J'ai passé beaucoup de temps à générer mon propre modèle de style personnalisé à l'aide de cascadenik et à en générer des tuiles, ce dont je suis très satisfait.

Mon nouveau problème consiste à configurer un exemple de carte glissante avec OpenLayers pour qu'il s'exécute sur le même serveur ...

Je l'ai quelque peu configuré et fonctionnel; configuration Apache, mod_python, TileCache, etc. Il rend les tuiles dans la carte glissante, mais je pense que j'ai tous les paramètres vissés dans OpenLayers. Voici ce que j'ai actuellement (qui rend ce qui ressemble à un océan vide à tous les niveaux 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>

Je pense que quelque chose ne va pas avec les paramètres des options de couche, mais je ne trouve pas de bonne documentation décrivant les paramètres standard à utiliser pour afficher les tuiles OSM générales rendues par Mapnik ...

Y a-t-il quelque chose d'évident que je manque qui pourrait causer ce problème?

Voici tout ce que j'ai dans le fichier tilecache.cfg:

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

Réponses:

8

Une remarque: je recommande mod_wsgi plutôt que mod_python. Et il est important d'utiliser Apache prefork avec mod_python ou (idéalement) mod_wsgi en mode démon avec threads = 1 et processus = N (où N correspond le mieux au nombre de processeurs logiques). mod_wsgi en mode démon peut être utilisé avec Apache Prefork ou Worker. La raison en est que TileCache met en cache l'objet mapnik.Map et qu'il ne doit donc pas être partagé entre les threads. Le noyau de Mapnik est parfaitement threadsafe, mais les applications serveur multithread doivent créer une instance d'un objet mapnik.Map par thread. Mod_tile et Paleoserver sont des exemples d'applications qui prennent en charge le rendu multithread de cette manière, mais TileCache ne le prend pas en charge. Cependant, exécuter le mode démon TileCache + Mapnik + mod_wsgi avec threads = 1 est une bonne route,

En ce qui concerne votre configuration de couche, essayez d'ajouter "serviceVersion":

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

Dane Springmeyer
la source
Merci! Cela a résolu le problème, mais maintenant setCenter ne fonctionne pas - je pense que cela va au niveau de zoom correct, mais il est centré sur ll = (0, 0) (hors Afrique) ... Peut-être un problème avec les mètres par rapport à dec . degrés? Merci également pour les conseils concernant: mod_wsgi. Je vais le configurer de cette façon et voir si je peux obtenir de meilleures performances. J'exécute dans une machine virtuelle avec 6 cœurs et 12 Go de RAM, donc cela devrait être suffisant pour un rendu / cache rapide.
colemanm
2
Les coordonnées OSM sont en mètres, vous devrez donc définir le centre en mètres projetés. Voir docs.openlayers.org/library/… .
Christopher Schmidt
Merci, on dirait que c'était mon problème - lors de l'utilisation de setCenter avec des cordons en mètres, cela fonctionne.
colemanm