News

Montando banco de dados espacial com a GDAL - Parte 1

Olá pessoal,

A postagem deste mês mostra uma atividade de geoprocessamento pouco utilizada pelos usuários, a execução de tarefas automatizadas com o uso de scripts.

Os softwares de Geoprocessamento, apesar de oferecerem mecanismos de automatização de tarefas, possuem algumas limitações, e ainda, tende a ter uma linguagem própria, o que restringe seu uso ao próprio software.

No estudo de caso vai ser mostrado os scripts, no caso o SHELL do LINUX, que chamam os utilitários da GDAL/OGR que manipulam dados vetoriais.

Para usuários do WINDOWS é mostrado como baixar as utilitários para termos os mesmos comandos do LINUX.

Somando-se os recursos do Shell e os utilitários da GDAL/OGR , vamos criar um banco de dados espacial, com todos os shapefiles do PRODES o que seria uma atividade "humanamente" muito difícil.

Os scripts, além de automatizar as tarefas, tornam o trabalho mais controlado, garantido a padronização, e por fim, o script serve de documentação da atividades.

Por ser um conteúdo extenso, o mesmo foi dividido em partes. Esta é somente a PARTE - 1.

Este estudo de caso foi a montagem do banco de dados espacial, em PostgreSQL/PostGIS, dos dados do PRODES obtidos por shapefile de cenas em cada ano.

O resultado foi uma tabela com os desflorestamentos dos anos de 2000 a 2010, com os campos:
  • ogc_fid: Campo serial com o identificador da feição;
  • the-geom: campo geométrico do tipo polígono com o sistema de referência geográfico com o Datum SAD69;
  • ano: campo texto com o ano do desmatamento;
  • pathrow: campo texto com a órbita-ponto;
  • anoi: campo inteiro com o ano do desmatamento.
As fases de obtenção dos dados (shapefiles), verificação dos campos e valores e ingestão dos dados foram feitas por comandos/utilitários do UNIX e shell scripts chamando os utilitários da GDAL/OGR.

A seguir, a configuração do ambiente para executar os comandos e scripts.

1. GDAL/OGR (www.gdal.org):

