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.
Ingredientes
mapnik (por ahora nos vale con el paquete debian)
libmapnik0.5
mapnik-plugins
mapnik-utils
python-mapnik
postgis
postgresql
ogr2ogr (opcional)
Map
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:
background - Establece el color de fondo del mapa.
height - Ancho del mapa.
width - Alto del mapa.
style - Define cómo se visualizan de los distintos componentes del mapa.
layers - Capas que contiene el mapa. Es decir cada una de las fuentes de datos que queramos que muestre el mapa.
Además esta clase permite manejar el mapa por medio de diversos métodos.
pan - centra el mapa en la posicion indicada (x,y).
pan_and_zoom - centra el mapa en la posicion indicada y hace zoom sobre ella.
zoom_all - realiza el zoom a todas las capas, es decir, visualiza el mapa entero.
zoom_to_box - realiza el zoom a todas las capas en un determinado area.
envelope - obtiene el area de las capas del mapa.
También existen algunas funciones que no pertenecen a ningún objeto en concreto.
render_to_file(Map, archivoConExtension) - Renderiza el mapa a un archivo.
render(Map, CairoContext) - Gracias a este método se puede integrar con GTK. No disponible via paquete debian, solo bajando el .tgz y compilando.
save_map(Map, archivoConExtension) - Almacena el mapa en un archivo.
frommapnikimport*#Creacion del Mapa
width=790height=590map=Map(width,height,'+proj=latlong +datum=WGS84')map.background=Color('white')
Style
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:
PolygonSymbolizer - Establece el estilo de los poligonos.
LineSymbolizer - Establece el estilo de las lineas.
PointSymbolizer- Establece el estilo de los puntos.
RasterSymbolizer - Permite que se visualizen las imagenes raster.
#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)
Layers
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.
Raster - Permite crear una layer a partir de imagenes (.tif). Puede ser util la herramienta ogr2ogr para convertir imagenes normales a imagenes con formato geográfico.
Shapefile - Crea una layer a partir de un archivo .shp de descripción de figuras geométricas.
PostGIS - Crea una layer a partir de la información de una tabla de una base de datos Postgres con campos PostGIS (geometry). Es posible realizar un pequeño filtrado de la tabla pero solo se puede trabajar con la tabla en cuestión nada de hacer joins ni comparaciones con campos de otras tablas.
Gdal - Todavia no lo he probado :-)
#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")
Cómo instalar nuestra querida Debian en el Acer Aspire ONE. Sé que hay varias buenas recetas sobre lo mismo, pero son efímeras y al final nos quedamos sin receta. CRySoL perdura.
Supongo que sabréis que el Ministerio de Cultura y estamentos privados tan reputados como la SGAE, la industria de los contenidos y las empresas de comunicaciones están preparando un proyecto para acabar con el P2P en España (la semana que viene) y parece que la propuesta va a ser el sistema francés de tres amenazas avisos.
Hola, como dije cuando me presenté, no soy un experto de gnu/linux. Llevo unos meses utilizando ubuntu, la verdad es que no me ha dado problemas, pero hace unos días recibí la última versión de molinux, y decidí partir el disco e instalar en una mitad ubuntu y la otra mitad molinux (creo que fue una estupidez y que finalmente borraré uno de ello ya que son casi iguales, para lo que también pido ayuda, ya que no se como se hace, he de reconocer que tampoco he googleado sobre esto, asi que me pondré a ello). Bueno el caso es que antes de decantarme y elegir he decidido instalar algunos programas en molinux, como el aircrack o wireshack (que conste que es cuestión de auditoria :p) o a borrar los tipicos juegos. Bien, para lo primero me dice:
Con todo esto de las atribuciones, las competencias, los títulos, las huelgas, la mala información y la pura y llana desinformación (incluso intencionada) es un auténtico reto enterarse de qué va todo esto y hacia dónde va (si es que va) nuestra amada/odiada, al 50%, carrera de Informática.
Con propósitos docentes he generado un paquetillo Debian que contiene DevkitPro 23b para ARMEABI, PPC y PSP completo, con las herramientas de manipulación de imágenes, generación de ROMs, depuración, etc.
Esta receta prentede ser una introducción a los hilos utilizando la librería glib.
¿Qué es un hilo?
Un hilo de ejecución es una característica que permite a una aplicación realizar varias tareas concurrentemente. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente, por ejemplo si programamos videojuegos podemos tener un hilo para la Inteligencia Artificial, otro para la física y otro para el renderizado de los gráficos, pero todos ellos se ejecutarán de manera paralela.
¿Qué es glib?
La librería glib es una de las más importantes que existen en GNOME. Dentro de glib está implementada una serie de tipos de datos que nos hace más fácil, si cabe, el tratamiento de los datos y además tiene la propiedad de mejorar la portabilidad de nuestros programas.
Un ejemplo sencillo de programa en C++ que crea dos hilos
#include <cstdlib>
#include <iostream>
#include <glib.h>
GThreadFuncfuncion_de_prueba(char*cadena);intmain(intargc,char*argv[]){char*mensaje1="mensaje_1";char*mensaje2="mensaje_2";//inicializamos el soporte para hilos en glibif(!g_thread_supported())g_thread_init(NULL);//reservamos memoria para los hilos de manera dinámicaGThread*productor=(GThread*)malloc(sizeof(GThread));GThread*consumidor=(GThread*)malloc(sizeof(GThread));//creamos los hilosproductor=g_thread_create((GThreadFunc)funcion_de_prueba,(char*)mensaje1,TRUE,NULL);consumidor=g_thread_create((GThreadFunc)funcion_de_prueba,(char*)mensaje2,TRUE,NULL);//destruimos los hilosg_thread_join(productor);g_thread_join(consumidor);//liberamos memoriafree(productor);free(consumidor);return0;}//esta es la función que es llamada por los hilosGThreadFuncfuncion_de_prueba(char*cadena){printf("esta es la funcion de prueba\n");printf("mensaje %s\n",cadena);}
Resultados que deberás obtener
esta es la funcion de prueba
mensaje mensaje_1
esta es la funcion de prueba
mensaje mensaje_2
o bien
esta es la funcion de prueba
esta es la funcion de prueba
mensaje mensaje_1
mensaje mensaje_2
Hola, no he visto nada de Molinux Adarga 4.0 por aquí, aunque supongo que la mayoría de los miembros de la comunidad ya lo conocen. Pero siempre quedará gente que no esté informada sobre éste (como era mi caso hasta hace 4 días).
Hay unas cuantas piezas de fruta que nadie se come porque están empezando a pasarse, y no son tan apetecibles como el resto de la fruta. ¡Estupendo! Haz una mermelada con ellas.
Ingredientes
N gramos de fruta
N/2 gramos de azúcar
agua
Preparación
Echar un poco de agua en una cazuela y poner a hervir con el azúcar.
Opcionalmente, se puede añadir una rama de canela.
Picar la fruta en trozos muy pequeños, cuanto más, mejor. Como si quisiéramos hacerla puré.
Echarla a la cazuela y hervir, removiendo constantemente. A medida que la cocción vaya avanzando, la mezcla se irá solidificando.
Cuando tenga la textura adecuada, retirar del fuego y dejar enfriar en un bol.
¿Cuál es la textura adecuada?
Bueno, pues eso es muy subjetivo. Obviamente, no debe ser tan líquido como para chorrear, ni tan sólido como para cortarlo con cuchillo. El problema es que, al dejarla enfriar, se endurecerá aún más. Si habéis echado demasiado azúcar puede quedar demasiado dura. En ese caso, se puede volver a calentar al baño maría y rebajarla añadiendo un poco de agua.