Desenho de Poligonos no Google Earth usando Ruby

Considerando nosso último post, conseguimos definir os pontos de intersecções entre as linhas que compõem o contorno, mas e agora de posse dessas informações como vamos desenhar isso no mapa?

Essa técnica pode ser usada para desenhar em qualquer* linguagem ou componente do Google Earth, mas para melhor entendimento vamos pegar o desenho de polígonos utilizando Ruby.

Primeiro vamos entender sobre os arquivos de entrada e saída:

KML Estrutura XML composta pelas descrições de cada componente. Saiba mais (documentação).

KMZ é um arquivo comprimido (ZIP) contendo seu KML e possíveis imagens utilizadas. Saiba mais (documentação).

É extremamente recomendável que você leia a documentação sobre os dois arquivos.

Sabendo esse mínimo sobre os dois arquivos, vamos escolher o KML por ser mais simples de manipular e de demonstrar o funcionamento.

Não vamos explicar aqui todas as tags do KML para isso consulte a documentação, citaremos apenas as principais tags que compõe nosso exemplo.

Para melhor visualização nosso KML já foi dividido em métodos:

O método abaixo define o cabeçalho de nosso KML (XML) e dá inicio ao documento com a tag <Document> [Atenção o KML é case-sensitive]

Name: especifica o nome do grupo de componentes que vai ser criados para esse documento.

[ruby]

def kml_inicio

"<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'
xmlns:gx='http://www.google.com/kml/ext/2.2'
xmlns:kml='http://www.opengis.net/kml/2.2'
xmlns:atom='http://www.w3.org/2005/Atom'>
<Document>
<name>Contornos de Propagação para Radiodifusão</name>
<open>1</open>"

end

[/ruby]

Esse segundo segmento é responsável pela definição de cores e largura dos contornos, foram definidas 4 cores para as quatro coordenadas que serão desenhadas. Sendo composta por 6 digitos hexadecimais, observem que ao ser inserida no KML elas recebem 2 outros caracteres, (00 e FF) que são responsáveis pelas definições de opacidade. O 00 garante que o preenchimento não vai ser visível enquanto a linha sim, tanto para modo normal, quando para o modo highlight ( mouse over ), Width é responsável pela largura do contorno.

Após a definição dos 8 estilos (Style>LineStyle)  ( 4 normais e 4 highlight) é criado mais 4 tags responsáveis (StyleMap) que agrupam os outros 8 estilos em pares, definindo assim os 2 estados para cada contorno.

[ruby]

def kml_estilos

template = ""
cor={1=>"00ffff",2=>"FF6600",3=>"0000ff",4=>"33CCFF"}
tipos = ["normal","highlight"]
(1..4).each do |numero|
tipos.each do |tipo|
template+="<Style id='contorno#{numero}_#{tipo}'>
<LineStyle>
<color>ff#{cor[numero]}</color>
<width>2</width>
</LineStyle>
<PolyStyle>
<color>00#{cor[numero]}</color>
</PolyStyle>
</Style>"
end

template+="<StyleMap id='contorno#{numero}'>
<Pair>
<key>normal</key>
<styleUrl>#contorno#{numero}_normal</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#contorno#{numero}_highlight</styleUrl>
</Pair>
</StyleMap>"
end
template

end

[/ruby]

Após abrirmos as tags do documentos e definirmos os estilos de cores de cada contorno vamos então desenha-los. O método abaixo necessita que seja passado o numero do contorno ( ou seja vai ser chamado 4 vezes, uma para cada contorno) e as coordenadas referentes a cada um destes.

Tags: name: o nome do contorno que irá aparecer no google Earth agrupado pelo primeiro name que definiu o documento.

StyleUrl: O estilo que vai definir as propriedades do contorno.

Polygon>Coordinates: Requer os pares de Lon,lat ( atenção, os pares são invertidos exatamente assim) separados um par de outro por espaço.

[ruby]

def desenhar_poligonos(numero,coordenadas)
" <Placemark>
<name>Contorno #{numero}</name>
<styleUrl>#contorno#{numero}</styleUrl>
<Polygon>
<tessellate>1</tessellate>
<outerBoundaryIs>
<LinearRing>
<coordinates>
#{coordenadas}
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>"
end

[/ruby]

E por fim, mas não menos importante, vamos fechar nosso arquivo:

[ruby]

def kml_fim

"\n </Document>\n</kml>"

end

[/ruby]

E para gerar nosso arquivo completo? Muito simples agora:

[ruby]

def kml_default_template(coordenadas)

default_template = kml_inicio

default_template+= kml_estilos

(1..4).each do |numero|

default_template+= desenhar_poligonos(numero, coordenadas[numero])

end

default_template+=kml_fim

end

[/ruby]

E pronto. Save o resultado em um arquivo e nomeie como aqualquer_coisa.kml e dê dois cliques, se seu Google Earth estiver instalado normalmente você verá algo parecido com isso:

[caption id="" align="aligncenter" width="653" caption="Polígono desenhado no google Earth via Código"]Polígono desenhado no google Earth via Código[/caption]