El formato de la URL que hay que utilizar es:
https://maps.googleapis.com/maps/api/elevation/outputFormat?parameters
El formato de salida puede ser json o xml, en este ejemplo utilizaremos json.
Ejemplo:
https://maps.googleapis.com/maps/api/elevation/json?locations=30.88144,-5.57505
El navegador nos devolvería lo siguiente:
{
"results" :
[
{
"elevation" : 992.9691772460938,
"location" : {
"lat" : 30.88144, "lng" : -5.57505
},
"resolution" : 152.7032318115234
}
],
"status" : "OK"
}
Sabiendo esto, lo único que necesitamos es tratar el resultado para obtener el dato "elevation", con Delphi Berlín tenemos una unit que nos facilita las cosas System.json, también necesitaré algunos de los componentes Indy: idhttp y tidSSLIOHandlerSocketOpenSSL (para obtener el código de páginas https).
También se podría utilizar http en google maps, pero pensando en futuro desarrollos de aplicaciones públicas y dado que estamos utilizando las coordenadas de un usuario, creo que dichas coordenadas se deberían proteger bajo la capa de SSL.
CONFIGURACIÓN:
idhttp1:tidhttp;
ssl1:idSSLIOHandlerSocketOpenSSL;
SSL1.ssloption.method:=sslvtlsv1_2;
SSL1.ssloption.mode:=sslmunassigned;
idhttp1.
IDHTTP1.IOHANDLER:=SSL1 ;
IdHTTP1.HandleRedirects := true;
PROPIEDADES de SSL1;
PROPIEDADES de IDHTTP1:
Como para acceder a GoogleMaps se hace desde una página segura "https" tendremos que utilizar las librerías de INDY para SSL
openssl-0.9.8s-i386-win32.zip y openssl-0.9.8s-x64_86-win64.zip
Los archivos del zip openssl-0.9.8s-i386-win32.zip Se copiarán a la carpeta SYSTEMWOW64 y los archivos del zip openssl-0.9.8s-x64_86-win64.zip irán la carpeta SYSTEM32.
Ya sólo nos queda hacer GET para obtener el json de Google Maps, utilizando como parámetros la latitud y la longitud de un punto de la superficie terrestre.
Texto := IdHTTP1.get('https://maps.googleapis.com/maps/api/elevation/json?locations=' + lat + ',' + long);
Con esto hemos almacenado el archivo en formato json dentro del string "Texto", después necesitamos extraer el dato "elevation", no sin antes comprobar si el "Get" no ha fallado comprobando si devuelve alguno de los siguientes códigos de error:
OK indica que la solicitud de API se realizó con éxito.
INVALID_REQUEST indica que el formato de la solicitud de API era incorrecto.
OVER_QUERY_LIMIT indica que el solicitante excedió su cuota.
REQUEST_DENIED indica que la API no completó la solicitud.
UNKNOWN_ERROR indica un error desconocido.
FUNCTION ObtenerAltitudDesdeGMaps(lat, long: STRING): STRING;
VAR
joStatus, joElev: TJSONObject;
Texto, texto1, estado: STRING;
begin
IF Texto <> '' THEN
BEGIN
// quito los retornos de linea
Texto := stringreplace(Texto, '''#$A''', '', [rfreplaceall]);
joStatus := NIL;
joElev := NIL;
TRY
joStatus := TJSONObject.Create;
joElev := TJSONObject.Create;
TRY
joStatus := TJSONObject.ParseJSONValue(Texto) AS TJSONObject;
joStatus.Parse(BytesOf(Texto), 0);
estado := joStatus.GetValue('status').Value;
//SI GOOGLE MAPS NO HA FALLADO ENTONCES...
IF estado = 'OK' THEN
BEGIN
texto1 := joStatus.GetValue('results').ToString;
texto1 := stringreplace(texto1, '[', '', [rfreplaceall]);
texto1 := stringreplace(texto1, ']', '', [rfreplaceall]);
joElev := TJSONObject.ParseJSONValue(texto1) AS TJSONObject;
joElev.Parse(BytesOf(texto1), 0);
//AQUI OBTENEMOS EL DATO BUSCADO
result := joElev.GetValue('elevation').Value;
END;
EXCEPT
ON E: Exception DO
BEGIN
MessageDlg('Error en parser.-' + E.Message, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);
END;
END;
FINALLY
joStatus.free;
joElev.free;
END;
END;
RESUMEN:
Hemos visto
- Cómo obtener la altitud con Google Maps desde un navegador.
- Cómo obtener el código de una página https con indy y Delphi Berlín.
- Un ejemplo de cómo se parsea un archivo json con Delphi Berlín.
parabéns muito legal seu artigo. Estou acompanhando. abraços
ResponderEliminar