Análise e probasCRM e plataformas de datosFerramentas de mercadotecnia

Calcula ou consulta a distancia dun círculo grande entre puntos de latitude e lonxitude usando a fórmula Havesine (Exemplos PHP, JavaScript, Java, Python, MySQL, MSSQL)

Este mes estiven programando en PHP e MySQL para GIS. Mentres investigaba o tema, tiven dificultades para atopalo cálculos xeográficos para atopar a distancia entre dúas localizacións, así que quería compartilas aquí.

Mapa de voos Europa con gran círculo de distancia

A forma sinxela de calcular a distancia entre dous puntos é empregando a fórmula pitagórica para calcular a hipotenusa dun triángulo (A² + B² = C²). Isto coñécese como Distancia euclidiana.

Ese é un comezo interesante, pero non se aplica á xeografía xa que a distancia entre as liñas de latitude e lonxitude son distancias non iguais entre si. A medida que te achegas ao ecuador, as liñas de latitude vanse separando. Se usas unha ecuación de triangulación sinxela, pode medir a distancia con precisión nun lugar e incorrecta no outro debido á curvatura da Terra.

Distancia Gran Círculo

As rutas que percorreron longas distancias arredor da Terra coñécense como a Distancia do Gran Círculo. É dicir... a distancia máis curta entre dous puntos dunha esfera difire dos puntos dun mapa plano. Combínao co feito de que as liñas de latitude e lonxitude non son equidistantes... e tes un cálculo difícil.

Aquí tes unha fantástica explicación en vídeo de como funcionan os grandes círculos.

A Fórmula Haversine

A distancia que utiliza a curvatura da Terra incorpórase á fórmula de Havesine, que utiliza a trigonometría para permitir a curvatura da Terra. Cando estás atopando a distancia entre dous lugares da Terra (en liña recta), unha liña recta é en realidade un arco.

Isto é aplicable no voo aéreo. Miraches algunha vez o mapa real dos voos e observaches que están arqueados? Isto é porque voar nun arco entre dous puntos é máis curto que directamente ao lugar.

PHP: calcular a distancia entre 2 puntos de latitude e lonxitude

Aquí tes a fórmula PHP para calcular a distancia entre dous puntos (xunto coa conversión de millas a quilómetro) redondeada a dous decimais.

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)); 
}

As variables son:

  • $Latitude1 – unha variable para a latitude da súa primeira localización.
  • $Lonxitude1 – unha variable para a lonxitude da súa primeira localización
  • $Latitude2 – unha variable para a latitude da súa segunda localización.
  • $Lonxitude2 – unha variable para a lonxitude da súa segunda localización.
  • $unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.

Java: calcula a distancia entre 2 puntos de latitude e lonxitude

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;
    }
}

As variables son:

  • latitude 1 – unha variable para a latitude da súa primeira localización.
  • lonxitude 1 – unha variable para a lonxitude da súa primeira localización
  • latitude 2 – unha variable para a latitude da súa segunda localización.
  • lonxitude 2 – unha variable para a lonxitude da súa segunda localización.
  • unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.

JavaScript: calcula a distancia entre 2 puntos de latitude e lonxitude

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);
    }
}

As variables son:

  • latitude 1 – unha variable para a latitude da súa primeira localización.
  • lonxitude 1 – unha variable para a lonxitude da súa primeira localización
  • latitude 2 – unha variable para a latitude da súa segunda localización.
  • lonxitude 2 – unha variable para a lonxitude da súa segunda localización.
  • unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.

Python: calcula a distancia entre 2 puntos de latitude e lonxitude

Aquí tes a fórmula de Python para calcular a distancia entre dous puntos (xunto coa conversión de millas a quilómetros) redondeada a dous decimais. Crédito a meu fillo, Bill Karr, un científico de datos OpenINSIGHTS, para o 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)

As variables son:

  • latitude 1 – unha variable para a súa primeira localización latitud.
  • lonxitude 1 – unha variable para a súa primeira localización lonxitude
  • latitude 2 – unha variable para a súa segunda localización latitud.
  • lonxitude 2 – unha variable para a súa segunda localización lonxitude.
  • unidade - o ser por defecto millas. Isto pódese actualizar ou pasar como quilómetros.

MySQL: recuperando todos os rexistros dentro dun intervalo calculando a distancia en millas usando latitude e lonxitude

Usar tipos de datos espaciais en MySQL é un xeito máis eficiente e cómodo de traballar con datos xeográficos, incluíndo o cálculo de distancias entre puntos. MySQL admite tipos de datos espaciais como POINT, LINESTRINGe POLYGON, xunto con funcións espaciais como ST_Distance.

Cando empregas o ST_Distance función en MySQL con datos xeográficos representados como POINT coordenadas, ten en conta a curvatura da superficie terrestre. O modelo esférico utilizado por ST_Distance emprega a fórmula de Havesine. Esta aproximación é adecuada para a maioría dos propósitos prácticos, pero pode introducir pequenas imprecisións para distancias moi longas.

Vexa como podes calcular distancias entre dous puntos usando Tipos de datos espaciais:

  1. Crea unha táboa con tipo de datos espaciais: Primeiro, crea unha táboa con a POINT columna para almacenar puntos xeográficos. Por exemplo:
CREATE TABLE locations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    coordinates POINT
);

Insira os seus puntos xeográficos nesta táboa usando o 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. Calcula a distancia usando ST_Distance: pode calcular a distancia entre dous puntos usando o ST_Distance función. Aquí tes un exemplo de consulta para calcular a distancia entre dous 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;

Substituír 1 2 cos ID dos dous puntos que quere calcular a distancia entre.

  1. Resultado: A consulta devolverá a distancia entre os dous puntos en millas.

Usando tipos de datos espaciais e ST_Distance proporciona unha forma máis eficiente e precisa de traballar con datos xeográficos en MySQL. Tamén simplifica o cálculo de distancias entre puntos, facilitando a xestión e consulta dos seus datos.

MySQL: recuperando todos os rexistros dentro dun intervalo calculando a distancia en quilómetros usando a latitude e a lonxitude

Por defecto ST_Distance devolve a distancia en metros, polo que só tes que actualizar a consulta de quiló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 xeográfica de Microsoft SQL Server: STDistance

Se estás utilizando Microsoft SQL Server, ofrecen a súa propia función, Distancia ST para calcular a distancia entre dous puntos utilizando o tipo de datos Xeography.

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);  

Punta de sombreiro para Manash Sahoo, fundador e arquitecto senior de Ion Tres.

Douglas Karr

Douglas Karr é CMO de OpenINSIGHTS e o fundador da Martech Zone. Douglas axudou a decenas de startups exitosas de MarTech, axudou na debida dilixencia de máis de 5 millóns de dólares en adquisicións e investimentos en Martech e segue axudando ás empresas a implementar e automatizar as súas estratexias de vendas e mercadotecnia. Douglas é un experto e relator de MarTech en transformación dixital recoñecido internacionalmente. Douglas tamén é autor publicado dunha guía de Dummie e dun libro de liderado empresarial.

artigos relacionados

Botón de volta ao principio
preto

Adblock detectado

Martech Zone pode fornecerche este contido sen ningún custo porque monetizamos o noso sitio mediante ingresos publicitarios, ligazóns de afiliados e patrocinios. Agradeceríamos que elimines o teu bloqueador de anuncios mentres visitas o noso sitio.