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"][/caption]