Hace poco recurrí a TileStache para renderizar los mosaicos de Mapnik debido a la opción de almacenamiento en caché. Antes, estaba usando Mapnik python bindings solamente y funcionaba perfectamente. Ahora que utilizo TileStache, los azulejos se muestran aleatoriamente en la posición incorrecta en el orden equivocado, al igual que las piezas de un rompecabezas. Sólo en el zoom 0 las características están en el lugar correcto en el mapa.
Esto me hace pensar que el problema podría estar en la fila (y) y la columna (x) utilizadas para generar los mosaicos con coord = ModestMaps.Core.Coordinate(y, x, zoom)
o con la proyección que es EPSG 900913.
Utilizo OpenLayers.Layer.TMS para el mapeo.
Aquí algunos códigos:
Escritura de embaldosado:
def tile(request, version, shapefile, zoom, x, y):
config = {
"cache": {
"name": "Disk",
"path": "/mygeosite/stache",
"umask": "0000"},
"layers": {
shapefile.filename: {
"provider": {"name": "mapnik", "mapfile": "c:\\mygeosite\\geodjango\\test.xml"},
"projection": "spherical mercator"
}
}
}
# like http://tile.openstreetmap.org/1/0/0.png
# x = row , y = column , zoom = zoom level
coord = ModestMaps.Core.Coordinate(y, x, zoom)
config = TileStache.Config.buildConfiguration(config)
bytes = TileStache.getTile(config.layers[shapefile.filename], coord, 'png')
return HttpResponse(bytes[2], mimetype="image/png")
mapnik.xml
<?xml version="1.0" encoding="utf-8"?>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over" background-color="rgb(115,145,173)">
<Style name="featureLayerStyle">
<Rule>
<PolygonSymbolizer fill="rgb(247,237,238)"/>
<LineSymbolizer stroke-width="0.5"/>
</Rule>
</Style>
<Layer name="featureLayer" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over">
<StyleName>featureLayerStyle</StyleName>
<Datasource>
<Parameter name="dbname">ezmapping</Parameter>
<Parameter name="geometry_field">geom_multipolygon</Parameter>
<Parameter name="geometry_table">"shapefile_feature"</Parameter>
<Parameter name="password">ogrant22</Parameter>
<Parameter name="simplify_geometries">1</Parameter>
<Parameter name="srid">900913</Parameter>
<Parameter name="table">(select geom_multipolygon, id from "shapefile_feature" where shapefile_id=68) as geom</Parameter>
<Parameter name="type">postgis</Parameter>
<Parameter name="user">postgres</Parameter>
</Datasource>
</Layer>
</Map>
OpenLayers.js:
map = new OpenLayers.Map('map',
{maxResolution: 156543.0399,
projection: new OpenLayers.Projection("EPSG:3857"),
units: 'm',
maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
numZoomLevels: 21});
tiledLayer = new OpenLayers.Layer.TMS('TMS',
"{{ tmsURL }}",
{serviceVersion: "1.0",
layername: "{{ shapefile.id }}",
type: 'png'});
map.addLayer(tiledLayer);