Geolocalizar con CSharp y GoogleMaps

julio 19 20103 comentarios

Guardado en : General, Microsoft, Programación

Hola comunidad!, de regreso aportando más material para que esto siga en crecimiento.

Ahora presentando un pequeño programita hecho en C# que nos sirve para geolocalizar direcciones mediante google maps.

El programa lo dividí en tres clases:

Geocodign.- Es la parte donde se hace el proceso de geolocalización
Point.- Clase para identificar nuestras direcciones a geolocalizar
Principal.- Es la clase principal del proyecto

La clase Geocodign

Esta clase cuenta con tres métodos (GetXml, GetData, ChangeUrl)

El método GetXml nos regresa los datos en formato XML y lo guarda en un archivo, el XML es lo que nos manda el googlemaps.

El método GetData nos regresa un Hashtable con los datos dirección (address), longitud (longitude), latitud (latitude). Estos datos los extraemos del arhivo XML que se guarda con el GetXml.

El método ChangeUrl lo utilizamos para reemplazar los espaciós en blanco de la dirección a geolocalizar, por ejemplo “dirección a geolocalizar” por “dirección%20a%20geolocalizar”.

Usings

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Xml;
using System.Xml.XPath;
using System.Windows.Forms;
using System.Collections;
class Geocoding
    {
        private string fileName = "datosxml.xml";
 
        public void GetXml(string address)
        {
            try
            {
                string url = String.Format("{0}", address);
                url = this.ChangeUrl(url);
                string lcUrl = String.Format("http://maps.google.com/maps/geo?q={0}&output=xml&sensor=true_or_false&key=your_api_key", url);
                HttpWebRequest loHttp =
                (HttpWebRequest)WebRequest.Create(lcUrl);
                loHttp.Timeout = 30000;     // 30 secs
                loHttp.UserAgent = "Code Sample Web Client";
                HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();
                Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page
                StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
                string lcHtml = loResponseStream.ReadToEnd();
 
                StreamWriter sw = new StreamWriter(fileName, false);
                sw.Write(lcHtml);
                sw.Close();
 
                loWebResponse.Close();
                loResponseStream.Close();
            }
            catch (Exception ex) {
                MessageBox.Show("Error " + ex.Message, "Error");
            }
 
        }
 
        public Hashtable GetData()
        {
            Hashtable data = new Hashtable();
            XPathDocument doc = new XPathDocument(fileName);
            string namespaceUri = "http://earth.google.com/kml/2.0";
            XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable());
            XPathNavigator nav = doc.CreateNavigator();
            ns.AddNamespace("bz", namespaceUri);
            string query = "bz:kml/bz:Response/bz:Placemark/bz:Point/bz:coordinates";
            XPathNodeIterator iter = nav.Select(query, ns);
            string coordinates = (iter.MoveNext()) ? iter.Current.Value : "";
 
            query = "bz:kml/bz:Response/bz:Placemark/bz:address";
            iter = nav.Select(query, ns);
            string address = (iter.MoveNext()) ? iter.Current.Value : "";
 
            string lon = "";
            string lat = "";
            if (coordinates.Split(',').Length == 3)
            {
                lon = coordinates.Split(',')[0].ToString();
                lat = coordinates.Split(',')[1].ToString();
 
                data.Add("longitude",lon);
                data.Add("latitude", lat);
                data.Add("address", address);
            }
            else
            {
                data.Add("longitude", lon);
                data.Add("latitude", lat);
                data.Add("address", address);
            }
            return data;
        }
 
        private string ChangeUrl(string address)
        {
            address = address.Replace("#", "");
            address = address.Replace(" ", "%20");
            return address;
        }
    }

La clase Point

Esta clase cuenta con los atributos Address, Longitude y Latitude con sus respectivos métodos get y set.

Usings

