Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
Como visualizar archivos KML en Google Maps desde delphi?

He probado esta aplicación de Neftali y casi hace lo que quiero ya que pasa los ficheros de GPX a KML y luego los muestra en el mapa:
Código:
neftali.clubdelphi.com/?p=1319
y funciona perfectamente pero necesita tener el fichero GPX para pasarlo a las tablas para luego verlo en el Google Maps.
He intentado pero partiendo del fichero KML no consigo que lo muestre en el mapa.
Alguien tiene alguna idea?

gracias
Responder Con Cita
  #2  
Antiguo 04-03-2011
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.269
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
Hola farute.
Lo que necesitas hacer tú es aun más fácil que lo que hay en ese ejemplo, pues todo el proceso de conversión te lo puedes evitar.

Si te fijas, para visualizar la ruta, lo que se hace es generar a partir de los funtos, los elementos que si visualizan en el mapa; Eso se hace en el procedimiento _GetPoints.

Código Delphi [-]
procedure _GetPoints(cdsPoints:TDataset; AList:TStrings);
const
  STR_NEWPOINT  = 'new GLatLng(%s,%s)';
  STR_SPACE     = '          ';
var
  Str1, Str2, Line:String;
  first:boolean;
begin
  // ini
  AList.Clear;
  first := True;
  // Lista de puntos
  cdsPoints.First;
  cdsPoints.DisableControls;
  try
    // Recorrer los puntos
    While not (cdsPoints.Eof) do begin
      Str1 := Copy(cdsPoints.FieldByName('lat').AsString,1,12);
      Str2 := Copy(cdsPoints.FieldByName('lon').AsString,1,12);

      Line := Format(STR_NEWPOINT, [Str1, Str2]);

      if (first) then begin
        first := False;
      end
      else begin
        Line := ',' + Line;
      end;

      AList.Add(STR_SPACE + Line);

      // Siguiente
      cdsPoints.Next;
    end;
  finally
    cdsPoints.EnableControls;
  end;
end;

Ese procedimiento coge los puntos de la ruta y genera en un TStrings una salida como esta:

Código:
           new GLatLng(41.333713,2.002021)
          ,new GLatLng(41.333161,2.003006)
          ,new GLatLng(41.332833,2.002962)
          ,new GLatLng(41.331890,2.002259)
          ,new GLatLng(41.331593,2.002182)
          ....
Eso es lo que nospermite visualizar la ruta.
En mi caso los puntos se obtienen de un Dataset que se recorre con un While.
Si modificas ese procedimiento para que "obtenga" los puntos de otro sitio (archivo, estructura, XML,...) todo te funcionará.

Tú tienes un fichero KML. Si lo cargas utilizando un TStrings obtendrás algo como esto:
Código:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Placemark>
<name>cicloide_4434</name>
<Style><LineStyle><color>ff0000FF</color><width>2</width></LineStyle></Style>
<LineString><coordinates>
2.0956127,41.3581748,3.8 
2.0956321,41.3583157,4.6 
2.0957633,41.3581490,7.2 
2.0953774,41.3584122,9.8 
2.0952960,41.3585965,10.8 
...
Basta con que cambies el recorrido para que obtenga los 2 primeros parámetros.

Un saludo.
__________________
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 04-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
muchas gracias, lo intentaré,
¿pero no existe alguna forma directa de cargar el KML sin tener que crear un dataset para meter los puntos?

En la teoría ya se que no tiene que ser complicado hacer lo que dices, pero para sacar todos los datos del KML, colores, textos,..... aparte de los puntos me imagino que hay que hacer más cosas.
No existe una función ya hecha para delphi que tenga en cuenta todas las posibles cosas que pueda tener un KML para que las muestre en el mapa tal cual lo haría al abrir un KML con el google earth. ¿?
Responder Con Cita
  #4  
Antiguo 04-03-2011
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.269
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 farute Ver Mensaje
muchas gracias, lo intentaré,
¿pero no existe alguna forma directa de cargar el KML sin tener que crear un dataset para meter los puntos?
Pues sí, eso es lo que intento decirte; Que directamente cargues el KML en un TStrings y leas los datos desde ahí, sin pasar por el Dataset; Por eso digo que tu caso es más simple, porque todo lo del Dataset te lo puedes "saltar".
__________________
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
  #5  
