Cuando trabajamos con Google Maps usamos las latitudes y longitudes para definir los puntos, el centro del mapa, etc… Si no conocemos esos datos, pero sí la dirección de la ubicación, podemos “geolocalizar“, es decir obtener las coordenadas con el objecto “geocoder“.
Para poder obtener las coordenadas directamente vía C# y no geolocalizar con javascript usaremos el objeto de C# WebRequest y WebResponse para obtener directamente desde Google los datos que necesitamos y poder tratarlos en nuestra aplicación.
La idea es hacer las petiticiones a la URL de geolocalización de Google que es la siguiente: http://maps.google.com/maps/geo?q=Direccion
A esta url, se le deben especificar los siguientes parámetros:
q -> es la dirección que queremos geolocalizar
output -> es como queremos obtener la información del servicio. Puede ser xml, kml, csv o json
key -> nuestra key de la api de google.
En resumidas cuentas, nos queda una URL así, vamos a usar el formato CSV, así que lo especifico ya en el ejemplo:
http://maps.google.com/maps/geo?q=Mataro&output=csv&key=MI-KEY-API
La url anterior debería mostrar en nuestros navegadores algo así:
200,4,41.5375002,2.4452776
Esos son los datos que necesitamos, una tira de valores separados por comas para poder trabajar con ellos.
El primer valor es el código de respuesta de la petición. Existen diferentes códigos en función de si todo ha ido bien, si se ha producido un error o si simplemente, la dirección no se puede encontrar. Aquí hay una tabla que relaciona estos códigos:
El segundo grupo, es el 4 en el ejemplo, nos indica la precisión del resultado, de nuevo, hay una tabla para relacionar todo esto:
Y por último, los 2 restantes valores, lo que realmente queremos saber, la latitud y la longitud.
Ahora solo nos queda hacer que nuestra aplicación recoja esos valores con un par de funciones simples:
string constructuirGeoURL(string direccion){ string geoURL = ""; if(direccion != ""){ direccion = direccion.Trim(); direccion = direccion.Replace(" ", "+"); geoURL = @"http://maps.google.com/maps/geo? q=###ADDRESS###&output=###OUTPUT###&key=###KEY###"; //Sustitución de las variables geoURL = geoURL.Replace("###ADDRESS###", direccion); geoURL = geoURL.Replace("###OUTPUT###","csv"); geoURL = geoURL.Replace("###KEY###", ApiGoogle); } return geoURL; }
Con la función construirGeoURL(), vamos ha obtener la URL que después vamos a usar en la función cargarLatitudLatitud() que nos va a dar la latitud, longitud y el código de respuesta de la petición.
void cargarLatitudLatitud(string geoURL){ string csvValues = ""; string Latitud = ""; string Longitud = ""; string Respuesta_geo = ""; try { WebRequest objWebRequest = WebRequest.Create(geoURL); WebResponse objWebResponse = objWebRequest.GetResponse(); Stream objWebStream = objWebResponse.GetResponseStream(); using (StreamReader objStreamReader = new StreamReader(objWebStream)) { csvValues = objStreamReader.ReadToEnd(); } if (csvValues != null) { string[] geoValues = csvValues.Split(new char[] { ',' }); if (geoValues.Length > 0) { Respuesta_geo = geoValues[0].ToString(); Latitud = geoValues[2].ToString(); Longitud = geoValues[3].ToString(); } } } catch (Exception exp){ Response.Write(exp.Message); } }
Para poder usar la función cargarLatitudLatitud(), hay que importar los espacios de nombres siguientes:
<%@ import Namespace="System.Net" %> <%@ import Namespace="System.IO" %>
Como podéis ver, el uso del objecto WebRequest y WebResponse es sencillo y nos permite trabajar con el servicio de Google Maps para geolocalizar directamente desde nuestras aplicaciones C#.
¿Se os ocurre alguna forma de aprovechar otra característica de Google Maps sobre C#?
es q en internet no hay un estupido mapa de coordenadas geograficas??????
Muchas Gracias!!!, estoy haciendo una aplicación en C#, donde bajo el mapa de Google Static Map y lo presento en una picture box para posteriormente guardar la imagen en una base de datos y lo que me hacia falta era una manera de buscar las latitudes y longitudes de una dirección dada.
Solo me gustaría preguntarte si hay alguna manera mas eficiente de hacer este proceso ya que mi programa tarda mucho tiempo en bajar la imagen.
Muchas gracias por este articulo esta muy bueno. : )
Hola, Eias,
El proceso tarda por la velocidad de conexión a Internet. Una forma de agilizarlo es ejecutando el programa en un servidor con un ancho de banda (de bajada) mucho mayor. Fíjate que hablo de un servidor por algo. Sin embargo, tienes que tener en cuenta que existe un límite de peticiones (diferentes) por API en un día. Revisa la documentación de Gmaps en Google…
Olle gracias ppero una pregunta cuando mando la geoUrl me aparece solo El error Y un Cero pero le doy la direccion bien y me devuelve eso nose si podrias ayudarme
o como l epaso la direccion por que yo solo le di el nombre como por ejemplo culiacan
Se puede obtener C# la direccion a partir de la longitud y latitud?
@Luis En efecto, solo es cuestión de seguir la documentación de la API de GoogleMaps en C#. Hace poco desarrollamos un sistema de detección de geolocalización via GPS en C# de dispositivos, para la ubicación de dispositivos portátiles de alquiler bastante chulo, haciendo servir todo esto.
Si encuentras dificultades con algún punto de la API, coméntanoslo más concretamente.
Un saludo,
@Alejandro, para poder saber cuál es tu problema, necesitaría que postees parte de tu código.
De todas formas, te adelanto que los más útil es seguir la documentación de la API de Google.
En cualquier caso, si te encuentras perdido, lánzame el código y lo comentamos
Un saludo,
Tengo el gps TM2200. Segun el manual envia su EMEI y a continuacion hay que enviarle en binario el codigo 1 para que empieze a enviar datos.
Lo hago asi pero no recibo ningun dato. El primero que recibo es el EMEI, que es un codigo de 15 digitos, a continuacion le envio en binario el 1, pero no recibo nada. Con el hyperterminal si que veo todos los codigos NMEA.
Hay alguna otra forma de hacerlo?.
Saludos, Luis
Hola!
Muchas gracias por el post, me ha sido de mucha ayuda en un proyecto que estoy haciendo con Google Maps.
Un saludo y gracias de nuevo!
necesito encontrar la latlong de muchas direcciones (de casas) hay algun programa que me permita sitematizar esto. es decir que lea la direccion de alguna lista y que devuelva en la misma lista la latitud y longitud?. son mas de 500 casas o tengo que hacerlo manualmente?
gracias
Lo puedes programar, si te es factible. Programarlo no es muy complicado. Yo llevaría ese listado de 500 direcciones a una mini base de datos, para que después te sea mucho más fácil extraer la información de la latitud y longitud de estas casas cuando quqieras, supongo que programando un sistema de representación.
Pero manualmente es demasiado trabajo. Si no puedes programar, contrata a alguien que lo haga or ti, en estos casos se gradece. No debería costarte más de 2 o 3 horas.
Si te avenuturas a hacerlo por tu cuenta, cualquier cosa pásate por aquí y la vemos.
Un saludo,
Muchas gracias, lo maximo…!!!
por fin algo que me funcionaaa…!!!
Saludos.,