<?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; mapfile</title>
	<atom:link href="http://www.gisandchips.org/tag/mapfile/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>Aumentar velocidad de carga de un mapfile utilizando simplificación de geometrías</title>
		<link>http://www.gisandchips.org/2009/11/05/aumentar-velocidad-de-carga-de-un-mapfile-utilizando-simplificacion-de-geometrias/</link>
		<comments>http://www.gisandchips.org/2009/11/05/aumentar-velocidad-de-carga-de-un-mapfile-utilizando-simplificacion-de-geometrias/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 11:48:58 +0000</pubDate>
		<dc:creator>pepe</dc:creator>
				<category><![CDATA[Comparativa]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[geometry simplification]]></category>
		<category><![CDATA[mapfile]]></category>
		<category><![CDATA[mapscript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=492</guid>
		<description><![CDATA[En el anterior post creamos un mapfile dinámicamente con PHPMapScript, ahora lo que vamos a ver es como conseguir que la velocidad de carga de este mapfile se reduzca de forma considerable utilizando simplificación de geometrías mediante una función en PostGIS, esperando obtener un mapa con los municipios de toda España. Resultado esperado: El código [...]]]></description>
			<content:encoded><![CDATA[<p>En el anterior <a href="http://www.gisandchips.org/2009/11/02/creacion-de-un-mapfile-de-forma-dinamica-al-vuelo/" target="_blank">post</a> creamos un mapfile dinámicamente con PHPMapScript, ahora lo que vamos a ver es como conseguir que la velocidad de carga de este mapfile se reduzca de forma considerable utilizando simplificación de geometrías mediante una función en PostGIS, esperando obtener un mapa con los municipios de toda España.</p>
<p style="text-align: center;">Resultado esperado:<img class="aligncenter size-full wp-image-1082" title="4b024cb4_7df_1" src="http://www.gisandchips.org/wp-content/4b024cb4_7df_1.gif" alt="Mapa simplificado" width="300" height="300" /></p>
<p style="text-align: center;">
<p>El código de generación del mapfile será el mismo que en el  <a href="http://www.gisandchips.org/2009/11/02/creacion-de-un-mapfile-de-forma-dinamica-al-vuelo/" target="_blank">post</a> de creación del mapfile &#8220;al vuelo&#8221;, tan solo habría que cambiar la forma de obtener los datos, para que en lugar de obtenerlos con una simple sentencia sql, llamar a una función que obtuviera las geometrías simplificadas a costa de perder nivel de detalle (inapreciable a la vista).</p>
<p><span id="more-492"></span></p>
<p>Cuando se trata de simplificar geometrías hay que tener en cuenta la dimensión del mapa que queremos obtener para en función de esta dimensión, poder obtener de alguna forma un coeficiente de simplificación que se adecue a la simplificación que pretendemos obtener (es decir, ni que no nos haga casi simplificación, ni que simplifique demasiado).</p>
<p>Para obtener este factor de simplificación, podemos hacer varias operaciones, en este caso realizaremos una operación como la siguiente, dividiremos el resultado de restar a la xmax la xmin de la entensión de la geometria entre el ancho del mapa que queremos obtener.</p>
<p>Es decir, obtenemos la extensión de la geometría que estamos analizando , sacamos al xmax y la xmin, las restamos y el resultado lo dividimos entre el ancho del mapa que queremos obtener:</p>
<p>(xmax(extent(geometria) )- xmin(extent(geometria)))/Ancho del mapa</p>
<p>Creamos una función en sql para obtener el factor de simplificación que deseamos:</p>
<pre class="brush: php; title: ; notranslate">
create or replace function fs(float8) returns float8 AS $$
 select (xmax(extent(geometria))-xmin(extent(geometria)))/$1 from ine.municipios;
$$ LANGUAGE SQL;
</pre>
<p>Una vez que tenemos el factor de simplificación obtenido con la función anterior, ya podemos aplicar la simplificación con el factor de simplificación obtenido anteriormente.</p>
<p>Podemos hacer una comparativa del aumento de velocidad entre realizar una consulta sin simplificación y otra con la simplificación, por ejemplo para un mapa bastante grande de 4000px.</p>
<p>1ª consulta: &#8220;<strong><em>select geometria  from municipios2</em></strong>&#8221;</p>
<p>2ª consulta:&#8221;<strong><em>select st_simplify(geometria,factor_simplificacion) from municipios2</em></strong>&#8221;</p>
<p>En PostgreSQL, al ejecutar las dos sentencias podemos comparar y obtener:</p>
<p>1ª consulta</p>
<ul>
<li>Tiempo de ejecución de la consulta: <strong>50,84 segundos</strong></li>
<li>Numero de vertices: <strong>393666</strong></li>
</ul>
<p>2ª consulta</p>
<ul>
<li>Tiempo de ejecución de la consulta: <strong>19,51 segundos</strong></li>
<li>Numero de vertices: <strong>141610</strong></li>
</ul>
<p>De esta manera comprobamos que se produce un aumento en la velocidad a cambio de reducir el nivel de detalle, circunstancia que nos viene bien de cara a la publicación web, ya que no necesitamos un nivel de detalle elevado.</p>
<p>Para constaruir ahora la layer en MapScript, la sentencia SQL para obtener los datos sería como esta:</p>
<pre class="brush: php; title: ; notranslate">
$name = $Layer2-&gt;set(&quot;name&quot;,&quot;Municipios&quot;);
$type = $Layer2-&gt;set(&quot;type&quot;,MS_LAYER_POLYGON);
$status = $Layer2-&gt;set(&quot;status&quot;,MS_ON);
//Conexión con nuestra base de datos que va as er de tipo POSTGIS
$Layer2-&gt;setConnectionType(MS_POSTGIS);
//Cadena de conexión a la base de datos donde tenemos nuestros datos

//En primer lugar, debemos obtener el factor de simplificación que obtenemos mediante consulta a postgresql desde php:
$conexion = pg_pconnect(&quot;host=localhost port=5432 dbname=demos user=postgres&quot;);

$sql=&quot;select fs(&quot;.$Map-&gt;width.&quot;)&quot;;
$resultado=pg_exec($conexion,$sql);
$factor=pg_result($resultado,0,0);

$Layer2-&gt;set(&quot;connection&quot;,&quot;user=postgres dbname=demos host=localhost&quot;);
//Filtro en sql que vamos a introducir para sacar nuestros datos a mostrar, aplicando el factor obtenido anteriormente
$data=&quot;geometria from (select st_simplify(geometria,&quot;.$factor.&quot;) as geometria, nombre,provincia,gid from municipios) as foo using SRID=23030, using unique gid&quot;;
$Layer2-&gt;set(&quot;data&quot;,$data);
//Una vez definida la estructura d ela capa procedemos a definir el estilo de nuestra capa número 1
</pre>
<p>Para la comparación de velocidad de creación de un mapfile con una única capa PostGIS utilizando una sentencia SQL normal y utilizando simplificación de geometrías, utilizando para ello varios test de medición de velocidad de carga, asumimos que vamos a crear un mapa bastante grande de una dimensión de 2000&#215;2000 pixeles.</p>
<p><a href="http://www.gisandchips.org/demos/mapscript/index_norm.php" target="_blank">Sin simplificación de geometrías </a>(tal y como se hizo en el artículo anterior, pero con una sola capa y de tamaño 2000&#215;2000 píxeles)</p>
<p><a href="http://www.gisandchips.org/demos/mapscript/index_simp.php" target="_blank">Con simplificación de geometrías</a> (utilizando la función que hemos programado anteriormente)</p>
<p>Para realizar la comparativa de cargas he utilizado la herramienta <a href="http://www.websitegoodies.com/tools/speed-test.php" target="_blank">Speed-Test </a></p>
<p>El resultado que he obtenido es el siguiente:<br />
(no se aprecia mucha diferencia, pero es debido a que se ha guardado en la caché y no es significativa la diferencia)<br />
- Con la sentencia normal (sin simplificación)</p>
<table style="border: 1px solid #cccccc;" border="0">
<tbody>
<tr>
<td style="padding: 0pt 5px;"><strong>URL:</strong></td>
<td style="padding: 0pt 5px;">http://www.gisandchips.org/demos/mapscript/index_norm.php</td>
</tr>
<tr>
<td style="padding: 0pt 5px;"><strong>Load Time:</strong></td>
<td style="padding: 0pt 5px;">1.048 seconds</td>
</tr>
<tr>
<td style="padding: 0pt 5px;"><strong>Page Size:</strong></td>
<td style="padding: 0pt 5px;">0.19 kb</td>
</tr>
</tbody>
</table>
<p>- Utilizando el factor de simplificación y realizando una simplificación de las geometrías:</p>
<table style="border: 1px solid #cccccc;" border="0">
<tbody>
<tr>
<td style="padding: 0pt 5px;"><strong>URL:</strong></td>
<td style="padding: 0pt 5px;">http://www.gisandchips.org/demos/mapscript/index_simp.php</td>
</tr>
<tr>
<td style="padding: 0pt 5px;"><strong>Load Time:</strong></td>
<td style="padding: 0pt 5px;">1.013 seconds</td>
</tr>
<tr>
<td style="padding: 0pt 5px;"><strong>Page Size:</strong></td>
<td style="padding: 0pt 5px;">0.18 kb</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/11/05/aumentar-velocidad-de-carga-de-un-mapfile-utilizando-simplificacion-de-geometrias/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Creación de un mapfile de forma dinámica (&#8220;al vuelo&#8221;)</title>
		<link>http://www.gisandchips.org/2009/11/02/creacion-de-un-mapfile-de-forma-dinamica-al-vuelo/</link>
		<comments>http://www.gisandchips.org/2009/11/02/creacion-de-un-mapfile-de-forma-dinamica-al-vuelo/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 10:47:11 +0000</pubDate>
		<dc:creator>pepe</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[mapfile]]></category>
		<category><![CDATA[mapscript]]></category>
		<category><![CDATA[mapserver]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostGIS]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=383</guid>
		<description><![CDATA[Este artículo va encaminado a la publicación de cartografía en Internet de forma dinámica, utilizando PHPMapScript. Lo que vamos a intentar conseguir es mostrar en una página web un fichero de mapa sin la necesidad de tener un fichero .map (MapFile) asociado y complejo de mantener, simplemente realizando modificaciones en nuestro código php. Este es [...]]]></description>
			<content:encoded><![CDATA[<p>Este artículo va encaminado a la publicación de cartografía en Internet de forma dinámica, utilizando PHPMapScript.</p>
<p>Lo que vamos a intentar conseguir es mostrar en una página web un fichero de mapa sin la necesidad de tener un fichero .map (MapFile) asociado y complejo de mantener, simplemente realizando modificaciones en nuestro código php.</p>
<p>Este es el resultado que queremos obtener:</p>
<div id="attachment_1085" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-1085" title="4b025a29_5fd1_1" src="http://www.gisandchips.org/wp-content/4b025a29_5fd1_1-300x300.gif" alt="Mapa de españa" width="300" height="300" /><p class="wp-caption-text">Mapa de españa</p></div>
<p style="text-align: center">
<p>Vamos a ponernos manos a la obra para conseguirlo.</p>
<p>En primer lugar, doy por supuesto que tenemos instalado MapServer y MapScript en nuestro servidor Linux (en mi caso CentOS)  y el Servidor de Bases de Datos PostgreSQL+PostGIS y con la extensión PHP/pgSQL.</p>
<p>Creamos un fichero .php</p>
<p>Lo primero que debemos hacer es cargar la librería PHPMapScript (<em>php_mapscript.so</em>)</p>
<p><span id="more-383"></span></p>
<pre class="brush: php; title: ; notranslate">

dl('php_mapscript.so');

//Una vez cargada la librería ya se puede trabajar con las funciones propias de PHPMapScript
//Para empezar hay que crear el fichero mapa y definir las diferentes características que queremos que tenga el mapa (nombre, tamaño,

//Creamos un objeto llamado Map mediante el Constructor de MapObject

$Map=ms_newMapObj(&quot;&quot;);

//Le damos un nombre (p.e. mapa)
$Map-&gt;set(&quot;name&quot;,&quot;Mapa&quot;);

//La dimensión del mapa
$Map-&gt;setSize(600,600);

// La extensión del mapa (la podemos obtener de postgresql mediante la función de postgis st_extent
$Map-&gt;setExtent(626679.9375,4191059,815673.125,4519371);

// Se define el path de la imagen la temporal y la real que se mostrarán por web
$Map-&gt;web-&gt;set(&quot;imagepath&quot;,&quot;/tmp&quot;);
$Map-&gt;web-&gt;set(&quot;imageurl&quot;,&quot;/ms_tmp&quot;);

Una vez hemos definido las características de nuestro fichero de mapa, procedemos a incluir capas.
&lt;pre&gt;//Definimos una capa asociada a nuestro fichero de mapa anteriormente definido
// En este caso la primera capa, y que va a servir de fondo de nuestro mapa va a ser wms
// y del servicio wms que proporciona el &lt;a href=&quot;http://www.idee.es/wms/PNOA/PNOA?Request=GetCapabilities&amp;Service=WMS&quot; target=&quot;_blank&quot;&gt;PNOA&lt;/a&gt;&lt;/pre&gt;
$Layer1=ms_newLayerObj($Map);

$Layer1-&gt;set(&quot;name&quot;,&quot;ortofoto&quot;);

//Tipo Raster

$Layer1-&gt;set(&quot;type&quot;,MS_LAYER_RASTER);

$Layer1-&gt;set(&quot;status&quot;,MS_ON);//El status de la Layer, esto nos permitirá definir layers y mantenerlas ocultas dependiendo de las necesidades que tengamos
$Layer1-&gt;setConnectionType(MS_WMS);
$Layer1-&gt;set(&quot;connection&quot;,&quot;http://www.idee.es/wms/PNOA/PNOA?&quot;);
//Definimos la proyección del wms junto con el nombre de la capa wms, la versión del servidor y el formato de la imagen
&lt;pre&gt;//El que esta capa se muestre o no, no depende de nosotros, depende de una fuente externa que proporciona la capa WMS, en este caso es la del PNOA&lt;/pre&gt;
$Layer1-&gt;setProjection(&quot;init=epsg:23030&quot;);
$Layer1-&gt;setMetadata(&quot;wms_name&quot;,&quot;pnoa&quot;);
$Layer1-&gt;setMetadata(&quot;wms_server_version&quot;,&quot;1.1.1&quot;);
$Layer1-&gt;setMetadata(&quot;wms_format&quot;,&quot;image/png&quot;);

//Como segunda capa asociada a nuestro fichero de mapa anteriormente definido vamos a añadir una capa obtenida de nuestros datos en postgresql
$Layer2=ms_newLayerObj($Map);

//Vamos definiendo las características que va a tener esta nuestra primera capa
$name = $Layer2-&gt;set(&quot;name&quot;,&quot;Municipios&quot;);
$type = $Layer2-&gt;set(&quot;type&quot;,MS_LAYER_POLYGON);
$status = $Layer2-&gt;set(&quot;status&quot;,MS_ON);
//Conexión con nuestra base de datos que va as er de tipo POSTGIS
$Layer2-&gt;setConnectionType(MS_POSTGIS);
//Cadena de conexión a la base de datos donde tenemos nuestros datos
$Layer2-&gt;set(&quot;connection&quot;,&quot;user=postgres dbname=demos host=localhost&quot;);
//Filtro en sql que vamos a introducir para sacar nuestros datos a mostrar
// MUY IMPORTANTE es necesario incluir el unique gid y using srid=23030, si no no funcionará
$Layer2-&gt;set(&quot;data&quot;,&quot;geometria from ine.municipios using unique gid using srid=23030&quot; );
//Una vez definida la estructura d ela capa procedemos a definir el estilo de nuestra capa número 1

$clase = ms_newClassObj($Layer2); //Definimos la clase
$estilo = ms_newStyleObj($clase); //El estilo asociado a dicha clase
$estilo-&gt;color-&gt;setRGB(10,150,190); //Los colores
$estilo-&gt;outlinecolor-&gt;setRGB(0,0,0); //El contorno

//Una vez hemos definido las capas tenemos que indicar que se dibuje el mapa
$Image=$Map-&gt;Draw();

//Muy importante que no se nos olviden estas 2 sentencias que vienen a continuación, si no ponemos que se almacene la imagen en el path que le hemos incluido o no la mostramos por pantalla con un echo, no va a mostarse nada, y caeremos en el desanimo ya que después de definir todo correctamente la página aparece en blanco.

$url_imagen=$Image-&gt;saveWebImage();
echo &quot;&lt;img src=&quot;.$url_imagen.&quot;&gt;&quot;;
</pre>
<p>Y después de tener esto, solo hay que lanzar el navegador y et voilà!, tenemos nuestro primer mapfile utilizando PHPMapScript en nuestro navegador, puede que sea un poco lento a la hora de cargar, pero no depende tanto de nuestra capa en PostGIS sino del Servidor WMS que utilicemos como capa de fondo, que ya no depende de nosotros.</p>
<p>El resultado es este: <a href="http://www.gisandchips.org/demos/mapscript/index.php" target="_blank">http://www.gisandchips.org/demos/mapscript/index.php</a></p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/11/02/creacion-de-un-mapfile-de-forma-dinamica-al-vuelo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<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>