Antiguo 04-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
pero sigo teniendo el problema de que no todos los ficheros KMl son iguales, entonces al localizar los datos requieren de un preprocesado de los ficheros para limpiarlos y pillar los datos necesarios,
y si los ficheros KML son muy largos tarda mucho en recorrerse todos los puntos.
No se, en la api de DG no hay una función que cargue el KML directamente, sea como sea el KML?
Responder Con Cita
  #6  
Antiguo 04-03-2011
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.269
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 farute Ver Mensaje
No se, en la api de DG no hay una función que cargue el KML directamente, sea como sea el KML?
Puede ser. Para eso tendrás que buscar en la API de Google Maps.
Desde la web se pueden importar (Utilizando "Mis Mapas"), así que es posible que se pueda programar, pero lo desconozco.
__________________
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
  #7  
Antiguo 04-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
Si algún dia te aburres mucho o encuentras algo de tiempo y puedes añadir a tu ejemplo la opción de abrir KML's directamente para verlos como te comento te lo agradecería ya que tengo un poco olvidado el tema del manejo de strings y tstrings y creo que hago algo mal, aunque voya a seguir probando.

tampoco es algo que utilice especialmente ya que los kml se me abren con el google earth, pero me gustaria hacerme un pequeño programita para ver mis tracks en bici sin tener que depender del googleearth.

He encontrado otra forma de poder cargarlos, pero hay que incrustar el google earth en delphi y subir el KML a un servidor web,
pero me gusta más como he dicho no tener que depender de google earth ni de tener que subir el KML a ningún lado.

1 saludo y gracias por todo
Responder Con Cita
  #8  
Antiguo 08-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
Por cierto Neftali, no se si te lo había dicho ya pero a mi no me funcionaba el ejemplo ni el fichero ya compilado en mi windows7 64x
al visualizar me daba el error 41,4737373737 is not a valid floating point value.
debe de ser un problema del separador de decimales en la configuración de mi sistema.

para que me funcione tengo que recompilarlo y meter esto en el oncreate:
DecimalSeparator:=',';
(no es primera vez que tengo este problema en un programa)

Por otro lado a base de trastear con los strings he conseguido crear el fichero para leerlo con el formato:
new GLatLng(41.333713,2.002021)
,new GLatLng(41.333161,2.003006)
..............
pero aun no me lo muestra bién por el tema de localización long lat que no he hecho algo bien, me lo localiza en medio del mar.
Responder Con Cita
  #9  
Antiguo 08-03-2011
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.269
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
Es muy posible fature que falle por el tema del separador.
La verdad es que en el ejemplo no me he preocupqado de eso, pues no era la función de la entreda, pero está bien que lo comentes.

El tema que que no te coja bien las coordenadas ya me extraña más. Si quieres pásame el fichero que estás utilizando y lo probaré con ese.
__________________
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
  #10  
Antiguo 08-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
ok, gracias te he enviado lo que he hecho por la opción enviar correo del foro.
Responder Con Cita
  #11  
Antiguo 09-03-2011
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.269
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
Hola Javier.

He realizado algunas modificaciones en el proyecto que me has enviado y lo he subido aquí. Tengo una entrada a medias en mi blog, sobre el tema, donde se explica todo con detalle, pero por si te hace falta te adelanto el código (que está bastante comentado).

He cambiado algunas cosas:

(1) Estabas utilizando Lat y Lon intercambiadas, de ahí que la localización en el mapa que obtenías fuera incorrecta.
(2) He simplicado el código que tenías para extraer coordenadas.
(3) He utilizado TStrings en lugar de los TMemos (no necesitan refrescar visualmente y hacen más rápido el proceso)
(4) Modificaciones en la página del Mapa, que ahora se centra de forma automática y toma el Zoom más adecuado al track que se está visualizando. El tamaño del mapa ahora no es fijo, de forma que si redimensionas la ventana el mapa se ajusta sin recargar la página.
(5) He añadido un preproceso a las coordenadas, ya que aunque en el fichero que me envías no pasa ni en los míos tampoco, existen otros formatos en que las coordenadas no están separadas por líneas (revisa los ejemplo que te adjunto).



