Oct 06 2008

C# GPS Tracking en Windows Mobile (4 parte)

Category: ProgramacionIndigo @ 3:06 PM

Aquí está la cuarta de entrega de GPS Tracking en Windows Mobile. En la anterior entrega (la podeis leer en http://www.microcode.es/2008/09/29/c-gps-tracking-en-windows-mobile-3-parte/) vimos como grabar las posición que nos daba el GPS en fichero XML. Leyendo un poco por Internet sobre intercambio de datos sobre posicionamiento GPS, encontré que hay un estandard. Este estandard se llama GPX (GPS Exchange Format) y su página web es http://www.topografix.com/gpx.asp. Viendo las especificaciones he visto que hay una para almacenar puntos y otro para almacenar rutas. Estos estandars los podemos ver en las especificaciones xsd (http://www.topografix.com/gpx/1/1/).

En nuestro código tendriamos que el método SavePosition para grabar la posición como xml o como gpx.

[sourcecode language="csharp"]private void SavePosition(object sender, System.EventArgs args)
{
if (gps.Opened)
{
if (position != null)
{
if ((position.LatitudeValid) && (position.LongitudeValid) && (position.SeaLevelAltitudeValid))
{
if (ConfigManager.Config.Xml)
SavePositionXml(position.LatitudeInDegreesMinutesSeconds, position.LongitudeInDegreesMinutesSeconds, position.SeaLevelAltitude);
if (ConfigManager.Config.GpxRte)
SavePositionGpxRte(position.LatitudeInDegreesMinutesSeconds, position.LongitudeInDegreesMinutesSeconds, position.SeaLevelAltitude);
}
}
}
}[/sourcecode]

La función para generar el fichero gpx es la siguiente

[sourcecode language='csharp']private void SavePositionGpxRte(DegreesMinutesSeconds latitude, DegreesMinutesSeconds longitude, float altitude)
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string filename = Path.Combine(path, DateTime.Today.ToString(”yyyyMMdd”) + “.rte.gpx”);

XmlDocument xmlDocument = new XmlDocument();
XmlNode rootNode = null;
if (File.Exists(filename))
{
// Cargamos el fichero xml
xmlDocument.Load(filename);
XmlNode xmlHeader = xmlDocument.DocumentElement;
rootNode = xmlHeader.ChildNodes[0]; //
}
else
{
// Creamos el fichero
XmlNode xmlHeader = xmlDocument.CreateElement(”gpx”);
XmlAttribute version = xmlDocument.CreateAttribute(”version”);
version.Value = “1.0″;
XmlAttribute creator = xmlDocument.CreateAttribute(”creator”);
creator.Value = “GPSLocation”;
XmlAttribute schema = xmlDocument.CreateAttribute(”xsi”, “schemaLocation”, “http://www.w3.org/2001/XMLSchema-instance”);
schema.Value = “http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd”;
xmlHeader.Attributes.Append(version);
xmlHeader.Attributes.Append(creator);
xmlHeader.Attributes.Append(schema);

rootNode = xmlDocument.CreateElement(”rte”);

xmlHeader.AppendChild(rootNode);
xmlDocument.AppendChild(xmlHeader);
}

NumberFormatInfo formatInfo = new NumberFormatInfo();
formatInfo.NumberDecimalSeparator = “.”;

XmlNode node = xmlDocument.CreateElement(”rtept”);

XmlAttribute lat = xmlDocument.CreateAttribute(”lat”);
double value = latitude.ToDecimalDegrees();
lat.Value = value.ToString(formatInfo);

XmlAttribute lon = xmlDocument.CreateAttribute(”lon”);
value = longitude.ToDecimalDegrees();
lon.Value = value.ToString(formatInfo);

node.Attributes.Append(lat);
node.Attributes.Append(lon);

rootNode.AppendChild(node);

xmlDocument.Save(filename);
}[/sourcecode]

Este fichero lo podemos ver con google earth (http://earth.google.com/)

Espero que les sea útil.

Tags: , , , , ,


Sep 29 2008

C# GPS Tracking en Windows Mobile (3 parte)

Category: ProgramacionIndigo @ 4:49 PM

Hola a todos, aquí esta la tercera entrega de mis artículos sobre GPS Tracking. En las entregas anteriores vimos con preparar el entorno para poder desarrollar aplicaciones para Compact Mobile e instalar el ejemplo de Microsoft sobre el que nos vamos a apoyar para el desarrollo de nuestra aplicación.

Si estudiamos un poco el GPS Sample, veremos que hay un evento LocationChanged en la clase gps. En el manejados de este evento es donde pondremos nuestro código para grabar nuestra posición.

[sourcecode language='csharp']private void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
position = args.Position;

Invoke(displayLocationHandler);
Invoke(saveLocationHandler);
}[/sourcecode]

La declaración de saveLocationHandler la haremos en el Form_Load de la siguiente menera

[sourcecode language='csharp']private void Form1_Load(object sender, EventArgs e)
{
// …
saveLocationHandler = new EventHandler(SavePosition);
// …
}[/sourcecode]

y nuestro método para grabar la posición es el siguiente

[sourcecode language='csharp']private void SavePosition(object sender, System.EventArgs args)
{
if (gps.Opened)
{
if (position != null)
{
if ((position.LatitudeValid) ‘and’ (position.LongitudeValid) ‘and’ (position.SeaLevelAltitudeValid))
{
SavePositionXml(position.LatitudeInDegreesMinutesSeconds,
}
}
}
}

private void SavePositionXml(DegreesMinutesSeconds latitude, DegreesMinutesSeconds longitude, float altitude)
{
string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
string filename = Path.Combine(path, DateTime.Today.ToString(”yyyyMMdd”) + “.xml”);

XmlDocument xmlDocument = new XmlDocument();
XmlNode rootNode = null;
if (File.Exists(filename))
{
// Cargamos el fichero xml
xmlDocument.Load(filename);
rootNode = xmlDocument.DocumentElement;
}
else
{
// Creamos el fichero
XmlNode header = xmlDocument.CreateXmlDeclaration(”1.0″, “UTF-8″, null);
xmlDocument.AppendChild(header);

rootNode = xmlDocument.CreateElement(”Positions”);
xmlDocument.AppendChild(rootNode);
}

XmlElement nodePosition = xmlDocument.CreateElement(”Position”);

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “DateTime”, DateTime.Now.ToString(”dd/MM/yyyy HH:mm:ss”)));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeDegrees”, (latitude.Degrees * (latitude.IsPositive ? 1 : -1)).ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeMinutes”, latitude.Minutes.ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LatitudeSeconds”, latitude.Seconds.ToString()));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeDegrees”, (longitude.Degrees * (longitude.IsPositive ? 1 : -1)).ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeMinutes”, longitude.Minutes.ToString()));
nodePosition.AppendChild(CreateXmlElement(xmlDocument, “LongitudeSeconds”, longitude.Seconds.ToString()));