using System;
using System.Collections.Generic;
using System.Text;
class Point
    {
        private string longitude;
        private string latitude;
        private string address;
 
        public string Address
        {
            get
            {
                return this.address;
            }
            set
            {
                this.address = value;
            }
        }
 
        public string Longitude
        {
            get
            {
                return this.longitude;
            }
            set
            {
                this.longitude = value;
            }
        }
 
        public string Latitude
        {
            get
            {
                return this.latitude;
            }
            set
            {
                this.latitude = value;
            }
        }
    }

La clase Principal

Para nuestro caso la clase principal es la de nuestro formulario, donde tendremos dos textbox (txtaddress y txtdata), en el txtaddress pondremos la dirección a geolocalizar y en el txtdata obtendremos nuestros datos, también tendremos un boton (btngeocoding) con el cual daremos la acción para realizar la geolocalización.

Formulario principal

El código del botón es el siguiente

Usings

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.XPath;
using System.IO;
        private void btngeocoding_Click(object sender, EventArgs e)
        {
            string address = this.txtaddress.Text;
            Geocoding geocodign = new Geocoding();
            Point point = new Point();
 
            geocodign.GetXml(address);
            Hashtable data = geocodign.GetData();
 
            point.Address = data["address"].ToString();
            point.Longitude = data["longitude"].ToString();
            point.Latitude = data["latitude"].ToString();
 
            this.txtdata.Clear();
            this.txtdata.Text = String.Format("{0}Dirección= {1} \r\n", this.txtdata.Text, point.Address);
            this.txtdata.Text = String.Format("{0}Longitud= {1} \r\n", this.txtdata.Text, point.Longitude);
            this.txtdata.Text = String.Format("{0}Latitud= {1} \r\n", this.txtdata.Text, point.Latitude);
        }

Ejemplo:

Ejemplo

Espero sea de grán ayuda! Dudas ó sugerencias, no duden en hacerlas llegar. Estamos para servir.. Saludos!

Comparte esta información:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • LinkedIn
  • Technorati
  • TwitThis

Quizá te interese :

Acerca del autor: Jorge

Estudiante de la carrera de Ingeniería en Sistemas Computacionales en el Instituto Tecnológico Superior de Cosamaloapan. Puedes contactarme sobre mis artículos en jsosa@smartdsign.net

3 Respuestas a “Geolocalizar con CSharp y GoogleMaps”

  1. Daniel dice:

    Wow es la segunda pagina que visito y me quedo asombrado, directo a webs favoritas.

    Excelente aporte, gracias

    Podrias subir el exe de la aplicacion para ver como funciona, seria genial verlo funcionar

  2. Fernando dice:

    Interesante articulo el que has desarrollado, podrias depronto indicar como se puede visualizar el mapa de GoogleMaps si desearamos graficar el resultado?.

    Muchas gracias por el aporte.

  3. Jorge dice:

    Claro que sí, trabajaremos en ello :)

    ?

Deja un comentario


Licencia y uso

Las técnicas demostradas en los tutoriales pueden ser utilizadas sin ninguna limitación y tampoco es obligatorio dar una atribución.


Los textos, imágenes y tutoriales son propiedad de sus respectivos autores, nuestro contenido se encuentra bajo licencia Creative Commons Share-Alike.

Escribe algo para el sitio

El escribir un tutorial o un artículo, mandarnos un enlace para Ubicuos, no solamente es una forma de obtener publicidad, si no también de dar algo a la comunidad y nosotros te lo recompensamos con los premios del mes! Leer más de nuestras promociones

¿Sugerencias?

Este es TU sitio, si tienes sugerencias o ideas de cómo podemos mejorarlo para ti, ¡Por favor háznoslos saber!

Hacemos nuestro mayor esfuerzo en proporcionar un sitio útil y amigable y esperamos que disfrutes tu tiempo aquí.

Ayuda a Difundir

Te gusta Ubicuos?

Ve las formas en que nos puedes apoyar.

Apoyando a Ubicuos.com

Submit your linkClose

-->