Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Importar fichero GPX utilizando XML Mapper

Hola, después de leer el artículo de de Neftalí http://neftali.clubdelphi.com/cargar...r-a-los-datos/ (cojonudo por cierto) sobre cómo cargar ficheros GPX me decidí a implementarlo en mi programa.

Utilizo los ficheros GPX para sincronizarlos con las fotografías y geolocalizarlas.

Creo un archivo de transformación utilizando XML Mapper partiendo de un fichero GPX. Sigo al dedillo el artículo y todo funciona correctamente. Cuando creo que todo va bien, arrango mi GPS Logger aprovechando un viaje y genero 8 horas de waypoints que exporto a GPX al llegar a casa.
Cuando arranco el programa me doy cuenta de que el archivo de transformación esta mal, ya que el GPS logger añade rutas cuando pierde conexión con los satelites, es decir, en el mismo GPX hay varios registros de ruta <trk> que a su vez tienen sus <trkseg> con los waypoints de la ruta.

El caso y sin liarme mucho, es que genero otro fichero de transformación tal que así:



Con lo que tenemos de resultado:



Son dos DBGrids donde mostramos las tracks del GPX y los waypoints de cada una de las tracks... automáticamente al pinchar en una track lista los waypoints que contiene en el otro DBGrid.

He trasteado con MySQL y utilizo SQLite3 para mi aplicación, pero nunca había trasteado con los datacontrols... lo que necesito en este caso es que en un DBGrid, me muestre los waypoints asociados a todas las rutas.

Es decir que lea los DATASETS trkpt de todas las tracks y las muestre una tras de otra.

Alguien me podría decir por donde tirar? sería una consulta del estilo ADOQuery? no se si al final tendré que leer registro a registro "a mano", seguro que hay otra forma. La verdad es que estoy bastante perdido con estas cosas

Muchas gracias de antemano y un saludo!
Responder Con Cita
  #2  
Antiguo 08-01-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por lago Ver Mensaje
Hola, después de leer el artículo de de Neftalí http://neftali.clubdelphi.com/cargar...r-a-los-datos/ (cojonudo por cierto) sobre cómo cargar ficheros GPX me decidí a implementarlo en mi programa.
Gracias, me alegro de que te haya servido.

Cita:
Empezado por lago Ver Mensaje
Creo un archivo de transformación utilizando XML Mapper partiendo de un fichero GPX. Sigo al dedillo el artículo y todo funciona correctamente. Cuando creo que todo va bien, arrango mi GPS Logger aprovechando un viaje y genero 8 horas de waypoints que exporto a GPX al llegar a casa.
Cuando arranco el programa me doy cuenta de que el archivo de transformación esta mal, ya que el GPS logger añade rutas cuando pierde conexión con los satelites, es decir, en el mismo GPX hay varios registros de ruta <trk> que a su vez tienen sus <trkseg> con los waypoints de la ruta.
La idea al final es la misma que se explica en el artículo, pero generando algún nivel más.
Es verdad que el ejemplo de ese artículo trabaja con ficheros de track que contienen puntos (2 nivelesa), pero yo mismo, al igual que tú, a posteriori me he encontrado con ficheros cuya estructura es más compleja.

Fichero del artículo:
TRACK
_________=> N PUNTOS


Por ejemplo, en el ejemplo que subo al final, la estructura es más parecida à la que tú te encuentras. Un fichero de track que tienen N Waypoints y N Segmentos, y cada segmento tienen n puntos.
Fichero adjunto:
TRACK (< gpx >)
_________=> N WAYPOINTS (< wpt >)
_________=> N SEGMENTOS (< trk >)
__________________=> N PUNTOS (< trkpt >)

En ese caso el fichero XTR se genera de la misma forma, pero es un poco más complejo:


Y la estructiura en formato DATASET sería esta:


Te adjunto un ejemplo Delphi con los DBGrids para leer eso, pero es lo mismo que en el ejemplo inicial, simplemente que añadiendo un nivel más:

(dentro está el fichero de transformación y una ruta de ejemplo)

Espero que te aclare algo.

