{"id":8874,"date":"2020-07-27T08:00:18","date_gmt":"2020-07-27T11:00:18","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8874"},"modified":"2021-12-21T18:43:04","modified_gmt":"2021-12-21T21:43:04","slug":"automatizar-processos-no-geoserver","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2020\/07\/27\/automatizar-processos-no-geoserver\/","title":{"rendered":"Automatizar processos no GeoServer"},"content":{"rendered":"<p>Prezados leitores,<\/p>\n<p>O post de hoje falar\u00e1 um pouco sobre automatiza\u00e7\u00e3o de processos no GeoServer. Para isso eu irei utilizar um servidor linux (CentOS 8), a API Rest do GeoServer, e scripts em bash.<\/p>\n<p>Essa demanda apareceu pois no momento estou prestando consultoria para uma startup ajudando eles a escalarem os mapas. Al\u00e9m de alterar o paradigma que eles estavam utilizando (arquivos KML lidos pela API JavaScript do Google Maps), e implantar o GeoServer (e por consequ\u00eancia os padr\u00f5es OGC), eu tamb\u00e9m organizei\/configurei todos os dados dentro do GeoServer.<\/p>\n<p>Nessa etapa, me deparei com uma camada com precis\u00e3o de 5m. S\u00f3 pra dar uma dimens\u00e3o de tamanho, essa camada apenas para o estado do Rio de Janeiro tem 5 GB. N\u00e3o teve como faz\u00ea-la por Estado, ela teve que ser dividida por mun\u00edcipio, e ao final ser criado um layer group pra ent\u00e3o poder realizar o agrupamento por Estado novamente. Vou apresentar pra voc\u00eas como resolvi o problema.<\/p>\n<p><strong>1. Configurar Store e Layers<\/strong><\/p>\n<p>Como eu estou trabalhando com shapefiles, eu decidi criar um store do tipo &#8220;Directory of spatial files (shapefiles)&#8221;. Antes de executar o comando para criar o Store no GeoServer eu coloquei os shapes dentro da pasta de dados do GeoServer.<\/p>\n<pre>\r\ncurl -v -u admin:geoserver -XPUT -H \"Content-type: text\/plain\" -d \"file:\/\/\/var\/lib\/geoserver-data\/data\/riodejaneiro\/\" \"http:\/\/localhost:8080\/geoserver\/rest\/workspaces\/topp\/datastores\/riodejaneiro\/external.shp?configure=all\"\r\n<\/pre>\n<p>Ao executar o comando acima, o GeoServer ir\u00e1 criar o seu &#8220;Directory of spatial files&#8221;, e como eu utilizei ao final da requisi\u00e7\u00e3o o par\u00e2metro &#8220;configure=all&#8221; ele ir\u00e1 criar as camadas automaticamente a partir de cada shapefile contido na minha pasta riodejaneiro.<\/p>\n<p><strong>2. Alterar os estilos<\/strong><\/p>\n<p>Ao criar as camadas, o GeoServer aplicou o estilo padr\u00e3o para elas. Por\u00e9m, eu criei um estilo que ser\u00e1 aplicado a todas as camadas (o mesmo estilo). Dessa forma, eu preciso passar por cada camada e alterar o estilo. Fazer isso &#8220;na m\u00e3o&#8221; seria muito trabalhoso, dessa forma o comando abaixo (que precisa ser executado dentro da pasta \/var\/lib\/geoserver-data\/data\/riodejaneiro\/) vai fazer o trabalho &#8220;sujo&#8221; pra mim.<\/p>\n<pre>\r\nfor filename in *.shp; do\r\n  curl -v -u admin:geoserver -XPUT -H \"Content-type: text\/xml\" -d \"&lt;layer&gt;&lt;defaultStyle&gt;&lt;name&gt;estilo_errejota&lt;\/name&gt;&lt;\/defaultStyle&gt;&lt;\/layer&gt;\" https:\/\/localhost:8080\/geoserver\/rest\/layers\/topp:\"${filename%.shp}\";\r\ndone\r\n<\/pre>\n<p>O comando acima, faz um itera\u00e7\u00e3o, e pra cada camada ele aplica o estilo &#8220;estilo_errejota&#8221;.<\/p>\n<p><strong>3. Criar o Layer Group<\/strong><\/p>\n<p>Como mencionei no in\u00edcio do post, eu precisei dividir a camada por munic\u00edpio, e agora, que elas j\u00e1 est\u00e3o todas criadas e com os estilos aplicados corretamente, eu preciso agrup\u00e1-las para apresentar no WebGIS. Pra poder criar um Layer Group via Rest, eu precivo enviar um arquivo XML com o nome das camadas e o estilo de cada camada, conforme o modelo abaixo:<\/p>\n<pre>\r\n&lt;layerGroup&gt;\r\n&nbsp;&nbsp;&lt;name&gt;nyc&lt;\/name&gt;\r\n&nbsp;&nbsp;&lt;layers&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;layer&gt;roads&lt;\/layer&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;layer&gt;parks&lt;\/layer&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;layer&gt;buildings&lt;\/layer&gt;\r\n&nbsp;&nbsp;&lt;\/layers&gt;\r\n&nbsp;&nbsp;&lt;styles&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;roads_style&lt;\/style&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;polygon&lt;\/style&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;polygon&lt;\/style&gt;\r\n&nbsp;&nbsp;&lt;\/styles&gt;\r\n&lt;\/layerGroup&gt;\r\n<\/pre>\n<p>Pra gerar esse XML e enviar pro GeoServer via Rest, eu criei o seguinte script em bash:<\/p>\n<pre>\r\n# script para adicionar layer group no GeoServer\r\n# Author: Fernando Quadro\r\n\r\nrestapi=http:\/\/localhost:8080\/geoserver\/rest\r\nlogin=admin:geoserver\r\nworkspace=topp\r\nlayer_group=errejota\r\ndir=\/var\/lib\/geoserver-data\/data\/riodejaneiro\/layer_group.xml\r\n\r\necho \"&lt;layerGroup&gt;\" &gt; $dir \r\necho \"&lt;name&gt;$layer_group&lt;\/name&gt;\" &gt;&gt; $dir\r\necho \"&lt;layers&gt;\" &gt;&gt; $dir\r\n\r\nfor filename in *.shp; do\r\n\techo \"&lt;layer&gt;$workspace:${filename%.shp}&lt;\/layer&gt;\" &gt;&gt; $dir\t\r\ndone\r\n    \r\necho \"&lt;\/layers&gt;\" &gt;&gt; $dir\r\necho \"&lt;styles&gt;\" &gt;&gt; $dir\r\n\r\nfor filename in *.shp; do\r\n\techo \"&lt;style&gt;estilo_errejota&lt;\/style&gt;\" &gt;&gt; $dir\t\r\ndone\r\n\r\necho \"&lt;\/styles&gt;\" &gt;&gt; $dir\r\necho \"&lt;\/layerGroup&gt;\" &gt;&gt; $dir\r\n\r\ncurl -v -u admin:geoserver -XPOST -d @layer_group.xml -H \"Content-type: text\/xml\" $restapi\/layergroups\r\n<\/pre>\n<p>Ap\u00f3s a execu\u00e7\u00e3o do script acima, que tamb\u00e9m deve estar dentro da pasta onde est\u00e3o os shapefiles, voc\u00ea ter\u00e1 ent\u00e3o seu layer group criado automaticamente. Lembre-se de ao final do processo retirar o script e o arquivo XML da pasta onde est\u00e3o os shapes.<\/p>\n<p>Se voc\u00ea quiser, pode ver o processo detalhado acima no YouTube:<\/p>\n<p><center><br \/>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/7CtZfFDUUGc\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezados leitores, O post de hoje falar\u00e1 um pouco sobre automatiza\u00e7\u00e3o de processos no GeoServer. Para isso eu irei utilizar um servidor linux (CentOS 8), a API Rest do GeoServer, e scripts em bash. Essa demanda apareceu pois no momento&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2020\/07\/27\/automatizar-processos-no-geoserver\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8879,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[208],"class_list":["post-8874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-geoserver"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8874","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=8874"}],"version-history":[{"count":13,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8874\/revisions"}],"predecessor-version":[{"id":9133,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8874\/revisions\/9133"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8879"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}