NOTA: Como bien me ha comentado farute, al ejecutar el EXE, da un error de que no se puede grabar un fichero en r:\coord.txt; Es un fichero temporal de texto con las coordenadas que yo guardo en esa ubicación (Era para debug y es mi directorio temporal), y que al generar el proyecto final me he olvidado de eliminarlo; Basta con que eliminéis del código esa línea o en lugar de r:\coord.txt uséis otro nombre y recompiléis.
En cuanto pueda modificaré los ficheos (ahora mismo no tengo acceso a Delphi).


NOTA2: Ya están actualizados los adjuntos.


Un saludo.
Archivos Adjuntos
Tipo de Archivo: zip Neftali - Visor KML - BIN.zip (526,3 KB, 99 visitas)
Tipo de Archivo: zip Neftali - Visor KML - Sources.zip (108,6 KB, 152 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.

Última edición por Neftali [Germán.Estévez] fecha: 10-03-2011 a las 18:38:19.
Responder Con Cita
  #12  
Antiguo 12-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
gracias por tu esfuerzo en el tema,
ahora ya solo falta ir añadiendo opciones para que el programa detecte y muestre más cosas de los KML aparte de las rutas.
Responder Con Cita
  #13  
Antiguo 12-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
Con tu permiso, he limpiado un poco el programa de todos los controles que sobraban, muchos los había metido yo, y he quitado todos los paneles con tal de hacerlo lo mas simple posible, y he añadido opción de poder cambar el modo de vista, satelite, mapa e híbrido.

Codigo más ejecutable:
ves.cat/ay7R

Ahora con esta base sería interesante ir añadiendo más detecciones de elementos de los KML, etiquetas y demás para mostrarlas.

Por cierto no se porque a la derecha del mapa en el navegador aparece una franja blanca. ¿como se quita eso?

Última edición por farute fecha: 12-03-2011 a las 15:09:37.
Responder Con Cita
  #14  
Antiguo 12-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
he añadido también posibilidad de cambiar el color y el grosor del trazado, está en el mismo fichero que he puesto antes,
Lo que no entiendo es porque si yo varío el grosor del trazado al hacer zoom no se respeta ese grosor.¿?


PD: Este foro me hace cosas raras y hay veces que no puedo editar los mensajes así que añado otro.
Responder Con Cita
  #15  
Antiguo 13-03-2011
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.269
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 farute Ver Mensaje
Por cierto no se porque a la derecha del mapa en el navegador aparece una franja blanca. ¿como se quita eso?
Creo que es el espacio resrvado a la barra de desplazamiento. Fíjate en el código que hay en el evento OnComplete.
__________________
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
  #16  
Antiguo 13-03-2011
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.269
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 farute Ver Mensaje
...Lo que no entiendo es porque si yo varío el grosor del trazado al hacer zoom no se respeta ese grosor.¿?
Mañana le echaré un vistazo si puedo.


Cita:
Empezado por farute Ver Mensaje
PD: Este foro me hace cosas raras y hay veces que no puedo editar los mensajes así que añado otro.
Es normal; Pasado un tiempo no se permiten editar mensajes.
__________________
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
  #17  
Antiguo 14-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
Ya he visto que lo has colgado en el blog con alguna corrección interesante.

por cierto lo que te decía del grosor del trazado es que creo que lo estaba planteando mal, si te fijas en el archivo de labor....kml
el primer grupo de coordenadas del trazado es en realidad poligonos,
ya que tiene la etiqueta <Polygon> ¿no?
habría algún modo de tratar eso para que se dibujen los poligonos que tenga el fichero KML en vez de como una simple línea¿?
y después que aparte se dibuje en otro color el trazado?

EDITO:
he estado mirando un poco y creo que simplemente habría que mirar la etiqueta de las coordenadas e ir cambiando
si es un poligono poner GPolygon donde pone GPolyline y mirar el estilo para el tema de los colores y demás,
o lo mismo con GMarker GInfoWindow
Aunque no será tan simple como parece

Por cierto que mirado por internet y no existe o al menos no he encontrado ningún programa que haga esto de cargar ficheros
KML en local.

Última edición por farute fecha: 14-03-2011 a las 18:54:25.
Responder Con Cita
  #18  
Antiguo 14-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
sobre la franja en blanco a la derecha el unico modo que la he podido quitar es poniendo el width a 103% del uprocedures.pas, seguro que hay alguna forma más elegante de hacerlo pero no doy

STR_TAM = '<div id="map" style="position: absolute; top: 0; left: 0; width: 103%; height: 100%;"></div>';
Responder Con Cita
  #19  
Antiguo 15-03-2011
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.269
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 farute Ver Mensaje
...Lo que no entiendo es porque si yo varío el grosor del trazado al hacer zoom no se respeta ese grosor.¿?
Esto no me ha quedado claro; A mi me pasa al cpontrario, que si se cambia el color o el grosor pierdes el Zoom que tienes activado. Es normal tal y como está hecho, porque vuelves a recargar la página con el Zoom inicial.
La solución en ese caso es quedarte con el Zoom activo antes de realizar los cambios (incluso te podrás quedar con la posición por si ha cambiado) y luego restaurar esos en lugar de los iniciales.
En una de las primeras entradas de mi blog sobre Google Maps ´hay implementado un sistema para "coger" del mapa en cada momento estos valores.


Cita:
Empezado por farute Ver Mensaje
por cierto lo que te decía del grosor del trazado es que creo que lo estaba planteando mal, si te fijas en el archivo de labor....kml
el primer grupo de coordenadas del trazado es en realidad poligonos,
ya que tiene la etiqueta <Polygon> ¿no?
Es correcto.
Si te fijas en el fichero que comentas (labor) no sólo está la ruta que hemos pintado en el ejemplo, sino que además está definido un polígono como tú dices, pero es casi igual de sencillo que pintar la ruta/Track.

Si coges las coordenadas de la ruta/track con eso se genera una polilínea en la página y al final se añade:

Código:
var polyline = new GPolyline([
  ,new GLatLng(41.389864,2.059049)
  ,new GLatLng(41.389832,2.058866)
  ...
   ], "#ff0000", 5);
  // Añadirla al mapa
  map.addOverlay(polyline);
Para el área, basta con hacer lo mismo, pero con la coordenadas correspondientes; En esta caso se utiliza un polígono; Se generan las coordenadas y se añaden:

Código:
var polygon = new GPolygon([       
  new GLatLng(-0.582289405204,42.0494255042)
  new GLatLng(-0.58229530464,42.0494469093),
  ...
  ], "#00FF00", 1, 1, "#FF7F00", 0.2);

  //-> El primer color en la línea y el segundo el relleno
  // El último número es la transparencia  < 1
  // El primer 1 es el grosor de línea
  // ...
  // Añadirlo al Mapa
  map.addOverlay(polygon);
Y si los añades los dos aparecerán los 2.
Si creas el polígono obtendrás algo como lo que se ve en la imagen inferior.


Cita:
Empezado por farute Ver Mensaje
...Por cierto que mirado por internet y no existe o al menos no he encontrado ningún programa que haga esto de cargar ficheros
KML en local.
Bueno, ya existe 1, al menos...
Imágenes Adjuntas
Tipo de Archivo: jpg Visualizacion_de_areas.jpg (19,4 KB, 18 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
  #20  
Antiguo 15-03-2011
farute farute is offline
Miembro
 
Registrado: feb 2010
Posts: 84
Poder: 15
farute Va por buen camino
en definitiva para dejar más o menos acabado el visor habría que detectar y añadir los
GMarker , GPolygon , GPolyline y GInfoWindow
porque creo que solo hay esas 4 cosas básicas posibles que ponen marcas en los mapas ¿no?

Bueno luego hay mil historias para añadir más que están dentro de los KML pero tampoco se trata de hacer un nuevo google earth

Última edición por farute fecha: 15-03-2011 a las 11:28:13.
Responder Con Cita
Respuesta



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
GPS y Google Maps MAXIUM Internet 5 15-03-2011 18:15:05
Intentado integrar google maps en delphi 5 radge Internet 4 24-03-2010 09:02:01
Ejecutar Javascript con Delphi para Google Maps vejerf Varios 7 15-12-2009 23:22:10
Interactuar entre Google maps y Delphi madiazg Varios 2 09-11-2008 04:16:45
Google Maps .es Neftali [Germán.Estévez] Noticias 0 27-04-2006 13:32:54


La franja horaria es GMT +2. Ahora son las 20:20:19.


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