Pregunta original Comprobar si una latitud y longitud está dentro de un círculo
Me gustaría saber cómo se puede lograr esto usando PHP. Tengo una serie de latitudes y longitudes y me gustaría probarlas con otra serie de latitudes/longitudes para dar un escenario verdadero/falso
He preparado el fragmento de código de muestra para usted. Está funcionando bien para mí. Siéntete libre de adaptarte con tu propia lógica.
$lat1 = "10.5900627"; $lon1 = "77.1933317"; $lat2 = "10.6068507"; $lon2 = "77.117246"; function distance($lat1, $lon1, $lat2, $lon2, $unit) { if (($lat1 == $lat2) && ($lon1 == $lon2)) { return 0; } else { $theta = $lon1 - $lon2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; $unit = strtoupper($unit); if ($unit == "K") { return ($miles * 1.609344); } else if ($unit == "N") { return ($miles * 0.8684); } else { return $miles; } } } if(distance($lat1, $lon1, $lat2, $lon2, "K") < 10) { echo "True"; } else { echo "False"; }Si el resultado de 'K' es inferior a 10 km, obtendrá el resultado como "Verdadero". De lo contrario, se devolverá 'Falso' como resultado.
Lo haría de esta manera, primero necesitaré calcular la distancia entre dos puntos (este es un método similar al de Google Maps: https://stackoverflow.com/a/53069194/7071905 ):
function computeDistance($lat1, $lng1, $lat2, $lng2, $radius) { static $x = M_PI / 180; $lat1 *= $x; $lng1 *= $x; $lat2 *= $x; $lng2 *= $x; $distance = 2 * asin(sqrt(pow(sin(($lat1 - $lat2) / 2), 2) + cos($lat1) * cos($lat2) * pow(sin(($lng1 - $lng2) / 2), 2))); return $distance * $radius; }Luego, necesitaré una función simple con el punto base (el centro) para volver verdadero cuando la distancia sea inferior a 10 kilómetros ($ KM):
function isWithinCircle($lat, $lng, $KM = 10): bool { $baseLat = 0; $baseLng = 0; $radius = 6378137; return computeDistance($baseLat, $baseLng, $lat, $lng, $radius) <= $KM; }