Análisis y pruebasCRM y plataformas de datosHerramientas de marketing

Calcule o consulte la distancia del gran círculo entre puntos de latitud y longitud utilizando la fórmula de Haversine (ejemplos de PHP, JavaScript, Java, Python, MySQL, MSSQL)

Este mes he estado programando en PHP y MySQL para GIS. Mientras investigaba el tema, tuve dificultades para encontrar cálculos geográficos para encontrar la distancia entre dos ubicaciones, así que quería compartirlas aquí.

Mapa de vuelo de Europa con gran distancia circular

La forma sencilla de calcular una distancia entre dos puntos es utilizar la fórmula de Pitágoras para calcular la hipotenusa de un triángulo (A² + B² = C²). Esto se conoce como distancia euclidiana.

Es un comienzo interesante, pero no se aplica a la geografía ya que la distancia entre las líneas de latitud y longitud son distancias no iguales entre sí. A medida que nos acercamos al ecuador, las líneas de latitud se alejan. Si se utiliza una ecuación de triangulación simple, es posible que mida la distancia con precisión en un lugar y incorrectamente en el otro debido a la curvatura de la Tierra.

Gran distancia del círculo

Las rutas recorridas largas distancias alrededor de la Tierra se conocen como la Gran Distancia del Círculo. Es decir… la distancia más corta entre dos puntos en una esfera difiere de los puntos en un mapa plano. Combina eso con el hecho de que las líneas de latitud y longitud no son equidistantes... y tienes un cálculo difícil.

Aquí hay una fantástica explicación en video de cómo funcionan Great Circles.

La fórmula de Haversine

La distancia que utiliza la curvatura de la Tierra se incorpora en la fórmula de Haversine, que utiliza la trigonometría para tener en cuenta la curvatura de la Tierra. Cuando estás encontrando la distancia entre 2 lugares en la Tierra (a vuelo de pájaro), una línea recta es en realidad un arco.

Esto es aplicable en vuelos aéreos: ¿alguna vez miró el mapa real de vuelos y notó que están arqueados? Eso es porque volar en un arco entre dos puntos es más corto que directamente a la ubicación.

PHP: Calcule la distancia entre 2 puntos de latitud y longitud

Aquí está la fórmula de PHP para calcular la distancia entre dos puntos (junto con la conversión de Milla a Kilómetro) redondeada a dos decimales.

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
  $theta = $longitude1 - $longitude2; 
  $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
  $distance = acos($distance); 
  $distance = rad2deg($distance); 
  $distance = $distance * 60 * 1.1515; 
  switch($unit) { 
    case 'miles': 
      break; 
    case 'kilometers' : 
      $distance = $distance * 1.609344; 
  } 
  return (round($distance,2)); 
}

Las variables son:

  • $Latitud1 – una variable para la latitud de su primera ubicación.
  • $Longitud1 – una variable para la longitud de su primera ubicación
  • $Latitud2 – una variable para la latitud de su segunda ubicación.
  • $Longitud2 – una variable para la longitud de su segunda ubicación.
  • $unidad – el valor predeterminado es millas. Esto se puede actualizar o pasar como kilómetros.

Java: calcular la distancia entre 2 puntos de latitud y longitud

public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
    double theta = longitude1 - longitude2;
    double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit.equals("miles")) {
        return Math.round(distance, 2);
    } else if (unit.equals("kilometers")) {
        return Math.round(distance * 1.609344, 2);
    } else {
        return 0;
    }
}

Las variables son:

  • latitud1 – una variable para la latitud de su primera ubicación.
  • longitud1 – una variable para la longitud de su primera ubicación
  • latitud2 – una variable para la latitud de su segunda ubicación.
  • longitud2 – una variable para la longitud de su segunda ubicación.
  • unidad – el valor predeterminado es millas. Esto se puede actualizar o pasar como kilómetros.

JavaScript: calcular la distancia entre 2 puntos de latitud y longitud

function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
    let theta = longitude1 - longitude2;
    let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
        Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) + 
        Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
    );
    if (unit == 'miles') {
        return Math.round(distance, 2);
    } else if (unit == 'kilometers') {
        return Math.round(distance * 1.609344, 2);
    }
}

Las variables son:

  • latitud1 – una variable para la latitud de su primera ubicación.
  • longitud1 – una variable para la longitud de su primera ubicación
  • latitud2 – una variable para la latitud de su segunda ubicación.
  • longitud2 – una variable para la longitud de su segunda ubicación.
  • unidad – el valor predeterminado es millas. Esto se puede actualizar o pasar como kilómetros.

Python: calcula la distancia entre 2 puntos de latitud y longitud

Aquí está la fórmula de Python para calcular la distancia entre dos puntos (junto con la conversión de millas a kilómetros) redondeada a dos decimales. Crédito a mi hijo, Bill Karr, científico de datos de AbrirINSIGHTS, para el código.

