
Mapnik es una librería que permite generar y manipular mapas obteniendo los datos de diferentes fuentes (archivos .shp, PostGIS, .tif). En esta receta se muestra como utilizar mapnik en Python.
Mapnik permite crear y manejar mapas a partir de diferentes fuentes de datos. Esta librería se basa en el objeto Map que contiene varios atributos que permiten personalizarlo. Los atributos mas relevantes son:
Además esta clase permite manejar el mapa por medio de diversos métodos.
También existen algunas funciones que no pertenecen a ningún objeto en concreto.
from mapnik import * #Creacion del Mapa width = 790 height = 590 map = Map(width,height,'+proj=latlong +datum=WGS84') map.background = Color('white')
Para visualizar el objeto Map se le debe asociar una serie de objetos Style que permiten definir como se debe representar cada elemento del mapa.
Un Objeto Style se compone de reglas (Rules) para elementos del mapa, siendo posible definir filtros para cada una de dichas reglas. Por ejemplo podemos crear dos Rules en las que en una los puntos que cumplen una determinada condición se vean de color rojo mientras que los demás se vean de otro color. Para ello se debe asociar a la regla un objeto Filter que realize el filtrado deseado.
Elementos del mapa:
#Creacion del Estilo del Mapa styleShp = Style() r = Rule() r.symbols.append(PolygonSymbolizer(Color('#f2eff9'))) r.symbols.append(LineSymbolizer(Color('rgb(50%,50%,50%)'),0.1)) r.symbols.append(RasterSymbolizer()) styleShp.rules.append(r) #Filter # Acepta <, >, <>, not, or, and # En teoria tambien puede filtrar por expresiones regulares # pero tras probarlo no he obtenido resultados satisfactorios # Ej.- [id].match('^ascensor') style = Style() rVerde = Rule() rVerde.symbols.append(PointSymbolizer('img/puntoVerde.png','png',10,10)) rVerde.filter = Filter("not [id]='escalera0_up' or not [id]='escalera1_up'") rRojo = Rule() rRojo.symbols.append(PointSymbolizer('img/puntoRojo.png','png',10,10)) rRojo.filter = Filter("[id]='escalera0_up' or [id]='escalera1_up'") style.rules.append(rRojo) style.rules.append(rVerde) map.append_style('styleShp',styleShp) map.append_style('style',style)
Hasta el momento puede obtener datos de diferentes fuentes, para ello se crean
objetos Layer con la fuente de datos necesaria (datasource) a partir de varias clases.

#Layers del Mapa #--------------- #A cada layer hay que asociarle: # Una fuente de datos # Un Style para representar la informacion # Finalmente hay que asociarla al mapa lyrImg = Layer('raster') lyrImg.datasource = Raster(file='img/pbaja.tif',lox='0', loy='0', hix='50', hiy='50') lyrImg.styles.append('styleShp') lyrGeo = Layer('GIS') lyrGeo.datasource = PostGIS(host='localhost', user='mapnik', password='mapnik', dbname='mapnik', table='mapnik') lyrGeo.styles.append('style') lyrShp = Layer('shape') lyrShp.datasource = Shapefile(file='shp/salas') lyrShp.styles.append('styleShp') #El orden de aplicacion de las capas es relevante map.layers.append(lyrImg) map.layers.append(lyrShp) map.layers.append(lyrGeo) #Importante ajustar el zoom para ver el mapa map.zoom_all() render_to_file(map, "MapNik", "png")
$ sudo su - postgres $ createuser -s -P -e usuario $ createdb -O dueño databasename $ createlang plpgsql -d databasename $ psql databasename -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql $ psql databasename -f /usr/share/postgresql-8.3-postgis/spatial ref sys.sql $ psql -d databasename -f db-schema.sql
Ejemplo de esquema SQL.
CREATE TABLE mapnik ( id varchar(100) PRIMARY KEY, ); SELECT AddGeometryColumn('mapnik', 'geom', -1, 'GEOMETRY', 3); CREATE INDEX mapnik_idx ON mapnik USING GIST(geom);
Finalmente hay que poblar la base de datos:
INSERT INTO mapnik (id, geom) VALUES ('escalera0_up', GeomFromEWKT('POINT(45 56 0)')); INSERT INTO mapnik (id, geom) VALUES ('escalera1_up', GeomFromEWKT('POINT(66 59 0)')); INSERT INTO mapnik (id, geom) VALUES ('entrada', GeomFromEWKT('POINT(32 45 0)')); INSERT INTO mapnik (id, geom) VALUES ('salida', GeomFromEWKT('POINT(30 43 0)'));
Comentarios recientes
hace 1 seg
hace 19 horas 32 mins
hace 1 día 3 horas
hace 1 día 21 horas
hace 2 días 21 horas
hace 3 días 1 hora
hace 5 días 2 horas
hace 1 semana 1 día
hace 1 semana 6 días
hace 2 semanas 2 días