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.
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