from numpy import sin, cos, arccos, pi, round

def rad2deg(radians):
    degrees = radians * 180 / pi
    return degrees

def deg2rad(degrees):
    radians = degrees * pi / 180
    return radians

def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
    
    theta = longitude1 - longitude2
    
    distance = 60 * 1.1515 * rad2deg(
        arccos(
            (sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) + 
            (cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
        )
    )
    
    if unit == 'miles':
        return round(distance, 2)
    if unit == 'kilometers':
        return round(distance * 1.609344, 2)

Las variables son:

  • latitud1 – una variable para su primera ubicación latitud.
  • longitud1 – una variable para su primera ubicación longitud
  • latitud2 – una variable para su segunda ubicación latitud.
  • longitud2 – una variable para su segunda ubicación longitud.
  • unidad – el valor predeterminado es millas. Esto se puede actualizar o pasar como kilómetros.

MySQL: recuperación de todos los registros dentro de un rango calculando la distancia en millas usando la latitud y la longitud

Usar tipos de datos espaciales en MySQL es una forma más eficiente y conveniente de trabajar con datos geográficos, incluido el cálculo de distancias entre puntos. MySQL admite tipos de datos espaciales como POINT, LINESTRINGy POLYGON, junto con funciones espaciales como ST_Distance.

Cuando se utiliza el ST_Distance funcionar en MySQL con datos geográficos representados como POINT coordenadas, tiene en cuenta la curvatura de la superficie de la Tierra. El modelo esférico utilizado por ST_Distance Emplea la fórmula de Haversine. Esta aproximación es adecuada para la mayoría de los fines prácticos, pero puede introducir ligeras imprecisiones para distancias muy largas.

Así es como puedes calcular distancias entre dos puntos usando tipos de datos espaciales:

  1. Crear una tabla con tipo de datos espaciales: Primero, cree una tabla con un POINT Columna para almacenar puntos geográficos. Por ejemplo:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Inserte sus puntos geográficos en esta tabla usando el POINT constructor:

INSERT INTO locations (name, coordinates)
VALUES
    ('Point A', POINT(40.7128, -74.0060)), -- New York City
    ('Point B', POINT(34.0522, -118.2437)); -- Los Angeles
  1. Calcular distancia usando ST_Distance: Puede calcular la distancia entre dos puntos utilizando el ST_Distance función. Aquí hay una consulta de ejemplo para calcular la distancia entre dos puntos:
SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1609.344) AS distance_in_miles
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

Reemplaza 1 y 2 con los ID de los dos puntos entre los que desea calcular la distancia.

  1. Resultado: La consulta devolverá la distancia entre los dos puntos en millas.

Uso de tipos de datos espaciales y el ST_Distance La función proporciona una forma más eficiente y precisa de trabajar con datos geográficos en MySQL. También simplifica el cálculo de distancias entre puntos, facilitando la gestión y consulta de sus datos.

MySQL: recuperación de todos los registros dentro de un rango mediante el cálculo de la distancia en kilómetros utilizando la latitud y la longitud

Por defecto ST_Distance devuelve la distancia en metros, por lo que simplemente necesitas actualizar la consulta en kilómetros:

SELECT
    id1,
    id2,
    (ST_Distance(coordinates1, coordinates2) / 1000) AS distance_in_kilometers
FROM (
    SELECT
        l1.id AS id1,
        l2.id AS id2,
        l1.coordinates AS coordinates1,
        l2.coordinates AS coordinates2
    FROM
        locations l1,
        locations l2
    WHERE
        l1.id = 1 AND l2.id = 2
) AS distances;

Distancia geográfica de Microsoft SQL Server: STDistance

Si está utilizando Microsoft SQL Server, ofrecen su propia función, Distancia ST para calcular la distancia entre dos puntos utilizando el tipo de datos Geografía.

DECLARE @g geography;  
DECLARE @h geography;  
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);  
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);  
SELECT @g.STDistance(@h);  

Un saludo a Manash Sahoo, fundador y arquitecto senior de Ión tres.

Douglas Karr

Douglas Karr es CMO de AbrirINSIGHTS y el fundador de la Martech Zone. Douglas ha ayudado a docenas de nuevas empresas exitosas de MarTech, ha colaborado en la diligencia debida de más de $5 mil millones en adquisiciones e inversiones de Martech y continúa ayudando a las empresas a implementar y automatizar sus estrategias de ventas y marketing. Douglas es un orador y experto en transformación digital y MarTech reconocido internacionalmente. Douglas también es autor de una guía para principiantes y de un libro sobre liderazgo empresarial.

Artículos Relacionados

Volver al botón superior
Cerrar

Adblock detectado

Martech Zone puede proporcionarle este contenido sin costo porque monetizamos nuestro sitio a través de ingresos publicitarios, enlaces de afiliados y patrocinios. Le agradeceríamos que elimine su bloqueador de anuncios mientras visita nuestro sitio.