{"id":5547,"date":"2016-06-08T07:30:03","date_gmt":"2016-06-08T10:30:03","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=5547"},"modified":"2016-08-12T15:44:41","modified_gmt":"2016-08-12T18:44:41","slug":"criando-um-aplicativo-de-rotas-com-pgrouting-parte-1","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/06\/08\/criando-um-aplicativo-de-rotas-com-pgrouting-parte-1\/","title":{"rendered":"Criando um aplicativo de rotas com pgRouting &#8211; Parte 1"},"content":{"rendered":"<p>A grande vantagem no uso de padr\u00f5es abertos \u00e9 que as tecnologias se encaixem perfeitamente quando precisamos delas.<\/p>\n<p>Neste caso estamos falando da integra\u00e7\u00e3o entre GeoServer, OpenLayers e pgRouting, que \u00e9 uma extens\u00e3o do PostgreSQL e PostGIS que nos permite calcular o caminho mais r\u00e1pido, mais barato ou mais curto entre dois pontos. <\/p>\n<p>A primeira coisa a entender sobre o roteamento de menor caminho \u00e9 que n\u00e3o h\u00e1 nada de fundamentalmente espacial nisso, mas ele se integra muito bem com aplica\u00e7\u00f5es espaciais. <\/p>\n<p>O pgRouting precisa de uma &#8220;rede de roteamento&#8221; em um banco de dados PostgreSQL, que mostra a posi\u00e7\u00e3o relativa dos pontos, ao inv\u00e9s de suas posi\u00e7\u00f5es espaciais reais. Quando as redes contem dados espaciais, no entanto, podemos construir aplicativos de roteamento precisos que mostrem o caminho mais curto atrav\u00e9s da rede e qual o caminho que se traduz espacialmente.<\/p>\n<p>O que vamos fazer? N\u00f3s estaremos construindo uma aplica\u00e7\u00e3o de roteamento que mostra aos usu\u00e1rios o caminho mais curto entre dois pontos em uma cidade.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1.png\" alt=\"route1\" width=\"1019\" height=\"632\" class=\"aligncenter size-full wp-image-5553\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1.png 1019w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1-300x186.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1-768x476.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1-945x586.png 945w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/06\/route1-600x372.png 600w\" sizes=\"auto, (max-width: 1019px) 100vw, 1019px\" \/><\/p>\n<p>Para fazer isso, precisaremos dos seguintes itens:<\/p>\n<p> &#8211; pgRouting 2 habilitado na base de dados<br \/>\n &#8211; Dados do OpenStreetMap no PostGIS<br \/>\n &#8211; Prepara\u00e7\u00e3o dos dados para utiliza\u00e7\u00e3o com o software de roteamento<br \/>\n &#8211; Publicar os dados em GeoServer<br \/>\n &#8211; Usar o Boundless SDK para criar uma aplica\u00e7\u00e3o web<br \/>\n &#8211; OpenGeo Suite 4.5 (incluindo GeoServer, PostGIS, GDAL \/ OGR and Suite SDK)<\/p>\n<p>H\u00e1 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):<\/p>\n<pre>sudo add-apt-repository ppa:georepublic\/pgrouting\r\nsudo apt-get update\r\nsudo apt-get install postgresql-9.3-pgrouting\r\nsudo apt-get install opengeo-tomcat7 geoserver<\/pre>\n<p>Para este tutorial partiremos do pressuposto que voc\u00ea j\u00e1 instalou o OpenGeo Suite. Caso n\u00e3o tenha realizado a instala\u00e7\u00e3o ainda, voc\u00ea pode ver como fazer <a href=\"http:\/\/suite.opengeo.org\/opengeo-docs\/intro\/installation\/index.html\" target=\"_blank\">neste link<\/a>.<\/p>\n<p>O OpenStreetMap \u00e9 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).<\/p>\n<p>Existem programas que podem ser usados \u200b\u200bpara gerar uma rede de roteamento de dados OpenStreetMap, mas vamos ficar com as ferramentas que acompanham o OpenGeo Suite para fazer a prepara\u00e7\u00e3o dos nossos dados.<\/p>\n<p>Nossa primeira a\u00e7\u00e3o ser\u00e1 baixar os dados do OpenStreetMap; o MapZen fornece trechos para muitas cidades do mundo em formato ShapeFile, mas n\u00f3s poderiamos facilmente ter usado osm2pgsql para obter dados para qualquer outro lugar do mundo.<\/p>\n<p>Baixe o <a href=\"https:\/\/s3.amazonaws.com\/metro-extracts.mapzen.com\/portland_maine.osm2pgsql-shapefiles.zip\" target=\"_blank\">shapefile para Portland<\/a> e extraia o arquivo:<\/p>\n<pre>wget https:\/\/s3.amazonaws.com\/metro-extracts.mapzen.com\/portland_maine.osm2pgsql-shapefiles.zip \r\nunzip portland_maine.osm2pgsql-shapefiles.zip<\/pre>\n<p>Em seguida, precisamos criar um novo banco de dados em PostgreSQL em que iremos importar nossos dados. N\u00f3s tamb\u00e9m precisa ativar as fun\u00e7\u00f5es espaciais do PostGIS:<\/p>\n<pre>createdb routing;\r\npsql -c \"CREATE EXTENSION postgis;\" routing<\/pre>\n<p>Os dados do OSM est\u00e3o em tr\u00eas shapefiles, uma para pontos, um para linhas e um para pol\u00edgonos. Os dados de rodovias est\u00e1 armazenado no arquivo portland-me.osm-line.shp. Se olharmos para os dados, vamos notar que as estradas t\u00eam sempre um valor para o atributo highway e t\u00eam um valor vazio para o atributo non-road.<\/p>\n<p>Nosso primeiro objetivo para a importa\u00e7\u00e3o ser\u00e1 de carregar apenas linhas que s\u00e3o realmente estradas em nosso banco de dados. Nosso segundo objetivo ser\u00e1 o de eliminar os atributos desnecess\u00e1rios que v\u00eam com os dados do OSM. Dos 57 atributos originais do ShapeFile, s\u00e3o apenas de nosso interesse: highway, name, oneway, ref e surface. Por fim, vamos converter os dados do EPSG:4326 para EPSG:3857, que \u00e9 mais adequado para a visualiza\u00e7\u00e3o de dados em n\u00edvel de cidade.<\/p>\n<p>Podemos usar OGR para carregar os dados no banco de dados e realizar todos os objetivos acima, veja:<\/p>\n<pre>ogr2ogr&nbsp;\\\r\n&nbsp;&nbsp;-where&nbsp;\"highway&nbsp;<>&nbsp;''\"&nbsp;\\\r\n&nbsp;&nbsp;-select&nbsp;'name,highway,oneway,surface'&nbsp;\\\r\n&nbsp;&nbsp;-lco&nbsp;GEOMETRY_NAME=the_geom&nbsp;\\\r\n&nbsp;&nbsp;-lco&nbsp;FID=id&nbsp;\\\r\n&nbsp;&nbsp;-t_srs&nbsp;EPSG:3857&nbsp;\\\r\n&nbsp;&nbsp;-f&nbsp;PostgreSQL&nbsp;PG:\"dbname=routing&nbsp;user=postgres\"&nbsp;\\\r\n&nbsp;&nbsp;-nln&nbsp;edges&nbsp;portland_maine.osm-line.shp<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A grande vantagem no uso de padr\u00f5es abertos \u00e9 que as tecnologias se encaixem perfeitamente quando precisamos delas. Neste caso estamos falando da integra\u00e7\u00e3o entre GeoServer, OpenLayers e pgRouting, que \u00e9 uma extens\u00e3o do PostgreSQL e PostGIS que nos permite&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/06\/08\/criando-um-aplicativo-de-rotas-com-pgrouting-parte-1\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5549,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,24,132,11],"tags":[208,223,266,212],"class_list":["post-5547","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geoserver","category-gis","category-openlayers","category-postgis","tag-geoserver","tag-gis","tag-pgrouting","tag-postgis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5547","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=5547"}],"version-history":[{"count":9,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5547\/revisions"}],"predecessor-version":[{"id":6215,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5547\/revisions\/6215"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5549"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=5547"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=5547"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=5547"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}