Alex Franco

Blog de Alex Franco, aquí podrás encontrar temas de tecnología, desarrollo web y móvil, Python, Django, Mongo, DBs y… otros temas más
Home  /  Codigo  /  Marcador arrastrable y cómo obtener su Lat/Lng GMaps API v3

Marcador arrastrable y cómo obtener su Lat/Lng GMaps API v3

Alex Franco API, Draggable, GMaps, InfoWindow, LatLng, Maps, Marcadores, Marks 39 Comments

En este pequeño espacio vamos a ver cómo y para qué nos podrían ser útiles los marcadores arrastrables pudiendo obtener la latitud y longitud, para este ejercicio vamos a ocupar el post del uso de las Info Window.

Ya hemos visto como dibujar un marcador y asignarle un InfoWindow, así que esta parte será sencilla, ya que podremos mover el marcador de lugar y a placer, obteniendo las coordenadas de donde fue colocado, los usos que podemos darle varían infinitamente, actualmente podemos ver su uso por ejemplo en Foursquare cuando editamos un vvenue, podemos mover el marcador hasta el lugar más preciso donde se encuentra realmente el venue, más delante podremos hacer polígonos y delimitar las zonas usando las latitudes y longitudes para ser más precisos y bueno… miles de aplicaciones más que se pueden hacer e imaginar con ello, interesante, ¿no?

En la zona de Referencias de la API de GMaps v3 podremos encontrar a detalle las propiedades y funciones de cada elemento que usemos, para este ejemplo usaremos una propiedad de los marcadores que se llama draggable, esta propiedad hace que los marcadores que dibujemos puedan ser “arrastrables“, es decir, que los podamos tomar y arrastrarlos o moverlos a cualquier parte del mapa. Lo único que tenemos que hacer para hacer esa función es escribir en las propiedades del marcador draggable: true como lo veremos a continuación:

		var marker = new google.maps.Marker({
		    position: myLatlng,
		    draggable: true,
		    map: map,
		    title:"Ejemplo marcador arrastrable"
		});

Ahora nos centraremos en la función que se llama openInfoWindow.

	function openInfoWindow(marker) {
		var markerLatLng = marker.getPosition();
		infoWindow.setContent([
			'<b>La posicion del marcador es:</b><br/>',
			markerLatLng.lat(),
			', ',
			markerLatLng.lng(),
			'<br/><br/>Arrástrame y haz click para actualizar la posición.'
		].join(''));
		infoWindow.open(map, marker);
	}

En la función openInfoWindow podemos observar que recibe un parámetro al que manejaremos con el nombre de marker dentro de la función (al momento de invocar la función puede llamarse de cualquier otra manera, pero es necesario que sea un objeto tipo Marker); dentro de la función declaramos una variable llamada markerLatLng que va a almacenar la propiedad LatLng del marcador mediante la función getPosition(), lo que obtiene es un objeto con la latitud y longitud del marcador que recibió la función, para hacer referencia a cada uno de ellos, es con las subfunciones .lat() y .lng(); en el setContent del InfoWindow asignamos todo el contenido como un arreglo de cadenas, por eso la separación en comas y no con el signo más (+), con la instrucción join se indica que se concatene o se “unan” las cadenas; por último con la función open() de infoWindow mostramos de diálogo con el contenido que le asignamos anteriormente.

Ahora si veamos el código completo, la mayoría del código ya lo hemos visto así que aquí está:

	var map = null;
	var infoWindow = null;

	function openInfoWindow(marker) {
		var markerLatLng = marker.getPosition();
		infoWindow.setContent([
			'<b>La posicion del marcador es:</b><br/>',
			markerLatLng.lat(),
			', ',
			markerLatLng.lng(),
			'<br/><br/>Arrástrame y haz click para actualizar la posición.'
		].join(''));
		infoWindow.open(map, marker);
	}

	function initialize() {
		var myLatlng = new google.maps.LatLng(20.68017,-101.35437);
		var myOptions = {
		  zoom: 13,
		  center: myLatlng,
		  mapTypeId: google.maps.MapTypeId.ROADMAP
		}

		map = new google.maps.Map($("#map_canvas").get(0), myOptions);

		infoWindow = new google.maps.InfoWindow();

		var marker = new google.maps.Marker({
		    position: myLatlng,
		    draggable: true,
		    map: map,
		    title:"Ejemplo marcador arrastrable"
		});

		google.maps.event.addListener(marker, 'click', function(){
			openInfoWindow(marker);
		});
	}

	$(document).ready(function() {
	    initialize();
	});

