Mapnik tiles für einen Ausschnitt neu erzeugen

Unsere Basiskarte wird laufend um Informationen ergänzt (zum Beispiel ein Shapefile mit Skipisten). Nach einer solchen Ergänzung soll nicht der gesamte Karten-Cache (mod_tile/renderd) neu gerechnet werden, sondern nur der Ausschnitt in dem Veränderungen stattgefunden haben.

Lösung

Drei Schritte um die Kartenkacheln neu zu erzeugen:

Extent des Shapefiles ermitteln

ogrinfo -geom=SUMMARY pp.shp pp
...
Extent: (11.015149, 46.848712) - (11.085476, 46.911385)
...

Liste der Tiles für diesen Ausschnitt erzeugen

Die maximale Zoomstufe meiner Karte ist 17. Jetzt nur noch die Bounding Box des Shapefiles angeben und die gewünschte Ausgabe (nach grep und awk) in eine Datei umleiten.

./globalmaptiles.py 17 46.848712 11.015149 46.911385 11.085476 | grep __Goo | awk '{print $1}' > /tmp/expired.lst

Das globalmaptiles.py Script wurde ge-patched um die gewünschten „Google“-Coordinaten einfach auszulesen

--- globalmaptiles.py.orig	2014-02-06 00:36:01.021060820 +0100
+++ globalmaptiles.py	2014-02-06 00:15:42.459082600 +0100
@@ -427,7 +427,7 @@
 			print tilefilename, "( TileMapService: z / x / y )"

 			gx, gy = mercator.GoogleTile(tx, ty, tz)
-			print "tGoogle:", gx, gy
+			print "%s/%s/%s __Google__" % (tz, gx, gy)
 			quadkey = mercator.QuadTree(tx, ty, tz)
 			print "tQuadkey:", quadkey, '(',int(quadkey, 4),')'
 			bounds = mercator.TileBounds( tx, ty, tz)

render_expired mit der Liste der Tiles aufrufen

Abschließend wird das Programm render_expired mit der generierten Liste der Tiles aufgerufen. Um die unteren Zoomstufen kümmert sich das Script selbst.

render_expired -m snowhow -s /var/run/renderd/renderd.sock < /tmp/expired.lst

See also