{"id":5226,"date":"2016-05-11T07:34:59","date_gmt":"2016-05-11T10:34:59","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=5226"},"modified":"2018-09-04T12:04:44","modified_gmt":"2018-09-04T15:04:44","slug":"criando-um-mapa-de-calor-no-geoserver-com-wps-parte-1","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/11\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-1\/","title":{"rendered":"Criando um mapa de calor no GeoServer com WPS (Parte 1)"},"content":{"rendered":"<p>O mapa de calor (heatmap) orientado por palavra \u00e9 uma id\u00e9ia legal, e pode ser aplicado a todos os tipos de bancos de dados textuais. O principal requisito \u00e9 que as ocorr\u00eancias das palavras obede\u00e7am a algum tipo de aglomera\u00e7\u00e3o, de modo que os mapas de calor possam mostrar um padr\u00e3o discern\u00edvel.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster.jpg\" alt=\"yelp_hipster\" width=\"977\" height=\"728\" class=\"aligncenter size-full wp-image-5230\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster.jpg 977w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster-300x224.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster-768x572.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster-945x704.jpg 945w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/yelp_hipster-600x447.jpg 600w\" sizes=\"auto, (max-width: 977px) 100vw, 977px\" \/><\/p>\n<p>Vamos construir a nossa pr\u00f3pria vers\u00e3o do mapa de calor, utilizando as seguintes ferramentas, ao longo desse post que voc\u00ea deve instalar agora:<\/p>\n<p>&nbsp;&#8211; OpenGeo Suite 4.x (dispon\u00edvel para Linux, Mac OSX e Windows)<\/p>\n<p>A estrutura b\u00e1sica utilizada ser\u00e1:<\/p>\n<p>&nbsp;&#8211; A tabela espacial em PostGIS, com um \u00edndice full-text sobre os campos que deseja pesquisar<br \/>\n&nbsp;&#8211; Uma SQL View no GeoServer, expondo uma consulta full-text parametrizada<br \/>\n&nbsp;&#8211; Um aplicativo simples com GeoExt<br \/>\n&nbsp;&#8211; Uma renderiza\u00e7\u00e3o no GeoServer, transformando os pontos a partir da consulta SQL em uma visualiza\u00e7\u00e3o heatmap<\/p>\n<p>O fluxo da aplica\u00e7\u00e3o ir\u00e1:<\/p>\n<p>&nbsp;&#8211; Receber uma palavra a partir da interface web do GeoExt, que ir\u00e1<br \/>\n&nbsp;&#8211; Pass\u00e1-lo para GeoServer atrav\u00e9s de um par\u00e2metro na URL do WMS, que ir\u00e1<br \/>\n&nbsp;&#8211; Pass\u00e1-lo para o PostgreSQL como um par\u00e2metro SQL, que ir\u00e1<br \/>\n&nbsp;&#8211; Executar uma pesquisa de texto completo para encontrar um conjunto de pontos cujos nomes cont\u00eam a palavra, que ir\u00e1<br \/>\n&nbsp;&#8211; Ser processado pelo GeoServer em uma visualiza\u00e7\u00e3o do mapa de calor, que vai<br \/>\n&nbsp;&#8211; Ser exibido em uma janela de mapa na interface web pelo GeoExt.<\/p>\n<p>Este tutorial requer que voc\u00ea utilize a extens\u00e3o WPS para gerar a camada de mapa de calor (heatmap), ent\u00e3o voc\u00ea precisa para garantir que ela foi inclu\u00eddo durante a instala\u00e7\u00e3o.<\/p>\n<p>&nbsp;&#8211; Durante a instala\u00e7\u00e3o do Windows, verifique se a op\u00e7\u00e3o WPS do GeoServer foi marcada.<br \/>\n&nbsp;&#8211; No Linux, certifique-se de instalar o pacote geoserver-wps (mesmo nome de pacote para as duas distro: Red Hat e Ubuntu).<br \/>\n&nbsp;&#8211; No MacOSX, voc\u00ea tem que <a href=\"http:\/\/suite.opengeo.org\/4.1\/installation\/mac\/install.html#installation-mac-install-extensions\" target=\"_blank\">copiar os arquivos WPS para o diret\u00f3rio webapps<\/a>.<\/p>\n<p>A parte mais dif\u00edcil deste projeto, em alguns aspectos, \u00e9 encontrar dados interessantes para alimentar o mapa. Dentre as possibilidades, foi decidido pelo uso de nomes geogr\u00e1ficos (geonames), de modo a facilitar o acesso. Todas as outras possibilidades envolvidas envolviam pr\u00e9-processamento complicado antes de pudessmos come\u00e7ar com a parte da cartografia.<\/p>\n<p>O site <a href=\"http:\/\/geonames.org\/\" target=\"_blank\">geonames.org<\/a> oferece downloads diretos de dados, ent\u00e3o vamos baixar os dados para os EUA.<\/p>\n<p><a href=\"http:\/\/download.geonames.org\/export\/dump\/US.zip\" target=\"_blank\">http:\/\/download.geonames.org\/export\/dump\/US.zip<\/a><\/p>\n<p>Olhando para dentro do arquivo zip, os dados est\u00e3o em um arquivo texto denominado &#8220;US.txt&#8221;. H\u00e1 tamb\u00e9m um arquivo readme.txt, um dicion\u00e1rio de dados que descreve as colunas do arquivo de dados. <\/p>\n<p>As colunas que vamos extrair s\u00e3o:<\/p>\n<p> &#8211; geonameid<br \/>\n &#8211; name<br \/>\n &#8211; latitude<br \/>\n &#8211; longitude<br \/>\n &#8211; feature code<br \/>\n &#8211; admin1 code<\/p>\n<p>N\u00f3s podemos carregar diretamente o arquivo texto GeoNames usando o <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/sql-copy.html\" target=\"_blank\">comand COPY<\/a> do PostgreSQL, que importa os dados diretamente para a tabela a partir de arquivos de texto delimitados.<\/p>\n<p>Para receber os dados, precisamos de uma tabela que possua o mesmo n\u00famero de colunas do arquivo.<\/p>\n<pre>CREATE TABLE geonames_load (\r\n  geonameid INTEGER PRIMARY KEY,\r\n  name VARCHAR(200),\r\n  asciiname VARCHAR(200),\r\n  alternatenames VARCHAR,\r\n  latitude FLOAT8,\r\n  longitude FLOAT8,\r\n  feature_class char(1),\r\n  feature_code VARCHAR(10),\r\n  country_code VARCHAR(2),\r\n  cc2 VARCHAR(60),\r\n  admin1 VARCHAR(20),\r\n  admin2 VARCHAR(80),\r\n  admin3 VARCHAR(20),\r\n  admin4 VARCHAR(20),\r\n  population INTEGER,\r\n  elevation INTEGER,\r\n  dem INTEGER,\r\n  timezone VARCHAR(40),\r\n  modification VARCHAR(18)\r\n);\r\n<\/pre>\n<p>Uma vez que temos uma tabela em branco, podemos carregar o arquivo. Para ler o arquivo, ele deve estar em um local que seja acess\u00edvel pelo banco de dados. Eu costumo usar o \/tmp no Linux ou MacOSX e C:\\Temp no Windows.<\/p>\n<pre>COPY geonames_load FROM '\/tmp\/US.txt' WITH (\r\n  FORMAT csv,\r\n  DELIMITER E'\\t',\r\n  QUOTE '*',\r\n  HEADER false,\r\n  ENCODING 'UTF8'\r\n);\r\n<\/pre>\n<p>O formato &#8220;csv&#8221; geralmente suporta qualquer separador, n\u00e3o apenas v\u00edrgulas, e n\u00f3s declaramos nosso delimitador como um caracter de tabula\u00e7\u00e3o. Conforme descrito no readme.txt o arquivo GeoNames n\u00e3o tem nenhuma linha de cabe\u00e7alho, e a codifica\u00e7\u00e3o de texto \u00e9 UTF8.<\/p>\n<p>Uma vez que a tabela \u00e9 carregada, podemos verificar quantas linhas tem, em seguida, criar um nova tabela apenas com as colunas que nos interessam:<\/p>\n<pre>-- There's over 2M records!\r\nSELECT Count(*) FROM geonames_load;\r\n\r\n-- Strip out columns we want, and create a point geometry.\r\nCREATE TABLE geonames AS\r\nSELECT\r\n  geonameid AS id,\r\n  name AS name,\r\n  admin1 AS state,\r\n  feature_code AS kind,\r\n  ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)::Geometry(Point,4326) AS geom\r\nFROM geonames_load;\r\n<\/pre>\n<p>Finalmente, podemos adicionar um \u00edndice espacial, e declarar a chave prim\u00e1ria. Isto ir\u00e1 acelerar a visualiza\u00e7\u00e3o dos dados.<\/p>\n<pre>ALTER TABLE geonames ADD PRIMARY KEY (id);\r\nCREATE INDEX geonames_gix ON geonames USING GIST (geom);\r\n<\/pre>\n<p><a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/12\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-2\/\" target=\"_blank\">No pr\u00f3ximo post<\/a> iremos configurar o Full-Text Seach, os dados no GeoServer e preparar a aplica\u00e7\u00e3o.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O mapa de calor (heatmap) orientado por palavra \u00e9 uma id\u00e9ia legal, e pode ser aplicado a todos os tipos de bancos de dados textuais. O principal requisito \u00e9 que as ocorr\u00eancias das palavras obede\u00e7am a algum tipo de aglomera\u00e7\u00e3o,&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/11\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-1\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5228,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,24,132,62],"tags":[208,223,250,212,264],"class_list":["post-5226","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geoserver","category-gis","category-openlayers","category-wps","tag-geoserver","tag-gis","tag-openlayers","tag-postgis","tag-wps"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5226","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=5226"}],"version-history":[{"count":13,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5226\/revisions"}],"predecessor-version":[{"id":7286,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5226\/revisions\/7286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5228"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=5226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=5226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=5226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}