OpenLayers mit meinem eigenen OSM-Datenserver

9

Ich habe meine eigene OSM-Datenbank / meinen eigenen Kachelserver eingerichtet, indem ich PostGIS eingerichtet, den Planet.osm-Datenschnappschuss importiert (einige Tage gedauert) und Mapnik / cascadenik usw. eingerichtet habe. Ich kann meine eigene manuell rendern Beispielkacheln mit generate_image.pyund ich kann Kachelsätze mit manuell erstellen generate_tiles.py. Ich habe ziemlich viel Zeit damit verbracht, meine eigene benutzerdefinierte Stilvorlage mit Cascadenik zu erstellen und daraus Kacheln zu generieren, mit denen ich sehr zufrieden bin.

Mein neues Problem ist das Einrichten einer Beispiel-Slippy-Map mit OpenLayers, die auf demselben Server ausgeführt werden soll ...

Ich habe es etwas konfiguriert und funktioniert; Richten Sie Apache, mod_python, TileCache usw. ein. Dadurch werden Kacheln in die rutschige Map gerendert, aber ich glaube, ich habe alle Parameter in OpenLayers durcheinander gebracht. Folgendes habe ich derzeit (was bei allen Zoomstufen das Aussehen eines leeren Ozeans wiedergibt):

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

Ich habe das Gefühl, dass etwas mit den Layer-Optionsparametern nicht stimmt, aber ich kann keine gute Dokumentation finden, die die Standardparameter beschreibt, die für die Anzeige allgemeiner OSM-Kacheln verwendet werden sollen, die von Mapnik gerendert wurden ...

Gibt es etwas Offensichtliches, das mir fehlt und das dieses Problem verursachen würde?

Hier ist alles, was ich auch in der Datei tilecache.cfg habe:

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

Antworten:

8

Ein Hinweis: Ich empfehle mod_wsgi gegenüber mod_python. Und es ist wichtig, entweder Apache prefork mit mod_python oder (idealerweise) mod_wsgi im Daemon-Modus mit Threads = 1 und Prozessen = N zu verwenden (wobei N am besten mit der Anzahl der logischen Prozessoren übereinstimmt). mod_wsgi im Daemon-Modus kann entweder mit Apache Prefork oder Worker verwendet werden. Der Grund dafür ist, dass TileCache das mapnik.Map-Objekt zwischenspeichert und daher nicht für mehrere Threads freigegeben werden sollte. Der Mapnik-Kern ist perfekt threadsicher, aber Multithread-Serveranwendungen müssen pro Thread eine Instanz eines mapnik.Map-Objekts erstellen. Mod_tile und Paleoserver sind Beispiele für Anwendungen, die Multithread-Rendering auf diese Weise unterstützen, TileCache unterstützt dies jedoch nicht. Das Ausführen des TileCache + Mapnik + mod_wsgi-Dämonmodus mit threads = 1 ist jedoch eine gute Route.

Versuchen Sie in Bezug auf Ihre Layer-Konfiguration, "serviceVersion" hinzuzufügen:

var tms = new OpenLayers.Layer.TMS ("TileCache Mapnik Layer", URL, {serviceVersion: "1.0.0", Layername: "osm", Typ: "png"});

Däne Springmeyer
quelle
Vielen Dank! Das hat das Problem behoben, aber jetzt funktioniert setCenter nicht mehr - ich denke, es wird die richtige Zoomstufe erreicht, aber es ist auf ll = (0, 0) (außerhalb Afrikas) zentriert ... Möglicherweise ein Problem mit Metern vs. Dez. . Grad? Vielen Dank auch für den Rat bezüglich: mod_wsgi. Ich werde es so einrichten und sehen, ob ich eine bessere Leistung erzielen kann. Ich arbeite in einer VM mit 6 Kernen und 12 GB RAM, daher sollte es für schnelles Rendern / Caching ausreichend sein.
Coleman
2
Die OSM-Koordinaten sind in Metern angegeben, daher müssen Sie den Mittelpunkt in projizierten Metern festlegen. Siehe docs.openlayers.org/library/… .
Christopher Schmidt
Danke, anscheinend war das mein Problem - wenn ich setCenter mit Koordinaten in Metern verwende, funktioniert es.
Coleman