Criando KML com polígono

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

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.