¿Cómo convertir la latitud o longitud a metros?

127

Si tengo una lectura de latitud o longitud en formato NMEA estándar, ¿hay una forma / fórmula fácil de convertir esa lectura a metros, que luego puedo implementar en Java (J9)?

Editar: Ok, parece que lo que quiero hacer no es posible fácilmente , sin embargo, lo que realmente quiero hacer es:

Supongamos que tengo un punto intermedio largo y largo y un usuario largo y largo ¿hay una manera fácil de compararlos para decidir cuándo decirle al usuario que están dentro de una distancia razonablemente cercana al punto intermedio? Me doy cuenta de que razonable es el tema, pero ¿es esto fácilmente factible o todavía es demasiado matemático?

Adam Taylor
fuente
2
¿Te refieres a UTM? en.wikipedia.org/wiki/…
Adrian Archer
1
¿Qué quieres decir con convertir un lat / long a metros? metros de donde? ¿Estás buscando una manera de calcular la distancia a lo largo de la superficie de la tierra de una coordenada a otra?
Baltimark
2
Definir "waypoint". Definir "razonable". ¿Es esto realmente lo que quieres saber: "cómo calculas la distancia entre dos puntos dada su latitud y longitud?"
Baltimark
2
Me topé con esta pregunta que quería hacer consultas SQL sobre la latitud y la longitud y encontré este gran artículo con un código Java en la parte inferior. También te puede interesar.
Kristof Van Landschoot

Respuestas:

173

Aquí hay una función de JavaScript:

function measure(lat1, lon1, lat2, lon2){  // generally used geo measurement function
    var R = 6378.137; // Radius of earth in KM
    var dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
    var dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
    Math.sin(dLon/2) * Math.sin(dLon/2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    var d = R * c;
    return d * 1000; // meters
}

Explicación: https://en.wikipedia.org/wiki/Haversine_formula

La fórmula de Haversine determina la distancia del gran círculo entre dos puntos en una esfera dadas sus longitudes y latitudes.

bh-
fuente
2
Para aquellos que buscan una biblioteca para convertir entre wgs y utm: github.com/urbanetic/utm-converter
Aram Kocharyan
3
Estaría realmente agradecido si alguien pudiera agregar algunos comentarios explicativos sobre el código anterior. ¡Gracias por adelantado!
Ravindranath Akila
Encontré esto que este comentario parece ser una adopción. El enlace también dice que se basa en este artículo sobre cálculo de distancia. Por lo tanto, cualquier pregunta sin respuesta se debe encontrar en el enlace original. :)
Joachim
¿Cómo agrego elevación a este cálculo?
dangalg hace
62

Dado que está buscando una fórmula simple, esta es probablemente la forma más sencilla de hacerlo, suponiendo que la Tierra es una esfera con una circunferencia de 40075 km.

Longitud en metros de 1 ° de latitud = siempre 111.32 km

Longitud en metros de 1 ° de longitud = 40075 km * cos (latitud) / 360

Ben
fuente
2
¿Cómo funciona la ecuación de longitud? con una latitud de 90 grados, esperarías que muestre cerca de 111 km; pero en cambio muestra 0; de manera similar, los valores cercanos también están cerca de 0.
Reece
9
La latitud es 0 ° en el ecuador y 90 ° en el polo (y no lo contrario). Para el ecuador, la fórmula da 40075 km * cos (0 °) / 360 = 111 km. Para el polo, la fórmula da 40075 * cos (90 °) / 360 = 0 km.
Ben
Creo que este enfoque es simple, especialmente porque la pregunta no pedía la distancia exacta entre dos puntos, sino más bien si están "lo suficientemente cerca". Con estas fórmulas, verificamos fácilmente si el usuario está dentro de un cuadrado centrado en el punto de referencia . Es mucho más simple verificar un cuadrado que un círculo.
Ben
29

Para aproximar distancias cortas entre dos coordenadas, utilicé fórmulas de http://en.wikipedia.org/wiki/Lat-lon :

m_per_deg_lat = 111132.954 - 559.822 * cos( 2 * latMid ) + 1.175 * cos( 4 * latMid);
m_per_deg_lon = 111132.954 * cos ( latMid );

.

En el siguiente código, he dejado los números en bruto para mostrar su relación con la fórmula de wikipedia.

double latMid, m_per_deg_lat, m_per_deg_lon, deltaLat, deltaLon,dist_m;

latMid = (Lat1+Lat2 )/2.0;  // or just use Lat1 for slightly less accurate estimate


m_per_deg_lat = 111132.954 - 559.822 * cos( 2.0 * latMid ) + 1.175 * cos( 4.0 * latMid);
m_per_deg_lon = (3.14159265359/180 ) * 6367449 * cos ( latMid );

deltaLat = fabs(Lat1 - Lat2);
deltaLon = fabs(Lon1 - Lon2);

dist_m = sqrt (  pow( deltaLat * m_per_deg_lat,2) + pow( deltaLon * m_per_deg_lon , 2) );

La entrada de Wikipedia dice que los cálculos de distancia están dentro de 0,6 m por 100 km longitudinalmente y 1 cm por 100 km latitudinalmente, pero no he verificado esto ya que cerca de esa precisión está bien para mi uso.

JJones
fuente
3
Tenga en cuenta que en 2017 la página de Wikipedia tiene otra fórmula (parece refinada).
Gorka Llona
3
Sí, la fórmula en Wikipedia es ligeramente diferente, pero parece que la otra fórmula de Wikipedia se basa en los resultados similares de esta gran respuesta SO , donde alguien realmente realizó los cálculos.
not2qubit
10

Las latitudes y longitudes especifican puntos, no distancias, por lo que su pregunta no tiene sentido. Si está preguntando acerca de la distancia más corta entre dos puntos (lat, lon), vea este artículo de Wikipedia sobre distancias de gran círculo.

John Feminella
fuente
9
Él está hablando de la conversión referencial, por lo que su respuesta no es acertada (sin juego de palabras)
Paulo Neves
1
Y como referencia, una guía de conversión para la transformación de datos de posiciones GPS. www.microem.ru/pages/u_blox/tech/dataconvert/GPS.G1-X-00006.pdf
Paulo Neves
2
Quiere saber cuántos grados por metro para poder encontrar la distancia entre 2 puntos. Leer entre lineas.
theAnonymous
1
y su respuesta es mucho más absurda
jerinho.com
7

Hay muchas herramientas que facilitarán esto. Vea la respuesta de monjardin para más detalles sobre lo que está involucrado.

Sin embargo, hacer esto no es necesariamente difícil. Parece que está utilizando Java, por lo que recomendaría buscar algo como GDAL . Proporciona envoltorios de Java para sus rutinas, y tienen todas las herramientas necesarias para convertir de Lat / Lon (coordenadas geográficas) a UTM (sistema de coordenadas proyectadas) o alguna otra proyección de mapa razonable.

UTM es agradable, porque es metros, es muy fácil trabajar con él. Sin embargo, deberá obtener la zona UTM adecuada para que haga un buen trabajo. Hay algunos códigos simples disponibles a través de Google para encontrar una zona apropiada para un par lat / long.

Reed Copsey
fuente
7

La tierra es una superficie molesta e irregular, por lo que no existe una fórmula simple para hacer esto exactamente. Tienes que vivir con un modelo aproximado de la tierra y proyectar tus coordenadas sobre él. El modelo que generalmente veo usado para esto es WGS 84 . Esto es lo que los dispositivos GPS suelen usar para resolver exactamente el mismo problema.

NOAA tiene algún software que puede descargar para ayudar con esto en su sitio web .

TED
fuente
6

Aquí está la versión R de la función bh- , por si acaso:

measure <- function(lon1,lat1,lon2,lat2) {
    R <- 6378.137                                # radius of earth in Km
    dLat <- (lat2-lat1)*pi/180
    dLon <- (lon2-lon1)*pi/180
    a <- sin((dLat/2))^2 + cos(lat1*pi/180)*cos(lat2*pi/180)*(sin(dLon/2))^2
    c <- 2 * atan2(sqrt(a), sqrt(1-a))
    d <- R * c
    return (d * 1000)                            # distance in meters
}
Rodrigo
fuente
2

Una milla náutica (1852 metros) se define como un minuto de arco de longitud en el ecuador. Sin embargo, debe definir una proyección de mapa (consulte también UTM ) en la que está trabajando para que la conversión tenga sentido.

El juez Maygarden
fuente
1
No, la milla náutica está definida por el estándar internacional ( v en.wikipedia.org/wiki/Nautical_mile ) para ser 1852m. Su relación con la medición de un arco en la superficie de un esferoide como la Tierra ahora es histórica y aproximada.
Mark de alto rendimiento el
1
    'below is from
