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

Descarga el ejemplo

Ando medio complicado con una aplicacion que requiere usar los tan afamados google maps y bueno buscando me encontre esta libreria que puedes descargarla desde codeplex y buenola forma de uso se me complico algo pues no tiene documentacion explicita, claro el poner en los tabs de controles y demas es sencillo pues solo basta jalar el control en un formulario y oclocar lapropiedad MapType a GoogleMap (existen mas opciones pero esa es la que me intereza ahora), con eso ya te muestra el google maps en tu formulario, claro con el zoon a 0 osea te muestra el mapa mundi, para centrarlo en alguna posicion y con algo de zoom pues asi:

gMapControl1.Zoom=15;
gMapControl1.Position = new PointLatLng(-16.438389, -71.528358);

gMapControl1: es el control del mapa.

PointLatLng: es el objeto que define la latitud y longitud de cualquier punto en el mapa y se define con dos valores de tipo doble.

Zoom: indica el zoom que va a tener el mapa desde el inicio y 15 es un zoom que hace visibles las calles.

Ahora lo que si me complico fue el de establecer marcas, mi aplicacion requiere trazar diferentes puntos en un mapa detarminado pues el ejemplo es algo complicado pero aqui viene como hacerlo:

– Primero tienes que definir un objeto de tipo GMapOverlay y luego irle agregando los marcadores uno a uno de esta forma:

List<string> lsMarcas = new List<string>();
lsMarcas.Add(“-16.438389,-71.528358”);
lsMarcas.Add(“-16.438606,-71.527878”);
lsMarcas.Add(“-16.438465,-71.527824”);
lsMarcas.Add(“-16.437904,-71.527580”);

foreach (string cad in lsMarcas)
{
Double lat, lon;
string[] aCad= cad.Split(‘,’);
lat=Convert.ToDouble(aCad[0]);
lon=Convert.ToDouble(aCad[1]);
PointLatLng ptll = new PointLatLng(lat, lon);
GMapMarker marca;

marca = new GMapMarkerGoogleRed(ptll);
objects.Markers.Add(marca);
}

Como ven yo he metido todas mis coordenadas de longitus y latitud en una Lista de tipo string separada por comas (la latitud y la longitud).

La forma de agregar marcas es hacia el objeto de tipo GMapOverlay que en mi caso se llama “objects”, defino un objeto de tipo PointLatLng que es ptll y le asigno las coordenadas de la lista, luego un objeto marca basado en esas coordenadas y agrego la marca en el objeto: objects.Markers.Add(marca);

