O KML (Keyhole Markup Language) é baseado no XML (Extensible Markup Language): uma linguagem de marcação que permite a organização dos dados de maneira estruturada através do uso de tags. Um arquivo nesse formato pode incluir posição e informações de locais a serem sobrepostas em um mapa (como o Google Maps).
Veja um exemplo de uma página HTML com código JavaScript para exibir um arquivo KML sobre um Google Maps, o arquivo KML em si e um shell script para criar esse KML a partir de uma lista de coordenadas.
1) Página de exibição
Segue o arquivo “teste_kml.php” contendo os códigos HTML e JavaScript para exibição do Google Maps centrado nas coordenadas indicadas e usando o arquivo KML linkado. A respeito do estilo, sempre defina a altura do mapa explicitamente para definir o tamanho do elemento div que contém o mapa. Opcionalmente, pode fazer com que a página de exemplo preencha a janela.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0">
<meta charset="utf-8">
<title>Polígono KML</title>
<style>
#map {
height: 100%;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 15,
center: {lat: -9.973542, lng: -67.813611}
});
var Layer = new google.maps.KmlLayer({
url: 'http://www.monolitonimbus.iag.usp.br/poligono.kml',
map: map
});
}
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=CRIE_UMA_API_USANDO_SUA_CONTA_GOOGLE&callback=initMap">
[/script]
</body>
</html>
Obs.: a tag “viewport” é usada para uma página responsiva. O parâmetro “initial-scale=1” garante que, após a abertura, o layout será exibido corretamente em escala 1:1 – nenhum zoom será aplicado. Veja mais no post Dica Rápida: Não Esqueça da Meta Tag de Viewport.
2) Arquivo KML
O exemplo anterior e o que segue foram retirados deste link do Google Maps API e usa linha. Segue uma versão adaptada para um polígono:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Document>
<name>Exemplo de Polígono KML</name>
<description>Exemplo de Polígono KML</description>
<Style id="estilo">
<PolyStyle>
<color>7d00cc00</color>
<outline>1</outline>
</PolyStyle>
<LineStyle>
<color>ff00cc00</color>
<width>3</width>
</LineStyle>
</Style>
<Placemark>
<name>Políogono preenchido</name>
<description><![CDATA[Texto para descrição]]></description>
<styleUrl>#estilo</styleUrl>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<altitudeMode>relative</altitudeMode>
<coordinates>-67.804914,-9.97183,0.0 -67.804742,-9.971006,0.0 -67.803712,-9.970224,0.0 -67.803497,-9.969654,0.0 -67.80412,-9.968787,0.0 -67.805707,-9.968659999999998,0.0 -67.806351,-9.968131999999999,0.0 -67.806931,-9.967942000000003,0.0 -67.807789,-9.967244000000003,0.0 -67.80869,-9.967223,0.0 -67.809227,-9.968026,0.0 -67.809591,-9.968534,0.0 -67.81045,-9.969062,0.0 -67.812102,-9.968999,0.0 -67.814012,-9.968089999999998,0.0 -67.815149,-9.968365000000002,0.0 -67.816286,-9.96902,0.0 -67.818046,-9.969083,0.0 -67.819548,-9.969485,0.0 -67.820878,-9.970288,0.0 -67.82223,-9.970541,0.0 -67.823646,-9.970288,0.0 -67.825599,-9.969611000000002,0.0 -67.826843,-9.969421,0.0 -67.828496,-9.969168,0.0 -67.829311,-9.968914,0.0 -67.829976,-9.969125000000002,0.0 -67.830341,-9.970140000000002,0.0 -67.830448,-9.97071,0.0 -67.831521,-9.971281,0.0 -67.831628,-9.971682999999999,0.0 -67.830813,-9.971492,0.0 -67.829611,-9.970541,0.0 -67.828882,-9.969569,0.0 -67.825406,-9.970034,0.0 -67.823367,-9.970753000000002,0.0 -67.821479,-9.970816000000001,0.0 -67.818689,-9.969654,0.0 -67.815857,-9.969315999999997,0.0 -67.814226,-9.968534,0.0 -67.812402,-9.969485000000002,0.0 -67.810771,-9.969526999999998,0.0 -67.809205,-9.968745,0.0 -67.808411,-9.967836000000002,0.0 -67.807724,-9.967794,0.0 -67.806716,-9.968597000000003,0.0 -67.805793,-9.969146000000002,0.0 -67.804441,-9.969675,0.0 -67.804785,-9.969971,0.0 -67.805471,-9.970837,0.0 -67.805686,-9.971704,0.0 -67.804914,-9.97183,0.0</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
</Document>
</kml>
Além do cabeçalho (com nome e descrição), existe uma tag de estilo (para o interior do polígono e sua linha de contorno) e outra tag para o polígono em si (nome, descrição e pontos com latitude, longitude e altitude.
A respeito das cores, elas são indicadas como oito caracteres em hexadecimal em ABGR:
- 2 dígitos para camada de transparência (Alpha): FF é 100%, 80 é 50% e 00 é 0% (veja tabela completa no post 8-digit hex codes)
- 2 dígitos para o azul (Blue)
- 2 dígitos para o verde (Green)
- 2 dígitos para o vermelho (Red)
Veja esse exemplo de uma cor em RGB: 11ffcc. Agora em ABGR: ffccff11 (“ff” para cor sólida sem transparência). A palheta de cores Pegar cores hexadecimal pode ser vista no link da W3schools.
3) Shell script de criação do KML
O script “cria_kml.sh” cria o arquivo “poligono.kml”, no qual serão impressas as tags necessárias. Cada arquivo contém o conjunto de um polígono, sendo o resultado final um conjunto de polígonos identificados pela numeração de cada arquivo de coordenadas.
#!/bin/bash
# Script para criar KML com coordenadas de um arquivo/lista
rm -f poligono.kml; touch poligono.kml
# Imprimir cabeçalho
echo "<?xml version='1.0' encoding='UTF-8'?>" >> poligono.kml
echo "<kml xmlns='http://earth.google.com/kml/2.1'>" >> poligono.kml
echo " <Document>" >> poligono.kml
echo " <name>Polígonos</name>" >> poligono.kml
echo " <description>Polígonos</description>" >> poligono.kml
# Imprimir estilo
echo " <Style id='estilo'>" >> poligono.kml
echo " <PolyStyle>" >> poligono.kml
echo " <color>7d00cc00</color>" >> poligono.kml
echo " <outline>1</outline>" >> poligono.kml
echo " </PolyStyle>" >> poligono.kml
echo " <LineStyle>" >> poligono.kml
echo " <color>ff00cc00</color>" >> poligono.kml
echo " <width>3</width>" >> poligono.kml
echo " </LineStyle>" >> poligono.kml
echo " </Style>" >> poligono.kml
oldIFS=$IFS # backup do separador de campo
IFS=$'\n' # novo separador de campo, o caractere de fim de linha
for file in `ls dados`; do
# Identificação
id=$(echo $file | tr -dc '0-9')
# Imprimir Placemark
echo " <Placemark>" >> poligono.kml
echo " <name>Políogono "$id"</name>" >> poligono.kml
echo " <description><![CDATA[Texto para descrição]]></description>" >> poligono.kml
echo " <styleUrl>#estilo</styleUrl>" >> poligono.kml
echo " <Polygon>" >> poligono.kml
echo " <outerBoundaryIs>" >> poligono.kml
echo " <LinearRing>" >> poligono.kml
echo " <altitudeMode>relative</altitudeMode>" >> poligono.kml
echo " <coordinates>" >> poligono.kml
# Inserir coordenadas
for linha in $(cat 'dados/'$file); do
# Obter latitude e longitude
lon=$(echo $linha | awk '{print $1}')
lat=$(echo $linha | awk '{print $2}')
echo " "$lon","$lat",0.0 " >> poligono.kml
done
echo " </coordinates>" >> poligono.kml
echo " </LinearRing>" >> poligono.kml
echo " </outerBoundaryIs>" >> poligono.kml
echo " </Polygon>" >> poligono.kml
echo " </Placemark>" >> poligono.kml
done
# Imprimir encerramento
echo " </Document>" >> poligono.kml
echo "</kml>" >> poligono.kml
Também é possível imprimir cada polígono em arquivos separados, fazendo algumas adaptações no código acima – basicamente, colocar tudo dentro do loop para cada arquivo que contém as coordenadas e personalizar o nome do arquivo de saída.
Veja também o outro post sobre como Adicionar uma camada KML ao Google Maps, que fala sobre SHP (shape file), Google Earth e outros truques.


One comment