A OGR é a biblioteca para manipulação de dados espaciais e utiliza os padrões da OGC. Sua instalação pode ser feita baixando os arquivos diretamente no site ou utilizando o instalador da OSGEO4W (http://trac.osgeo.org/osgeo4w/).
A OSGEO4W é um utilitário que baixa os projetos de software livre apoiados pela OSGEO e também diversas bibliotecas.No estudo de caso, utilizei os utilitários da GDAL/OGR instalados pela OSGEO4W.

2. Ambiente Shell:

Para emular o ambiente SHELL no Windows foram utilizados:
2.1 OSGEO4W possui o pacote MSYS que possui alguns utilitários do SHELL
2.1.1 Diretório: C:\OSGeo4W\apps\msys\bin
2.1.2 Comandos a serem utilizados:
2.1.2.1 sh: Interpretador do SHELL
2.1.2.2 grep e egrep: Procura palavras num fluxo de dados (Ex.: arquivos)

2.2 Para completar os utilitários do SHELL foi instalado alguns módulos do GnuWin32 (http://gnuwin32.sourceforge.net/packages.html)
2.2.1 Diretório: C:\_gnu_windows\package\bin
2.2.2 Em caso de proxy definir a variável 'http_proxy' set http_proxy=[endereço]:[porta]
2.2.3 Módulos: coreutils (comandos básicos), unzip (decompacta arquivos ZIP) e wget (baixa arquivos da Internet).

3. Os pacotes devem ser executados no console (prompt do DOS) com as definições de caminho e variáveis.

Definição da console está no arquivo 'OSGeo4W_PRODES.bat'

4. Foram criados Shell Script's (*.sh) para processamentos em lote.

Para executar os scripts utiliza-se o interpretador Shell, comando 'sh'
Exemplo: sh unzip_all.sh

Preparação para os dados espaciais do PRODES

Para seguir os próximos passos faça o download dos scripts, clique aqui.

Foram obtidos os shapefiles do PRODES por cena dos anos 2000 até 2010: http://www.dpi.inpe.br/prodesdigital/dadosn

Para cada ano foi criado um diretório de trabalho
G:\_bd_prodes: prodes2000, prodes2001,..., prodes2010

Listagem dos Scripts:

linkzip_all_need_link.sh
  • Utilização: sh linkzip_all_need_link.sh [index.html] [endereço dos ZIP´s]
  • index.html: Arquivo obtido com: wget [endereço dos ZIP´s]
  • Saída: Arquivo texto com a listagem dos endereços dos ZIP´s
unzip_all.sh
  • Utilização: sh unzip_all.sh
  • Saída: Descompacta todos os arquivos do diretório corrente
exist_CRS-in-shapefile_all.sh
  • Utilização: sh exist_CRS-in-shapefile_all.sh [String de Projeção]
  • Saída: Listagem na tela dos shapefiles com a ocorrência da projeção
exist_type-geom-in-shapefile_all.sh
  • Utilização: sh exist_type-geom-in-shapefile_all.sh [Tipo de geometria]
  • Saída: Listagem na tela dos shapefiles com a ocorrência da geometria
exist_field-in-shapefile_all.sh
  • Utilização: sh exist_field-in-shapefile_all.sh [Campo]
  • Saída: Listagem na tela dos shapefiles com a ocorrência do campo
exist_class-in-shapefile_all.sh
  • Utilização: sh exist_class-in-shapefile_all.sh [Campo] [Valor]
  • Saída: Listagem na tela dos shapefiles com a ocorrência do valor
ogr_get_values-of-field-in-shapefile.sh
  • Utilização: sh ogr_get_values-of-field-in-shapefile.sh [shapefile] [campo]
  • Saída: Listagem na tela com os valores do campo
ogr_get_values-of-field-in-shapefile_all.sh
  • Utilização: sh ogr_get_values-of-field-in-shapefile_all.sh [campo]
  • Saída: Listagem na tela com os valores do campo p/ todos os shapefiles
ogr_get_values-of-field-in-shapefile_by_list.sh
  • Utilização: sh ogr_get_values-of-field-in-shapefile_by_list.sh [arquivo] [campo]
  • Saída: Listagem na tela com os valores do campo p/ todos os shapefiles listados no arquivo
ogr_ingest_desflorestamento_postgis_all_p1.sh
  • Utilização: sh ogr_ingest_desflorestamento_postgis_all_p1.sh [ano]
  • Saída: Ingestão dos shapefiles (classe desflorestamento) no postgres/postgis
  • Existe variações do script (*_pN.sh) conforme o tipo de shapefile
  • Deve-se configurar a connecção do POSTGRES dentro so script.
Definição da tabela dos dados do PRODES

Os shapefiles do PRODES possuem várias classes e cobrem toda a a área da cena.

Todos os shapefiles foram inseridos em uma única tabela no banco de dados espacial, aplicando-se o filtro da classe de 'desflorestamento' nos shapefiles e criando apenas 4 campos: ogc_fid(index da tabela), ano (texto), anoi (inteiro), pathrow (definição da cena – tipo texto) e o campo Geométrico (polígono).

Ocorreram variações do filtro em função das mudanças do levantamento de cada ano, como exemplos:

  • 2010: ano = '$1' and class_name = 'DESFLORESTAMENTO'
* $1 = 2010
  • 2005: sprclasse = 'desmatamento'
* O ano e o pathrow foram obtidos pelo nome do arquivo
Exemplo: Pdigital2005_00157_359_pol → ano = 2005 e pathrow = 00157

Ingestão dos dados – Exemplo 2010

  • Baixar os ZIP's
1 - Obtenção dos 'Index.html' (Figura 1) do endereço http://www.dpi.inpe.br/prodesdigital/dadosn/2010:
Figura 1. Obtenção dos 'Index html'

Comando no console:
wget http://www.dpi.inpe.br/prodesdigital/dadosn/2010/

2 - Criação da listagem dos endereços dos ZIP´s (Figura 2):
Figura 2. Criação do arquivo dos endereços dos ZIP's

Comando no console:
sh linkzip_all_need_link.sh index.html "http://www.dpi.inpe.br/prodesdigital/dadosn/2010/" | grep _shp.zip > list_shape.txt

3 - Baixar arquivos zipados (Figura 3):
Figura 3. Baixar arquivos zipados.


Comando no console:
wget --input-file=list_shape.txt

4 - Descompactar os 97 arquivos baixados (Figura 4):
Figura 4. Descompactando os arquivos


Comando no console:
sh unzip_all.sh

5 - Alguns comandos do Shell e da OGR
5.1 - Ver se todos os shapefiles possuem projeção (contar os arquivos PRJ) (Figura 5):
Figura 5. Verificando os arquivos .PRJ
Comando no console:
ls -l *.prj | wc -l

5.2 - Ver as informações resumidas de um shapefile (utilitário da OGR) (Figura 6):
Figura 6. Resumo das informações dos shapefiles

Comando no console:
ogrinfo -so PDigital2010_00165_pol.shp PDigital2010_00165_pol

6 - Verificar se os Shapefiles tem a mesma projeção (Figura 7):
Figura 7. Verificando a mesma projeção nos shapefiles

* Foi feito o filtro na saída (uso do GREP), para listar apenas quem não tem projeção escolhida (': 0'), como não retornou nenhum elemento, todos possuem a projeção pesquisada.

Comando no console:
sh exist_CRS-in-shapefile_all.sh GCS_South_American_169 | grep ": 0"

7 - Verifica se os shapefiles são polígonos (o mesmo raciocínio anterior) (Figura 8):
Figura 8. Verificando a mesma geometria

Comando no console:
sh exist_type-geom-in-shapefile_all.sh Polygon | grep ": 0"

8 - Verifica se os shapefiles possuem o campo pathrow (Figura 9):
Figura 9. Verificação do campo pathrow nos shapefiles

Comando no console:
sh exist_field-in-shapefile_all.sh pathrow | grep ": 0"

9 - Verifica se os shapefiles possuem campo ano com valor 2010 (Figura 10):
Figura 10. Verificação do campo 2010 nos shapefiles

Comando no console:
sh exist_class-in-shapefile_all.sh ano 2010 | grep ": 0"

10 - Como todos os shapes foram conferidos (projeção, geometria, campos,...) é feita a ingestão no PostgreSQL/PostGIS (Figura 11):
Figura 11. Ingestão dos shapefiles no PostgreSQL/PostGIS

* O Script cria a tabela no Postgres se não existir.

Comando no console:
sh ogr_ingest_desflorestamento_postgis_all_p1.sh 2010


11 - Após inserir os primeiros dados, utiliza-se o POSTGRES para criar o campo 'anoi' do tipo inteiro e depois faz a atualização dos valores desse campo , fazendo a conversão dos valores do campo 'ano' (tipo texto) para inteiro com a instrução SQL :

UPDATE public.prodes
SET anoi = ano::integer
WHERE anoi IS NULL;

* Obs.: O campo 'ano' nos shapefiles é do tipo texto

A tabela do PRODES passa a ter apenas os desmatamento do ano corrente.

A utilização de SHELL script seria uma postagem a parte, mas a ideia é poder mostrar quando scripts são necessários, logo, para quem tem necessidade de tarefas repetitivas em dados vetoriais, pode aproveitar os scripts utilizados nesse artigo e fazer as suas adaptações.

O artigo procurou mostrar uma operação real, em toda sua fase, utilizando os scripts para o ano de 2010 do PRODES. As próximas etapas mostrarão as investigações dos dados, ou seja, perceber as diferenças de cada ano do PRODES, e assim, as mudanças dos scripts para poder inserir os dados no banco. Também teremos mais comentários sobre os comandos dos utilitários da GDAL/OGR, assim, vamos populando o banco de dados começando do ano mais recente até o ano de 2000.

A interação de vocês é fundamental, foram várias técnicas ilustradas, assim, sintam-se a vontade para perguntarem, tirarem suas dúvidas ou curiosidades.

O que acharam? Deixem seus comentários...

Até a segunda parte!

Luiz Motta
--
luiz.motta@gmail.com

2 comentários:

Marcelus Oliveira de Jesus disse...

Luis Lopes !!! bom curso este pois vai ajudar e muito tanto para comandos na GDAL pois e sempre bom aprender mais. É bom salientar que GEO também a linhas de comandos e não só apertar botão !! E esta colaboração do Luis Motta e fantástica ! E que estamos Juntos ai no Geoprocessamento...

Luís Lopes disse...

Olá Marcelus,

Essa série do Luiz Motta realmente é muito boa! As contribuições do Luiz à comunidade Geo, sobretudo open source é de grande valia!

Em breve novas postagens virão!

Abraços,
Luís Lopes

Geotecnologias Luís Lopes Designed by Templateism.com Copyright © 2014

Imagens do modelo de Bim. Tecnologia do Blogger.