(Español) GMLib – Google Maps Library

 

Sorry, this entry is only available in European Spanish.

  365 Responses to “(Español) GMLib – Google Maps Library”

  1. Hola que tal, excelente tu pagina, apenas he dado con ella y se me hace muy interesante, estoy probando tus componentes para Google Maps y despues de jugar un poco con los ejemplos que vienen con las librerias, me puse a checar el que permite insertar etiquetas en el mapa “GMMarker” y quisiera saber si me puedes indicar como puedo hacer para insertar un marcador por codigo, lo que pasa es que si deseo poner marcadores desde el Componente con el “Marker Editor” me funciona excelente.

    Pero en mi caso yo lo quiero utilizar con una base de datos, tengo mis campos Longitud, Latitud, Titulo y HTMLContent y me gustaria saber como agregarle las cordenas que filtro para que me las muestre segun las que cumplan con la condicion que seleccione supongo que sera algo como

    Procedure TForm1.CargarMarcadores;
    var
    i: Integer;
    begin
    for i:0 to Table1.RecordCount do
    GMMarker1.VisualObjects //// Agregarle la Longitud, Latitud conforme encuentra los registros
    ….

    He intentado con la ayuda que da el propio delphi cuando escribes y te muestra la lista de opciones pero no sabria cual es la que me permite agregarlo manualmente, te agradeceria mucho me pudieras comentar cual seria esta forma 🙂

    Saludos

    P.D. Muchas gracias por compartir tu codigo es muy util y educativo

    • Buenas,

      Ante todo gracias por probar los componentes y hacer de “conejillo de indias” dada la “juventud” de los mismos (no son ni beta jejejeje)

      Lo que quieres es sencillo de hacer. Desde la clase TGMMarker tienes un método para ello y podría ser algo así

      procedure TForm1.bAddMarkerClick(Sender: TObject);
      var
        Marker: TMarker;
      begin
        // con esta simple linea lo tienes añadido
        Marker := GMMarker1.Add;
        // a partir de aquí ya puedes informar las propiedades a tu gusto
        Marker.Position.Lat := 10.543345;
        Marker.Position.Lng := -4.344567;
        Marker.Title := 'título para el marcador';
        .....
      end;
      

      Si sólo le vas a dar valor a la lat/lon y título, puedes hacerlo directamente desde el método Add.

      procedure TForm1.bAddMarkerClick(Sender: TObject);
      var
        Marker: TMarker;
      begin
        // con esta simple linea lo tienes añadido
        Marker := GMMarker1.Add(10.543345, -4.344567, 'título para el marcador');
      end;
      

      Espero te sea de ayuda

      Nos leemos
      cadetill

      • Cadetill muchas gracias por tu respuesta, me ayudo mucho pero aun sigo con el detalle de que si tengo yo las ubicaciones en mi base de datos (restaurantes, cines, parques, etc) y por ejemplo filtro “restaurantes” el resultado me muestra en un DBGrid las columnas Latitud, Longitud y Titulo o Nombre si lo hago uno por uno tocandolo no hay problema, pero si quiero que me carge el X numero de restaurantes que tengo en mi base y que cumplen el criterio de mi consulta que se muestran en el dbgrid se traba mi aplicacion.

        Mi aplicacion es sencilla y utilizo mysql donde almaceno direcciones y lugares y ahora que veo la posibilidad de ubicarlos en un mapa me parecio muy buena idea

        Mi consulta es basicamente


        SELECT
        MainDB.ID,
        MainDB.LUGAR,
        MainDB.LATITUD,
        MainDB.LONGITUD
        FROM
        MainDB
        WHERE
        MainDB.LUGAR = 'RESTAURANT'

        Y ya que me los muestra en la DBGrid los intento leer de la siguiente manera


        procedure TForm1.Button2Click(Sender: TObject);
        var
        Marker: TMarker;
        Lat, Long: Real;
        begin
        Lat:= Table1.FieldbyName('Latitud').ASFloat;
        Long:= Table1.FieldbyName('Longitud').ASFloat;
        UniTable1.First;
        While Not UniTable1.Eof do
        Marker := GMMarker1.Add(Lat , Long, 'título para el marcador');
        Unitable1.Next;
        end;

        No se si haya una mejor forma de hacerlo directo desde una consulta pero si es asi no sabria por donde leer los datos para que los carge directos al mapa mientras realiza la consulta, por eso ya que tengo los datos en la DbGrid los intento cargar uno por uno 🙂

        Cualquier sugerencia se agradece 😀

        • Por cierto una observación igual no se si sea relevante pero a mi si me parece curioso y creo que por eso no me carga las coordenadas aunque se las ponga manuales, yo me encuentro en México y aquí el símbolo decimal es el “.” y veo que en España es “,” de hecho cuando compilo tus ejemplos que incluyes e intento cargar las coordenadas que vienen de ejemplo me dice que hay un error y para que me funcione lo tengo que poner con “.” 🙂 saludos

          —————————
          Gmmarker_demo
          —————————
          ‘41,380908’ is not a valid floating point value.

        • Buenas

          La forma en que cargas los marcadores es la correcta. No hay otra manera que hacer el bucle. Aun no hay un “TDBMarker” jejejeje Quizás en un futuro 😉

          Sólo un comentario. Si no vas a usar el TMarker creado, puedes obviar la variable 😉

          En cuanto al tema del separador decimal, pues es cierto, la demo está pensada para la gente que use como separador decimal la coma, no el punto. No obstante, eso sólo afecta a la demo, no al componente, ¿correcto?

          Nos leemos
          cadetill

          • Muchas gracias mi estimado Cadetill, por alguna razon he notado que cuando cargo alguna corrdinada me sale un error que en estos momentos no tengo el dato, busque en google y corresponde si mal no recuerdo al mismo script de carga de google maps.

            Pues de la forma en que cargo los marcadores aunque algo rudimentaria 😀 por no decir mas jajajaja me esta dando errores, ya que cada que ejecuto el codigo el programa se traba y tengo que cerrarlo, pero si lo ejecuto

            ( disculpame si no queda las etiquetas de codigo porque intente ponerselas pero no me salio 😀 )


            procedure TForm1.Button2Click(Sender: TObject);
            var
            Marker: TMarker;
            Lat, Long: Real;
            begin
            Lat:= Table1.FieldbyName('Latitud').ASFloat;
            Long:= Table1.FieldbyName('Longitud').ASFloat;
            Marker := GMMarker1.Add(Lat , Long, 'título para el marcador');
            Unitable1.Next;
            end;

            Por cada ves que oprimo el boton me carga perfectamente los marcadores claro que no es lo ideal 😀 intentare probar de otras formas para ver porque se bloquea mi programa.

            Por cierto lo de un TDBMarker no estaria nada descabellado 😉

          • Pd. En efecto lo de la coma por punto solo afecta la demo, el componente funciona excelente 😀

    • hola, bueno estoy tratando de hacer algo parecido a tu programa y al principio me tope con que esta version no es compatible con firemonkey x3. ahora bien como hace para capturar en tu base de datos la logitud y latitud?

      • Buenas

        Sólo decirte que los componentes sí son compatibles con FMX. Lo que pasa es que al no haber un navegador compatible con esta versión de Delphi, no tiene sentido instalar los componentes en FMX 😉

        Nos leemos

  2. Buen inicio de semana Cadetill, pues bien a base de ensayo y error ya pude hacer que de manera “automatica” me carge los marcadores, al principio me costo trabajo debido a que me faltaba una line a que hacia referencia a que utilizaria la Tabla, por eso se bloqueaba, despues el problema surgio porque queria leer directamente de los DBEdits, y solo me cargaba el primer marcador, asi que lo que se me ocurrio es que al recorrer los registros encontrados me leyera el valor directo de cada “campo” de mi base de datos, y quedo de la siguiente forma por si alguien mas le llega a interesar:

    procedure TForm1.Button2Click(Sender: TObject);
    var
    Marker: TMarker;
    begin
    with Form1.Table1 do begin
    First;
    while not eof do begin
    Marker := GMMarker1.Add(Table1.FieldByName('Latitud').AsFloat , Table1.FieldByName('Longitud').AsFloat, Table1.FieldByName('Lugar').AsString);
    Next;
    end;
    end;
    end;

  3. Nuevamente saludando Cadetill, mira intente buscar algún procedimiento desde tu componente para quitar las etiquetas, pero no lo encontre 😀

    Asi que me invente un pequeño procedimiento

    procedure TForm1.LimpiarMarcadores;
    var
    i: Integer;
    begin
    for I := 1 to Table1.RecordCount do
    GMMarker1.Delete(0);
    end;

    El unico detalle es que debe de haber marcadores si no marcara error “List index out of bounds (0)” lo cual es logico considerando que quiero borrar y no hay nada que borrar 🙂

    Otra pregunta, intento cargar desde mi FormShow

    procedure TForm1.FormShow(Sender: TObject);
    begin
    GMMap1.RequiredProp.Center.Lat := Latitud;
    GMMap1.RequiredProp.Center.Lng := Longitud;
    GMMap1.RequiredProp.Zoom := 8;
    GMMap1.DoMap;
    end;

    Pero me devuelve el siguiente error: “Página inicial aun no cargada.”

    Ese mismo codigo lo pongo en un boton y me funciona perfectamente.

    Hay algun metodo o forma o estoy omitiendo algo que evita que pueda cargar la pagina de forma automatica??

    Por cierto de verdad muchas gracias por tu paciencia 😀 y comentarios 😀

    • Buenas,

      Todo componente descendiente de TGMLinkedComponent (léase TGMMarker, TGMInfoWindows,….) tienen el método Clear, con lo que con un simple GMMarker1.Clear, borras los marcadores.

      Con un bucle también podrías hacerlo, pero en lugar de basarte en la tabla, recorrer directamente los marcadores que tienes

      for i := GMMarker1.VisualObjects.Count – 1 downto 0 do GMMarker1.Delete(i);

      Respecto al otro problema, como digo en la ayuda, lo primero que se tiene que hacer es activar el TGMMap (Active := true)para cargar el HTML básico que se necesita para operar con el componente. Esto dispara el evento AfterPageLoaded con el parámetro First a true, que puedes usar para disparar el DoMap o habilitar el botón que lo muestro o activar un TTimer que al cabo de x milisegondos se dispare y realice el DoMap,….

      Espero te ayude y gracias a ti por probarlo

      Nos leemos
      cadetill

  4. Excelente!!! trabajo. Los voy a probar.
    Saludos

  5. Estimado Cadetill gracias por tus comentarios pero no se si sea solo a mi pero el metodo Clear, me da error al compilar, lo pongo de la misma manera “GMMarker1.Clear” y no me permite continuar incluso cuando lo escribo manualmente, despues del punto en la lista de funciones y procedimientos no me aparece la funcion o metodo CLEAR

    No se si lo puedas checar para ver si en tu delphi si funciona, saludos

    • jejeje, perdón, no me acordaba que es un método que he añadido para la próxima versión de los componentes que no tardará en salir (y que contendrá el objeto TGMPolyline) 🙂

      Si “tienes prisa” puedes usar el bucle que te comentaba y, cuando suba la nueva versión, pues ya lo sustituyes por el nuevo método 🙂

      Nos leemos
      cadetill

      • 😀 Ya decia yo que no me aparecia, por mientras lo estoy dejando como te mencione, porque el bucle que me indicas por alguna razon no me lo compila asi con DownTO pero igual es por algun detalle lo voy a checar, ya que si la nueva version contiene CLEAN estaria excelente y mas limpio, porque de mi forma noto que de repente me borra todos los marcadores pero despues cuando cargo otros me deja los anteriores, supongo porque como me djiste lo baso en mis registros encontrados no en los marcadore.

        En horabuena por la siguiente version y esperandola para probarla 😀 Saludos

  6. Saludos Cadetill aqui de nuevo saludando 😀

    Un comentario o detalle que he notado no si sea por la cuestion de precision del componente o por alguna otra cuestion, ya que solo en mis ratos libres estoy trabajando en mi programita 😀

    Lo que pasa es que cuando copio las latitudes y longitudes desde los mapas de google con el explorador o firefox me las muestra correctamente con el componente, pero si las copio de google maps la aplicacion, las cordenadas me aparecen diferentes incluso si las ocupo en las del explorador me da otra ubicacion, no es algo tan malo ya que en mapas cargados desde la pagina las ubicaciones me dan exactas en donde selecciono, pero me parece curiosa la diferencia, saludos

    • Buenas,

      No entiendo lo que quieres decir. ¿Puedes ponerme un ejemplo? Por que…. no será la precisión que puedes especificar en el componentes TGMMaps, ¿no?

      • Perdon por contestar hasta ahorita pero he estado con mucho trabajo y no he podido checarlo pero espero en estos dias te checo bien en que parte es si en la precision o en los mapas que maneja google con algun ejemplo 😀

        Mientras tanto un saludo Cadetill

  7. Llevaba tiempo buscando una librería que me permitiese trabajar en Delphi 5.. y la encontré !!

    He conseguido compilar GMLib 0.1.1 en Delphi 5 (eliminando las llamadas a ShowCollectionEditor y retocando ligeros detalles) sin errores, así como las Demos.

    Sólo tengo una pequeña sugerencia (por el uso que quiero darle) y es que (aun, espero) no permite elegir el icono de los Marcadores.

    De todas formas, funciona genial, gran trabajo !!

    • Hola Fernando,

      Me alegra saber que has podido compilar sin muchos problemas con una versión tan vieja de Delphi 🙂 La verdad es que no me pensaba que hubiera gente que aun programara en versiones anteriores a Delphi 6 jejejeje Por casa debo de tener alguna versión de Delphi 3, 4 y 5. Miraré de instalarlas a ver si para la próxima versión puedo hacer que se compile también en estas versiones de Delphi

      Gracias por probar los componentes

      Nos leemos
      cadetill

  8. Hola a todos:
    Llevo tiempo manejando una página con planos de Google Maps que desarrollo en modo artesanal (o sea, con mucho trabajo) y me gustaría que la página que mostrara resultados (marks) se generara dinamicamente. estoy buscando a alguien que me pueda hacer el trabajo. O sea, la base de datos con los datos que necesito pasar al mapa, el interface de entrada de información a dicha base de datos y los códigos PHP que generen el plano a partir de los datos de búsqueda introducidos por el visitante de la página. ¿Sabeis de alguien que me lo pudiera hacer?

  9. Hola, intente instalarlo en Delphi XE, pero sin éxito, veo que los paquetes de los componentes existen actualmente para D6, D7, D2007, D2010, DXE2 pero no para DXE, tienes algún tip para esta instalación?

    • Buenas Erasmo

      No tengo el XE para poder hacer el paquete ni probarlo, pero vamos, imagino que el paquete de D2010 o DXE2 debería de servirte y compilar en XE. Si no te compila, dime qué errores te da para poder ayudarte a compilarlo

      Nos leemos

      • Hola cadetill,

        De antemano gracias!, te comento que efectivamente, logre compilar y registrar los componentes en DelphiXE con el paquete D2010 realizando estos cambios en en la sentencia
        {$IF CompilerVersion < 22} la cambie por {$IF CompilerVersion < 23}.

        Ahora! realizando el hola mundo con estos componentes, no logro que en los eventos me de las coordenadas (LatLng: TLatLng) estas siempre me las da en cero. por ejemplo, en el evento GMMap1CenterChanged(Sender: TObject; LatLng: TLatLng), siempre que se dispara, LatLng siempre bienen en Cero; incluso en los demos en el log de eventos, me vienen en cero. Sabes si es algo que tenga que ver con el lenguaje, soy de Mexico.

        • Disculpas, el cambio que te mencione anteriormente lo realice en GMMap.pas y el mensaje de error fue:

          [DCC Error] GMMap.pas(1621): E2009 Incompatible types: ‘Parameter lists differ’

          nos leemos.

          • Ya encontré cual es el detalle… y efectivamente tenia que ver con el regionalismo, comente la linea linea 164 del WebControl.pas, la funcion quedo de la siguiente manera:


            function TWebControl.GetFloatField(const aFormName, aField: string;
            DefaultValue: Real): Real;
            var
            Strg: string;
            Val: Extended;
            begin
            Result := DefaultValue;

            WebFormNames;

            if Forms.IndexOf(aFormName) = -1 then Exit;

            WebFormFields(aFormName);

            if Fields.IndexOf(aField) -1 then
            begin
            Strg := Trim(WebFormFieldValue(Forms.IndexOf(aFormName), aField));
            //Strg := StringReplace(Strg, '.', ',', [rfReplaceAll]);
            if (Strg '') and TryStrToFloat(Strg, Val) then
            Result := Val;
            end;
            end;

          • Hola Erasmo

            Me alegra que hayas podido instalar los componentes. Miraré de hacer el cambio que mencionas en el código para poder instalarlo en XE sin problemas 🙂

            Con respecto al problema que has tenido con el LatLng, no termino de entender por qué no te funciona. Se supone que las funciones de Google necesitan un numérico con un separador de decimales de punto. La función esa lo único que hace es eso, reemplazar las comas (separador decimal usado en España) por puntos (separador decimal americano y, por ende, usado por Google).

            Intentaré investigar un poco el tema. Si descubres algo más, te estaré agradecido si lo comentas

            Nos leemos

          • Buenas,

            Instalando la ultima actualización me di cuanta que las coordenadas me las sigue dando en Cero, entonces regrese a la linea 164 de WebControl.pas, analice los comentarios en donde me dices lo que hace esa linea, remplazar el punto por la coma

            Strg := StringReplace(Strg, ‘,’, ‘.’, [rfReplaceAll]);

            esto es valido en tu región, en donde se separa los decimales con coma, pero en México no funciona,

            Coloque una validación, que solo se ejecute esa linea mientras exista un separador decimal con coma.

            if DecimalSeparator = ‘,’ then Strg := StringReplace(Strg, ‘.’, ‘,’, [rfReplaceAll]);

            Me dices que te parece.

            Saludos.

          • Buenas Erasmo,

            Pues me parece genial, simple y sencillo. En la próxima versión ya aparecerá el cambio (ya lo he realizado)

            Gracias 😉

  10. Excelente trabajo. Apenas he encontrado tus componentes y estoy experimentando con ellos. Al principio me encontré igualmente con el problema de los separadores decimales y de millares como Erasmo con la configuración regional de México.

    Se me ha ocurrido, no hay una manera de “seleccionar” un área del mapa con el ratón y que esa área sea un cuadrado traslucido mientras se este seleccionando? O al menos que se note con un rectángulo de selección.

    Gracias nuevamente

    • Buenas Ricardo

      Muchas gracias por aunque sea probarlos 🙂

      Respecto a lo que me comentas, no termino de entender lo que quieres. ¿Puedes explicarte algo mejor?

      • En esencia, es seleccionar un área del mapa, tipo selección de Autocad, sólo eso. Ya obtuve las coordenadas de la selección usando el método OnClick del GMMap pero me falta lo “visual” para indicar que se está seleccionando. Tal vez ya esté implementado en alguna de las funciones de Java pero desconozco la API de Google Maps. Gracias

        • Buenas,

          Lo que no entiendo es eso de la selección. Es decir, entiendo que quieres que aparezca un rectángulo mientras estás seleccionando un área del mapa, lo que no veo es la utilidad o qué quieres conseguir seleccionando una zona del mapa. Por otro lado, desde el API de Google Maps no hay ninguna opción que lo permita, se tendría que implementar mediante JavaScript de alguna manera. También se tendría que tener en cuenta que el mapa no se pudiera “mover” con el ratón (propiedad Draggable).

          Nos leemos
          cadetill

          • Ya he pensado en esos detalles y hasta este momento debido a mis escasos conocimientos de la manipulación del TWebBrowser / GoogleMaps API / Java son casi insalvables para mí 🙁

            Para efectos de pruebas solamente uso un clic para definir la primera esquina y un segundo clic para la definir la segunda, esto es para hacer zoom a la zona seleccionada de manera mas rápida y no dar clic varias veces en el control o usar la rueda del ratón