Gmap.NET: una libreria para usar google maps en .NET (Parte II)

Aqui la parte dos de como usar la libreria GMap.Net bien ahora voy a explicar como capturar la latitud y longitud al dar click en cualquier parte del mapa y asi poder crear una nueva marca y tambien como pintar rutas (caminos).

Para poder poder capturar el punto donde se da click en el mapa usamos el siguiente codigo:

private void gMapControl1_Click(object sender, EventArgs e)
        {
            double x,y;
            GMapControl gm = (GMapControl)sender;
            MouseEventArgs hj = (MouseEventArgs)e;
            PointLatLng plg= gm.FromLocalToLatLng(hj.X,hj.Y);
            ultimopunto = plg;
        }

Este es el evento click del control MapControl yo tengo definida una propiedad en mi formulario tipo PointLatLng que me permite almacenar el ultimo punto clickeado yasi poder crear una nueva marca en base a ese punto, la longitud y latitud la obtenemos al llamar  al metodo FromLocalToLatLng del control GMAP.NET (que es el sender) que toma como parametros las coordenadas X,Y del mouse que esta en el argumento pasado al evento clic (que es el EventArgs ) llamado “e”.

Ahora si lo que queremos es crear una marca en base ese punto donde se dio click pues hacemos lo siguiente (lo tengo puesto en el evento click de un boton y me queda de esta manera)

private void button5_Click(object sender, EventArgs e)
        {
            GMapMarker newmarca;
            newmarca = new GMapMarkerGoogleRed(ultimopunto);
            objects.Markers.Add(newmarca);
            marcaselected = newmarca;
        }

Ahora vamos a por las rutas, pues para las rutas usamos el objeto de tipo GMapOverlay que definimos al comienzo para poner las marcas y que maneja todos objetos del control GMap.NET en mi caso es una propiedad del formulario llmado “objects” bien a las rutas para eso he creado un metodo llamado haceruta que toma dos parametros de tipo PointLatLng  de esta manera:

private void haceruta(PointLatLng origen, PointLatLng destino)
        {
            List<PointLatLng> rutapoint = new List<PointLatLng>();
            rutapoint.Add(origen);
            rutapoint.Add(destino);
            GMapRoute ruta0 = new GMapRoute(rutapoint, “aaa”);
            GMapRoute ruta = new GMapRoute(rutapoint, ruta0.Name);
            objects.Routes.Add(ruta);
            calculadistancia();
        }

bien con eso ya se puede crear una marca teniendo dos puntos de referencia, pero si se quiere hacer que se pinten las rutas de todas las marcas que tenemos pues podemos hacer esto:

private void button7_Click(object sender, EventArgs e)
        {
            PointLatLng puntoini = new PointLatLng();
            PointLatLng puntofin = new PointLatLng();
            objects.Routes.Clear();
            foreach (GMapMarker marcaact in objects.Markers)
            {
                puntoini = marcaact.Position;
                if (puntofin.Lng == 0)
                {
                    puntofin = marcaact.Position;
                }
                else
                {
                    haceruta(puntofin,puntoini);
                    puntofin = puntoini;
                }
            }
        }

Pues estoy haciendo que se recorra todas las marcas en el objeto de tipo GMapOverlay que tenemos enlazado a nuestro control GMap.Net y voy llamando a la funcion hace ruta con las coordenadas de cada marca que la obtenemos de la propiedad Position de la marca.

Bueno ya para terminar la eliminicacion de las marcas, si lo que quieres es eliminar una marca que seleccionastes con el mouse puedes hacer esto:

private void button6_Click(object sender, EventArgs e)
        {
            if (marcaselected != null)
                objects.Markers.Remove(marcaselected);
            marcaselected = null;
        }

Yo tengo una propiedad en el form llamada  marcaselected que siempre es null hasta que selecciones una de ellas y para darle el valor de que marca ha sido seleccionada pues uso lo siguiente en el evento OnMarkerClick, podriamos hacer otra cosa que al presionar el boton derecho del mouse se borre la marca eso lo podriamos controlar por que nos pasa un MouseEventArgs en donde esta el boton precionado del mouse.

 private void gMapControl1_OnMarkerClick(GMapMarker item, MouseEventArgs e)
        {
            marcaselected = item;
        }

Esta es una actulizacion ya que no vale para una tercera entrega ya ques corto pero muy importante pues ahora queremos hacer que se pinten una ruta y usando el motor de googlemaps nos indique como llegar desde un punto hasta otro punto pues usamos esto:

