{"id":5247,"date":"2016-05-12T07:09:57","date_gmt":"2016-05-12T10:09:57","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=5247"},"modified":"2018-09-04T12:26:18","modified_gmt":"2018-09-04T15:26:18","slug":"criando-um-mapa-de-calor-no-geoserver-com-wps-parte-2","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/12\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-2\/","title":{"rendered":"Criando um mapa de calor no GeoServer com WPS (Parte 2)"},"content":{"rendered":"<p><a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/11\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-1\/\" target=\"_blank\">No \u00faltimo post<\/a> baixamos e carregamos os dados para o PostgreSQL, hoje iremos dar sequencia no artigo, configurando a pesquisa Full-text.<\/p>\n<p>A fim de fazer um mapa eficiente, temos que encontrar rapidamente os registros que t\u00eam as palavras que estamos interessados. Felizmente, o PostgreSQL fornece a facilidade de uma pesquisa de texto completo (full-text search) para a procura r\u00e1pida e eficaz dos campos texto. Com ela \u00e9 poss\u00edvel combinar automaticamente palavras diferentes-mas-semelhante (como &#8220;\u00e1rvore&#8221; e &#8220;\u00e1rvores&#8221;) e encontrar palavras particulares em grandes blocos de texto.<\/p>\n<p>Nossos dados n\u00e3o s\u00e3o particularmente pesados \u200b\u200b(a maioria dos nomes de lugares na nossa base de dados consistem em apenas duas palavras, apenas alguns t\u00eam tr\u00eas ou mais), mas full-text search ainda ser\u00e1 mais eficiente do que uma simples correspond\u00eancia de padr\u00e3o, porque ele pode fazer uso do \u00edndice full-text.<\/p>\n<p>O full-text faz uso de tipos do PostgreSQL especializadas: <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/datatype-textsearch.html\" target=\"_blank\">tsvector <\/a>e <a href=\"http:\/\/www.postgresql.org\/docs\/current\/static\/datatype-textsearch.html\" target=\"_blank\">tsquery<\/a>.<\/p>\n<p>Ele depende da cria\u00e7\u00e3o de um \u00edndice no tsvector representando um (ou v\u00e1rios) campo de texto. Podemos ver o efeito do \u00edndice, executando uma consulta de teste antes e depois de constru\u00ed-lo.<\/p>\n<pre> -- Watch the timing of this query\r\nSELECT Count(*) FROM geonames WHERE to_tsvector('english', name) @@ to_tsquery('english', 'oak');\r\n-- Create the full-text index\r\nCREATE INDEX geonames_fulltext_idx ON geonames USING GIN (to_tsvector('english', name));\r\n-- Again, watch the timing of this query\r\nSELECT Count(*) FROM geonames WHERE to_tsvector('english', name) @@ to_tsquery('english', 'oak');\r\n<\/pre>\n<p>Quando o nosso aplicativo envia de volta o texto a partir da interface web, o texto pode conter espa\u00e7os. A fun\u00e7\u00e3o to_tsquery () n\u00e3o gosta de espa\u00e7os, ela espera que cada palavra na string de consulta devem ser separados por &#8220;&#038;&#8221;,  &#8220;AND&#8221;, &#8220;|&#8221; ou &#8220;OR&#8221;.<\/p>\n<p>Para resolver este problema e retirar qualquer espa\u00e7o \u00e0 na palavra, vamos usar a fun\u00e7\u00e3o trim().<\/p>\n<pre>-- Example of space trimming\r\nSELECT trim('   New York ');<\/pre>\n<p>A seguir, vamos tratar todo o texto com espa\u00e7os como consultas. Por isso, queremos substituir os espa\u00e7os entre as palavras com o s\u00edmbolo &#8220;&#038;&#8221;.<\/p>\n<pre>-- Example of trimming and turning spaces into &s\r\nSELECT regexp_replace(trim('  New  York '), E'\\\\s+', '&', 'g');\r\n<\/pre>\n<p>Finalmente, podemos colocar o resultado em um to_tsquery() executando na query atual.<\/p>\n<pre>-- Again, watch the timing of this query\r\nSELECT Count(*)\r\nFROM geonames\r\nWHERE\r\n to_tsvector('english', name) @@\r\n to_tsquery('english', regexp_replace(trim('   New York '), E'\\\\s+', '&', 'g'));\r\n<\/pre>\n<p>Agora, imagine que &#8220;New York&#8221; poderia ser substitu\u00eddo por qualquer palavra que voc\u00ea quisesse, e que os resultados poderiam ser colocados em um mapa em tempo real! Isso \u00e9 o que n\u00f3s vamos configurar a seguir.<\/p>\n<p>Para este artigo, vou considerar que o GeoServer est\u00e1 configurado com as camadas (em uma store PostGIS) e voc\u00ea criou um workspace com o nome &#8220;wordmap&#8221;.<\/p>\n<p>Tendo dito isto, vamos configurar a nossa camada SQL View, indo na op\u00e7\u00e3o &#8220;Add Layer&#8221;.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/newsqllayer1.png\" alt=\"newsqllayer1\" width=\"771\" height=\"292\" class=\"aligncenter size-full wp-image-5257\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/newsqllayer1.png 771w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/newsqllayer1-300x114.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/newsqllayer1-768x291.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/newsqllayer1-600x227.png 600w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/p>\n<p>Vamos setar o nome da nossa camada como geonames, com o SQL a seguir:<\/p>\n<pre>SELECT id, name, geom\r\nFROM geonames\r\nWHERE\r\n to_tsvector('english', name) @@\r\n to_tsquery('english', regexp_replace(trim('%word%'), E'\\\\s+', '&', 'g'))\r\n<\/pre>\n<p>Esta \u00e9 basicamente a mesma consulta usada na se\u00e7\u00e3o anterior. Ela rapidamente encontra todos os registros em que o nome cont\u00e9m uma palavra particular. Neste caso, em vez de procurar por uma palavra particular, n\u00f3s colocamos %word% como um par\u00e2metro. Isso nos permite buscar qualquer palavra, apenas passando o par\u00e2metro na URL.<\/p>\n<p>Esta \u00e9 basicamente a mesma consulta usada na se\u00e7\u00e3o anterior. Ela rapidamente encontra todos os registros em que o nome cont\u00e9m uma palavra particular. Neste caso, em vez de procurar por uma palavra particular, n\u00f3s colocamos %word% como um par\u00e2metro. Isso nos permite buscar qualquer palavra consulta do GeoServer, apenas passando o par\u00e2metro na URL.<\/p>\n<p>Depois de criar a SQL View, v\u00e1 at\u00e9 a se\u00e7\u00e3o &#8220;SQL view parameters&#8221; e clique em &#8220;Guess parameters from SQL&#8221;:<\/p>\n<p> &#8211; O par\u00e2metro &#8220;word&#8221; deve estar preenchido na lista de par\u00e2metros.<br \/>\n &#8211; Defina o valor padr\u00e3o para &#8220;oceano&#8221;.<br \/>\n &#8211; Defina a &#8220;valida\u00e7\u00e3o de express\u00e3o regular&#8221; para &#8220;^ [\\ w \\ d \\ s] * $&#8221;<br \/>\n*Esta express\u00e3o permite apenas letras, n\u00fameros e espa\u00e7os, incluindo os valores vazios.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/sqlviewdetails1.png\" alt=\"sqlviewdetails1\" width=\"744\" height=\"105\" class=\"aligncenter size-full wp-image-5260\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/sqlviewdetails1.png 744w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/sqlviewdetails1-300x42.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/sqlviewdetails1-600x85.png 600w\" sizes=\"auto, (max-width: 744px) 100vw, 744px\" \/><\/p>\n<p>Agora v\u00e1 para se\u00e7\u00e3o &#8220;Attributes&#8221; e clique em &#8220;Refresh&#8221;. As colunas &#8220;id&#8221;, &#8220;nome&#8221; e &#8220;geom&#8221; devem ter sido inferidas a partir do SQL.<\/p>\n<p> &#8211; Verifique se &#8220;id&#8221; est\u00e1 como identificador exclusivo.<br \/>\n &#8211; Defina o campo &#8220;geom&#8221; como ponto .<br \/>\n &#8211; Defina o &#8220;SRID&#8221; do &#8220;geom&#8221; para 4326 .<\/p>\n<p>Agora salve as configura\u00e7\u00f5es do SQL View, e voc\u00ea ser\u00e1 redirecionado diretamente para a p\u00e1gina de configura\u00e7\u00e3o da camada.<\/p>\n<p>Na tela de configura\u00e7\u00e3o de camada fa\u00e7a o seguinte: <\/p>\n<p>Na aba &#8220;Data&#8221;: <\/p>\n<p> &#8211; Declare SRS como EPSG:4326<br \/>\n &#8211; Gere os Bounding Boxes<\/p>\n<p>Na aba &#8220;Tile Cache&#8221;:<\/p>\n<p> &#8211; Na op\u00e7\u00e3o Tile Cache, desmarque a op\u00e7\u00e3o &#8220;Criar camada de cache para esta camada&#8221;<br \/>\n &#8211; Clique em &#8220;Salvar&#8221;<\/p>\n<p>Agora voc\u00ea tem uma camada vis\u00edvel!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/preview_ocean.png\" alt=\"preview_ocean\" width=\"621\" height=\"450\" class=\"aligncenter size-full wp-image-5262\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/preview_ocean.png 621w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/preview_ocean-300x217.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/preview_ocean-600x435.png 600w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/p>\n<p>Para testar se a camada funcionou, vamos realizar um teste:<\/p>\n<p>http:\/\/localhost:8080\/geoserver\/wms\/reflect?layers=wordmap:geonames&#038;viewparams=word:navajo<\/p>\n<p>Comparando com a imagem acima, \u00e9 poss\u00edvel verificar que houve uma mudan\u00e7a, mas que \u00e9 dif\u00edcil de interpretar sem uma mapa base. No pr\u00f3ximo post iremos construir um interface web para que possamos explorar esta camada din\u00e2mica.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/map-navajo.png\" alt=\"map-navajo\" width=\"512\" height=\"111\" class=\"aligncenter size-full wp-image-5264\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/map-navajo.png 512w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/05\/map-navajo-300x65.png 300w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>No \u00faltimo post baixamos e carregamos os dados para o PostgreSQL, hoje iremos dar sequencia no artigo, configurando a pesquisa Full-text. A fim de fazer um mapa eficiente, temos que encontrar rapidamente os registros que t\u00eam as palavras que estamos&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/05\/12\/criando-um-mapa-de-calor-no-geoserver-com-wps-parte-2\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":5268,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,24,62],"tags":[208,223],"class_list":["post-5247","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geoserver","category-gis","category-wps","tag-geoserver","tag-gis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5247","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=5247"}],"version-history":[{"count":21,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5247\/revisions"}],"predecessor-version":[{"id":7287,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/5247\/revisions\/7287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/5268"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=5247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=5247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=5247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}