Para este ejemplo y posteriores comenzaremos a usar funciones para un mejor manejo del código, como pueden ver hemos declarado la variable map e infoWindow como globales, las cuáles podrán usarse a través de las funciones sin temor a que se pierdan las referencias al liberar la función. La razón por la cual es mejor poner este código en una función, es que si requerimos colocar más de un marcador, podamos enlazar un InfoWindow diferente para cada uno, sin necesidad de escribir el mismo código individualmente, además de que la función puede re-usarse tantas veces como sea necesario. Para ver cómo es que funciona este ejercicio ve al siguiente enlace:

Es todo por esta ocasión si tienen dudas ya saben cómo y dónde preguntar, mucha suerte…

Enjoy this Life!!

Relacionado

About Author

Alex Franco

 IT

Previous Article Info Window en GMaps API v3
Next Article Mostrar sólo un InfoWindow y cerrarlo automáticamente GMaps API v3

Related Posts

  • Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

    Enviar correo personalizado automáticamente cuando respondan un Formulario de Google

  • Django + AllAuth + Google OAuth 2.0

    Django + AllAuth + Google OAuth 2.0

  • Agregar número consecutivo y enviar correo al contestar Formulario de Google Drive

39 Comments

  1. orenzo Reply
    2011-03-17 at 9:00 pm

    Una consulta como podria hacer para que cuando arrastre el marcador me aparesca otro, osea que el primero se quede en su lugar y que al querer arrastrarlo aparesca otro el cual me pueda dar informacion de lat y lon.

    tner dos uno con la informacion que tiene actualmente y el otro con la nueva informacion.

    • Alex Franco Reply
      2011-03-18 at 9:10 am

      @orenzo tienes que crear una función que solamente dibuje marcadores, al momento de que muevas el pin, obtienes las nuevas coordenadas y se las mandas a la función y ésta se encargará de dibujar el siguiente marcador, es la forma más sencilla que se me ocurre, además de la más fácil =P

  2. Paul Reply
    2011-08-17 at 2:31 pm

    hola

    puse el codigo pero la verdad no puedo hacer que funcione para mi sitio que actualmente solo tengo en mi maquina

    logro ver el mapa moverlo y todo pero no me pone el marcador ni me despliega la info espero me puedas ayudar

    • Alex Franco Reply
      2011-08-17 at 6:05 pm

      @Paul Claro, pega el código que estás usando, solo el script y ya te echo una mano

  3. jean Reply
    2011-09-09 at 4:21 pm

    Disculpa por casualidad saber trabajar con la libreria infoBubble?? necesito actualizar un infoBubble

    • Alex Franco Reply
      2011-09-09 at 11:55 pm

      @jean no he trabajado con la librería, pero no parece complicada, qué ocupas?

  4. Mari Reply
    2011-11-03 at 2:23 pm

    Como podria guardar las cordenadas en una base de datos mysql?

    gracias

    • Alex Franco Reply
      2011-11-06 at 9:57 pm

      @mari pues, necesitas 2 campos en una tabla de tu base de datos, esos datos deben ser algo como:
      `lat` FLOAT( 10, 6 ) NOT NULL
      `lng` FLOAT( 10, 6 ) NOT NULL

      Esto debería hacerse cada vez que una coordenada es consultada, sin embargo y recuerda que si vas a guardarlas, por ética y políticas de uso debes avisar al usuario que vas a conservar sus datos.

      • Mari
        2011-11-11 at 4:44 pm

        Hola alex gracias por tu respuesta, lo de la base lo tengo claro lo que no es como lograrlo automaticamente desde el codigo que compartes algo asi como cuando se arrastre a una nueva posicion se guarde la nueva posicion en la base en los campos que indicas.

        Pero como lograrlo soy mala no entiendo a google maps

        Saludos

      • Alex Franco
        2011-11-18 at 1:41 pm

        @Mari Puedes agregar un listener, al marcador, no lo he hecho pero… deja investigo bien y te contacto con correo directo

  5. Mari Reply
    2011-11-22 at 11:07 am

    A muchas gracias alex ojalá puedas ayudarme estare eternamente agradecida.

  6. nah Reply
    2012-06-12 at 9:48 am

    Disculpa, ¿cómo podría hacer para que los marcadores estén numerados, pero que su numeración se actualice si agrego un nuevo elemento?

    • Alex Franco Reply
      2012-08-06 at 12:06 pm

      @nah si lo haces dinámico todos tienen una llave (identificador o key), es cuestión de “guardar” o manejar esa llave y que puedas agregar más marcadores después.

  7. Martin Reply
    2012-08-06 at 12:28 am

    Seria posible que me enseñes como hacer para que la latitud y longitud que me indica en este mapa aparesca en un form tal como esta en la anterio programacion que lo arroga atraves de
    document.fm.coordenadas.value = point.y+””
    document.fm.coordenadas2.value = point.x+””

    Gracias anticipadas.

    • Alex Franco Reply
      2012-08-07 at 12:03 am

      @Martin si quieres lo vemos por correo, ya migré tu código de la v2 a la v3

  8. Martin Reply
    2012-08-07 at 10:49 am

    Gracias como hago para poder ver el codigo. buen día.

  9. Beatriz Reply
    2012-08-16 at 4:00 pm

    Vale hacer la salvedad de que el evento que mencionas (CLICK) debe de cambiarse por el evento MOUSEUP para capturar las nuevas coordenadas.

    Ej:

    google.maps.event.addListener(marker,’mouseup’, function(){
    openInfoWindow(marker);
    });

    • Alex Franco Reply
      2012-08-22 at 1:27 pm

      @Beatriz Cualquiera de los 2 es válido, ambos funcionan, yo lo hice con el evento click por ser como el más sencillo e intuitivo, ya dependerá del tipo de aplicación para usar algún otro evento 🙂

    • tom Reply
      2012-10-19 at 6:06 pm

      Hola Alex esta interesante es de Google Maps lo que quiero hacer es por medio de mysql darle las coordenas de algunos puntos que tengo marcados y me los despliegue en el mapa haz hecho eso con V3?

      • Alex Franco
        2012-10-29 at 3:05 pm

        @tom claro, es simple, solamente una pregunta, ¿deseas seguir teniendo control sobre los marcadores o solo es dibujarlos y listo?

  10. bruno Reply
    2012-09-18 at 12:14 pm

    hola alex, estoy usando tu codigo y lo que quiero es pasar latitud y longitud a un campo de form tipo texto para luego enviarlo a la base de datos, como puedo hacer esto, muchas gracias saludos

    • Alex Franco Reply
      2012-10-29 at 2:11 pm

      @bruno a partir de este código, con javascript puedes poner los valores en las cajas de texto que requieres, usando los valores del marcador, algo como:

      var markerLatLng = marker.getPosition();
      getElementById('lat').value = markerLatLng.lat();
      getElementById('lng').value = markerLatLng.lng();
      

      A partir de ahí comienza tu lógica para mandar esos datos a la Base de Datos, mediante un formulario.

  11. Maite Reply
    2012-11-30 at 12:35 pm

    Se agradece las publicaciones respecto al tema ya que me ha sido de gran ayuda ya que se encuentran claras y con ejemplos, exito!

  12. jose Reply
    2013-01-15 at 11:19 am

    hola amigo me pudieras decir como ago para ya que este en un punto establecido la marca no se pueda mover, como darle opcion de editar para moverla al punto que necesito y obtener las coordenadas y que se guarde por que cada ves que refresco el punto vuelve a la direccion que esta solo que no es el punto correcto, espero me ayudes gracias.

    • Alex Franco Reply
      2013-04-16 at 2:46 pm

      O.o creo que no entendí del todo qué quieres hacer… =S

  13. Rams Reply
    2013-02-14 at 10:44 am

    Hola alex, estoy utilizando tu código para un proyecto, pero no se porqué no se dibuja el mapa en el navegador, me podrías ayudar?

    • Alex Franco Reply
      2013-04-16 at 2:48 pm

      Necesitaría ver el código para ver qué estás haciendo mal, lo has publicado en algún lado?

  14. Eros Reply
    2013-08-25 at 8:17 pm

    Hola Alex, buenas tardes.
    Tengo un código basado en el tuyo, el problema es que el marcador no me muestra ningún info windows, crees que podrías ayudarme?

    • Alex Franco Reply
      2013-08-29 at 10:08 am

      @Eros necesitaría ver el código para poder ayudarte, mándalo en la sección de contacto

  15. Oscar Marmanillo Reply
    2013-08-26 at 1:48 pm

    Hola alex.
    Ante todo felicitaciones por tus aportes.
    desearia me puedas ayudar como puedo agregar variables a un marcador, para poder usar estas en un proceso determinado.
    por ejemplo lo que deseo es k al pasar el mouse me muestre en un form los datos relacionados a ese marker.
    necesito crear varios marcadores con un id especifico y al pasar el mouse con ese di referenciar a una base de datos para que me entregue información en un form.
    Gracias por al respuesta

    • Alex Franco Reply
      2013-08-29 at 10:15 am

      @Oscar eso es programación en Javascript usando los controles de eventos para la interfaz del usuario, algo como:

      google.maps.event.addListener(marker, 'mouseover', function() { /* tu proceso */ }

      Esto se hace justo después de dibujar el marcador y antes de cerrar la función que lo hace para que se quede ligado al ID del marcador.

  16. Carlos Reply
    2013-11-23 at 7:00 pm

    Gracias por el aporte.. justamemte lo que buscaba

  17. ruben Reply
    2016-02-25 at 4:36 pm

    buenas cree una web vacia con el codigo pegado tuyo y no aparece nada…

    • Alex Franco Reply
      2016-04-11 at 12:42 pm

      Prueba cambiando la versión de jQuery, copia el código que está en mi GitHub

  18. dbanegasl Reply
    2016-03-03 at 4:57 am

    Excelente amigo, gracias

  19. Maikel Y. Almarales Leyva Reply
    2016-05-18 at 3:21 pm

    un , preguntica, tal vez esta fuera de contexto pero bueno es una idea parecida lo que ando buscando, como le hago para dibujar un poligono y que me muestre la linea por donde esta el cursor, hasta que no de dblclick o otra cosa no me fije el segmento en el mapa.

    • Alex Franco Reply
      2016-08-24 at 10:32 am

      Puedo referirte a un ejemplo, puedes verlo directo en la API https://developers.google.com/maps/documentation/javascript/examples/drawing-tools

  20. Ruben Reply
    2016-07-27 at 11:36 pm

    gracias amigo llevava un milenio buscando algo asi pero tu te has volado la barda gracias

  21. Roman Gonzalez Reply
    2019-07-31 at 4:44 pm

    Hola Alex! excelente trabajo. Mi pregunta. Existe alguna forma de quitar la leyenda for development purposes only google maps

Responder a dbanegaslCancelar respuesta

Posts populares

  • Geocode Simple: Buscar direcciones (coordenadas a partir de direcciones) con GMaps API v3
  • Buscar y trazar rutas con GMaps API v3
  • Recuperar o ver las claves de las redes inalámbricas en tu Mac (o cualquier App)
  • Enviar correo después de contestar Formulario de Google Drive automáticamente

Suscríbete

Suscríbirme!

Quizá te interese

  • Qué características de HTML5 soporta tu navegador
  • Cabalgata de Los Reyes Magos en Irapuato
  • Servir o publicar imágenes con Django y MongoDB (GridFS)
  • Aldea Digital – Día DOS
Alex Franco 2009 - 2023