private void button8_Click(object sender, EventArgs e)
        {
            MapRoute mp = gMapControl1.Manager.GetWalkingRouteBetweenPoints(objects.Markers[0].Position, objects.Markers[objects.Markers.Count – 1].Position,15);
            PointLatLng origen = mp.Points[0];
            PointLatLng destino = new PointLatLng();
            objects.Routes.Clear();
            for (int k = 1; k < mp.Points.Count; k++)
            {
                destino = mp.Points[k];
                haceruta(origen,destino);
                origen = destino;
            }
        }

Lo que hacemos es usar el Manages del control GMap.NET para que nos indique la ruta entre dos puntos con el metodo GetWalkingRouteBetweenPoints y para ello estoy usando el primer y el ultimo marcador que tengo colocado pues este evento devuelve un objeto de tipo MapRoute  que contiene todos los puntos que nos indica por donde ir, despues de eso hago un bucle para pintar las rutas una entre los puntos y llamar a la funcion que cree antes haceruta(PointLatLng ,PointLatLng ) y listo ahora nos indica el camino por donde ir.

Una cosilla mas si lo que queremos es posicionar el mapa mientraz vamos dando click en el pues podemos cambiar la location de esta forma:

private void gMapControl1_Click(object sender, EventArgs e)
        {
            GMapControl gm = (GMapControl)sender;
            MouseEventArgs hj = (MouseEventArgs)e;
            PointLatLng plg= gm.FromLocalToLatLng(hj.X,hj.Y);
            if(hj.Button == MouseButtons.Right)
                gMapControl1.Position = plg;
        }

Lo que estoy haciendo es en el evnto click del control GmapControl y preguntando si se preciono el boton derecho entonces muevo la posicion del mapa a la locacion de donde se dio click.

Bien hasta aqui la Parte II, volvere para una tercera entrega en cuanto tenga mas tiempo. Aqui el link para la Parte I

Acerca de

Antes que nada voy a dejar en claro algo, en este blog escribo como se me place, asi que no busquen errores de ortografia o de redaccion que los van a encontrar a montones y tampoco me critiquen o me digan nada sobre ellos pues no tengo intencion alguna de cambiarlos, lo que escribo lo dejo asi y no lo corrijo,claro esta a menos que sean lineas de codigo. Jorge Prado Anci, profesional en desarrollo de aplicaciones, en especial las dirigidas a bases de datos. He trabajado con VFP en casi todas sus versiones, se algo de Java (que no me gusta, es eso solo no me gusta, es bueno pero no me gusta), lo suficiente de PHP como para tener mi propio CMS(es que sigue sin gustarme por la capacidad de desorden que te permite este “lenguaje”), VB lo conoci y lo deteste tanto que lo olvide al punto de no querer adoptar ni por obligacion a su reemplazante VB .NET (por lo mismo de Java) y si C# este si me encanta y aun que conozco bastante bien el lenguaje, la verdad es que me falta mucho del Framework (del 100% estare en un 65%). Soy un apasionado por el orden (en los proyectos de desarrollo), de la programacion en capas (de MVC conozco pero no he aplicado mucho), los estandares y las condenadas pruebas unitaria. Venga creo que ya con esto fue suficiente.

Tagged with: , , , ,
Publicado en c#, Webs Internet
5 comments on “Gmap.NET: una libreria para usar google maps en .NET (Parte II)
  1. José Flores dice:

    Hola Compadre, pues tu si vas al grano y te felicito, a mi tampoco me va bien eso de s por c o por z, como si a la hora de leer habría mucha diferencia eso de vaca o baca, pero total cada uno con su rollo.
    a lo que voy, agradeceré me indiques la forma de insertar mis puntos en el google Map. mejor dicho personalizar mis iconos desde visual basic, ah se me olvidaba tu manual esta de la… como suena, sigue así hermano, el que sabe gracias por compartir, y el que no sabe, a aprender de ustedes….
    no demores con la respuesta por favor..

  2. Ramiro Rosales dice:

    Hola buenas tardes:

    Se puede poner iconos externos para las marcas???? o que las marcas sean de otros colores diferentes a verde y rojo???????????

    Gracias +

  3. joacko dice:

    Muy buen aporte, pero me quede con una duda… donde defines “objects”? la verdad no entiendo ese punto…. si pudieran aclararlo seria de mucha ayuda…
    Saludos, gracias

  4. Pedro Delgado dice:

    como puedo calcular las distancias entre los marcadores?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 441 seguidores

Blog Stats
  • 304,137 hits
A %d blogueros les gusta esto: