<?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; pgRouting</title>
	<atom:link href="http://www.gisandchips.org/tag/pgrouting/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>Análisis de redes con OpenStreetMap y PgRouting en un ambiente web</title>
		<link>http://www.gisandchips.org/2009/10/03/analisis-de-redes-con-openstreetmap-y-pgrouting-en-un-ambiente-web/</link>
		<comments>http://www.gisandchips.org/2009/10/03/analisis-de-redes-con-openstreetmap-y-pgrouting-en-un-ambiente-web/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 23:50:27 +0000</pubDate>
		<dc:creator>jose</dc:creator>
				<category><![CDATA[Análisis]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[pgRouting]]></category>

		<guid isPermaLink="false">http://www.gisandchips.org/?p=290</guid>
		<description><![CDATA[OBJETIVO: El objetivo de esta serie de artículos es proporcionar una metodología para crear servicios de enrutamiento (routing) en portales web utilizando datos de OpenStreetMap (http://www.openstreetmap.org) que serán añadidos a una geodatabase de PostgreSQL, con la extensión PostGIS y PgRouting. Para llevar a cabo este servicio son necesarias las siguientes fases: Instalación de las extensiones [...]]]></description>
			<content:encoded><![CDATA[<p><strong>OBJETIVO</strong>:</p>
<p>El objetivo de esta serie de artículos es proporcionar una metodología para crear servicios de enrutamiento (routing) en portales web utilizando datos de OpenStreetMap (<a href="http://www.openstreetmap.org/">http://www.openstreetmap.org</a>) que serán añadidos a una geodatabase de PostgreSQL, con la extensión PostGIS y PgRouting.</p>
<p>Para llevar a cabo este servicio son necesarias las siguientes fases:</p>
<ol>
<li>Instalación de las extensiones PostGIS y PgRouting</li>
<li>Importación de los datos de OSM</li>
<li>Conversión a una geodatabase de PostGIS en PostgreSQL</li>
<li>Explotación de una geodatabase con PgRouting.</li>
<li>Diseño de la interfaz de usuario. Contenedor HTML y Javascript (Openlayers)</li>
<li>Creación de lógica de enrutamiento en PHP</li>
</ol>
<p>En la medida en que vaya finalizando los capítulos serán publicados en esta web. En este primer artículo se abordarán las tres primeras fases.</p>
<p><span id="more-290"></span></p>
<p><strong>OBSERVACIONES</strong>:</p>
<p>Para la realización del presente documento me he basado en las referencias web de los portales de PgRouting (<a href="http://pgrouting.postlbs.org/">http://pgrouting.postlbs.org/</a>) y OpenLayers (<a href="http://openlayers.org/">http://openlayers.org</a>), así como en diferentes páginas encontradas en Internet. En la medida en que se utilice información de otra fuente será convenientemente citada, salvo olvido.</p>
<p><strong>ÁMBITO DE APLICACIÓN</strong></p>
<p>Todas las fases se han ensayado satisfactoriamente en los siguientes entornos: Ubuntu 9.04 y Centos 5.3. (clon de Red Hat Enterpise Linux). No obstante, las indicaciones y comandos utilizados en este artículo hacen referencia a este último sistema operativo.</p>
<p>Partimos de la base que tenemos un servidor Linux con el sistema operativo Centos 5.3 de 64 bits, con la base de datos PostgreSQL 8.3 ya instaladas. Por defecto, Centos dispone de PostgreSQL 8.1, si bien hemos preferido añadir los repositorios para la 8.3.7. Para información sobre la instalación ver este enlace: <a href="https://projects.commandprompt.com/public/pgcore">https://projects.commandprompt.com/public/pgcore</a></p>
<p><strong><em>NOTA</em></strong><em>: La instalación de PostgreSQL desde este repositorio “oficial” de PostgreSQL no ha sido todo lo gratificante que esperaba. Hay problemas de dependencias con respecto a otras librerías del sistema Centos. Esto en cambio no ocurre con Ubuntu, que por defecto tiene en su paquetería las últimas versión de esta base de datos.</em></p>
<p>APLICACIONES UTILIZADAS</p>
<ul>
<li>PostgreSQL 8.3</li>
<li>PostGIS 1.4</li>
<li>OpenLayers 2.8</li>
<li>PgRouting 1.03</li>
<li>Osm2pgRouting</li>
<li>Osmosis</li>
</ul>
<p><strong>INSTRUCCIONES Y RECOMENDACIONES GENERALES:</strong></p>
<p>Las instrucciones para la instalación o compilación de programas se especifican mediante comandos de la consola Linux, sin tener que recurrir a ninguna herramienta gráfica. Esta forma de actuar puede ser útil para aquellos usuarios que disponen de acceso a un servidor remoto, donde sólo se tiene acceso mediante la consola.</p>
<p>Con el fin de facilitar las tareas conviene crear un directorio donde descargar, descomprimir y compilar las fuentes de los programas. Para ello, crea un directorio de compilación dentro del home del usuario<br />
<code><br />
$ mkdir /home/&lt;usuario&gt;/compilar</code></p>
<p><code> </code></p>
<p><code>$ cd /home/&lt;usuario&gt;/compilar<br />
</code></p>
<p><strong><em>NOTA</em></strong><em>: El símbolo “$” es sólo el indicativo del prompt del sistema, no es necesario escribirlo.</em></p>
<p>Otra opción es crear un directorio de fuentes (por ejemplo “src” dentro de la carpeta “usr/local/”, y trabajar siempre como root. Yo particularmente prefiero la primera opción.</p>
<p><strong>INSTALACIÓN DE POSTGIS</strong></p>
<p>Aunque es posible utilizar la paquetería de PostGIS que aparece en el repositorio (yum info Postgis) he preferido compilar el paquete con el fin de tener la última versión estable de PostGIS</p>
<p>Sí no estás interesado en compilar PostGIS, puedes instalar el paquete oficial que viene con el repositorio de Postgres para Centos. Utiliza estos comandos</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top"># yum info postgis</td>
</tr>
</tbody>
</table>
<p>Y obtendrás esta información:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">Available PackagesName : postgisArch : x86_64Version : 1.3.6Release : 1.rhel5Size : 1.0 MRepo : pgdg83Summary : Geographic Information Systems Extensions to PostgreSQLURL : <a href="http://postgis.refractions.net/">http://postgis.refractions.net/</a></p>
<p>License : GPL</p>
<p>Description: PostGIS adds support for geographic objects to the PostgreSQL</p>
<p>: object-relational database. In effect, PostGIS “spatially enables”</p>
<p>: the PostgreSQL server, allowing it to be used as a backend spatial</p>
<p>: database for geographic information systems (GIS), much like ESRI’s</p>
<p>: SDE or Oracle’s Spatial extension. PostGIS follows the OpenGIS</p>
<p>: “Simple Features Specification for SQL” and has been certified as</p>
<p>: compliant with the “Types and Functions” profile.</td>
</tr>
</tbody>
</table>
<p>Luego, como superusuario:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top"># yum install postgis</td>
</tr>
</tbody>
</table>
<p><strong>Compilación de PostGIS 1.4</strong></p>
<p>Por suerte, PostGIS es una extensión bastante utilizada, y por tanto su compilación está muy bien detallada en el portal de Reflaction Research (<a href="http://postgis.refractions.net/">http://postgis.refractions.net/</a>)</p>
<p>Esta extensión requiera para su compilación de dos librerías de las que depende (dependencias), por una parte PROJ y por otra GEOS. Ambas son bien conocidas y utilizadas en multitud de programas de SIG de código abierto. Ambas son opcionales, y no son necesarias para la compilación, pero sin ellas dejariamos a PostGIS huerfano de utilidades de reproyección y geoprocesamiento.</p>
<p><strong>Instalación de la librería PROJ.4</strong></p>
<p>PROJ.4 (<a href="http://trac.osgeo.org/proj/">http://trac.osgeo.org/proj/</a>) es la librería más utilizada para las proyecciones cartográficas y permite, como no podía ser de otra manera realizar conversiones entre diferentes proyecciones cartográficas.</p>
<p><strong><em>NOTA</em></strong><em>: En el blog de Geomaticblog.net hay un excelente post de como utlizar esta librería desde aplicaciones como GDAL/OGR o GvSIG. Particularmente, me ha resultado útil para transformar datos desde ED50 a WGS84. Enlace: <a href="http://geomaticblog.net/2009/01/23/2009-01-23-ogrs_y_rejillas_ntv2/">http://geomaticblog.net/2009/01/23/2009-01-23-ogrs_y_rejillas_ntv2/</a></em></p>
<p>Pasos para la compilación:</p>
<p>1. Descargar la fuente</p>
<p>$ wget <a href="http://download.osgeo.org/proj/proj-4.7.0.tar.gz">http://download.osgeo.org/proj/proj-4.7.0.tar.gz</a></p>
<p>2. Descomprimirla</p>
<p>$ tar xzvf proj-4.7.0.tar.gz</p>
<p>3. Cambio de directorio</p>
<p>$ cd proj-4.7.0</p>
<p>4. Configuración y puesta a punto. El siguiente comando prepara la compilación advirtiéndonos si falta algún que otro paquete</p>
<p>$ ./configure</p>
<p><em>NOTA: Es posible que en este paso aparezcan errores porque falta algún paquete. Tan sólo fíjate en que es lo que falta e instálalo (con “yum” o “apt” en el caso de Ubuntu). Habitualmente serán necesarias algunas herramienta propias de la compilación, como flex, bison, make, etc. En Ubuntu tienes un paquete específico para ello: “sudo apt-get install build-essential”.</em></p>
<p>5. Compilación</p>
<p>$ make</p>
<p>6. Colocar las librerias en su sitio como “root”</p>
<p>$ make install</p>
<p>Para “impersonarse” como superusuario sólo tienes que escribir: “<strong>su -</strong>”. En Ubuntu sólo tienes que anteceder la palabra “<strong>sudo</strong>” a cualquier comando que quieras ejecutar como root. En ambos casos te pedirá la clave de acceso del administrador del sistema.</p>
<p>7. Comprobación</p>
<p>$ proj</p>
<p>Obtendremos lo siguiente:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">Rel. 4.7.1, 23 September 2009usage: proj [ -beEfiIlormsStTvVwW [args] ] [ +opts[=arg] ] [ files ]</td>
</tr>
</tbody>
</table>
<p><strong>Instalación de GEOS (Geometry Engine Open Source)</strong></p>
<p>GEOS (<a href="http://trac.osgeo.org/geos/">http://trac.osgeo.org/geos/</a>) es una librería que proporciona a PostGIS la capacidad de realizar geoprocesamiento. Sin ella no podriamos realizar las típicas operaciones de unión, intersección, diferencia, buffer, etc, todas ellas correspondiente a la especificación SFA (Simple Feature Access) del OGC. GEOS es un porting de la librería JTS (Java Topology Suite) en el lenguaje C++, lo que le convierte en una máquina de geoprocesos bastante eficiente.</p>
<p>Pasos para la compilación</p>
<p>1. Descarga de la fuente</p>
<p>$ wget <a href="http://download.osgeo.org/geos/geos-3.1.1.tar.bz2">http://download.osgeo.org/geos/geos-3.1.1.tar.bz2</a></p>
<p>2.Descomprimir:</p>
<p>$ tar -xjvf geos-3.1.1.tar.bz2</p>
<p>3.Cambio de directorio</p>
<p>$ cd geos-3.1.1</p>
<p>4.Configuración</p>
<p>$ LDFLAGS=-lstdc++ ./configure</p>
<p>La directiva LDFLAGS tiene como objetivo enlazar expliciatamente PostgreSQL con el estándar C++</p>
<p>5. Compilar</p>
<p>$ make</p>
<p>El tiempo de compilación suele ser bastante largo (en torno a los 7-10 minutos)</p>
<p>6. Colocar librerías en su sitio (Como usuario root):</p>
<p>$ make install</p>
<p>7. Comprobación</p>
<p>$ geos-config –version</p>
<p>Devolverá:</p>
<p>3.1.1</p>
<p><strong>Instalar PostGIS</strong></p>
<p>Sí las dos librerías anteriores han sido instaladas correctamente deberás de tener los siguientes archivos en el directorio “/usr/local/lib”. Compruébalo:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">$ ls /usr/local/lib/libproj*/usr/local/lib/libproj.a /usr/local/lib/libproj.so.0/usr/local/lib/<a href="http://libproj.la/">libproj.la</a> /usr/local/lib/libproj.so.0.5.5/usr/local/lib/libproj.so /usr/local/lib/libproj.so.0.6.6$ ls /usr/local/lib/libgeos*/usr/local/lib/<a href="http://libgeos-3.1.0.so/">libgeos-3.1.0.so</a> /usr/local/lib/<a href="http://libgeos_c.la/">libgeos_c.la</a>/usr/local/lib/<a href="http://libgeos-3.1.1.so/">libgeos-3.1.1.so</a> /usr/local/lib/libgeos_c.so/usr/local/lib/libgeos.a /usr/local/lib/libgeos_c.so.1/usr/local/lib/<a href="http://libgeos.la/">libgeos.la</a> /usr/local/lib/libgeos_c.so.1.5.0</p>
<p>/usr/local/lib/libgeos.so /usr/local/lib/libgeos_c.so.1.6.0</td>
</tr>
</tbody>
</table>
<p><strong>Proceso de instalación:</strong></p>
<p>1. Descarga de las fuentes:</p>
<p>$ wget <a href="http://postgis.refractions.net/download/postgis-1.4.0.tar.gz">http://postgis.refractions.net/download/postgis-1.4.0.tar.gz</a></p>
<p>2. Descomprimir:</p>
<p>$ tar xzvf postgis-1.4.0</p>
<p>3. Cambiar de directorio</p>
<p>$ cd postgis-1.4.0</p>
<p>4. Configurar</p>
<p>Es el paso que más atención debemos de prestar, puesto que al final del comando emitirá un informe con las dependencias satisfechas</p>
<p>$ ./configure</p>
<p>Sí todo va bien obtendremos un mensaje similar a este:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">PostGIS is now configured for x86_64-unknown-linux-gnu&#8212;&#8212;&#8212;&#8212;&#8211; Compiler Info &#8212;&#8212;&#8212;&#8212;-C compiler: gcc -g -O2C++ compiler: g++ -g -O2&#8212;&#8212;&#8212;&#8212;&#8211; Dependencies &#8212;&#8212;&#8212;&#8212;&#8211;GEOS config: /usr/local/bin/geos-configGEOS version: 3.1PostgreSQL config: /usr/bin/pg_configPostgreSQL version: 8.3</p>
<p>PROJ4 version: 47</p>
<p>PostGIS debug level: 0</p>
<p>&#8212;&#8212;&#8211; Documentation Generation &#8212;&#8212;&#8211;</p>
<p>xsltproc: /usr/bin/xsltproc</p>
<p>xsl style sheets:</p>
<p>dblatex:</p>
<p>convert:</td>
</tr>
</tbody>
</table>
<p>5.Compilación y colocación de las librerías</p>
<p>$ make</p>
<p>$ make install (como root)</p>
<p><strong>Post-instalación de PostGIS</strong></p>
<p>El siguiente paso es de vital importancia y nos puede ahorrar muchos problemas en el futuro. Por defecto las librerías se instalan en el directorio ya citado (”/usr/local/lib”), sin embargo, éste directorio no es reconocido por los programas de compilación como un directorio válido para instalar librerías, por lo que es necesario indicárselo de forma expresa. Para ello como root:</p>
<p>1. Edita el fichero “/etc/ld.so.conf” con tu editor preferido (vi, pico, nano, etc):</p>
<p>$ nano /etc/ld.so.conf</p>
<p>Y añade las siguientes líneas al final del documento</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">/usr/local/lib/usr/local/lib64</td>
</tr>
</tbody>
</table>
<p>2. Finalmente ejecuta este comando</p>
<p>$ /sbin/ldconfig</p>
<p><strong>INSTALACIÓN DE LA LIBRERÍA PgRouting</strong></p>
<p>PgRouting (<a href="http://pgrouting.postlbs.org/">http://pgrouting.postlbs.org</a>), al igual que PostGIS, es una extensión de PostgreSQL que permite trabajar con redes</p>
<p>A diferencia de PostGIS, aun no tenemos un paquete que instale PgRouting que satisfaga todas sus dependencias, por ello es necesario optar por la compilación de todas y cada una de las librerías utilizadas.</p>
<p>Librerías de las que depende:</p>
<ul>
<li>BOOST (<a href="http://www.boost.org/">http://www.boost.org</a> ): Es la librería principal, y la única que es obligatoria. Se trata de un basto conjunto de utilidades, entre las que destacan las referidas al análisis y explotación de grafos.</li>
<li>GAUL (Genetic Algorithm Utility Library): Esta librería sólo es necesario si deseamos dotar a PostgreSQL de la utilidad de cálculo del llamado “Problema del viajante”, conocida por sus signas en inglés, TSP (Traveling Salesman Problem), es decir, proporcionar la ruta óptima pasando por varios sitios. Enlace: <a href="http://gaul.sourceforge.net/">http://gaul.sourceforge.net/</a></li>
<li>CGAL (Computacional Geometric Algorithm Library): Librería especializada en el cálculo y procesamiento de estructuras geométricas en 2D y 3D. En el caso de PgRouting proporciona el algoritmo de cálculo conocido como Driving Distance.</li>
</ul>
<p><em>NOTA: Adicionalmente compilaremos el compilador CMAKE</em></p>
<p><strong>BOOST</strong></p>
<p>Como ya se ha comentado se trata de una librería muy ambiciosa por la gran cantidad de utilidades que engloba, de ahí que se compilación sea muy pesada (en tiempo de compilación). En los repositorios, Centos dispone actualmente de la versión 1.33.1, bastante antigua, si pensamos que la última estable es la 1.4.0. No obstante, para este artículo utilizaré la 1.39.0 que es la que tenemos más ensayada.</p>
<p>Con todo, de esta líbrería sólo necesitamos las utilidades de grafos (graphs)</p>
<p>Para ver la versión de las fuentes boost del repositorio:</p>
<p>$ yum info boost-devel</p>
<p>Sí no queremos complicarnos la vida con la compilación añade el paquete con “yum”:</p>
<p>$ yum install boost-devel</p>
<p>En Ubuntu 9.04, la versión disponible es la 1.34, sería:</p>
<p>$ sudo apt-get install libboost-graph-dev</p>
<p><strong>Compilación de las fuentes de boost 1.39</strong></p>
<p>1. Descarga las fuentes:</p>
<p>wget <a href="http://sourceforge.net/projects/boost/files/boost/1.39.0/boost_1_39_0.tar.bz2/download">http://sourceforge.net/projects/boost/files/boost/1.39.0/boost_1_39_0.tar.bz2/download</a></p>
<p>2. Descomprimir</p>
<p>$ tar –xjvf boost_1_39_0.tar.bz2</p>
<p>3. Cambiamos al usuario administrador</p>
<p>$ su -</p>
<p>4. Instalar dependencias:</p>
<p>$ yum install expat-devel</p>
<p>$ yum install python-devel</p>
<p>$ yum install freetype-devel</p>
<p>5. Cambio de directorio</p>
<p>$ cd /home/&lt;usuario&gt;/compilar/boost_1_39_0</p>
<p>6. Configuración</p>
<p>Para obtener ayuda sobre la configuración</p>
<p>$ ./bootstrap.sh –help</p>
<p>Configuración genérica: Instala todas las librerías en este directorio</p>
<p>$ ./bootstrap.sh –prefix=/usr/local/</p>
<p>Sí sólo necesitamos compilar la librería de cabezera (header library)</p>
<p>$ ./bootstrap.sh –prefix=/usr/local/ &#8211;with-libraries=graph</p>
<p>5. Compilar</p>
<p>$ ./bjam install</p>
<p>Es posible que tengas al inicio de la compilación algún mensaje relacionado con la librería EXPAT ques es utilizada por libGraph.  Para evitar este mensaje define estas variables:</p>
<p>$ export EXPAT_INCLUDE=/usr/include</p>
<p>$ export EXPAT_LIBPATH=/usr/lib</p>
<p>Y de nuevo ejecuta</p>
<p><span style="background-color: #ffffff">$ ./bjam install</span></p>
<p><em>NOTA</em><em>: Sí deseas compilar versiones anteriores, como la 1.36 y 1.37, la compilación es más sencilla. Usa los clásicos: ./configure, make, make install</em></p>
<p><strong>GAUL</strong></p>
<p>Instalación de Gaul (librería necesaria para el algoritmo TSP -Traveling Salesman Problem)</p>
<p>$ wget <a href="http://nfsi.dl.sourceforge.net/sourceforge/gaul/gaul-devel-0.1849-0.tar.gz">http://nfsi.dl.sourceforge.net/sourceforge/gaul/gaul-devel-0.1849-0.tar.gz</a></p>
<p>$ tar xzvf gaul-devel-0.1849-0.tar.gz</p>
<p>$ ./configure &#8211;disable-slang</p>
<p><strong>Instalar CMAKE</strong></p>
<p>Este compilador sólo se instalará para el usuario, y no estará disponible para todos (no hacer nunca “make install” como root)</p>
<p>$ wget <a href="http://www.cmake.org/files/v2.4/cmake-2.4.8.tar.gz">http://www.cmake.org/files/v2.4/cmake-2.4.8.tar.gz</a></p>
<p>$ tar -zxvf cmake-2.4.8.tar.gz</p>
<p>$ cd cmake-2.4.8</p>
<p>$ ./configure</p>
<p>Como usuario (¡no como administrador¡)</p>
<p>$ gmake</p>
<p><strong>CGAL</strong></p>
<p>Librería necesaria para utilizar el algoritmo Driving Distance). La versión que vamos a compilar es la 3.3.1, aunque existe otra más moderna (3.4). Sin lugar a dudas es la libraría que más problemas ofrece.</p>
<p>$ wget <a href="ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/CGAL-3.3.1.tar.gz">ftp://ftp.mpi-sb.mpg.de/pub/outgoing/CGAL/CGAL-3.3.1.tar.gz</a></p>
<p>$ tar xzvf CGAL-3.3.1.tar.gz</p>
<p>$ cd CGAL-3.3.1</p>
<p>Compilar como root:</p>
<p>$ ./install_cgal &#8211;prefix=/usr/local &#8211;with-boost=n &#8211;without-autofind -ni /usr/bin/g++</p>
<p>Las librerías y los include se colocan en estos directorios:</p>
<p>/usr/local/lib/</p>
<p>/usr/local/include/</p>
<p><strong>INSTALACIÓN DE LA LIBRERÍA PGROUTING</strong></p>
<p>Una vez satisfechas todas las dependencias de librerías vamos a compilar PgRouting<span> </span></p>
<p>1. Primero nos descargamos las fuentes desde el repositorio subversión. Recuerda que debes de tener instalada dicha utilidad (“yum install subversión”)</p>
<p>$ svn checkout <a href="http://pgrouting.postlbs.org/svn/pgrouting/trunk">http://pgrouting.postlbs.org/svn/pgrouting/trunk</a> pgrouting</p>
<p>2. Nos cambiamos al directorio</p>
<p>$ cd pgrouting</p>
<p>3. Configuramos</p>
<p>Para ello utilizamos el compilador CMAKE que ya tenemos disponibles.</p>
<p>Compilar (no olvides el punto al final del comando)</p>
<p>La sintaxis de compilación es:</p>
<p>&lt;ruta al ejecutable CMAKE) .</p>
<p>NOTA: No olvides el punto al final. Es para indicarle que compile el directorio actual</p>
<p>Con ello instalaremos la librería, pero apenas nos servirá de nada porque no hemos hecho referencia a que queremos los algoritmos “Driving Distance (DD)” y TSP.</p>
<p>Por ello cambia lo anterior por esto</p>
<p># ../cmake-2.4.8/bin/cmake -DWITH_TSP=ON -DWITH_DD=ON .</p>
<p>Resultado del configure</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">Output directory for libraries is set to /usr/lib64/pgsqlInstallation directory for libraries is set to /usr/lib64/pgsql and for SQL files is set to /usr/share/postlbsInstallation directory for libraries is set to /usr/lib64/pgsql&#8211; Configuring done&#8211; Generating done&#8211; Build files have been written to: /home/jose/compilar/pgrouting../cmake-2.4.8/bin/cmake -DWITH_TSP=ON -DWITH_DD=ON .</p>
<p>&#8211; Check for working C compiler: /usr/bin/gcc</p>
<p>&#8211; Check for working C compiler: /usr/bin/gcc &#8212; works</p>
<p>&#8211; Check size of void*</p>
<p>&#8211; Check size of void* &#8211; done</p>
<p>&#8211; Check for working CXX compiler: /usr/bin/c++</p>
<p>&#8211; Check for working CXX compiler: /usr/bin/c++ &#8212; works</p>
<p>&#8211; Found PostgreSQL: /usr/include/pgsql/server, /usr/lib64/libpq.so</p>
<p>Boost headers were found here: /usr/local/include</p>
<p>Output directory for libraries is set to /usr/lib64/pgsql</p>
<p>&#8211; Found PGROUTING_CORE core: /home/jose/compilar/pgrouting/core/src</p>
<p>Installation directory for libraries is set to /usr/lib64/pgsql and for SQL files is set to /usr/share/postlbs</p>
<p>&#8211; Found GAUL: /usr/local/lib/libgaul.so, /usr/local/lib/libgaul_util.so</p>
<p>Installation directory for libraries is set to /usr/lib64/pgsql</p>
<p>&#8211; Found CGAL: /usr/local/include, /usr/local/lib/libCGAL.so</p>
<p>&#8211; Configuring done</p>
<p>&#8211; Generating done</p>
<p>&#8211; Build files have been written to: /home/jose/compilar/pgrouting</td>
</tr>
</tbody>
</table>
<p>4. Finalmente generamos la librería</p>
<p># make</p>
<p>Resultado de la compilación</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">Scanning dependencies of target routing_tsp[ 8%] Building C object extra/tsp/src/CMakeFiles/routing_tsp.dir/tsp.o[ 16%] Building CXX object extra/tsp/src/CMakeFiles/routing_tsp.dir/tsp_solver.oLinking CXX shared library ../../../lib/librouting_tsp.so[ 16%] Built target routing_tspScanning dependencies of target routing_dd[ 25%] Building C object extra/driving_distance/src/CMakeFiles/routing_dd.dir/alpha.o</p>
<p>[ 33%] Building CXX object extra/driving_distance/src/CMakeFiles/routing_dd.dir/alpha_drivedist.o</p>
<p>[ 41%] Building CXX object extra/driving_distance/src/CMakeFiles/routing_dd.dir/boost_drivedist.o</p>
<p>[ 50%] Building C object extra/driving_distance/src/CMakeFiles/routing_dd.dir/drivedist.o</p>
<p>Linking CXX shared library ../../../lib/librouting_dd.so</p>
<p>[ 50%] Built target routing_dd</p>
<p>Scanning dependencies of target routing</p>
<p>[ 58%] Building C object core/src/CMakeFiles/routing.dir/dijkstra.o</p>
<p>[ 66%] Building C object core/src/CMakeFiles/routing.dir/astar.o</p>
<p>[ 75%] Building C object core/src/CMakeFiles/routing.dir/shooting_star.o</p>
<p>[ 83%] Building CXX object core/src/CMakeFiles/routing.dir/boost_wrapper.o</p>
<p>[ 91%] Building CXX object core/src/CMakeFiles/routing.dir/astar_boost_wrapper.o</p>
<p>[100%] Building CXX object core/src/CMakeFiles/routing.dir/shooting_star_boost_wrapper.o</p>
<p>Linking CXX shared library ../../lib/librouting.so</p>
<p>[100%] Built target routing</td>
</tr>
</tbody>
</table>
<p>5. Por último colocamos los archivos en su sitio (como root):</p>
<p>$ make install</p>
<p>Resultados</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">[ 16%] Built target routing_tsp[ 50%] Built target routing_dd[100%] Built target routingLinking CXX shared library CMakeFiles/CMakeRelink.dir/librouting_tsp.soLinking CXX shared library CMakeFiles/CMakeRelink.dir/librouting_dd.soInstall the project&#8230;&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/lib64/pgsql/librouting.so</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/share/postlbs/routing_core.sql</p>
<p>&#8211; Installing /usr/share/postlbs/routing_core_wrappers.sql</p>
<p>&#8211; Installing /usr/share/postlbs/routing_topology.sql</p>
<p>&#8211; Installing /usr/share/postlbs/matching.sql SELECT assign_vertex_id(&#8216;ways&#8217;, 0.00001, &#8216;the_geom&#8217;, &#8216;gid&#8217;);</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/lib64/pgsql/librouting_tsp.so</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/share/postlbs/routing_tsp.sql</p>
<p>&#8211; Installing /usr/share/postlbs/routing_tsp_wrappers.sql</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/lib64/pgsql/librouting_dd.so</p>
<p>&#8211; Install configuration: &#8220;&#8221;</p>
<p>&#8211; Installing /usr/share/postlbs/routing_dd.sql</p>
<p>&#8211; Installing /usr/share/postlbs/routing_dd_wrappers.sql</td>
</tr>
</tbody>
</table>
<p>Ya tenemos PgRouting disponible</p>
<p><strong>OSM2PGROUTING</strong></p>
<p>Descripción:</p>
<p>Se trata de una utilidad que permite convertir un fichero de OpenStreetMap, en formato OSM o XML, en una base de datos PostgreSQL que tenga instaladas las extensiones PostGIS y PgRouting.</p>
<p>Esta utilidad está específicamente diseñada para OSM, y realiza un especial tratamiento de los datos teniendo en cuenta los tags OSM, de forma tal que es capaz de generar un grafo adecuado para el ruteo. Bien es cierto que tenemos otras posibilidades, como descargar un shapefile de datos OSM de cualquiera de los servidores existentes (Geofabrik, CloudMade) y convertirlos a PostgreSQL con la utilidad “shp2pgsql” provista por PostGIS, sin embargo el resultado no será el mismo. Veamos un ejemplo</p>
<p>Fíjate en esta zona donde tenemos vías que aparecen a distinto nivel: <a href="http://www.openstreetmap.org/?lat=38.379259&amp;lon=-0.452301&amp;zoom=18&amp;layers=B000FTF">http://www.openstreetmap.org/?lat=38.379259&amp;lon=-0.452301&amp;zoom=18&amp;layers=B000FTF</a></p>
<p><img class="alignnone size-full wp-image-288" src="http://www.gisandchips.org/wp-content/osm_cruce.png" alt="osm_cruce" width="470" height="509" /></p>
<p>Sí no utilizamos esta utilidad se generará un nodo por cada cruce de vías, independientemente de que si están o no a diferentes niveles. Osm2pgrouting entiende los tags de OSM y evita colocar nodos donde no le corresponde.</p>
<p>Nodos en OpenStreetMap. Las vías es azul contienen el tag bridge=yes, y por tanto están a diferente nivel</p>
<p><strong><img class="alignnone size-full wp-image-289" src="http://www.gisandchips.org/wp-content/osm_cruce_josm.png" alt="osm_cruce_josm" width="508" height="466" /></strong></p>
<p><strong>Compilar osm2pgrouting</strong></p>
<p>$ svn checkout <a href="http://pgrouting.postlbs.org/svn/pgrouting/tools/osm2pgrouting/trunk">http://pgrouting.postlbs.org/svn/pgrouting/tools/osm2pgrouting/trunk</a> osm2pgrouting</p>
<p>$ cd osm2pgrouting</p>
<p>$ make</p>
<p>Como administrador:</p>
<p>$ make install</p>
<p><strong>CREAR UNA PLANTILLA DE GEODATABASE CON POSTGIS Y PGROUTING</strong></p>
<p>Este es quizás el momento más excitante de todos, puesto que vamos a crear una base de datos con datos ya normalizados para ser explotado con las utilidades de PgRouting.</p>
<p>El proceso siempre es el mismo:</p>
<ol>
<li>Crear la base de datos</li>
<li>Añadirle la funcionalidad de PostGIS</li>
<li>Añadirle la funcionalidad de PgRouting</li>
<li>Cargar datos desde OSM a la base de datos (osm2pgsql)</li>
<li>Crear topología</li>
<li>Explotar la base de datos</li>
</ol>
<p><strong>Creación de una plantilla de base de datos</strong></p>
<p>Es una buena práctica tener creada una plantilla de base de datos con todas las extensiones ya incluidas para que podamos utilizarla en cualquier geodatabase que creemos.</p>
<p>Puesto que estamos intentando cargar datos desde OSM es conveniente utilizar una codificación de caracteres que albergue todas las posibilidades multilenguaje que se pueden dar (alfabetización árabe, cirílica, etc)</p>
<ol>
<li>Sín más preámbulos creamos la base de datos</li>
</ol>
<p>Sintaxis:</p>
<p>$ createdb –h &lt;host&gt; –U &lt;user&gt; -p &lt;puerto&gt; -E &lt;código codificación &lt;nombre base de datos&gt;</p>
<p>En nuestro caso este es el resultado</p>
<p>$ createdb -U postgres -E UTF8 routing</p>
<ol>
<li>PostGIS exige que la base de datos tenga cargado el lenguaje procedural Pl/PgSql. De hecho la gran mayoría de las funciones de PostGIS y PgRouting están en este lenguaje:</li>
</ol>
<p>$ createlang -U postgres plpgsql &lt;nombre base de datos&gt;</p>
<p>$ createlang -U postgres plpgsql routing</p>
<ol>
<li>Añadir la funcionalidad PostGIS</li>
</ol>
<p>Ahora necesitamos saber donde ha instalado Postgis los ficheros SQL necesarios para crear la geodatabase. Recomendamos utilizar el comando find para encontrarlos</p>
<p>Para las versiones &lt; 1.4</p>
<p>$ find /usr/ -name lwpostgis.sql</p>
<p>Para versiones &gt;= 1.4</p>
<p>$ find /usr/ -name postgis.sql</p>
<p>/usr/share/lwpostgis.sql</p>
<p>Lo mismo para las referencias espacials</p>
<p>$ find /usr/ -name spatial_ref_sys.sql</p>
<p>/usr/share/spatial_ref_sys.sql</p>
<p>Ahora sólo queda cargar el fichero de funcionalidades en la base de datos:</p>
<p>Para la versión 1.3.x</p>
<p>$ psql -U postgres -f /usr/share/lwpostgis.sql routing</p>
<p>$ psql -U postgres -f /usr/share/spatial_ref_sys.sql routing</p>
<p>Para la version 1.4</p>
<p>$ psql -U postgres -f /usr/share/pgsql/contrib/postgis.sql routing</p>
<p>$ psql -U postgres -f /usr/share/pgsql/contrib/spatial_ref_sys.sql routing</p>
<ol>
<li>Añadir la funcionalidad PgRouting</li>
</ol>
<p>Más de lo mismo. Primero añadimos la funcionalidad básica:</p>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_core.sql routing</p>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_core_wrappers.sql routing</p>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_topology.sql routing</p>
<ol>
<li>Luego la funcionalidad para el algoritmo TSP (opcional)</li>
</ol>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_tsp.sql routing</p>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_tsp_wrappers.sql routing</p>
<ol>
<li>Por ultimo la funcionalidad para el algoritmo “Driving Distance”</li>
</ol>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_dd.sql routing</p>
<p>$ psql -U postgres -f /usr/share/postlbs/routing_dd_wrappers.sql routing</p>
<ol>
<li>Vamos a comprobar que todo está bien.</li>
</ol>
<p>Accedemos a la base de datos creada:</p>
<p>$ psql -U postgres routing</p>
<p>routing=# <strong>select postgis_full_version();</strong></p>
<p>Devolverá:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">postgis_full_version&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-POSTGIS=&#8221;1.4.0&#8243; GEOS=&#8221;3.1.1-CAPI-1.6.0&#8243; PROJ=&#8221;Rel. 4.7.1, 23 September 2009&#8243; USE_STATS(1 row)</td>
</tr>
</tbody>
</table>
<ol>
<li>Últimos retoques:</li>
</ol>
<p>Con el objetivo de utilizar en el futuro OpenLayers, y con el fin de arbitrar un sistema de proyección que sea común para el uso de varios proveedores de datos (Google Maps, Yahoo Maps, Microsoft Live Maps, etc), vamos a incluir un nuevo registro en la tabla spatial_ref_sys, para añadir la denominada proyección esférica de Mercator, a veces conocida como “proyección Google”, por ser ésta la que se utiliza en en Google Maps. Lo interesante de esta proyección, a diferencia del sistema geodésico mundial con datum WGS84 es que las unidades están en metros, lo que facilita la compresión de los cálculos de distancias, en contraposición a la medición en grados decimales de arco de circunferencia. Más información aquí:</p>
<p><a href="http://trac.openlayers.org/wiki/SphericalMercator">http://trac.openlayers.org/wiki/SphericalMercator</a></p>
<p>En este enlace tienes una imagen de gran formato de la tierra con esta proyección: <a href="http://designintelligences.files.wordpress.com/2009/03/mercator-projection1.jpg">http://designintelligences.files.wordpress.com/2009/03/mercator-projection1.jpg</a></p>
<p>En definitiva, sólo tenemos que añadir este registro:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">routing=#  INSERT into spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text) values (900913 ,&#8217;EPSG&#8217;,900913,&#8217;GEOGCS["WGS 84", DATUM["World Geodetic System1984", SPHEROID["WGS 84", 6378137.0, 298.257223563,AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], NIT["degree",0.017453292519943295], AXIS["Longitude", EAST], AXIS["Latitude", NORTH],AUTHORITY["EPSG","4326"]], PROJECTION["Mercator_1SP"],PARAMETER["semi_minor", 6378137.0],PARAMETER["latitude_of_origin",0.0], PARAMETER["central_meridian", 0.0], PARAMETER["scale_factor",1.0], PARAMETER["false_easting", 0.0], PARAMETER["false_northing", 0.0],UNIT["m", 1.0], AXIS["x", EAST], AXIS["y", NORTH],AUTHORITY["EPSG","900913"]] |&#8217;,'+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&#8217;);</td>
</tr>
</tbody>
</table>
<p>La proyección esférica de Mercator tiene el código 900913, según el European Petroleum Survey Group (EPSG) mientras que OpenStreetMap utiliza como proyección global  predeterminada el geodésico mundial con datum WGS84, cuyo código es 4326.</p>
<p>Ya nos podemos salir de la consola de Postgresql</p>
<p>routing=# \q</p>
<ol>
<li>Crear una geodatabase a partir de la plantilla creada</li>
</ol>
<p>Bueno ya está hecho todo el trabajo de la plantilla, ahora el proceso de crear una nueva base de datos con todo ya preparado es sólo una línea;</p>
<p>createdb -U &lt;usuario&gt; -T &lt;plantilla&gt; &lt;nueva bd&gt;</p>
<p>En nuestro ejemplo sería</p>
<p>createdb -U postgres -T routing osmtest</p>
<p><strong>Truco del día:</strong></p>
<p>Sí tu servidor no tienes un sistema gráfico funcionando y necesitas llevar un fichero desde tu ordenador al servidor utiliza el comando “scp”. Es muy práctico</p>
<p>Sintaxis:</p>
<p>$ scp &lt;fichero de tu ordenador&gt;@&lt;hostname o IP&gt;:&lt;directorio del servidor donde copiar el fichero&gt;</p>
<p>Ejemplo:</p>
<p>$ scp OSM/alicante_30_09_2009.osm jose@www.gisandchips.org:/home/jose/compilar/osm2pgrouting</p>
<p><strong>DESCARGAR DATOS DE OPENSTREETMAP</strong></p>
<p>Esto ya va tomando color. Queda lo más bonito. ¡Paciencia!</p>
<p>Tenemos 2 opciones:</p>
<p>a)     Descargar un fichero OSM ya creado en cualquiera de los portales web que hay a tal efecto (Geofabrik (<a href="http://download.geofabrik.de/osm/">http://download.geofabrik.de/osm/</a>) , CloudMade (<a href="http://downloads.cloudmade.com/">http://downloads.cloudmade.com/</a>) , etc)</p>
<p>Ejemplo:</p>
<p>Descargar OSM de España (69 Mb)<span> </span></p>
<p>$ wget <a href="http://download.geofabrik.de/osm/europe/spain.osm.bz2">http://download.geofabrik.de/osm/europe/spain.osm.bz2</a></p>
<p>Descomprimir</p>
<p>$ tar -xjvf spain.osm.bz2</p>
<p>a)     Recortar una zona del planet.osm con Osmosis (<a href="http://wiki.openstreetmap.org/wiki/Osmosis">http://wiki.openstreetmap.org/wiki/Osmosis</a>)</p>
<p>$ wget <a href="http://dev.openstreetmap.org/~bretth/osmosis-build/osmosis-latest-bin.tar.gz">http://dev.openstreetmap.org/~bretth/osmosis-build/osmosis-latest-bin.tar.gz</a></p>
<p>$ tar xzvf osmosis-latest-bin.tar.gz</p>
<p>$ cd osmosis-0.31/ bin/</p>
<p>La sintaxis básica es la siguiente:</p>
<p>$./osmosis &#8211;read-xml &lt;fichero osm matriz&gt; &#8211;bb left=&lt;coord oeste&gt; right&lt;coord este&gt; top=&lt;coord norte&gt; bottom=&lt;coord sur&gt; &#8211;write-xml &lt;nombre fichero a crear extraido de matriz&gt;</p>
<p>Por supuesto las coordenadas deben de estar en grados decimales del WGS84. Pero, ¿de dónde las saco?</p>
<p>Esta vez viene en nuestra ayuda el portal <a href="http://www.openstreetmap.org/">www.openstreetmap.org</a> que viene con una utilidad (pestaña “Exportar”) para proporcionarnos información sobre la caja que estamos visualizando  en el mapa</p>
<p><img class="alignnone size-full wp-image-287" src="http://www.gisandchips.org/wp-content/osm_box.png" alt="osm_box" width="483" height="343" /></p>
<p>Ejemplo práctico a un barrio de Alicante</p>
<p>$./osmosis &#8211;read-xml /home/jose/OSM/alicante_30_09_2009.osm &#8211;bb left=-0.4359 right=-0.42006 top=38.37225 bottom=38.36192 &#8211;write-xml mibarrio.osm</p>
<p><strong>IMPORTAR UN OSM EN LA GEODATABASE</strong></p>
<p>Después de este tortuoso camino, ya queda lo más fácil importar el OSM, utilizando “osm2pgrouting”. La sintaxis es la siguiente:</p>
<p>$ ./osm2pgrouting -file &lt;fichero osm&gt; -conf &lt;fichero configuración&gt;  -dbname &lt;base de datos&gt; -user &lt;usuario&gt;</p>
<p>Ló único extraño aquí es el fichero de configuración, que es un XML donde se incluyen las tipologías de la vías  que queremos cargar a la base de datos (según OSM: motorway, trunk, primary, secondary, tertiary, residential, etc.). En las fuentes aparece un XML de ejemplo que nos puede servir. Debemos de tener en cuenta que en función de nuestros objetivos utilizaremos unas vías u otras. Por ejemplo, sí sólo queremos las grandes vías nos quedaremos con motorway y trunks. Sí sólo nos interesa el tema caminos rurales y rutas ciclistas nos toca trabajar el XML.</p>
<p>Ejemplo:</p>
<p>./osm2pgrouting -file ./alicante_30_09_2009.osm -conf ./mapconfig.xml -dbname osmtest -user postgres</p>
<p>NOTA: Este proceso suele ser bastante largo, y estará en función del tamaño del OSM. Como ejemplo, el área metropolitana de Alicante tardó unos 5 minutos, en un ordenador bien dotado. Toda España nos llevaría unas cuantas horas.</p>
<p>Tras un periodo de tiempo verás este mensaje</p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
<col span="1" width="256"></col>
<tbody>
<tr>
<td width="100%" valign="top">Ways table created<br />
<span style="background-color: #ffffff">Types table created<br />
Classes table created<br />
http://wiki.openstreetmap.org/wiki/Osmosis</span>create topology</p>
<p>#########################</p>
<p>size of streets: 4742</p>
<p>size of splitted ways : 12780</p>
<p>finished</td>
</tr>
</tbody>
</table>
<p>Para comprobar que tablas se han creado:</p>
<p>Entramos en la base de datos</p>
<p>psql -U postgres osmtest</p>
<p>Listamos las tablas:</p>
<p>osmtest=# \d</p>
<table border="1" cellspacing="0" cellpadding="0" width="1153">
<tbody>
<tr>
<td width="576" valign="top">List of relationsSchema | Name | Type | Owner</p>
<p>&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;-+&#8212;&#8212;&#8212;-</p>
<p>public | classes | table | postgres</p>
<p>public | geometry_columns | table | postgres</p>
<p>public | nodes | table | postgres</p>
<p>public | spatial_ref_sys | table | postgres</p>
<p>public | types | table | postgres</p>
<p>public | ways | table | postgres</p>
<p>(6 rows)</td>
<td width="576" valign="top"></td>
</tr>
</tbody>
</table>
<p>La tabla que contiene la geometría es ways;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">osmtest=# select * from geometry_columns ;f_table_catalog | f_table_schema | f_table_name | f_geometry_column | coord_dimension | srid | type</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>| public | ways | the_geom | 2 | 4326 | MULTILINESTRING</p>
<p>(1 row)</p>
<p>osmtest=# select srid, f_geometry_column as geometria from geometry_columns;</p>
<p>srid | geometria</p>
<p>&#8212;&#8212;+&#8212;&#8212;&#8212;&#8211;</p>
<p>4326 | the_geom</p>
<p>(1 row)</td>
</tr>
</tbody>
</table>
<h2>CREACIÓN DE TOPOLOGÍA DE RED</h2>
<p>Si nos fijamos la tabla ways tiene vacíos los campos <em>source</em> y <em>target</em>, que son los identificadores de nodo. Es necesario crear topología. Para ello recurrimos a una función topológica de pgrouting: <em>“assign_vertex_id”</em></p>
<p>Lo único que tenemos es un identificador de arco (gid)</p>
<p>Para el caso de datos procedentes de OSM, al estar los datos en grados decimales y la proyección en geodésica (4326) la tolerancia a aplicar es muy pequeña. 0.00001</p>
<p>SELECT assign_vertex_id(&#8216;ways&#8217;, 0.00001, &#8216;the_geom&#8217;, &#8216;gid&#8217;);</p>
<p>Listado de tablas</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">osmtest=# \dList of relationsSchema | Name | Type | Owner</p>
<p>&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-</p>
<p>public | classes | table | postgres</p>
<p>public | geometry_columns | table | postgres</p>
<p>public | nodes | table | postgres</p>
<p>public | spatial_ref_sys | table | postgres</p>
<p>public | types | table | postgres</p>
<p>public | vertices_tmp | table | postgres</p>
<p>public | vertices_tmp_id_seq | sequence | postgres</p>
<p>public | ways | table | postgres</p>
<p>(8 rows)</td>
</tr>
</tbody>
</table>
<p>Ahora la tabla ways está preparada para topología.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="576" valign="top">osmtest=# select gid,source,target from ways;gid | source | target</p>
<p>&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8211;</p>
<p>46 | 46 | 47</p>
<p>187 | 190 | 191</p>
<p>213 | 215 | 216</p>
<p>309 | 308 | 309</p>
<p>327 | 325 | 240</p>
<p>447 | 437 | 438</p>
<p>564 | 554 | 555</p>
<p>649 | 635 | 636</p>
<p>711 | 700 | 701</p>
<p>832 | 814 | 815</p>
<p>882 | 863 | 864</p>
<p>927 | 906 | 907</td>
</tr>
</tbody>
</table>
<p>Con este extenso post queda por finalizada la primera parte sobre PgRouting con OpenStreetMap. Nos esperan dos nuevos artículos que espero sean de vuestro interés:</p>
<ol>
<li>Explotación de una geodatabase con OpenStreetMap y PgRouting</li>
<li>Diseño de una interfaz web con OpenLayers para el análisis de redes.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.gisandchips.org/2009/10/03/analisis-de-redes-con-openstreetmap-y-pgrouting-en-un-ambiente-web/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

