Colaboraciones en el Guille

Creación de archivos KML para Google Earth con C#

 

Fecha: 03/Feb/2006 (03-02-06)
Autor: Jorge Ochoa Camus - jocamus@hotmail.com 

 


 

Saludos desde Iquitos - Perú, capital de la amazonia peruana. Desde que se lanzo Google Earth, es fascinante como se puede utilizar esta aplicación para viajar virtualmente a través del mundo desde la PC. Además si se cuenta con un listado de información georeferenciada, esta también se pude visualizar en esta aplicación, inclusive dando un  valor agregado de permitir a otros usuarios de tener mas detalles acerca de estos datos. En otras palabras es posible compartir con otros la ubicación de los puntos u observaciones realizadas en el campo a través de ficheros KML (basados en XML) y así otras personas pueden ver localmente y en contexto de mapas la ubicación de estos puntos.
Por lo tanto lo único que hace falta para compartir información es crear el archivo KML, por lo que es muy simple ya que prácticamente escribiremos un archivo XML pero siguiendo la estructura requerida por Google Earth.

Así que sin mas preámbulos manos a la obra, aquí solo muestro el evento Load de la pagina ASP.NET, este obviamente se puede reemplazar en un botón. Vamos a trabajar bajo el supuesto de que tenemos una clase de capa de lógica que nos devuelve un DataSet con solo tres columnas: [Nombre] de la coordenada, puede ser una persona u otro objeto que puede ser georefenciado, [Latitud] y [Longitud], que debe ser expresado en decimales; por ejemplo la coordenada 12º 30' = 12.50,si es en hemisferio sur entonces es -12.50.

 

private void Page_Load(object sender, System.EventArgs e)
{
	//Le daremos un nombre al archivo y tambien le expecificamos en que directorio se creara
	string nombrefile="Temp/jocamusgeo"+DateTime.Now.Ticks.ToString()+".kml";

		
	//Definimos el archivo XML
	XmlTextWriter writer = new 
	XmlTextWriter(Server.MapPath(nombrefile), Encoding.UTF8);

	// Empezamos a escribir
	writer.WriteStartDocument();
	writer.WriteStartElement("kml");
	writer.WriteAttributeString("xmlns", "http://earth.google.com/kml/2.0");
	writer.WriteStartElement("Folder");
	writer.WriteStartElement("description");
		//Descripcion del Conjunto de Datos,puede ser texto o HTML
		writer.WriteCData("Algunos paises de America delSur>");
	writer.WriteEndElement();
	writer.WriteElementString("name", "Paises");
	writer.WriteElementString("visibility", "0");
	writer.WriteElementString("open", "1");
		writer.WriteStartElement("Folder");

	//Obtenemos los datos donde estan las coordenadas
	DataSet ds= dsDatos();
	//Recorremos el DataSet
	for(int i=0;i<ds.Tables[0].Rows.Count;i++)
	{
	//Obtenemos los valores de Latitud y Longitud
	string slong=ds.Tables[0].Rows[i]["Longitud"].ToString();
	string slat=ds.Tables[0].Rows[i]["Latitud"].ToString();
	writer.WriteStartElement("Placemark");
		writer.WriteStartElement("description");
			writer.WriteCData("Aqui puede ir cualquier tipo de texto descriptivo de acuerdo al registro correspondiente");
		writer.WriteEndElement();
		//Asignamos el nombre del registro o coordenada obteniendo el valor del campo Nombre
		writer.WriteElementString("name",ds.Tables[0].Rows[i]["Nombre"].ToString());
		writer.WriteElementString("visibility","1");
		writer.WriteStartElement("Style");
		writer.WriteStartElement("IconStyle");
		writer.WriteStartElement("Icon");
		//Ruta del icono para ver las coordenadas
		//Debe ser pequeña de 32x32.
		writer.WriteElementString("href", "www.TuDominio.com/directorio/tuicono.ico");
		writer.WriteElementString("w", "32");
		writer.WriteElementString("h", "32");
		writer.WriteElementString("x", "64");
		writer.WriteElementString("y", "96");
		writer.WriteEndElement();
		writer.WriteEndElement();
		writer.WriteEndElement();
		writer.WriteStartElement("LookAt");
			writer.WriteElementString("longitude", slong);
			writer.WriteElementString("latitude", slat);
			writer.WriteElementString("range", "3000");
			writer.WriteElementString("tilt", "60");
			writer.WriteElementString("heading", "0");
		writer.WriteEndElement();
	writer.WriteStartElement("Point");
		writer.WriteElementString("extrude", "1");
		writer.WriteElementString("altitudeMode", "relativeToGround");
		writer.WriteElementString("coordinates",slong+"," +slat+",50");
	writer.WriteEndElement();
	writer.WriteEndElement();
	}
	      writer.WriteEndElement();
    	writer.WriteEndElement();
	writer.WriteEndElement();
 writer.WriteEndDocument();
writer.Close();    
}

Con esto conseguimos escribir un archivo KML que muestra la ubicación en el mapa de América del sur de las coordenadas obtenidas en diferentes países. Por lo que al hacer doble clic sobre el archivo se debe ver una imagen similar a esta:

Coordenadas en Google Earth

Se asume que previamente se ha instalado Google Earth, se puede descargar desde aquí


Espacios de nombres usados en el código de este artículo:

System.Xml
System.Text

 


Fichero con el código de ejemplo: jocamus_CodArchivosKML.zip - 10.0 KB

(MD5 checksum: 88DBB9F27797F5584EC55191853B921D)


ir al índice principal del Guille