Un saludo.
Archivos Adjuntos
Tipo de Archivo: zip Leer ficheros GPX.zip (54,7 KB, 7 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 08-01-2018
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 229
Poder: 17
WHILENOTEOF Va camino a la fama
, gracias Germán por el ejemplo.
Responder Con Cita
  #4  
Antiguo 08-01-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Hola Neftalí, gracias por responder tan rápido y por tu ejemplo! más o menos es lo que he hecho. Mi problema es que necesito un DBGrid con tooooodos los puntos independientemente del track que sea.

En tu ejemplo hay:

T6758644-0
T6758644-1
T6758644-2 ... etc

Cada uno de ellos contiene puntos de la ruta, cuando pincho en cada uno , en tu DBGrid4 me muestra los puntos correspondientes a ese track.

El tema sería saber si hay alguna manera de mostrarlos todos en un DBGrid sin recorrerlos a mano uno a uno? Para el programa que estoy haciendo necesito simplemente eso, un DBGrid con todos los puntos de un GPX, independientemente del track donde esten.

Muchas gracias por tu ayuda!
Responder Con Cita
  #5  
Antiguo 09-01-2018
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por lago Ver Mensaje
Hola Neftalí, gracias por responder tan rápido y por tu ejemplo! más o menos es lo que he hecho. Mi problema es que necesito un DBGrid con tooooodos los puntos independientemente del track que sea.
Directamente no.
Pero se solventa realizando iun recorrido de todos los segmentos y a su vez un recorrido de todos los puntos de cada segmente.
Puedes usar un TClientDataset, pore ejemplo, para almacenarlos todos.

Algo así:

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
begin
  cdsAllPoints.CreateDataSet;
  cdsAllPoints.OPen;

  cdsSegment.First;
  while (not cdsSegment.Eof) do begin
    cdsPuntos.First;
    Memo1.Lines.Add('Segmento: ' + cdsSegment.FieldByName('name').AsString);
    Memo1.Lines.Add('   ->' + IntToStr(cdsPuntos.RecordCount) + ' puntos');
    while (not cdsPuntos.Eof) do begin
      // Añadirlo ---------------------------
      cdsAllPoints.Append;
      cdsAllPoints.FieldByName('lat').AsString := cdsPuntos.FieldByName('lat').AsString;
      cdsAllPoints.FieldByName('lon').AsString := cdsPuntos.FieldByName('lon').AsString;
      cdsAllPoints.FieldByName('ele').AsString := cdsPuntos.FieldByName('ele').AsString;
      cdsAllPoints.FieldByName('time').AsString := cdsPuntos.FieldByName('time').AsString;
      cdsAllPoints.Post;
      //-------------------------------------
      cdsPuntos.Next;
    end;
    cdsSegment.Next;
  end;
  Memo1.Lines.Add('TOTAL DE PUNTOS: ' + IntToStr(cdsAllPoints.RecordCount));
end;

cdsAllPoints es un TClientDataset con 4 campos (lat, lon, ele y time).

Por lo que he visto no es que sea al perder señal, sino cada 500 puntos.
Muchos dispositivos antiguos (sobre todo Garmin que se consideran estandard) almacenaban como máximo 500 puntos por track. Sea uno de estos o sea uno nuevo que lo haga por compatibilidad, el tuyo está generando diferentes segmentos cuando llega a ese límite.

Crea un nuevo dataset como te he dicho y con ese procedimiento puedes hacer el recorrido.
El resultado es el siguiente:

-------------------------------
Segmento: T6758644-0
->500 puntos
Segmento: T6758644-1
->500 puntos
Segmento: T6758644-2
->500 puntos
Segmento: T6758644-3
->500 puntos
Segmento: T6758644-4
->500 puntos
Segmento: T6758644-5
->500 puntos
Segmento: T6758644-6
->500 puntos
Segmento: T6758644-7
->357 puntos

TOTAL DE PUNTOS: 3857


-------------------------------
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 09-01-2018
lago lago is offline
Miembro
 
Registrado: nov 2015
Posts: 40
Poder: 0
lago Va por buen camino
Genial! muchísimas gracias ! nunca había usado esos componentes, me has ayudado mucho!

Cita:
Por lo que he visto no es que sea al perder señal, sino cada 500 puntos.
Muchos dispositivos antiguos (sobre todo Garmin que se consideran estandard) almacenaban como máximo 500 puntos por track. Sea uno de estos o sea uno nuevo que lo haga por compatibilidad, el tuyo está generando diferentes segmentos cuando llega a ese límite.
En mi caso tengo un igotU GT 800 Pro, y por lo que he podido probar únicamente crea un track nuevo al perder la señal. He podido comprobarlo por que rastreando los últimos puntos que guarda de un track me coincide en túneles o en el medio del monte profundo.
De hecho, probándolo cerca de casa establezco el refresco de posición a 1 segundo y tengo GPX de un solo track y 3500 puntos por ejemplo.

Por ejemplo en el último GPX de unas 8 horas...

Track: 20180107-123330(1)
->443 puntos
Track: 20180107-123330(2)
->244 puntos
Track: 20180107-123330(3)
->1689 puntos
Track: 20180107-123330(4)
->631 puntos
....

Track: 20180107-123330(22)
->2 puntos
Track: 20180107-123330(23)
->1535 puntos
TOTAL DE PUNTOS: 5437

El caso es que ya funciona con múltiples tracks, y con DBGrid1->DataSource->DataSet->EnableControls(); y DBGrid1->DataSource->DataSet->DisableControls(); gana mil en velocidad

Muchas gracias por todo Neftalí!

Un saludo!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error al importar fichero txt jafera Varios 28 14-07-2014 17:30:34
DELPHI6 Importar fichero codificado UTF-8 a Dbase Jose Manuel Varios 0 16-05-2011 19:46:14
Importar fichero XML cincosoft OOP 1 08-02-2009 11:29:58
Importar fichero .dat desde cobol julian_ch Varios 0 08-08-2005 18:43:17
importar fichero consumo telefonica tonid Varios 3 11-09-2003 10:49:28


La franja horaria es GMT +2. Ahora son las 12:47:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi