Prezados leitores,

O post de hoje falará um pouco sobre automatização 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 estou prestando consultoria para uma startup ajudando eles a escalarem os mapas. Além de alterar o paradigma que eles estavam utilizando (arquivos KML lidos pela API JavaScript do Google Maps), e implantar o GeoServer (e por consequência os padrões OGC), eu também organizei/configurei todos os dados dentro do GeoServer.

Nessa etapa, me deparei com uma camada com precisão de 5m. Só pra dar uma dimensão de tamanho, essa camada apenas para o estado do Rio de Janeiro tem 5 GB. Não teve como fazê-la por Estado, ela teve que ser dividida por munícipio, e ao final ser criado um layer group pra então poder realizar o agrupamento por Estado novamente. Vou apresentar pra vocês como resolvi o problema.

1. Configurar Store e Layers

Como eu estou trabalhando com shapefiles, eu decidi criar um store do tipo “Directory of spatial files (shapefiles)”. Antes de executar o comando para criar o Store no GeoServer eu coloquei os shapes dentro da pasta de dados do GeoServer.

curl -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"

Ao executar o comando acima, o GeoServer irá criar o seu “Directory of spatial files”, e como eu utilizei ao final da requisição o parâmetro “configure=all” ele irá criar as camadas automaticamente a partir de cada shapefile contido na minha pasta riodejaneiro.

2. Alterar os estilos

Ao criar as camadas, o GeoServer aplicou o estilo padrão para elas. Porém, eu criei um estilo que será aplicado a todas as camadas (o mesmo estilo). Dessa forma, eu preciso passar por cada camada e alterar o estilo. Fazer isso “na mão” 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 “sujo” pra mim.

for filename in *.shp; do
  curl -v -u admin:geoserver -XPUT -H "Content-type: text/xml" -d "<layer><defaultStyle><name>estilo_errejota</name></defaultStyle></layer>" https://localhost:8080/geoserver/rest/layers/topp:"${filename%.shp}" 
done

O comando acima, faz um iteração, e pra cada camada ele aplica o estilo “estilo_errejota”.

3. Criar o Layer Group

Como mencionei no início do post, eu precisei dividir a camada por município, e agora, que elas já estão todas criadas e com os estilos aplicados corretamente, eu preciso agrupá-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:

<layerGroup>
  <name>nyc</name>
  <layers>
    <layer>roads</layer>
    <layer>parks</layer>
    <layer>buildings</layer>
  </layers>
  <styles>
    <style>roads_style</style>
    <style>polygon</style>
    <style>polygon</style>
  </styles>
</layerGroup>

Pra gerar esse XML e enviar pro GeoServer via Rest, eu criei o seguinte script em bash:

# script para adicionar layer group no GeoServer
# Author: Fernando Quadro

restapi=http://localhost:8080/geoserver/rest
login=admin:geoserver
workspace=topp
layer_group=errejota
dir=/var/lib/geoserver-data/data/riodejaneiro/layer_group.xml

echo "<layerGroup>" > $dir 
echo "<name>$layer_group</name>" >> $dir
echo "<layers>" >> $dir

for filename in *.shp; do
	echo "<layer>$workspace:${filename%.shp} </layer>" >> $dir	
done
    
echo "</layers>" >> $dir
echo "<styles>" >> $dir

for filename in *.shp; do
	echo "<style>estilo_errejota</style>" >> $dir	
done

echo "</styles>" >> $dir
echo "</layerGroup>" >> $dir

curl -v -u admin:geoserver -XPOST -d @layer_group.xml -H "Content-type: text/xml" $restapi/layergroups

Após a execução do script acima, que também deve estar dentro da pasta onde estão os shapefiles, você terá então seu layer group criado automaticamente. Lembre-se de ao final do processo retirar o script e o arquivo XML da pasta onde estão os shapes.