Latitud y longitud en PHP: algunas prácticas útiles
En publicaciones anteriores, escribí un poco sobre cómo trabajar con la API de Google Maps. A decir verdad, no he trabajado con él desde esa publicación.
Sin embargo, he tenido que trabajar con latitud y longitud en PHP, y hay algunas prácticas que he comenzado a usar que creo que nos pueden servir bien cuando trabajamos con coordenadas o valores de punto flotante, en general.
En el siguiente fragmento de código, desglosaré el enfoque que he usado y por qué lo he hecho. Pero quiero dejar claro que si está leyendo esto en relación con la API de Google Maps, no hay mucho que pueda ofrecer sobre cómo funciona esto y la versión actual de su API.
Latitud y longitud en PHP
Cada vez que trabaja con latitud y longitud en PHP, está trabajando con valores de coma flotante, ¿verdad? Así que nunca querrás analizarlos en nada menos que eso; de lo contrario, está perdiendo datos y no podrá localizar lo que sea que esté tratando de localizar.
Entonces, para todos los efectos, supongamos que tiene información que ingresa al servidor y necesita trabajar con ella usando PHP.
Las dos cosas que quieres recordar son:
- desinfectar los datos entrantes,
- asegúrese de que se convierta a un valor de coma flotante.
Esto se puede hacer mediante el uso de las funciones filter_var y floatval de PHP, de las que hablaré en un momento. Tenga en cuenta, sin embargo, que si el resultado de floatval no devuelve un punto flotante, debe tener una forma elegante de manejar eso.
Según el manual, floatval puede devolver lo siguiente:
El valor flotante de la variable dada. Las matrices vacías devuelven 0, las matrices no vacías devuelven 1. Lo más probable es que las cadenas devuelvan 0, aunque esto depende de los caracteres más a la izquierda de la cadena. Se aplican las reglas comunes de fundición flotante.
Veremos cómo manejar esto con más gracia más adelante en la publicación.
Análisis de latitud y longitud entrantes
Supongamos que los valores entrantes están en la colección $_REQUEST de PHP (que se refieren a las solicitudes HTTP que ingresan al servidor) codificadas como acme-demo-latitude y acme-demo-longitude.
Podemos recuperarlos así :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Pero esto no es suficiente. Primero, necesitamos usar filter_var para asegurarnos de que los datos estén desinfectados y sigan el esquema de punto flotante :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
A continuación, encuentro útil usar floatval para analizar el resultado como un valor de punto flotante. Esto deja el siguiente bloque de código con este aspecto :
<?php
$latitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
$longitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
Después de lo cual eres libre de usarlo. Pero recuerde, aún debemos asegurarnos de que los valores devueltos sean valores de punto flotante.
Validación de los datos
Ahora que tenemos la información, debemos asegurarnos de que se vea bien. Y si no es así, tenemos que manejarlo apropiadamente. Si no es así, simplemente podemos:
- devuelve falso de la función de la que está contenido,
- lanzar una excepción y permitir que la persona que llama lo maneje como mejor le parezca.
Cada uno de estos ejemplos puede verse así :
<?php
// Return false...
if (! (is_float( $latitude) && is_float( $longitude) )) {
return false;
}
// Or throw an exception...
if (! (is_float( $latitude) && is_float( $longitude) )) {
throw new Exception('Latitude and longitude are not valid floating point values.');
}
Sin embargo, en última instancia, la decisión es suya sobre cómo manejar los valores cuando no están en el formato adecuado una vez que los analiza.
¿Son estas mejores prácticas?
Para ser honesto, lo dudo. Sé que estas son las cosas que he estado usando y que he encontrado útiles. También proporciona una forma defensiva y resistente de asegurarse de que sus valores sean correctos.
Pero si hay mejores formas de hacer esto, estoy abierto a escucharlas en los comentarios.