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.
Se você quiser, pode ver o processo detalhado acima no YouTube: