<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GIS &#38; Chips &#187; Uncategorized</title>
	<atom:link href="http://www.gisandchips.org/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gisandchips.org</link>
	<description>Geografía útil para llevar</description>
	<lastBuildDate>Tue, 29 Nov 2011 10:38:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>OpenStreetMap y Mapnik</title>
		<link>http://www.gisandchips.org/2009/10/23/openstreetmap-y-mapnik/</link>
		<comments>http://www.gisandchips.org/2009/10/23/openstreetmap-y-mapnik/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 11:42:23 +0000</pubDate>
		<dc:creator>jose</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[mapfile]]></category>
		<category><![CDATA[Mapnik]]></category>
		<category><![CDATA[OpenStreetMap]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=420</guid>
		<description><![CDATA[Objetivo: Siguiendo con la serie de artículos sobre OSM vamos a introducirnos en las posibilidades que nos ofrece Mapnik para renderizar datos de OSM contenidos en una geodatabase que hemos creado con &#8220;osm2pgsql&#8221; (ver artículo previo). El objetivo final es crear un fichero de mapa (mapfile) en XML para utilizarlo con Python y los bindings [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Objetivo</strong>:<br />
Siguiendo con la serie de artículos sobre OSM vamos a introducirnos en las posibilidades que nos ofrece <a href="http://mapnik.org/">Mapnik </a>para renderizar datos de OSM contenidos en una geodatabase que hemos creado con &#8220;osm2pgsql&#8221; (ver artículo <a href="http://www.gisandchips.org/2009/10/22/renderizado-de-osmcon-mapnik-para-usar-en-openlayers/#more-387">previo</a>).<br />
El objetivo final es crear un fichero de mapa (mapfile) en XML para utilizarlo con Python y los bindings de Mapnik. Una vez realizado este proceso podremos generar tanto imágenes como conjuntos de teselas (tiles)</p>
<p><img src="http://www.gisandchips.org/wp-content/ali_zoom14-300x300.png" alt="" width="300" height="300" /></p>
<p><span id="more-420"></span></p>
<p><strong>Descarga de utilidades OSM para Mapnik</strong><br />
En el repositorio subversion de OSM tenemos todo lo necesario para montar nuestro propio motor de renderizado de imágenes y conjuntos de tiles.<br />
Para descargar estas utilidades nos situamos en la raíz de nuestro &#8220;home&#8221; y procedemos a la descarga:</p>
<pre class="brush: bash; title: ; notranslate">
svn co http://svn.openstreetmap.org/applications/rendering/mapnik/ mapnik
cd mapnik
</pre>
<p>Este es el contenido de la carpeta &#8220;mapnik&#8221;:</p>
<ul>
<li> <em>symbols</em>: carpeta con los iconos utilizados &#8220;oficialmente&#8221; en el &#8220;slippy map&#8221; de www.openstreetmap.org</li>
<li><em>osm_template.xml</em>:  plantilla por defecto para generar un mapfile de OSM</li>
<li><em>set_mapnik.env</em>:  script de configuración de directorios, datasources, etc.</li>
<li><em>generate_image.py</em>:  script para generar una imagen</li>
<li><em>generate_tiles.py</em>:  script para generar tiles</li>
<li>otros archivos</li>
</ul>
<p><strong>Descarga de shapefiles</strong>:</p>
<p>OSM necesita una serie de shapefiles para poder renderizar aspectos como la costa, paises, masas de agua, etc.<br />
Lo ideal es que dentro del directorio &#8220;mapnik&#8221; creemos una carpeta donde almacenarlos</p>
<pre class="brush: bash; title: ; notranslate">
mkdir world_boundaries
</pre>
<p>Ahora descargamos los shapefiles y los descomprimimos</p>
<pre class="brush: bash; title: ; notranslate">
echo &quot;Tamaño 50 Mb&quot;
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
echo &quot;processed_p: Tamaño 227 Mb&quot;
wget http://tile.openstreetmap.org/processed_p.tar.bz2
echo &quot;shoreline_300: Tamaño 46 Mb&quot;
$ wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
cd world_boundaries
echo &quot;Descomprimir&quot;
tar -xvzf world_boundaries-spherical.tgz
tar jxvf processed_p.tar.bz2
tar jxvf shoreline_300.tar.bz2
</pre>
<p>De todas las shapes de estos archivos nos interesan fundamentalmente tres:</p>
<ul>
<li><em>shoreline_300</em> : polígonos con los contienentes y en cuadrículas, utilizado para el renderizado de la costa. El detalle es muy tosco, por lo que se utiliza para escalas superiores a 1/600.000</li>
<li><em>processed_p</em>:  polígonos con los contienentes y en cuadrículas, utilizado para el renderizado de la costa. Tienen gran detalle, por lo que se utiliza para escalas inferiores a 1/600.000</li>
<li><em>builtup_area</em>:  polígonos con masas de agua continentales (lagos)</li>
</ul>
<p><strong>Configuración de Mapnik para OSM</strong></p>
<p>El siguiente paso es configurar el fichero &#8220;set_mapnik.env&#8221; donde especificaremos las rutas a las carpetas de símbolos, shapefiles y conexiones a PostGIS.<br />
Este fichero será utilizado por la plantilla de OSM (&#8220;osm_template.xml&#8221;) para sustituir las variables contenidas entre &#8220;%&#8221;, como por ejemplo &#8220;%HOST%&#8221;, por nuestros valores personalizados.</p>
<p>Contenido del fichero &#8220;set_mapnik.env&#8221;</p>
<pre class="brush: python; title: ; notranslate">
#!/bin/sh
# Nombre del mapfile
export MAPNIK_MAP_FILE=/home/&lt;usuario&gt;/mapnik/osm.xml

# carpeta de símbolos
export MAPNIK_SYMBOLS_DIR=/home/&lt;usuario&gt;/mapnik/symbols

# carpeta de shapefiles
export MAPNIK_WORLD_BOUNDARIES_DIR=/home/&lt;usuario&gt;/mapnik/world_boundaries

# Carpeta donde se generarán las tiles
export MAPNIK_TILE_DIR=/home/&lt;usuario&gt;/mapnik/tiles/

# Host de PostgreSQL
export MAPNIK_DBHOST='localhost';

# Puerto de PostgreSQL
export MAPNIK_DBPORT=''

# Nombre de la base de datos del planet OSM
export MAPNIK_DBNAME='osm'

# Nombre del usuario de Postgres con derechos sobre la base de datos OSM
export MAPNIK_DBUSER='postgres'

# Password del usuario de PostgreSQL
export MAPNIK_DBPASS='';

# Prefijo utilizado en las tablas. Este prefijo es generado si se utiliza
# el parámetro &quot;-p &lt;nombre&gt;&quot; en la utilidad &quot;osm2pgsql&quot;. Si no lo utilizamos
# se entiende que será &quot;planet_&quot;;
export MAPNIK_PREFIX=''
$*
#-----------------------------------------------------------------------------
</pre>
<p>NOTA: En el script sustituye &#8220;&#8221; por tu nombre de usuario.</p>
<p><strong>Configuración de la plantilla de OSM</strong></p>
<p>Como ya hemos indicado, entre los ficheros proporcionados en la carpeta &#8220;mapnik&#8221;, tenemos uno muy especial, &#8220;osm_template.xml&#8221;. Como habeis deducido se trata de la plantilla que utiliza Mapnik para generar el mapfile (&#8220;osm.xml&#8221;). Sí no tocamos nada de este archivo obtendremos un renderizado de imágenes o tiles igual que el utilizado por el &#8220;slippy map&#8221; de <a href="http://www.openstreetmap.org">www.openstreetmap.org</a>. Es aquí, por tanto, donde debemos de agudizar nuestro ingenio para establecer una simbología acorde con nuestros intereses: cambiar colores, retocar las SQL de las layers, añadir o cambiar iconos, etc.</p>
<p>En lo referente a este artículo, sólo vamos a realizar pequeños cambios.</p>
<p>1. Vamos a resaltar las paradas del tranvía para que aparezca el logotipo &#8220;oficial&#8221; por el que se conoce en Alicante a este medio de transporte (<a href="http://www.fgvalicante.com">TRAM</a>)</p>
<p>En el documento cambiamos este texto:</p>
<pre class="brush: xml; title: ; notranslate">
     &lt;Rule&gt;
      &lt;MaxScaleDenominator&gt;100000&lt;/MaxScaleDenominator&gt;
      &lt;MinScaleDenominator&gt;25000&lt;/MinScaleDenominator&gt;
      &lt;Filter&gt;[railway]='station' and not [disused]='yes'&lt;/Filter&gt;
      &lt;PointSymbolizer file =  &quot;%SYMBOLS_DIR%/station_small.png&quot; type=&quot;png&quot; width=&quot;6&quot; height=&quot;6&quot; /&gt;
    &lt;/Rule&gt;
</pre>
<p>Por este otro</p>
<pre class="brush: xml; title: ; notranslate">
    &lt;Rule&gt;
      &lt;MaxScaleDenominator&gt;100000&lt;/MaxScaleDenominator&gt;
      &lt;MinScaleDenominator&gt;25000&lt;/MinScaleDenominator&gt;
      &lt;Filter&gt;[railway]='station' and not [disused]='yes'&lt;/Filter&gt;
      &lt;PointSymbolizer file =  &quot;%SYMBOLS_DIR%/tram2.png&quot; type=&quot;png&quot; width=&quot;20&quot; height=&quot;20&quot; /&gt;
    &lt;/Rule&gt;
</pre>
<p>2. Por otra parte vamos a cambiar el color de fondo para las áreas residenciales<br />
Color: <span style="color: #F6CEE3">♦♦♦♦♦</span></p>
<pre class="brush: xml; title: ; notranslate">
    &lt;Rule&gt;
      &lt;MaxScaleDenominator&gt;1000000&lt;/MaxScaleDenominator&gt;
      &lt;MinScaleDenominator&gt;1000&lt;/MinScaleDenominator&gt;
      &lt;Filter&gt;[landuse] = 'residential'&lt;/Filter&gt;
      &lt;PolygonSymbolizer&gt;
        &lt;CssParameter name=&quot;fill&quot;&gt;#F6CEE3&lt;/CssParameter&gt;
      &lt;/PolygonSymbolizer&gt;
    &lt;/Rule&gt;
</pre>
<p><strong>Crear imágenes</strong></p>
<p>Una vez configurado nuestro mapfile (&#8220;osm.xml&#8221;) pasamos a generar imágenes utilizando el script &#8220;generate_image.py&#8221;. Te recomendamos que hagas una copia de ese archivo para no trabajar con el original. Con un editor de textos tienes que modificar los siguientes parámetros:</p>
<pre class="brush: python; title: ; notranslate">
#!/bin/sh
# ... resto de código
    mapfile = &quot;osm.xml&quot;
    map_uri = &quot;image.png&quot;

    #---------------------------------------------------
    #  Change this to the bounding box you want
    #
    # Área metropolitana de Alicante
    ll = (-0.5534, 38.3245, -0.4267, 38.4071)
    #---------------------------------------------------
    z = 18
    imgx = 50 * z
    imgy = 50 * z
# ... resto de código
</pre>
<p>Cómo ves sólo es necesario modificar tres aspectos:</p>
<ol>
<li>Extensión de la imagen en grados decimales: xmin,ymin,xmax,ymax</li>
<li>Nivel de zoom: del 1 (mundo) al 18 (máximo de detalle)</li>
<li>Dimensiones de la imagen en píxeles</li>
</ol>
<p>NOTA:</p>
<p>Para evitar resultados desagradables intenta ajustar el BBOX y las dimensiones de la imagen.</p>
<p>Por último debemos de realizar los siguientes pasos para generar la imagen</p>
<p>1. Leer las variables que hemos definido en &#8220;set_mapnik.env&#8221;</p>
<pre class="brush: bash; title: ; notranslate">source set-mapnik-env</pre>
<p>2.  Utilizar la plantilla &#8220;osm-template.xml&#8221; para generar el fichero &#8220;oxm.xml&#8221;</p>
<pre class="brush: bash; title: ; notranslate">
./customize-mapnik-map &gt;$MAPNIK_MAP_FILE
</pre>
<p>3. Lanzar el script:</p>
<pre class="brush: bash; title: ; notranslate">python mi_genera_imagen.py</pre>
<p>Este es el resultado:</p>
<p>Zoom 14<br />
<img src="http://www.gisandchips.org/wp-content/ali_zoom14-300x300.png" alt="" width="300" height="300" /></p>
<p>Zoom 18 (fíjate en el renderizado de las estaciones del TRAM)<br />
<img src="http://www.gisandchips.org/wp-content/ali_zoom18.png" alt="" width="300" height="300" /></p>
<p><strong>Crear las tiles</strong></p>
<p>Esta es la parte de Mapnik que tiene más interés para nosotros, puesto que nos permitirá generar nuestro propio TMS para ser utilizado con independencia del &#8220;Slippy map&#8221; de OpenStreetMap.</p>
<p>1. Creamos el directorio donde se guardarán las tiles creadas:</p>
<pre class="brush: bash; title: ; notranslate">mkdir -p $MAPNIK_TILE_DIR</pre>
<p>2. Editamos el fichero &#8220;generate_tiles.py&#8221; para definir las zonas a renderizar</p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/python
# resto de código
# directorio donde se almacenan las imágenes
        tile_dir = home + &quot;/osm/tiles/&quot;

    #-------------------------------------------------------------------------
    #
    # Change the following for different bounding boxes and zoom levels
    #
    # Start with an overview
    # World
    bbox = (-180.0,-90.0, 180.0,90.0)

    render_tiles(bbox, mapfile, tile_dir, 0, 5, &quot;World&quot;)

    # Europa
    minZoom = 6
    maxZoom = 8
    bbox = (1.0,10.0, 20.6,50.0)
    render_tiles(bbox, mapfile, tile_dir, minZoom, maxZoom)

    # Provincia de Alicante
    bbox = (-1.498,37.622,0.529,38.946)
    render_tiles(bbox, mapfile, tile_dir, 9, 11 , &quot;Europe+&quot;)

    # Área metropolitana de la ciudad de Alicante
    bbox = (-0.6171,38.295,-0.3637,38.4602)
    render_tiles(bbox, mapfile, tile_dir, 12, 18 , &quot;Alicante&quot;)
</pre>
<p>Cómo habrás podido deducir vamos a generar tiles en cuatro intervalos de escala:</p>
<ul>
<li>Escalas pequeñas: Zoom del 1 al 5</li>
<li>Escalas medias: 6 al 8</li>
<li>Escalas grandes (más detalles): 9 al 11</li>
<li>Escalas de máximo detalle): 12 al 18</li>
</ul>
<p>3. Ejecutamos el script</p>
<pre class="brush: bash; title: ; notranslate">python ./mi_genera_tiles.py</pre>
<p>4. Comprobación:<br />
Fíjate que en la carpeta &#8220;tiles&#8221; tendremos una carpeta por cada nivel de zoom. En los niveles superiores es donde habrán más imágenes (las de mayor detalle)</p>
<pre class="brush: bash; title: ; notranslate">ls tiles</pre>
<p>Por fin, ya hemos creado nuestro directorio de tiles listo para ser utilizado por OpenLayers como un TMS.</p>
<p>Esto es todo. Espero que os haya gustado. Comentarios y críticas serán bien recibidas</p>
<p>Este artículo es el segundo de una serie formada por:</p>
<ul>
<li><a href="http://www.gisandchips.org/2009/10/22/renderizado-de-osmcon-mapnik-para-usar-en-openlayers/#more-387">Renderizado con Mapnik</a></li>
<li>Mapnik y OpenStreetMap (este post)</li>
<li>Thumbnails con Mapnik y OpenStreetMap</li>
<li>Uso de TMS de OpenStreetMap con OpenLayers</li>
<li>TMS de OpenStreetMap con Mod_tile</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/10/23/openstreetmap-y-mapnik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

