Buenas,
Pasando el rato por internet, yendo de página en página para pasar el rato, me topé con el blog de un viejo conocido, Neftalí. En él vi que, en cuatro muy buenos mensajes, explicaba cómo se consultaba y mostraba en un programa Delphi información de Google Maps.
La verdad es que me gustó mucho el tema y nunca se me hubiera pasado por la cabeza el usar Google Maps en una aplicación Delphi. Desde aquí le doy las gracias por abrirme los ojos, jejeje
Interesado en el tema, empecé a investigarlo y me di cuenta que lo explicado por Neftalí (y otras webs consultadas) nos mostraban el uso de la v2 de la API de Google Maps la cual, actualmente está marcada en desuso. Así que decidí dedicar algo de tiempo a actualizar estas demos encontradas a la nueva versión de la API, la v3.
La GeoCodificación
Como la propia web del API de Google Maps dice, «la GeoCodificación es el proceso de convertir una dirección (como «1600 Amphitheatre Parkway, Mountain View, CA») en coordenadas geográficas (como latitud 37.423021 y longitud -122.083739), que pueden usarse para poner marcas o posiciones en el mapa«.
Aunque podemos encontrar toda la documentación sobre la API de GeoCodificación aquí y su uso no sea demasiado complejo, vamos a explicar cómo funciona.
La idea es sencilla: se realiza una llamada a una determinada URL con una serie de parámetros y Google Maps nos devuelve un resultado formateado como le hayamos indicado.
Aquí tenemos la primera diferencia entre la V2 y la V3. En la primera, el formato devuelto era un parámetro más de la llamada y tenía 4 formatos posibles. En cambio, en la V3 el formato no es una parámetro y sólo tiene dos posibles salidas, o JSON o XML.
La url a la que se tiene que realizar la llamada es la siguiente:
http://maps.google.com/maps/api/geocode/output?parameters
Donde output define el formato de salida pudiendo ser json o xml quedando url como estas:
http://maps.google.com/maps/api/geocode/json?parameters
http://maps.google.com/maps/api/geocode/xml?parameters
Y los parámetros son los siguientes:
- address o latlng: obligatorio. Es la dirección que queremos GeoCodificar (no puede contener espacios, hay que sustituirlos por un «+») o bien las coordenadas geográficas directamente. Ej: ?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA
- sensor: obligatorio. Indica si el dispositivo desde el que se hace la petición dispone de sensor de localización. Ej: &sensor=false
- language: opcional. Determina el idioma de salida. Si no se indica, se intentará usar el idioma del dominio que realiza la petición (si es posible), sino se tomará el inglés. Ej: &language=es. Lista de idiomas soportados.
- region: opcional. Código de la región en formato ccTLD (country code top-level domain). La mayoría de códigos ccTLD corresponden a los códigos ISO 3166-1, aunque hay exepciones. Ej: ®ion=es
- bounds: opcional. Especifica una zona geográfica en la que buscar de forma preferida. Se realiza mediante la definición de un cuadro especificando sus lados noreste y suroeste separados por la barra vertical (|). Ej: &bounds=34.172684,-118.604794|34.236144,-118.500938
Una vez explicada la teoría, el implementar ésto en Delphi no resulta complicado. Bastará con tener un TEdit donde introducir la dirección a buscar, un TButton donde pondremos el código de la llamada, un TIdHTTP con el que realizar la petición web y un TMemo en el que mostrar el resultado obtenido. El código del TButton debería de ser algo así:
const CHAR_SPACE = ' '; CHAR_PLUS = '+'; STR_WEB = 'http://maps.google.com/maps/api/geocode/json?address='; STR_SENSOR = '&sensor=false'; STR_REGION = '®ion=es'; var Str: string; Stream: TStringStream; begin Stream := TStringStream.Create(''); try // sustituimos blancos por signo + Str := AnsiReplaceStr(Edit1.Text, CHAR_SPACE, CHAR_PLUS); // generamos url con parámetros Str := STR_WEB + Str + STR_SENSOR + STR_REGION; // hacemos petición a la API de Google IdHTTP.Get(Str, Stream); // pasamos de UTF8 a string Memo1.Lines.Text := UTF8ToString(Stream.DataString); finally if Assigned(Stream) then FreeAndNil(Stream); end; end;
No olvidemos de incluir en la cláusula uses la unit StrUtils.
Continuará……
Nos leemos
Me parecio muy interesante lo q estabas desarrolllando. es lo que tengo que hacer en estos momentos.
Por favor dime como sigue. Desde Ya muchas Gracias
Hola Roberto
Gracias por probar los componentes. Dime qué parte te corre más prisa y puedo mirar de centrarme en ello 😉
Nos leemos
cadetill
Excelente tema, justo estaba investigando sobre este tema y algo no me queda claro y es en cuanto a las cantidad de solicitudes de geocodificacion que puedan realizarse sin costo, ya que dentro de las documentaciones establecen un límite de 2500 consultas por día y hasta ahora nadie puede responderme como afecta, por ejemplo, a la hora de realizar seguimiento via gps de vehiculos, ya que existen numerosos software’s que acceden a gmaps para su localización y hasta donde interpreto, la ubicación, en manera de marcador, en gmaps es una solicitud de geocodificación, entonces si el límite es 2500 y tengo una flota de 500 vehiculos, solamante podrán localizarse 5 veces al día?
Y eso que los software de localización son ofertados por poco precio, con cantidad ilimitada de seguimiento de vehiculos, siendo que google ofrece sus apis con acceso ilimitado por valores de 10.000 U$S y 15US$ por vehiculo, en una modalidad llamada «Google maps api premier para la localización y seguimiento de activos». Entonces como hacen estas empresas para ofrecer la localización sin abonar a google lo establecido?
Hola Rodrigo
La verdad es que no sabría decirte, pero si yo tubiera que hacer algo parecido, miraría de tirar por lo que se explica aquí
Espero te sirva
Nos leemos
cadetill
me gustaria si me puedes ayudar a migrar un codigo api google map v2 a v3
!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»>
Obtener coordenadas de google maps
<!– –>
} catch(err) {};
//<![CDATA[
// Inicialización de variables.
var map = null;
var geocoder = null;
var Url = location.href;
function load() { // Abre LLAVE 1.
try {
if (GBrowserIsCompatible()) { // Abre LLAVE 2.
Variables = Url.split("?");
document.form_mapa.address.value = Variables[1] ;
map = new GMap2(document.getElementById("map"));
//map.setCenter(new GLatLng(37.567236,-1.803499), 15);
map.setCenter(new GLatLng(-33.4616667,-70.6336855),11);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
geocoder = new GClientGeocoder();
showAddress(Variables[1],11);
//———————————//
// MARCADOR AL HACER CLICK
//———————————//
GEvent.addListener(map, "click",
function(marker, point) {
if (marker) {
null;
} else {
map.clearOverlays();
var marcador = new GMarker(point);
map.addOverlay(marcador);
//marcador.openInfoWindowHtml("Coordenadas:Latitud : «+point.y+»Longitud : «+point.x+»Fotografias«);
//marcador.openInfoWindowHtml(«Coordenadas: «+point.y+»,»+point.x);
//document.form_mapa.coordenadas.value = «Latitude:»+point.y+»Longitude:»+point.x;
}
}
);
//———————————//
// FIN MARCADOR AL HACER CLIC
//———————————//
} // Cierra LLAVE 1.
}
catch(err)
{ document.form_mapa.coordenadas.value =»»;
document.title=»Latitude:»;
}
} // Cierra LLAVE 2.
//———————————//
// GEOCODER
//———————————//
function showAddress(address, zoom) {
if (geocoder) {
geocoder.getLatLng(address,
function(point) {
if (!point) {
document.form_mapa.coordenadas.value =»Sin Coordenadas»;
document.title=»Latitude:»;
//alert(address + » not found»);
} else {
//comentado el 2009-07-31
//map.setCenter(point, zoom);
//var marker = new GMarker(point);
//map.addOverlay(marker);
// fin del comentado 2009-07-31
//marker.openInfoWindowHtml(««+address+»Coordenadas:Latitud : «+point.y+»Longitud : «+point.x+»Fotografias«);
// marker.openInfoWindowHtml(«Coordenadas: «+point.y+»,»+point.x);
document.form_mapa.coordenadas.value = «Latitude:»+point.y+»Longitude:»+point.x // point.y+»,»+point.x;
//window.status=»Latitude:»+point.y+»Longitude:»+point.x;
document.title=»Latitude:»+point.y+»Longitude:»+point.x;
}
}
);
}}
//———————————//
// FIN DE GEOCODER
//———————————//
//]]>
Dirección a buscar:
Coordenadas
:
Buenas
Esto por aquí no lo haremos. Si quieres, puedes mandarme un correo y miramos de hacer alguna cosa en privado.
Saludos
Gracias. se sirvió de mucho a terminar parte del proyecto….