nodePosition.AppendChild(CreateXmlElement(xmlDocument, “Altitude”, altitude.ToString()));

rootNode.AppendChild(nodePosition);

xmlDocument.Save(filename);
}[/sourcecode]

Y por último, el método auxiliar CreateXmlElement es este

[sourcecode language='csharp']private XmlElement CreateXmlElement(XmlDocument xmlDocument, string name, string value)
{
XmlElement node = xmlDocument.CreateElement(name);
XmlText text = xmlDocument.CreateTextNode(value);
node.AppendChild(text);

return node;
}[/sourcecode]

Con este método obtendremos un archivo xml como éste

[sourcecode language='xml'] 22/09/2008 16:04:22
xx
xx
xx,yy
x
xx
xx,yy
xxx,y
22/09/2008 16:04:23
xx
xx
xx,yy
xx
xx
xx,yy
xxx,y
[/sourcecode]

Con esto ya tenemos nuestro primer fichero xml con las posiciones guardas. En el próximo artículo veremos como generar otro tipo de fichero xml. En este caso, un fichero xml que cumpla el estandar gpx.

Tags: , , ,


Sep 26 2008

C# GPS Tracking en Windows Mobile (2 parte)

Category: ProgramacionIndigo @ 9:59 AM

Tras mi artículo anterior, C# GPS Tracking en Windows Mobile (1 parte), algunas personas me han comentado que no han podido sincronizar el emulador del Visual Studio con el ActiveSync de Microsoft. Para hacer esto haremos los siguiente

