Distancia entre 2 puntos geográficos


#1

Hola! Estoy intentando calcular la distancia entre dos puntos geográficos, tiene que tener en cuenta la esfericidad de la tierra. Vi que existe https://en.wikipedia.org/wiki/Haversine_formula (en R: geosphere::distHaversine). ¿Alguien sabe cual es el cálculo mas exacto (y en R)? (y que coincida con el de google map, ya que heversine no lo hace). Gracias!


#2

Hola Pablo! Según el caso, normalmente debería servir sp::spDists(), sp::spDistsN1() o raster::pointDistance(), aunque este último suele ser un proceso menos eficiente.


#3

Gracias! Ahi me pasaron la solucion y la verifique con google maps

Funciona con mas precision que la funcion de haversine:

dist2 <- function(lat_a, lon_a, lat_b, lon_b) 
{
  res=(acos(sin(lat_a * 0.01745329252) * sin(lat_b * 0.01745329252) + (cos(lat_a * 0.01745329252) * cos(lat_b * 0.01745329252) * cos(lon_a * 0.01745329252 - lon_b * 0.01745329252))) * 57.29577951 * 111.194)
  res
}

dist2(lat_a=-6.99,lon_a=-37.34, lat_b=48.19, lon_b=11.64)
[1] 7772.96

#4

Hola,
ojo que esta solución depende de la proyección en que estén las coordenadas. Supongo que en este caso son coordenadas WGS 84 / Pseudo-Mercator (https://epsg.io/3857) que es lo que usa Google Maps y la mayoría de los servicios geográficos web.
Sin embargo, la función distHaversine usa coordenadas en WGS84 - World Geodetic System 1984 (https://epsg.io/4326 la proyección que usan los GPS). En general el paquete “geosphere” interpreta la tierra como una esfera (o aproximación de una esfera) y por tanto usa geometría angular.

Si querés una solución mas general, deberías probar de transformar tus datos a epsg:4326 con spTransform(“tu objeto sp”, CRS("+init=epsg:4326")). Así, si te encontrás con coordenadas que no son de Google Maps, podes igual calcular la distancia.

Saludos

Edicion: las coordenadas estan en epgs:4326 (las del GPS). No hace falta transformarlas.
aca agrego codigo de la funcion y resultado:
puntos <- data.frame(id=c(“a”,“b”), lat=c(-6.99, 48.19), lon=c(-37.34, 11.64))
coordinates(puntos) <- c(“lon”, “lat”)
# proj4string(puntos) <- CRS("+init=epsg:3857")
proj4string(puntos) <- CRS("+init=epsg:4326")
distHaversine(coordinates(puntos)[1,], coordinates(puntos)[2,]) / 1000 # la funcion devuelve metros por default

[1] 7781.732 (km)

Para mas exactitud se aconseja “distVincentyEllipsoid”
distVincentyEllipsoid(coordinates(puntos)[1,], coordinates(puntos)[2,] )/1000
[1] 7759.518 (km)


#5

Gracias Alejandro! ahi volvi a revisar y basado en lo que dijiste voy a usar la distancia “vicenty ellipsoid” ( distVincentyEllipsoid de geosphere). Para referencia: stackoverflow.