A grande vantagem no uso de padrões abertos é que as tecnologias se encaixem perfeitamente quando precisamos delas.

Neste caso estamos falando da integração entre GeoServer, OpenLayers e pgRouting, que é uma extensão do PostgreSQL e PostGIS que nos permite calcular o caminho mais rápido, mais barato ou mais curto entre dois pontos.

A primeira coisa a entender sobre o roteamento de menor caminho é que não há nada de fundamentalmente espacial nisso, mas ele se integra muito bem com aplicações espaciais.

O pgRouting precisa de uma “rede de roteamento” em um banco de dados PostgreSQL, que mostra a posição relativa dos pontos, ao invés de suas posições espaciais reais. Quando as redes contem dados espaciais, no entanto, podemos construir aplicativos de roteamento precisos que mostrem o caminho mais curto através da rede e qual o caminho que se traduz espacialmente.

O que vamos fazer? Nós estaremos construindo uma aplicação de roteamento que mostra aos usuários o caminho mais curto entre dois pontos em uma cidade.

route1

Para fazer isso, precisaremos dos seguintes itens:

– pgRouting 2 habilitado na base de dados
– Dados do OpenStreetMap no PostGIS
– Preparação dos dados para utilização com o software de roteamento
– Publicar os dados em GeoServer
– Usar o Boundless SDK para criar uma aplicação web
– OpenGeo Suite 4.5 (incluindo GeoServer, PostGIS, GDAL / OGR and Suite SDK)

Há muitas maneiras de instalar pgRouting, dependendo do sistema operacional e da arquitetura. Os seguintes passos podem ser utilizados para instalar o pgRouting no Ubuntu (64 bits):

sudo add-apt-repository ppa:georepublic/pgrouting
sudo apt-get update
sudo apt-get install postgresql-9.3-pgrouting
sudo apt-get install opengeo-tomcat7 geoserver

Para este tutorial partiremos do pressuposto que você já instalou o OpenGeo Suite. Caso não tenha realizado a instalação ainda, você pode ver como fazer neste link.

O OpenStreetMap é o local que naturalmente se pensa quando se precisa de dados espaciais livre, e de alta qualidade; vamos fazer uso dele para construir um aplicativo de mapeamento para a cidade de Portland, (mas para qualquer outro local deve funcionar igualmente bem).

Existem programas que podem ser usados ​​para gerar uma rede de roteamento de dados OpenStreetMap, mas vamos ficar com as ferramentas que acompanham o OpenGeo Suite para fazer a preparação dos nossos dados.

Nossa primeira ação será baixar os dados do OpenStreetMap; o MapZen fornece trechos para muitas cidades do mundo em formato ShapeFile, mas nós poderiamos facilmente ter usado osm2pgsql para obter dados para qualquer outro lugar do mundo.

Baixe o shapefile para Portland e extraia o arquivo:

wget https://s3.amazonaws.com/metro-extracts.mapzen.com/portland_maine.osm2pgsql-shapefiles.zip 
unzip portland_maine.osm2pgsql-shapefiles.zip

Em seguida, precisamos criar um novo banco de dados em PostgreSQL em que iremos importar nossos dados. Nós também precisa ativar as funções espaciais do PostGIS:

createdb routing;
psql -c "CREATE EXTENSION postgis;" routing

Os dados do OSM estão em três shapefiles, uma para pontos, um para linhas e um para polígonos. Os dados de rodovias está armazenado no arquivo portland-me.osm-line.shp. Se olharmos para os dados, vamos notar que as estradas têm sempre um valor para o atributo highway e têm um valor vazio para o atributo non-road.

Nosso primeiro objetivo para a importação será de carregar apenas linhas que são realmente estradas em nosso banco de dados. Nosso segundo objetivo será o de eliminar os atributos desnecessários que vêm com os dados do OSM. Dos 57 atributos originais do ShapeFile, são apenas de nosso interesse: highway, name, oneway, ref e surface. Por fim, vamos converter os dados do EPSG:4326 para EPSG:3857, que é mais adequado para a visualização de dados em nível de cidade.

Podemos usar OGR para carregar os dados no banco de dados e realizar todos os objetivos acima, veja:

ogr2ogr \
  -where "highway <> ''" \
  -select 'name,highway,oneway,surface' \
  -lco GEOMETRY_NAME=the_geom \
  -lco FID=id \
  -t_srs EPSG:3857 \
  -f PostgreSQL PG:"dbname=routing user=postgres" \
  -nln edges portland_maine.osm-line.shp