tipos planas para metros longitud latitud gratis grados geograficas decimales coordenadas convertir convertidor math geolocation geo

math - planas - ¿Cómo convertir latitud o longitud a metros?



latitud y longitud (15)

Aquí está la versión R de la función de 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 }

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?


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 círculo máximo entre dos puntos en una esfera dadas sus longitudes y latitudes.


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

1 ° = 111 km;

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

entonces:

const RAD = 0.000008998719243599958; Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(long1 - long2, 2)) / RAD;


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 de perímetro 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


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.


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.


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 .


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.


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


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, dejé los números brutos 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 indica que los calcos de distancia están dentro de 0.6 m durante 100 km en sentido longitudinal y 1 cm en 100 km en sentido latitudinal, pero no he verificado que la precisión esté bien para mi uso.


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


Si desea una solución simple, utilice la https://en.wikipedia.org/wiki/Haversine_formula como se indica 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 un círculo. Para considerar que la Tierra es un esferoide achatado, considere usar las fórmulas de Vincenty . Además, no estoy seguro de qué radio deberíamos usar con la fórmula de Haversine: {Equator: 6,378.137 km, Polar: 6,356.752 km, Volumétrico: 6,371.0088 km}.


Si está lo suficientemente cerca, puede salirse con la suya tratándolos como coordenadas en un plano plano. Esto funciona, por ejemplo, en la calle o en la ciudad si no se requiere una precisión perfecta y todo lo que necesita es una estimación aproximada de la distancia involucrada para compararla con un límite arbitrario.



''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