Bueno hasta aqui la primera parte de esto, ahora estoy estudiando ese control asi que apenas tenga cosas como capturar la latitud y longitud de un punto al darle click, poner scroll, o activar el arrastre en el mapa.

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

 

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#
25 comments on “Gmap.NET: una libreria para usar google maps en .NET (Parte I)
  1. […] aqui la Parte II, volvere para una tercera entrega en cuanto tenga mas tiempo. Aqui el link para la Parte I LD_AddCustomAttr("AdOpt", "1"); LD_AddCustomAttr("Origin", "other"); […]

  2. Brayan Gómez dice:

    Bueno Yo Tengo Una Aplicación.Net…. Soy Muy Nuevo En Esto… Es Mas, Tengo 18 Años, Estoy Estudiando Ing. De Sistemas Y Mi Proyecto Requiere Que En La Aplicación Web Que Estoy Desarrollando Agregue un Mapa…. Yo Hice Lo Que Encontre En Este Blog Pues Me Pareció Que Tenía Buena Información. Este es el Link Del Blog: http://www.esasp.net/2009/10/google-maps-para-aspnet.html
    Pues Agrego Normal El mapa, Pero Pues Solo Puedo Ver Un Mapa Mundi Sin Ningun Tipo De Controles, Luego Pues Agrego La Clase c# Pero Pues Me Sale Un Error Pues En Esta Clase Me Dice Que Gmap1 No Existe En El Contexto Actual, Alguien Conoce Alguna Solución A Este Problema…. Necesito Esta Ayuda Urgente!!

    • Brayan Gómez dice:

      Por Cierto, Este Gmaps Lo Puedo Usar En Una Aplicacion Visual Studio 2010??? O Solo Sirve Para c# ??

      • xmeele dice:

        GMaps.NET es un control para el .NET Framework asi que funciona completamente con culaquie solucion que utilice el .NET Framework. ahora si solo vez el mapa mundi pues es por que tu zoom es 1, lo que tienes que hacer es configurar tu control, ahora cuando t dice “Gmap1 no existe” es por que seguramente arrastrastes el control a tu formulario web pero no le pusiste nombre si le cambias el nombre que t da por defecto a Gmap1 entonces lo veras perfectamente.
        Si por ejemplo pones esto:
        gMapControl1.Zoom=15;
        gMapControl1.Position = new PointLatLng(-16.438389, -71.528358);

        Pues te puede funcionar teniendo en cuenta que el nombre del control tiene que existir (en mi caso se llama gMapControl1) y pones esto en el constructor del winform o webform que muestra el control gmap.net,esto hara que se muestre el mapa con un zoom de 15 y ubicado en la ciduad de Arequipa – Peru.

      • xmeele dice:

        Solo una cosa mas yo uso otra clase a la que tu nombrastes en tu comentario la cual si es 100% gratuita.

  3. Brayan Gómez dice:

    No MIra… La verdad Yo Agrego Un dll A la carpeta Bin De MI Proyecto, Luego En un Formulario Agrego Este Codigo:

    Cuando Agrego Este Codigo Me Aparece Un Cuadro Que dice Q Son Los Mapas De Google, Ahi Lo Puedo Ejecutar y Me Muestra Un Mapa Mundi Normal, Sin Ninguna Clase De Control.

    Luego Agrego Una Clase De C# Donde agrego el Codigo Para Tener Los Controles Del Mapa Desde El Zoom Hasta Agregar Una Marca Con Informacion.

    El Código Es Este:

    using System;
    using System.Web.UI;
    using Subgurim.Controles;

    public partial class GoogleMaps : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    if (!Page.IsPostBack)
    {
    GLatLng ubicacion = new GLatLng(40.381090863719436, -3.6222052574157715);
    Mapa1.setCenter(ubicacion, 15);

    //Establecemos alto y ancho en px
    GMap1.Height = 560;
    GMap1.Width = 660;

    //Adiciona el control de la parte izq superior (moverse, ampliar y reducir)
    GMap1.addControl(new GControl(GControl.preBuilt.LargeMapControl));

    //GControl.preBuilt.MapTypeControl: permite elegir un tipo de mapa y otro.
    GMap1.addControl(new GControl(GControl.preBuilt.MapTypeControl));

    //Con esto podemos definir el icono que se mostrara en la ubicacion
    //#region Crear Icono
    //GIcon iconPropio = new GIcon();
    //iconPropio.image = “../images/iconBuilding.png”;
    //iconPropio.shadow = “../images/iconBuildingS.png”;
    //iconPropio.iconSize = new GSize(32, 32);
    //iconPropio.shadowSize = new GSize(29, 16);
    //iconPropio.iconAnchor = new GPoint(10, 18);
    //iconPropio.infoWindowAnchor = new GPoint(10, 9);
    //#endregion

    //Pone la marca de gota de agua con el nombre de la ubicacion
    GMarker marker = new GMarker(ubicacion);
    string strMarker = “” +
    “esASP.NET
    ” +
    ” C/ C/ Nombre de Calle, No X 28031 Madrid, España ” +
    “Tel: +34 902 00 00 00 Fax: +34 91 000 00 00” +
    “Web: http://www.esASP.net” +
    “Email: ” +
    “derbis.corrales@gmail.com
    “;
    GInfoWindow window = new GInfoWindow(marker, strMarker, true);
    GMap1.addInfoWindow(window);

    GMap1.enableHookMouseWheelToZoom = true;

    //Tipo de mapa a mostrar
    GMap1.mapType = GMapType.GTypes.Normal;

    //Moverse con el cursor del teclado
    GMap1.enableGKeyboardHandler = true;
    }
    }
    }

    Pero Ahi ves Todo Necesita Ese GMap1 Para Darle Las Funciones Dice Q No Esta En EL contexto actual:
    Error 5 El nombre ‘GMap1’ no existe en el contexto actual C:\Users\Brayan\Documents\Visual Studio 2010\WebSites\Mapas\App_Code\GoogleMaps.cs 17 13 C:\…\Mapas\
    y asi los 9 errores que tiene Cada Gmap1
    Probe Con Cambiarle El Nombre Como me dijiste De Ese Control, Le PUse Mapa1 Y Todas Esas Cosas Desde El Formulario En Propiedades Pero =mente Sigue Sin Reconocerlas.
    Agradeceria Tu Ayuda Sobre Este Tema O Si Pudieras De Pronto Explicarme Un Poco Mejor Como Descargar Y Aplicar La Libreria De Los GMaps Que MEncionan En Esta Y En tu Parte II, Por Cierto Me Interesa Muchisisisismo Este Codigo Que Mencionas En Estos Dos Post, Me Parece Increible Y Ademas Es Muy Entendible El Hecho De Agregar Los Controles Los Entiendo Muy Bien…

    Solo Quisiera Saber Un Poco Mejor Como Implemento Esa Libreria En Mi Visual Studio y Si Este COdigo Q Mencionas Lo Pongo En Una Clase O En El Mismo Formulario??

    Muchisisisimas Gracias Por Dedicarle Un Poco De tiempo A MIs Preguntas… Y Responderme Tan Rapida Y Acertadamente, Muchas GRacias Por La Ayuda Ya Brindada Y Por La Que Se Q Me Vas A Brindar!!!! Gracias!!!!

    Espero Tu Respuesta!!!! =D

  4. Brayan Gómez dice:

    Parce Muchas Gracias Por Su Ayuda Pero A Pesar De Que Pego El Código En El Web Form Donde Esta El Control Del GMaps Pues Nada Antes Se Triplican Los Errores… Podrias Explicarme Como Usar La Libreria Que Mencionas En Tus DOs Partes, Pues Este Código Esta Claro… Pero Como Agrego La Libreria??? La Descargo Y La Agrego Como? mmm Y El Código Que Muestras Tambien Se Pega En El Web Form Donde Esta El Control?? Gracias Por Todo Y Disculpa Las Molestias….. Recuerda Que Soy Muy Nuevo En Esto!! Gracias!

    Saludos,
    Brayan Gómez

    • Brayan Gómez dice:

      aaaaa Por Cierto…. Ya Q Veo Q Sabes Bastante Sobre Este Tipo De Desarrollo Tengo Un Problema Sobre El Cual Quiero Comentarte……

      Mira, Sobre Mi Proyecto, Debo Montar Un Web Form, Sobre Él, Van 3 DropDownList, El Primero, Me Muestra Las Localidades De La Ciudad De Bogotá, Después, El Segundo Me Muestra Los Barrios De Dicha Localidad, Luego Aparece El 3 Que Me Muestra Los Inmuebles Que Se Encuentren En Este Barrio (Mi Proyecto Es De Una Inmobiliaria)
      Cuando Selecciono Algún Valor Del DropDownList3 Me Aparece Una Lista Con Los Datos De Dicho Inmueble (Por Ejemplo: Cuantos Pisos Tiene, Habitaciones, Baños… Etc.) y Un GridView Con 3 Imagenes De Dicho Inmueble!!

      Hasta Ahi Todo Funciona Perfecto, Me Muestra Las 3 Imagenes Y Todo Bn…
      Pero Pues Me Aumentaron Los Requerimientos Del Proyecto… =(

      Ahora Necesito, Que Solo Me Muestre La Primera Imagen, Pero Que Con Un Boton o Algun Complemento De Ajax Para Que Se Haga Solo Me Vaya Cambiando De Imagen, Es Decir Mientras Estoy Viendo Los Datos De La Casa, Del Barrio Tal, Con No se Que Cosas, Pues A un Lado El GridView Se Vaya Actualizando De Imagen 1 a Imagen 2 y Luego a Imagen 3….
      Tendras Código Con El Cual Podrias Darme Solución A Este Problema????

      Muchas Gracias

      Saludos
      Brayan Gómez

  5. Brayan Gómez dice:

    Parce Que Pena Molestar Tanto, Pero El Link Q me Dejo Ps Descargo El .Rar y Lo Abro Con MI Visual Pero Me Bota Error Y No Puedo Ni Ver ningún Código Ni Ejecutarlo! =(
    Pues Me Dio Una IDea Q Le Quiero Mostrar:

    Inclui Un Timer En El Formulario Con Este Código:

    If GridView1.SelectedRow.Cells(0).Visible = True Then
    GridView1.SelectedRow.Cells(1).Visible = False
    GridView1.SelectedRow.Cells(2).Visible = False
    Else
    If GridView1.SelectedRow.Cells(1).Visible = True Then
    GridView1.SelectedRow.Cells(0).Visible = False
    GridView1.SelectedRow.Cells(2).Visible = False
    Else
    If GridView1.SelectedRow.Cells(2).Visible = True Then
    GridView1.SelectedRow.Cells(0).Visible = False
    GridView1.SelectedRow.Cells(1).Visible = False
    End If
    End If
    End If
    Pero No Encuentro La Forma De Hacer Como El Gridview1 Me Muestre Solo La Primera Columna Desde El Principio…….

    Ves Este Código Bien??… O Como Lo Podria Hacer??

    Muchas Gracias!!

    Saludos
    Brayan Gómez

    • Brayan Gómez dice:

      Bueno, Ya Encontre La forma De Hacer Q El Gridview1 Me Muestre Solo La Primera Columna Pero El Timer Me Boto Una Excepción me Podrias Ayudar Con El Código Para Programar Un Timer Donde Vayan Cambiando 3 Imagenes Dentro De Un Gridview??
      GRACIAS

      Saludos
      Brayan Gómez

  6. Brayan Gómez dice:

    Podrias Ayudarme Con El Codigo Para Q Un Timer Rote Tres Imagenes…..
    Gracias

    Saludos
    Brayan Gómez

  7. Marcos dice:

    hola, trate de implementar el codigo que mencionas al principio, para poder añadir multiples marcadores,pero no me da resultado, podrias decir me que estoy haciendo mal

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    using GMap.NET;
    using GMap.NET.MapProviders;
    using GMap.NET.WindowsForms;
    using GMap.NET.WindowsForms.Markers;
    using GMap.NET.WindowsForms.ToolTips;

    namespace EjemploGmapNET
    {
    public partial class Form1 : Form
    {
    GMapOverlay overlayOne;

    List lsMarcas = new List();

    public Form1()
    {
    InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {

    }

    private void Form1_Load(object sender, EventArgs e)
    {
    //gmap.SetCurrentPositionByKeywords(“Peru”);
    gmap.MapProvider = GMapProviders.GoogleMap;
    gmap.MinZoom = 3;
    gmap.MaxZoom = 17;
    gmap.Zoom = 5;
    gmap.Manager.Mode = AccessMode.ServerAndCache;
    overlayOne = new GMapOverlay(gmap, “OverlayOne”);

    lsMarcas.Add(“-16.438389, -71.528358”);
    lsMarcas.Add(“-16.438606, -71.527878”);
    lsMarcas.Add(“-16.438465, -71.527824”);
    lsMarcas.Add(“-16.437904, -71.527580”);

    foreach (string cad in lsMarcas)
    {
    Double lat, lon;
    string[] aCad = cad.Split(‘,’);
    lat = Convert.ToDouble(aCad[0]);
    lon = Convert.ToDouble(aCad[1]);
    overlayOne.Markers.Add(new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(new
    PointLatLng(lat, lon)));
    gmap.Overlays.Add(overlayOne);
    }

    }

    }
    }

    • xmeele dice:

      Este es el codigo que funciona y viendo tu codigo defines una variable tipo List para las marcas, cuando en mi ejemplo es una lsita tipada de tipo string pero creo que ese es un problema de versiones de .net, en cuanto a las marcas las marcas que estas colocando hacen referencia a a puntos en una manzana de una ciudad asi que solo seran visibles en el maximo zoom (17), me he fijado tambien que no le indicas cual es la posicion inical del del mapa.
      En todo caso he subido el archivo del proyecto a mi skydrive (ve en la parte inical del post).

      using System;
      using System.Collections.Generic;
      using System.Collections;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Linq;
      using System.Text;
      using System.Windows.Forms;

      using GMap.NET;
      using GMap.NET.MapProviders;
      using GMap.NET.WindowsForms;
      using GMap.NET.WindowsForms.Markers;
      using GMap.NET.WindowsForms.ToolTips;

      namespace mapademo
      {
      public partial class Form1 : Form
      {
      GMapOverlay overlayOne;
      ArrayList lsMarcas = new ArrayList();
      public Form1()
      {
      InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
      gmap.MapProvider = GMapProviders.GoogleMap;
      gmap.MinZoom = 3;
      gmap.MaxZoom = 17;
      gmap.Zoom = 17;
      gmap.CanDragMap = true;
      gmap.Manager.Mode = AccessMode.ServerAndCache;
      overlayOne = new GMapOverlay(gmap, “OverlayOne”);
      lsMarcas.Add(“-16.438389, -71.528358”);
      lsMarcas.Add(“-16.438606, -71.527878”);
      lsMarcas.Add(“-16.438465, -71.527824”);
      lsMarcas.Add(“-16.437904, -71.527580”);
      gmap.Position = new PointLatLng(-16.438389, -71.528358);
      foreach (string cad in lsMarcas)
      {
      Double lat, lon;
      string[] aCad = cad.Split(‘,’);
      lat = Convert.ToDouble(aCad[0]);
      lon = Convert.ToDouble(aCad[1]);
      overlayOne.Markers.Add(new GMap.NET.WindowsForms.Markers.GMapMarkerGoogleGreen(new PointLatLng(lat, lon)));
      gmap.Overlays.Add(overlayOne);
      }
      }
      }
      }

  8. Marcos dice:

    Muchas gracias por responder, al revisar tu respuesta me di cuenta que hay algo que no tengo claro…. ¿cuando te refieres a las marcas, estas tienes que visualizarse en el mapa?
    lo menciono porque al correr el programa solo me muestra la manzana que mencionas aumentada con el zoom=17, pero no visualizo ningun marcador.

    Saludos…

  9. Marcos dice:

    Es extraño he descargado la aplicacion y sobre la imagen del mapa, me aparecen varias posiciones en color rojo de la forma ” TILE{39492,71604} CENTER{39492,71604} “,y no aparecen las marcas verde, pero creo que su aplicacion esta correcta.

    gracias…

  10. Julio Campaz dice:

    hola he visto tu blog y creo que tu puedes ayudarme con un problema que tengo, pues resulta que tengo que pintar unos markers en el mapa, pero solo pinta uno en todo el centro del mapa al iniciar la aplicación, y cuando ago zoom-out desaparece.

    no se que pueda causar este comportamiento
    estoy trabajando con visual studio 2012, y las libreria de Gmaps el ultimo release

    adjunto la parte del codigo de la clase principal donde se inicializa el control Gmaps
    en el evento load:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using GMap.NET;
    using GMap.NET.WindowsForms;
    using GMap.NET.WindowsForms.Markers;
    using GMap.NET.WindowsForms.ToolTips;
    using modelo;
    namespace Interfaz
    {
    public partial class Form1 : Form
    {
    private STM sistema;

    public Form1()
    {
    sistema = new STM();
    InitializeComponent();

    }

    private void Form1_Load(object sender, EventArgs e)
    {
    // Initialize map:
    gmap.MapProvider = GMap.NET.MapProviders.GoogleMapProvider.Instance;
    GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
    gmap.SetPositionByKeywords(“cali, Colombia”);

    // markers Estaciones

    String rutaImagen = Application.StartupPath + “\\Estacion.jpg”;

    GMapOverlay overlayEstaciones = new GMapOverlay(“overlayEstaciones”);

    foreach (var est in sistema.Estaciones)
    {
    if(!est.Nombre.StartsWith(“Av”)&&!est.Nombre.StartsWith(“Cl”)
    &&!est.Nombre.StartsWith(“Dg”)&&!est.Nombre.StartsWith(“Kr”)&&!est.Nombre.StartsWith(“Tr”))
    {
    double estLongitud = est.Longitud/100000;
    double estLatitud = est.Latitud/100000;
    PointLatLng coordenadasEst = new PointLatLng(estLatitud, estLongitud);
    GMarkerGoogle estacion = new GMarkerGoogle(coordenadasEst, new Bitmap(rutaImagen));
    overlayEstaciones.Markers.Add(estacion);
    }
    }
    gmap.Overlays.Add(overlayEstaciones);
    }
    }
    }

    espero puedas ayudarme y gracias de antemano : -)

  11. Hola como estas? des
    cargue tu ejemplo pero no me muestra ninguna marca

  12. 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 +

  13. wilder dice:

    holaa muy interesante tu post sobre la libreria gmaps porfavor me podrias ayudar o guiar en como calcular la distancia entre 2 puntos dados? te lo agradeceria mucho gracias.

  14. luis dice:

    hola me parece muy interesante el GMAP.NET control, y lo estoy probando con vbnet.

    No consigo hacer mover el mapa, y dejar la cruz roja (marca del centro, indicando la posición cambiante de un objeto móvil)

    Muevo el mapa a discreción pero la cruz se me desplaza con el mapa; no consigo solucionarlo

    si tuvieseis una respuesta, os lo agardeceria

    saludos

  15. […] Origen: Gmap.NET: una libreria para usar google maps en .NET (Parte I) | Programacion y otras cosas […]

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: