Aquí podría ser tu PUBLICIDAD


¿Cómo convertir latitud o longitud a metros?

votos
85

Si tengo una lectura de latitud o longitud en formato NMEA estándar, ¿existe una forma / fórmula fácil para 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 lat y long waypoint y un lat y long de usuario es una forma fácil de compararlos para decidir cuándo decirle al usuario que se encuentran a una distancia razonablemente corta del punto de paso. Me doy cuenta de que es razonable, pero ¿es esto fácil de hacer o demasiado matemático?

Publicado el 12/03/2009 a las 18:38
fuente por usuario Adam Taylor
En otros idiomas...        العربية       

15 respuestas

votos
105

Aquí es una función 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 haversine determina la distancia de círculo máximo entre dos puntos en una esfera dada sus longitudes y latitudes.

Respondida el 23/06/2012 a las 09:20
fuente por usuario b-h-


Aquí podría ser tu PUBLICIDAD


votos
22

Para aproximar distancias cortas entre dos coordenadas que he utilizado 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 que 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 afirma que las calculadoras distancia se encuentran dentro de 0,6 m por 100 kilometros de 1 cm en sentido longitudinal y latitudinal de 100 kilometros pero no han verificado esto como en cualquier lugar cerca que la precisión está bien para mi uso.

Respondida el 14/10/2013 a las 09:46
fuente por usuario JJones

votos
15

Teniendo en cuenta que usted está buscando una fórmula simple, esta es probablemente la forma más sencilla de hacerlo, en el supuesto de que la Tierra es una esfera de perímetro 40075 km.

Longitud en metros de 1 ° de latitud = siempre 111,32 kilometros

Longitud en metros del 1 ° de longitud = 40,075 kilometros * cos (latitud) / 360

Respondida el 16/09/2016 a las 06:29
fuente por usuario Ben

votos
13

Las latitudes y longitudes especifican los puntos, no las distancias, por lo que su pregunta es un poco absurda. Si está preguntando sobre la distancia más corta entre dos (lat, lon) puntos, consulte este artículo de Wikipedia sobre distancias de círculo máximo.

Respondida el 12/03/2009 a las 06:45
fuente por usuario John Feminella

votos
8

Hay muchas herramientas que lo harán fácil. 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ás usando Java, por lo que te recomendaría buscar algo como GDAL . Proporciona envoltorios Java para sus rutinas, y tienen todas las herramientas necesarias para convertir Lat / Lon (coordenadas geográficas) a UTM (sistema de coordenadas proyectadas) o alguna otra proyección de mapa razonable.

UTM es bueno, 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 de latitud / longitud.

Respondida el 12/03/2009 a las 06:59
fuente por usuario Reed Copsey

votos
7

La tierra es una superficie irritantemente 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 normalmente veo utilizado para esto es WGS 84 . Esto es lo que los dispositivos de GPS generalmente usan para resolver exactamente el mismo problema.

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

Respondida el 12/03/2009 a las 07:59
fuente por usuario T.E.D.

votos
4

Sobre la base de la distancia promedio para Degress en la Tierra.

1 ° = 111 kilometros;

Convertir esto para radianes y dividiendo por metros, tomar un número mágico para la RAD, en metros: ,000008998719243599958;

entonces:

const RAD = 0.000008998719243599958;
Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;
Respondida el 28/08/2013 a las 03:34
fuente por usuario Jaykon

votos
4

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

Respondida el 12/03/2009 a las 06:42
fuente por usuario Judge Maygarden

votos
3

Aquí está la versión R de bh de funciones , 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
}
Respondida el 06/02/2015 a las 06:07
fuente por usuario Rodrigo

votos
3

Hay bastantes formas de calcular esto. Todos ellos usan aproximaciones de trigonometría esférica donde el radio es el de la tierra.

prueba http://www.movable-type.co.uk/scripts/latlong.html para ver un poco de métodos y códigos en diferentes idiomas.

Respondida el 12/03/2009 a las 07:34
fuente por usuario rcaval

votos
2

Para convertir latitud y longitud en x e y representación que usted necesita decidir qué tipo de proyección cartográfica de usar. En cuanto a mí, elíptica Mercator parece muy bien. Aquí se puede encontrar una aplicación (en Java también).

Respondida el 02/03/2013 a las 07:12
fuente por usuario Megamozg

votos
2
    '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
Respondida el 12/03/2009 a las 07:01
fuente por usuario dbasnett

votos
0

Si desea una solución simple a continuación, utilizar la fórmula Haversine como se indica por los otros comentarios. Si usted tiene una aplicación sensible exactitud tenga en cuenta la fórmula Haversine no garantiza una precisión mejor que 0,5%, ya que está asumiendo que la tierra es un círculo. Tener en cuenta que la Tierra es un esferoide achatado considere el uso de fórmulas de vincenty . Además, no estoy seguro de lo que deberíamos usar el radio con la fórmula Haversine: {ecuador: 6,378.137 km, Polar: 6,356.752 km, volumétrico: 6,371.0088 km}.

Respondida el 24/05/2018 a las 01:32
fuente por usuario Samuel Crawford Loveys

votos
0

Si su suficientemente cerca que puede salirse con la tratándolos como coordenadas en un plano liso. Esto funciona en digamos, calle o nivel de la ciudad si es perfecto isnt exactitud requerida y todo lo que necesita es un cálculo aproximado de la distancia involucrada comparar con un límite arbitrario.

Respondida el 16/04/2010 a las 11:11
fuente por usuario Bart

votos
-2

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

Respondida el 24/03/2010 a las 12:20
fuente por usuario Arlie Winters


Aquí podría ser tu PUBLICIDAD