Convertendo uma String WKT para uma Geometria e vice-versa

Primeiramente vamos entender o que é WKT, o WKT é a sigla de ‘Well-known text’. é de certo modo uma linguagem de marcação para a definição de vetores, geometrias,etc. Toda a sua estruturação é feita em texto puro, onde a abertura da definição contém o tipo do objeto geométrico, por exemplo:

  • POLYGON;
  • LINE;
  • MULTIPOLYGON;
  • etc.

Numa aplicação WEB, ao trabalharmos com o desenho de objetos geométricos em cima de uma layer do OpenLayers e caso queiremos persistir esse objeto, precisamos converter o mesmo para um formato entendível a aplicação servidora, logo fiz a conversão dos objetos geométricos para o formato WKT pelo Javascript e depois eu fiz um parser do WKT para transformá-lo em um objeto geométrico (Polygon, MultiPolygon, etc).

Abaixo segue uma parte do código Javascript que eu fiz para converter para o WKT os objetos geométricos desenhados em uma Layer do OpenLayers:

[javascript]
this.addPolygonsToHTMLInput = function() { var result = “”;

for(var i = 0; i < this.polygonLayer.features.length; i++)
{
var feat = feat2 = this.polygonLayer.features[i].geometry.toString();
var s     = feat.replace(/POLYGON/g, “”); s         = s.replace(“((“, “(“);
s = s.replace(“))”, “)”);
result += feat2 + “;”;
}
document.getElementById(“formCadastro:” + this.polygonInputText).value = result; };
};
[/javascript]

Action que chama a função acima:

[javascript]
this.addPolygonControls = function()
{
this.polygonLayer     = new OpenLayers.Layer.Vector(“Polygon Layer”);
var classe = this; var geometrias = {};
var control = new OpenLayers.Control.DrawFeature(this.polygonLayer, OpenLayers.Handler.Polygon,
{
featureAdded:function(geometry)
{
// Adiciona todos os poligonos no input definido no construtor.
classe.addPolygonsToHTMLInput(); }
});

this.map.addLayers    ([this.polygonLayer]);
this.map.addControl (control); control.activate ();
};
[/javascript]

Acima então tenho a parte que interessa a este artigo sobre como fazer a conversão. A sacada está na função addPolygonsToHTMLInput logo porque esta adiciona em um INPUT HIDDEN todos os objetos que eu desenhei separados por um ponto-e-virgula para que seja submitado com a página para o servidor.

Na aplicação Java que trata a requisição, para popular um objeto MultiPolygon, eu fiz uma classe factory para encapsular a lógica de négocio. Abaixo segue a implementação da mesma e a forma de chama-lá.

Com essa classe factory para fazer o parse e a instanciação dos objetos geométricos fica simples o nosso trabalho:

[java]
String s = “POLYGON((-7.5937521457672 14.43750500679, 30.374997854233 -8.7656199932098, 28.265622854233 37.64063000679, 9.9843728542328 25.68750500679, -7.5937521457672 14.43750500679));POLYGON((-7.5937521457672 14.43750500679, 30.374997854233 -8.7656199932098, 28.265622854233 37.64063000679, 9.9843728542328 25.68750500679, -7.5937521457672 14.43750500679))”;
this.getGleba().setTheGeom( GeometriaFactory.parseMultiPolygonFromWKT( s ) );
[/java]

Resumo

Este artigo aborda uma solução que eu desenvolvi para conseguir trabalhar de maneira fácil com os objetos geométrios e conseguir passar os mesmo entre a linguagem Java e Javascript e vice-verso.

A implementação acima não é 100% eficiente porque nos testes que eu havia começado, o método MultiPolygon.toString() retorna a anotação do WKT como sendo MULTIPOLYGON, e na importação na camada do OpenLayers o mesmo interpreta todos os polígonos que foram desenhados como sendo um só. Em breve vou estar melhorando este código e postarei aqui.

Download da Classe

Abaixo eu deixo a classe que realiza o parse e conversão das geometrias.

http://www.mediafire.com/file/9n7i6nekv2gm74w/GeometriaFactory.java

Referências

CIH – Centro Internacional de Hidroinformática

Vector Formats – OpenLayers

WKT Wikipédia

Vivid Solutions Library

Agradecimentos

Marcos Roque Rosa – CIH

Diogo Henrique – CIH