(Google Maps – API) Codificación Geográfica – I
Se conoce como Codificación Geográfica, al proceso o sistema de transformar una dirección «o similar» en coordenadas geográficas de Longitud y Latitud, para posteriormente ser utilizadas en sistemas de posicionamiento (por ejemplo).
El API de Google incluye este servicio, que es el que se utiliza cuando buscamos una dirección desde Google Maps.
Normalmente este acceso se hace desde una página web con peticiones HTTP; Lo que vamos a ver es cómo integrar este servicio en un programa Delphi.
Un poco más arriba he comentado que la codificación geográfica se basa en dar una entrada (dirección) para obtener unas coordenadas. También he añadido el «similar», puesto que en el caso de Google Maps, podemos dar como entrada otras cosas que expresamente no son una dirección.
Así, podemos utilizar como dirección:
- 08901,Spain
- c/Balmes,214,Barcelona,Spain
- Sevilla,Spain
- Alhambra,Granada,Spain
- …
Para hacer una prueba de lo que podemos obtener, basta con utilizar un componente TidHTTP de las Indy para realizar la petición. Coloca un componente TidHTTP en un formulario y un botón con el siguiente código:
procedure TForm1.btn1Click(Sender: TObject); const STR_WEB = 'http://maps.google.com/maps/geo?q='; STR_OUT = '&output=csv'; // formato de salida var Stream: TStringStream; Str, res:string; begin // ini Stream := TStringStream.Create(''); // proteccion para liberar try Str := STR_WEB + edt1.Text + STR_OUT; idhttp2.Get(Str, Stream); edt2.Text := Stream.DataString; finally FreeAndNil(Stream); end; end; |
Una imagen de lo que obtenemos una vez realizada la petición es la siguiente:
Se puede descargar el código completo de este ejemplo desde aquí.
Y lo que obtenemos como respuesta en este caso es:
200,8,41.3979638,2.1515206
Los dos últimos parámetros son los que buscabamos y nos indican las coordenadas de ese punto (latitud y longitud).
Para comprobar que so correctas, basta con ir a la web de Google Maps, copiar estas dos coordenadas en el cuadro de búsqueda y pulsar sobre el botón de <Buscar en el Mapa>.
A parte de esto, Google Maps nos devuelve, en este caso, dos números más; El primero corresponde al un «código de Estado» o «código de retorno» de la consulta que hemos realizado; En él se devuelve información por parte del servidor. Y el segundo es lo que se conoce como «Accuracy» o «Exactitud», que corresponde justamente a eso; Al nivel de exactitud que Google asigna a la respuesta, segun la dirección que le hemos dado.
El código de retorno, en este caso, es un 200, que corresponde a la constante «G_GEO_SUCCESS» (consulta correcta).
El nivel de exactitud, en este caso, es un 8 (máxima precisión).
Los niveles de exactitud con lo que trabaja Google Maps son los siguientes:
- 0: Ubicación desconocida.
- 1: Precisión a nivel de país.
- 2: Precisión a nivel de región.
- 3: Precisión a nivel de subregión.
- 4: Precisión a nivel de ciudad o pueblo.
- 5: Precisión a nivel de código postal.
- 6: Precisión a nivel de calle.
- 7: Precisión a nivel de intersección.
- 8: Precisión a nivel de dirección.
Así en el ejemplo que hemos visto antes obteníamos una Exactitud de 8 (a nivel de dirección), mientras que si íntroducimos una dirección del tipo;
<08905,Barcelona,Spain>
Obtendremos un código 5 (a nivel de C.P.)
NOTA: La descripción detallada de los «códigos de precisión» se puede encontrar aquí; Y la descripción detallada de todos los «códigos de retorno» se puede encontrar aquí.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Vaya!, que interesante amigo; gracias por el aporte.
Saludos!
@Felipe
Gracias.
Espero poder continuar; Primero con una ampliación y luego con temas relacionados.
Muy interesante la entrada.
Como esto lo tengo fresco, voy a hacer un par de aportaciones.
En las consultas que he realizado de prueba en mi sistema, me he llevado varias sorpresas.
Una es que existe un nivel 9 de precisión: «9 Premise (building name, property name, shopping center, etc.) level accuracy. (Since 2.105)». Lo que sucede es que no aparece en la traducción de la ayuda del API, en la misma dirección en inglés se puede consultar: http://code.google.com/intl/en-US/apis/maps/documentation/reference.html##GGeoAddressAccuracy.9
Otro tema es que cuando la consulta no sea muy precisa se pueden devolver varios resultados. En estos casos se obtiene mas precisión procesando la petición en xml en lugar de la csv. Además esta petición nos devuelve la información de la dirección muy bien codificada.
La último es un truco para ver directamente esas coordenadas en Google Maps, para ello hay que utilizar los parámetros de la página web, que no son públicos pero que unas almas cándidas se han encargado de recopilar en:
http://mapki.com/wiki/Google_Map_Parameters
Por ejemplo si se busca «Alhambra, Granada, ES» me devuelve una sola LatLong que puedo visualizar con un simple ShellExecute montando esta dirección:
http://maps.google.es/maps?z=12&mrt=loc&ie=ISO-8859-1&q=Alhambra,+Granada,+ES+(37.1764874%2C-3.5979291)+@37.1764874,-3.5979291
Ese @37… final es el que me precisa el punto que quiero marcar en Google Maps.
Otra cuestión interesante sería ver ese punto en un TWebBrowser para poder añadir manualmente precisión al punto marcado. Para evitar tener que introducir una key de acceso al API solo habría que montar un archivo html en disco, las peticiones locales no requieren de esa clave. Sin embargo no vale pasarle un stream al WebBrowser.
En mi blog aparecen algunas capturas:
http://criteriumcyp.blogspot.com/2009/04/geocodificar-direcciones.html
Las entradas del mismo están centradas en funcionalidades y cuestiones lógicas del desarrollo de un ERP, por eso no se dan detalles muy técnicos.
@Antonio
Hola Antonio.
Gracias por el comentario. Realmente hay cosas interesantes y además decirte que «parece que nuestra andadura es paralela», ya que hay bastantes similitudes entre lo que explicas que estás haciendo y lo que estoy haciendo yo… ;-D
>> Una es que existe un nivel 9 de precisión
Esta no la sabía.
>> En estos casos se obtiene mas precisión procesando la petición en xml en lugar de la csv…
Acabas de «descubrir» aquí parte del contenido de la segunda parte de este artículo que en sus primeras líneas reza: «…vamos a ver cómo obtener más datos de este servicio de Google Maps.»
>> Otra cuestión interesante sería ver ese punto en un TWebBrowser para poder añadir manualmente precisión al punto marcado.
Bueno, esa es otra cuestión que tengo preparada, y que espero que pronto pueda publicar; Ya tengo disponible la visualización:
(imagen incompleta)
http://img179.imageshack.us/img179/7210/imagen97.jpg
Y estoy trabajando en el modo de interactuar con el mapa para obtener las nuevas coordenadas que el usuario define; Es decir, la idea es mostrar unas coordenadas iniciales (a partir de Dirección, CP, ciudad,…), y que el usuario pueda «corregirlas» (afinarlas) a su gusto y devolver al programa las nuevas coordanas para que se actualicen las que había.
El tema del obtener coordenadas salió de la misma necesidad que la vuestra. Partiendo de direcciones de clientes, proveedores, carga, descarga,…
Incluso esto que comentas en tu blog esta posibilidad:
>>* Geoposicionamiento de recursos: conductores, tractoras, remolques.
* Planificación de cargas a través de datos objetivos de proximidad de los recursos en tránsito.
* Etc
Trabajo en una empresa que se dedica al transporte de mercancía, así que son cosas que también hemos valorado y tenemos en mente… De la necesidad de incorporar estas cuestiones a un ERP, es de donde ha salido esta necesidad.
Ya ves que hay muchas cosas en común. Espero sacar pronto la segunda parte (ya está casi completa) y para entonces tener casi preparada la tercera.
Un saludo.
Aquí tienes un ejemplo sobre cómo poner un flecha sobre un plano de google maps, (puede ser interesante para completar tu excelente post)
http://delphimagic.blogspot.com/2008/10/utilizar-google-maps-en-delphi.html
@Raul
Hola Raul.
Gracias por el link.
Estoy a medias de completar la siguiente entrega y ya va incluído lo que comentas. Tanto colocar una marca, como mostrar una ventana con información de él. Muy buena la información que hay en tu blog.
Gracias.
Un saludo.
Tengo la sensación de que la potencia real en el uso de GoogleEarth está en procesar archivos kml, concretamente su versión comprimida kmz, que entre otras lindezas permite adjuntar imágenes y entiendo que otro tipo de recursos.
Claro que si se pretende interactuar (pasar información) entre nuestra aplicación y googleearth no nos vale.
Muy bueno Neftali, como siempre. :-)
Solo una cosa, al abrir el ejemplo, me dá un error en una propiedad del idHTTP (yo estoy con BDS 2007):
Error reading idhttp2.Request.ProxyPort (does not exists)
Error reading idhttp3.Request.ProxyPort (does not exists)
Voy a seguir leyendo… :-) Saludos….
Hola Fernando.
Creo que la clave no es la versión de Delpohi, sino la versión de las Indy. En mi caso es la 10; Revisa con cuales trabajas.
Un saludo.
De nuevo aquí Neftali, perdona el retraso, he estado de viaje.
Bueno, pues comprobadas las indy, tengo la versión 10.1.5 que, si no me equivoco, son las que vienen con BDS 2007 por defecto.
A ver si actualio a BDS 2010.
Un abrazo.
buenas… te felicito inmensamente por tu gran aporte…
quisiera realizarte una consulta.. es que tengo un listado de los centros educativos de mi pais con las longitudes,latitudes,numero de estudiantes,numero de profesores y nombre de los centros educativos…
en un base de datos, y me gustaria muchisimo poder realizar una adaptacion de tu programa, pero en realidad aun estoy en pañales con este tema, ya logre incluir el nuermo de estudiantes y el resto de la informacion en un tab al escoger alguno de los centros educativos referenciados, pero lo hago por medio del txt llamado lugares y con la conexion ya existente…
mi pregunta es, si fueras tan amable y si tienes el conocimiento de como podria incluir la informacion, pero por medio de una base de datos a la que tengo acceso en sql 2008.
actualmente estoy trabajando en delphi 7 para seguir tus ejemplos…
nuevamente te agradesco muchisimo por tu tiempo
@wesbrrantes
Hola.
Puedes acceder a una Base de Datos SQL Server utilizando la pestaña ADO.
Con un ADOConnection y un ADOTable puedes accedra los datos de las tablas.
Si revisas los ejemplos que vienen con delphi, hay varios sobre ADO.
Échales un vistazo.
Si tienes problemas, o dudas, un sitio donde puedes preguntar y te ayudarán es:
http://www.ClubDelphi.com
Un saludo.
quisiera poder encontrar vehiculos,auto moviles con su matricula, modelo,etc haci como lugares gente,etc
@vernon maldonado cervera
Hola Vernon.
Tal vez deberías explicarte un poco mejor.
No se a qué te refieres con encontrar vehículos, coches,… Que yo sepa en Google no puedes buscar un coche por su matrícula. No al menos que no tengas las coordenadas.
Si posees las coordenadas, en otra de las entradas de esta serie dedicada a «Geolocalización» puedes encontrar cómo hacerlo.
Un saludo.
No anda el link :( . muy buen aporte !! .me interesa muchisimo (Y)
Hola Matias.
Gracias por el aviso; Había cambiado un valor en la configuración de WordPress y algunos enlaces habían dejado de funcionar.
Ya están restaurados.
Un saludo.
muy pero muy amable hermosa de vernon maldonado cervera,a si y como me llama una canciòn ,quiero saber si sobre el metro tambien puedo tener mapas,d.f.ciao.