ShapeFileReader + VRaptor 3 = facilidade para enviar e ler os seus shapefiles

Uma das coisas mais chatas que eu me recordo trabalhando com geoprocessamento eram os procedimentos para fazer upload e depois a leitura dos arquivos de geometrias ‘shapefiles’ no Java.

Basicamente nós tínhamos que informar cada coluna desejada e jogá-las em algum lugar, passando para um setAlgumaCoisa de alguma classe. Isso lembra o ResultSet, da especificação do JDBC…

[java]String s = resultSet.getString(“nome_do_campo”);[/java]

No Geotools, nós temos que fazer uma leitura de uma tabela de informações que vem junto do arquivo DBF, assim, nós fazemos algo assim:

[java]

SimpleFeature feat = (SimpleFeature) this.getSimpleFeatureIterator().next();
String nomeEstado = (String) feat.getAttribute(“nome_pais”);

[/java]

Se dermos uma olhada rápida, o código não é tão feio assim… só que ele poderia ser melhorado um pouco não é? Vamos olhar mais uma vez, só que agora atribuindo os valores dentro de um objeto Estado.

Ah, o código continua legal, não está tão feio assim.

Bom, vamos imaginar que na nossa aplicação iríamos ter que fazer o upload de arquivos shapefiles para um monte de informações, como estados, países, cidades, hidrografias, rios, arruamentos, propriedades, glebas, etc. Imaginem que teríamos cuidar de  instanciar e setar cada valor dentro destes objetos, isso não iria dar muito trabalho ?

Então, utilizando as quatro ferramentas (VRaptor, Mirror, Geotools e ShapeFileReader) combinadas é possível fazer de maneira fácil.

A jogada é abstrair todo esse procedimento de leitura ao máximo, a mesma idéia do Hibernate com SQL. Com a biblioteca ShapeFileReader nós conseguimos fazer a leitura do nosso shapefile utilizando uma sintaxe alternativa ao modo moroso de utilizar ‘setAlgumaCoisa’, basicamente eu consigo falar a ligação entre coluna e atributo de uma classe de forma verbal! Assim…

Está feito, agora eu já sei que as colunas do meu arquivo shapefile devem ir para esses destinos “atributos de uma classe“, legal não é?! O que eu preciso fazer agora é informar qual a classe de destino e qual é o shapefile (arquivo de origem).

Primeiro vamos saber da origem do arquivo. Pelo VRaptor eu fiz um pequeno formulário que me enviava esses arquivos por upload, no final eu tenho um método onde eu tenho os arquivos SHP, SHX e DBF, assim eu preciso apenas instanciar a classe que sabe processar esse arquivo(s).

A classe ShapeFileReader recebe no seu construtor as dependências diretas dele, que são:

  • A classe que deverá ser gerada com base nos dados do arquivo (Estado, Pais, etc.);
  • o arquivo .SHP de origem;
  • As definições que escrevemos antes (Definition);

Mais simples até agora né pessoal? O que me falta fazer é pegar a lista de dados da tabela do arquivo shapefile transformado em uma lista de classes que eu queira…

Bom, você já tem a sua lista de objetos desejada, mais simples não? Vou deixando a solução completa aqui…

Referências

ShapeFileReader – ferramenta com a abstração do Geotools.

Geotools – Framework para manipulação de geometrias.

Mirror – bibilioteca para trabalhar com reflection no Java.

VRaptor – framework para desenvolvimento WEB.

Arquivos de shapefile do exemplo estão aqui

Abraços e até a próxima.

Dúvidas usem a área de comentários abaixo.