'http://www.zipcodeworld.com/samples/distance.vbnet.html
Public Function distance(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim theta As Double = lon1 - lon2
    Dim dist As Double = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + _
                            Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * _
                            Math.Cos(deg2rad(theta))
    dist = Math.Acos(dist)
    dist = rad2deg(dist)
    dist = dist * 60 * 1.1515
    If unit = "K" Then
        dist = dist * 1.609344
    ElseIf unit = "N" Then
        dist = dist * 0.8684
    End If
    Return dist
End Function
Public Function Haversine(ByVal lat1 As Double, ByVal lon1 As Double, _
                         ByVal lat2 As Double, ByVal lon2 As Double, _
                         Optional ByVal unit As Char = "M"c) As Double
    Dim R As Double = 6371 'earth radius in km
    Dim dLat As Double
    Dim dLon As Double
    Dim a As Double
    Dim c As Double
    Dim d As Double
    dLat = deg2rad(lat2 - lat1)
    dLon = deg2rad((lon2 - lon1))
    a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(deg2rad(lat1)) * _
            Math.Cos(deg2rad(lat2)) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
    c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a))
    d = R * c
    Select Case unit.ToString.ToUpper
        Case "M"c
            d = d * 0.62137119
        Case "N"c
            d = d * 0.5399568
    End Select
    Return d
End Function
Private Function deg2rad(ByVal deg As Double) As Double
    Return (deg * Math.PI / 180.0)
End Function
Private Function rad2deg(ByVal rad As Double) As Double
    Return rad / Math.PI * 180.0
End Function
dbasnett
fuente
Veo que el enlace está lleno de roto.
tshepang
1

Para convertir la latitud y la longitud en la representación x e y, debe decidir qué tipo de proyección de mapa utilizar. En cuanto a mí, Mercator elíptico parece muy bien. Aquí puede encontrar una implementación (también en Java).

Megamozg
fuente
0

Si está lo suficientemente cerca, puede evitar tratarlos como coordenadas en un plano plano. Esto funciona a nivel de calle o ciudad si no se requiere una precisión perfecta y todo lo que necesita es una aproximación aproximada de la distancia involucrada para comparar con un límite arbitrario.


fuente
3
No, eso no funciona! La distancia x en m es diferente para diferentes valores de latitud. En el ecuador puede salirse con la suya, pero cuanto más se acerque a los polos, más extremos serán sus elipsoides.
RickyA
3
Si bien su comentario es razonable, no responde la pregunta del usuario sobre la conversión de la diferencia de grados lat / lng a metros.
JivanAmara
0

Basado en la distancia promedio para el degress en la Tierra.

1 ° = 111 km;

Convirtiendo esto para radianes y dividiendo para metros, tome un número mágico para el RAD, en metros: 0.000008998719243599958;

luego:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
Jaykon
fuente
3
finalmente, una respuesta directa :)
Ben Hutchison
¿Qué pasa si la latitud es -179 y la otra es 179, la distancia x debería ser 2 grados en lugar de 358
OMGPOP
77
No use esta respuesta (por alguna razón, está votada). No hay una sola escala entre longitud y distancia; La tierra no es plana.
CPBL
1
Creo que es 111.1
Abel Callejo
66
Tenga en cuenta que un grado de longitud es de 111 km en el ecuador, pero menos para otras latitudes. Hay una fórmula aproximada simple para encontrar la longitud en km de 1 ° de longitud en función de la latitud: 1 ° de longitud = 40000 km * cos (latitud) / 360 (y, por supuesto, da 111 km para latitud = 90 °). También observe que 1 ° de longitud es casi siempre una distancia diferente a 1 ° de latitud.
Ben
-1

Si desea una solución simple, utilice la fórmula de Haversine como se describe en los otros comentarios. Si tiene una aplicación sensible a la precisión, tenga en cuenta que la fórmula de Haversine no garantiza una precisión mejor que 0.5%, ya que supone que la tierra es una esfera. Para considerar que la Tierra es un esferoide achatado, considere usar las fórmulas de Vincenty . Además, no estoy seguro de qué radio debemos usar con la fórmula de Haversine: {Ecuador: 6,378.137 km, Polar: 6,356.752 km, Volumétrico: 6,371.0088 km}.

Samuel Crawford Loveys
fuente
it is assuming the earth is a circle^^ Algunas personas extrañas hacen esto hoy en día ... pero lo que quieres decir es probablemente más bien it is assuming the earth is a sphere;)
derHugo
-2

Necesitas convertir las coordenadas a radianes para hacer la geometría esférica. Una vez convertido, puede calcular una distancia entre los dos puntos. La distancia se puede convertir a cualquier medida que desee.

Arlie Winters
fuente