- Instalar el ActiveSync en nuestro PC. Este programa no viene por defecto en Windows por lo que será necesaria su instalación.

- Una vez instalado los abriremos, e iremos a Archivo > Configuración de conexión y pondremos DMA en el desplegable que esta debajo de “Permitir conexiones a uno de los siguientes” como se muestra en la imagen

- Ahora iremos al Visual Studio y lanzaremos (Herramientas > Conectar con dispositivo…) nuestro emulador de Windows Mobile

- Una vez lanzado el emulador, iremos a Herramientas > Administrador de emuladores y dispositivos

y buscaremos “Windows Mobile 6 Classic Emulator”, haremos click con el botón derecho y marcaremos “Craddle”.

Una vez hecho esto el ActiveSync detectará el emulador de la PDA con si fuera una PDA con lo que ya podremos copiar o extraer archivos…

Tags: , , ,


Sep 24 2008

C# GPS Tracking en Windows Mobile (1 parte)

Category: ProgramacionIndigo @ 3:00 PM

Llevo una semana sin postear nada y se debe a que he estado metido en proyecto bastante interesante. El proyecto consta de dos partes:

  1. GPS Tracking: Dado que mi nueva PDA (HTC Touch Cruise) trae GPS, decidí hacerme un programa para registrar mi posición cada cierto tiempo.
  2. Localización de fotos: Con lo puntos anterior y la fecha de creación de la foto, puedo saber donde fue esta tomada, por lo que localizarla sería bastante fácil.

Intentaré explicar en una serie de post la primera parte del proyecto, ya que la segunda parte está aun demasiado verde.

Para comenzar el desarrollo lo primero que haremos será descargar e instalar lo necesario para el desarrollo de aplicaciones en una PDA con Visual Studio 2005. Para eso necesitamos

Con esto ya tenemos preparado nuestro Visual Studio para el desarrollo. Ahora necesitamos algo de información sobre como programar la recepción de posiciones via gps. Navegando un poco encontré que con Windows Mobile 5 SDK viene un ejemplo de ésto. Con el Windows Mobile 6 también tenemos este ejemplo en la ruta C:\Archivos de programa\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS

Abrimos este ejemplo con el Visual Studio y ejecutamos la aplicación, y ya está, tenemos nuestro ejemplo de recepción de puntos via GPS funcionando. Vamos al menu “GPS” y le damos a “Start GPS” obteniendo esto

Como vemos hay un problema, el programa no muestra nada interesante. El problema está en que nuestra PDA virtual no tiene un receptor GPS. Para solucionar esto, tan sólo debemos instalar un GPS en nuestra entorno virtual. ¿Imposible?. Pues no. Tan sólo debemos instalar una pequeña utilidad llamada FakeGPS que nos da el Mobile 6.0 SDK en nuestro entorno. Esta utilidad esta en C:\Archivos de programa\Windows Mobile 6 SDK\Tools\GPS, y se llama FakeGPS.CAB.

Una vez instalada tendremos que configurarla. Para ellos buscamos la aplicacion

y marcamos en FakeGPS como enabled y NMEA file como fakegpsdata.txt. y le damos a “Done”. Esto lo que hace es lanzar una secuenta de comandos NMEA en la PDA. Esta secuenta la podemos cambiar, pero eso lo dejo a investigación propia.

Ahora volveremos a lanzar nuestra aplicación de ejemplo, activaremos el GPS y listo, ya tenemos nuestro receptor GPS funcionando como en la imagen.

Con estos paso ya tenemos preparado nuestro entorno para poder programar nuestro programa de GPS Tracking

Tags: , , ,